Skip to content

ums(post-merge): the same-repo citation trap, as a fifth occurrence - #2212

Merged
d-morrison merged 5 commits into
mainfrom
ums/post-merge-2207
Aug 25, 2026
Merged

ums(post-merge): the same-repo citation trap, as a fifth occurrence#2212
d-morrison merged 5 commits into
mainfrom
ums/post-merge-2207

Conversation

@d-morrison

Copy link
Copy Markdown
Collaborator

Post-merge UMS top-up for #2207, covering what the merge itself taught.

What happened

#2207's own claude-review found that its prose described COMMENT_FLAG_RE in hooks/require-agent-disclosure.py in the present tense, while the construct exists only on #2185, still open. Twelve pre-push adversarial rounds had executed that regex, its sibling forms, the commit ancestry and the timestamps --- all correct, and all against #2185.

What this records

A fifth occurrence, not a new rule. challenge-ambiguous-terminology.md already documents this trap (gha#151 twice, #208, #217), and CLAUDE.md already says that section applies to a same-repo sibling PR unchanged. A first draft opened a new shape in verify-the-right-artifact.md and was cut in review as a duplicate.

The increment is why thorough review misses it. Every reviewer verifies the claim against the branch the claim is about, which is the correct artifact for its truth --- so it passes, and the more carefully that branch is checked, the more settled the sentence looks. Nobody asks which artifact the reader will be standing on, because that is a question about the claim's audience rather than its truth. This is the one trap in that section where verification effort runs the wrong way.

Two corrections to the section itself

The 404 claim was wrong at source. It read as though a link checker catches a premature cross-repo citation. On all four measured cases it could not, for two different reasons: a backticked path is not a link so nothing crawls it, and the repo-root link resolves fine. Fixed where the claim is made, not by appending a rebuttal.

The Do bullet does not use git merge-base --is-ancestor. A first draft prescribed it. A review round ran the negative control and found it exits 1 for #2205, #2202 and #2201 --- all merged --- because this repo squash-merges and the squash commit excludes the branch's own commits. So it trades the grep's false positive for a permanent false negative. pr-on-claim.md documents exactly this ("a base..branch commit range cannot answer 'is this merged' in a squash-merging repo, at any freshness"), and the bullet now uses the instruments that fragment prescribes: the PR's own state, or an empty path-scoped git diff.

Also

least-flexible-tool.md drops a self-refuting clause #2207 shipped, which claimed git grep finds the constant nowhere on main in a sentence that itself put the string on main.

Deferred

#2210 --- reorganize-prose.md's content-preservation check is gated on a move, so a scripted whole-file rewrite that drops the tail never trips it. Hit live in this session. A first draft of that entry was cut in review with five findings against it; the issue records what it got wrong so the eventual entry does not repeat them.

Prose only, no code. check-links.py, markdownlint-cli2, semantic-line-breaks.py, CI's clause-break rule, git diff --check and a non-ASCII scan are green, and a bidirectional word diff confirms nothing was lost.

…occurrence

Post-merge UMS top-up. #2207's own claude-review found that its prose
described COMMENT_FLAG_RE in the present tense while the construct exists
only on unmerged #2185. That is a fifth occurrence of the trap
challenge-ambiguous-terminology.md already documents (gha#151 twice, #208,
#217), and CLAUDE.md already says that section covers a same-repo sibling PR
unchanged -- so this records the recurrence rather than opening a new shape,
which a first draft wrongly did in verify-the-right-artifact.md.

- The increment is why thorough review misses it: every reviewer verifies the
  claim against the branch it is ABOUT, which is correct for its truth, so it
  passes -- and the more carefully that branch is checked, the more settled
  the sentence looks. Nobody asks which artifact the READER lands on.
- Corrected the section's own 404 claim at source. It read as though a link
  checker catches a premature cross-repo citation; on all four measured cases
  it could not, for two different reasons -- a backticked path is not a link,
  and the repo-root link resolves.
- The Do bullet settles merge state from the PR's own state or an empty
  path-scoped git diff, per pr-on-claim. NOT git merge-base --is-ancestor: a
  review round demonstrated it exits 1 for #2205, #2202 and #2201, all merged,
  because this repo squash-merges and the squash commit excludes the branch's
  commits. pr-on-claim documents exactly that, and a first draft prescribed
  the broken check anyway.
- least-flexible-tool.md: dropped a self-refuting clause #2207 shipped, which
  said `git grep` finds the constant nowhere on main while itself putting the
  string on main.

Deferred to #2210: broadening reorganize-prose.md's content-preservation
check, which is gated on a MOVE and so never fires on a scripted whole-file
rewrite that drops the tail. A first draft of that entry was cut in review;
the issue records what it got wrong.
@d-morrison

Copy link
Copy Markdown
Collaborator Author

Working on this --- paws off until I'm done.

or construct in another repo is itself unverifiable --- and will 404 a link
checker --- if the PR that adds it hasn't merged yet.
**Cross-repo citations have a merge-order trap.**
Citing a specific file path or construct in another repo is itself unverifiable if the PR that adds it hasn't merged yet --- and a link checker will not save you, as the measured cases below show: a backticked path is not a link, so nothing crawls it.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor: "as the measured cases below show" is a forward reference — it points the reader at content (the case parentheticals) they haven't reached yet. Per this repo's own forward-references.md, pointing accurately is what qualifies a phrase under the rule, not what exempts it ("Direction is not the test" section) — so this isn't excused by the target genuinely being further down. Since the nearby (Caught by this very guideline four times now...) parenthetical already carries the referenced cases, consider dropping "below" (e.g. "a link checker will not save you: a backticked path is not a link...") rather than pointing forward to it.

Not blocking — this is exactly the class of nit fix-forward-references/ffr is meant to catch, worth a quick pass since this file is itself part of the corpus that defines the rule.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in 7b52990b. Dropped the forward pointer: the clause now reads "on any case measured here" rather than "as the measured cases below show", so it makes its claim without asking the reader to go looking.

(Measured on [ai-config#2207](https://github.com/Morrison-Lab/ai-config/pull/2207), whose prose described a constant in `hooks/require-agent-disclosure.py` in the present tense.
That constant exists only on [#2185](https://github.com/Morrison-Lab/ai-config/pull/2185), open at the time, and its introducing commit was an ancestor of neither `main` nor the citing branch.
Twelve pre-push adversarial rounds ran on that PR without raising it, and the round that did raise it had itself executed the regex, the commit ancestry, and the timestamps against `#2185` --- all correct, and all about the wrong branch.
Two separately-dispatched same-vendor passes then raised it nine minutes apart, once the diff was read as something about to become `main`.)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This sentence doesn't name which two passes it means, and the most plausible reading doesn't match the PR #2207 record.

The two claude-review comments on #2207 are ~9m55s apart (05:36:44Z and 05:46:39Z) — close enough to "nine minutes" to be the pair meant. But only the first one raised the COMMENT_FLAG_RE finding; the second explicitly says "This round's findings: none" and "Ready for merge" — it confirmed the fix, it didn't raise anything. So as worded, "raised it nine minutes apart" doesn't match either round's actual content (only one round raised it).

If instead this means the two parallel CLAUDE.md-compliance subagents within round 1 (both flagging the same finding, per that comment's own "the two CLAUDE.md-compliance passes surfaced two findings"), "nine minutes apart" seems like the wrong figure for two subagents dispatched in parallel within one job.

Could you clarify/name which two passes are meant? As it stands this reads as an inaccurate or at least ambiguous factual claim about #2207's review history (worth double-checking per this PR's own "watch for hallucinations" review instruction).

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in 7b52990b, and your uncertainty was well placed --- the claim was true but unnameable, so there was no way for you to check it.

The two passes are a session verification pass at 05:27:25Z (comment 5405924657) and claude-review at 05:36:44Z, 9m19s apart, both raising COMMENT_FLAG_RE. The sentence now names both.

Your reconstruction was the natural one and it is why the sentence needed fixing: comparing the two claude-review comments gives ~9m55s, which is close enough to "nine minutes" to look like the right pair, but the later one at 05:46:39Z reports zero findings and Ready for merge --- it confirmed the fix rather than raising anything. The entry now says that explicitly, so the next reader does not repeat the same reconstruction.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

…e finding

claude-review round 1 on 4112c6c, both findings addressed:

- "as the measured cases below show" pointed forward, which
  forward-references.md says is not excused by pointing accurately. Now
  "on any case measured here".
- "Two separately-dispatched same-vendor passes then raised it nine minutes
  apart" was accurate but unnameable, so the reviewer could not check it and
  flagged it as a possible inaccuracy. The two are a session verification
  pass at 05:27:25Z (comment 5405924657) and claude-review at 05:36:44Z --
  9m19s apart, both raising COMMENT_FLAG_RE. Named both, and said why the
  count looks wrong from the outside: the LATER claude-review round at
  05:46:39Z reports zero findings and Ready for merge, so a reader comparing
  only the two claude-review comments sees one raise rather than two. That
  is exactly the reconstruction the reviewer attempted.
Comment on lines 147 to 149

On [ai-config#2185](https://github.com/Morrison-Lab/ai-config/pull/2185) --- unmerged as of 2026-08-24, so `git grep COMMENT_FLAG_RE` finds nothing on `main` until it lands --- `COMMENT_FLAG_RE` in `hooks/require-agent-disclosure.py` decides whether a `gh issue|pr close|reopen` segment posts a comment, which it does only when `--comment` or its shorthand `-c` is present.
On [ai-config#2185](https://github.com/Morrison-Lab/ai-config/pull/2185) --- open as of 2026-08-24, so the constant below is defined on that branch only --- `COMMENT_FLAG_RE` in `hooks/require-agent-disclosure.py` decides whether a `gh issue|pr close|reopen` segment posts a comment, which it does only when `--comment` or its shorthand `-c` is present.
Its short-flag alternative was edited four times on that branch, through five forms.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor: "so the constant below is defined on that branch only" is itself a forward reference — COMMENT_FLAG_RE isn't named until later in the very same sentence (after the next em-dash aside). Per this repo's own forward-references.md, pointing accurately doesn't exempt a phrase from the rule.

This is the same class of issue this PR already fixed once in challenge-ambiguous-terminology.md:22 (dropping "below" there) — it just wasn't caught in this file in round 1. Not blocking, but worth a consistent fix since this file is part of the same corpus.

Suggested change
On [ai-config#2185](https://github.com/Morrison-Lab/ai-config/pull/2185) --- unmerged as of 2026-08-24, so `git grep COMMENT_FLAG_RE` finds nothing on `main` until it lands --- `COMMENT_FLAG_RE` in `hooks/require-agent-disclosure.py` decides whether a `gh issue|pr close|reopen` segment posts a comment, which it does only when `--comment` or its shorthand `-c` is present.
On [ai-config#2185](https://github.com/Morrison-Lab/ai-config/pull/2185) --- open as of 2026-08-24, so the constant below is defined on that branch only --- `COMMENT_FLAG_RE` in `hooks/require-agent-disclosure.py` decides whether a `gh issue|pr close|reopen` segment posts a comment, which it does only when `--comment` or its shorthand `-c` is present.
Its short-flag alternative was edited four times on that branch, through five forms.
On [ai-config#2185](https://github.com/Morrison-Lab/ai-config/pull/2185) --- open as of 2026-08-24 --- `COMMENT_FLAG_RE` in `hooks/require-agent-disclosure.py`, defined only on that branch, decides whether a `gh issue|pr close|reopen` segment posts a comment, which it does only when `--comment` or its shorthand `-c` is present.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in 54607dc7. Split into two sentences so the constant is named first and its provenance second, rather than pointing ahead across an em-dashed aside.

Worth noting for the record: this is the third pass over that one clause --- self-refuting first (it claimed git grep finds the constant nowhere on main, in a sentence that put the string on main), then forward-pointing once that was fixed. Your framing is right that it is the same class introduced alongside the fix for it, which is exactly the "a later round can find a defect in the fix rather than the original" shape learn-from-review-findings.md documents --- here running three deep on a single sentence.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

claude-review round 2 on 7b52990. The round-1 fix for a self-refuting clause
introduced a forward reference in the same slot: "so the constant below is
defined on that branch only" pointed ahead to COMMENT_FLAG_RE, which the
sentence did not name until after the em-dashed aside.

Split into two sentences so the constant is named first and its provenance
second. Third pass over this one clause -- self-refuting, then
forward-pointing, now neither -- which is the corpus's own "a later round can
find a defect in the fix" running on a single sentence.
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

Copy link
Copy Markdown
Contributor

Claude finished reviewView run


No matches found (grep exited 1, meaning no non-ASCII punctuation) — confirmed clean, and the link checker passes. Everything checks out. This confirms the state already established across three prior review rounds.

Review: PR #2212

Confirming review — no new findings. The PR's diff against its current merge-base (main @ 77ee6f1e) remains exactly the two files already reviewed and approved:

shared/coding/least-flexible-tool.md               |  3 ++-
shared/workflow/challenge-ambiguous-terminology.md | 25 +++++++++++++++++++---

I verified this directly: git diff between the last-reviewed commit (54607dc7, reviewed in the prior round, 2026-08-25T06:38:20Z, marked Ready for merge, and reconfirmed by a subsequent round at 06:58:04Z) and the current head (3e0b84d7) shows zero content changes to either file — the only intervening commits are main-merge commits, and the one file they touch (memories/preferences.md) is not part of this PR's diff.

I independently re-checked substance rather than relying only on the diff-empty result:

  • Forward reference at challenge-ambiguous-terminology.md:22 ("as the measured cases below show" → "on any case measured here") — still fixed.
  • Forward reference at least-flexible-tool.md:148-149COMMENT_FLAG_RE is still named before the sentence pointing to it ("It is defined on ai-config#2185's branch only...").
  • The ambiguous timing claim at challenge-ambiguous-terminology.md:73 — still fixed, naming both passes with comment IDs/timestamps.
  • shared/coding/least-flexible-tool.md, shared/workflow/challenge-ambiguous-terminology.md: scripts/check-links.py clean (2359 links, 555 files, zero broken); no non-ASCII punctuation (em-dashes, curly quotes) present.
  • Re-confirmed PR The disclosure marker must end the body, plus five missed posting surfaces #2185 is still OPEN, consistent with the diff's "open as of 2026-08-24" phrasing.

No new issues found in this round. No hallucinated APIs, paths, or citations; no CLAUDE.md violations; no redundant content.

Verdict

Ready for merge. No content changes since the prior "Ready for merge" verdict at commit 54607dc7 (confirmed again at 5b0c95de); the current head 3e0b84d7 carries only an unrelated main-merge that does not touch this PR's files.

Reviewed commit: 3e0b84d

@github-actions

Copy link
Copy Markdown
Contributor

💰 Cost: $1.3272 (review) — run

@d-morrison
d-morrison merged commit 3a7f1f6 into main Aug 25, 2026
8 checks passed
@d-morrison
d-morrison deleted the ums/post-merge-2207 branch August 25, 2026 16:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant