Skip to content

ums: three findings from a five-PR session - #1008

Merged
d-morrison merged 4 commits into
mainfrom
ums/list-merged-worktree-precondition
Aug 1, 2026
Merged

ums: three findings from a five-PR session#1008
d-morrison merged 4 commits into
mainfrom
ums/list-merged-worktree-precondition

Conversation

@d-morrison

@d-morrison d-morrison commented Aug 1, 2026

Copy link
Copy Markdown
Collaborator

Three entries from the session whose five PRs merged tonight, plus one candidate declined. I read what #996, #999, #1003, #1004, and #1005 recorded on current main first, so none of this restates them.

> [!NOTE]
> Three corrections since this PR opened, all to claims I published and then disproved. The body is rewritten rather than quietly patched, since the first version is what earlier readers saw.
>
> 1. A shell placeholder written in angle brackets was stripped by the API, leaving git worktree add main. That is the documented loss in memories/github.md; placeholders are unbracketed below, per its own remedy. Committed files are unaffected, which that entry also predicts and I verified.
> 2. I wrote that the memory-file-size threshold is "advisory and exits 0, so it should not block an unrelated PR", and kept an over-length entry on that basis. That was wrong, and validate failed in CI on it. See the section below.
> 3. Review round 1 found the prescribed fallback command itself wrong, and measuring it showed it fails in a second way neither the review nor I anticipated. Entry 2 below is rewritten accordingly; the superseded version is described in place rather than deleted.

1. memories/github.md -- list_pull_requests reports merged: false for merged PRs

Placed beside the two sibling field-reliability bullets (get_status, get_check_runs), because it is the third of that family and the contrast is the point: those two are about staleness, where a field is sometimes wrong. Here the value is constant, so it is wrong for every merged PR while looking correct on any unmerged one you spot-check it against. That is the same "a constant carries no information" argument fully-clean.md already makes for review .state, so the entry cites it rather than re-deriving it.

Verified myself rather than taken from the brief, on d-morrison/ai-config, 2026-08-01:

field open (1006) merged (1005) closed unmerged (505)
list merged false false false
list merged_at absent present absent
get merged false true false
  • merged: false on all 101 rows across four list calls, including 1005, which get reports merged: true / merged_by: d-morrison.
  • Not the fields projection. The brief flagged this as worth pinning down since the remedy differs, and it is not: a call passing no fields argument at all returns the same merged: false.
  • merged_by is not a fallback -- never served in a list response even when named explicitly in fields.
  • The closed-unmerged column needed a real example rather than an assumption; 505 was found by paging back to where this repo's merge-everything streak breaks.

I caught myself writing the get cell for the open PR before calling get on it, and made the call rather than leaving an inferred value in a table presented as measurement.

The mechanism (list returns GitHub's smaller pull-request representation, leaving a zero-value false) is marked as inferred from which fields are absent, not read from the server source -- the same hedging discipline #1004 applied to the node-ID story it had to retract.

2. memories/preferences.md + skills/gip/SKILL.md -- the worktree remedy has an unstated precondition

isolation: "worktree" needs the session's own cwd to be inside a git repository. #1005's entry prescribes it citing gip, and gip says to give every subagent that parameter; neither carries the precondition, so in this harness layout both prescribe a parameter that errors.

Verified both clauses of the error message independently:

  • git rev-parse --show-toplevel in the default cwd /home/user returns fatal: not a git repository, with ai-config, gha, qbt, qwt, rpt, workflows one level below.
  • No settings.json exists at ~/.claude/ or /root/.claude/, so no WorktreeCreate hook is configured either.

Stated limit: the error text is quoted from the parent session's attempt. This agent has no Agent tool and did not re-run it, and the entry says so rather than implying a reproduction.

The caveat went in both places a reader meets the remedy, per the brief: the full entry in memories/preferences.md beside the rule it qualifies, and a short pointer in gip at the line that prescribes the parameter. The failure mode worth naming is that a reader hitting the error concludes isolation is unavailable and shares the checkout after all, which is the exact outcome #1005's entry exists to prevent.

The fallback command, as corrected in review round 1

This PR originally prescribed git worktree add PATH main, and that was wrong. Review found it hard-codes a branch name that a worktree cannot reuse; I then measured the alternatives rather than reasoning about them, on git 2.43.0, five worktree creations per round against a throwaway repo whose local main sat five commits behind origin/main.

form sequential concurrent
add PATH main, main checked out 0/5 0/5
add PATH main, main free 1/5 guard races, see below
add -b SLUG PATH origin/main (review's suggestion) 5/5 failed in 4 of 5 rounds
add -b SLUG --no-track PATH origin/main 5/5 5/5 in all 5 rounds
add --detach PATH origin/main 5/5 5/5 in all 5 rounds

Two things beyond what the finding claimed:

  • The naive form's concurrent failure is silent. The already-checked-out guard is not atomic, so three or four worktrees landed on main at once in every one of six rounds. Committing in two of them showed the second reading main at the first's new commit and stacking on top -- the exact collision isolation exists to prevent, with no error.
  • The suggested -b SLUG ... origin/main loses a .git/config race, because branching with tracking from a remote ref writes upstream config: could not lock config file .git/config / unable to write upstream branch configuration.

What landed is git -C REPO worktree add --detach PATH origin/main, in both files. Basing on origin/main also removes the stale-base trap the original entry documented -- confirmed that fetch origin main advances origin/main while leaving the local main ref untouched -- so the separate "verify and realign" step is gone rather than merely restated.

3. shared/workflow/ardi.md -- name the specific gate when reporting a blocker

Placed directly after "Verify a blocker you assert", which it refines. That rule governs whether something is blocked and its remedy is to attempt it once. This governs why, and fires after that remedy has succeeded: the call was attempted, it genuinely failed, the blocker is real, and only the attribution is wrong -- which is why nothing about it feels unverified.

I reported an unresolvable review thread as blocked "for scope reasons" across roughly six status updates. The failure actually seen under that spelling was the node-versus-declared-string comparison. Only the other spelling is scope.

The transferable point, which is what made this worth an entry rather than a note: a category word that is also the proper name of one specific mechanism cannot double as the generic term for its family. "Scope" names a real gate on this platform, so the wrong reading survives re-reading, and it is actionable in the wrong direction -- someone told a call failed on scope will reach for the other owner, which also fails.

memories/github.md already records both gates and their verbatim errors (#1004). What was missing was the usage habit, which I confirmed is absent rather than assuming it.

Round 1 also found that inserting this section broke a pre-existing back-reference below it into a contradiction. Fixed by naming the target (the verify-a-blocker bullet above) and distinguishing all three adjacent blocker cases; a second instance of the same reference at line 860 was fixed in the same pass, since this insertion is what made it ambiguous.

Declined: the review-cost delta

Recommended as a comment on the gha issue, not recorded here, and I have posted nothing. My MCP scope is d-morrison/ai-config only.

The measurement is real (pre-slide run 30673938581 at $17.03, post-slide 30676853877 at $4.18, consecutive rounds on PR #1003). Three reasons it does not belong in this corpus:

  • It is evidence for a specific fix in a different repo. The audience is whoever maintains claude-code-review.yml, and the natural home is the issue that fix closes.
  • n=1 with an acknowledged confound -- round 2's diff differed from round 1's. A memory entry reads as settled, so recording "the fix cut cost 4x" would state a generalization the data does not support. The existing total_cost_usd entries use cost as a diagnostic (cost 0 means quota exhaustion), never as a performance comparison, so this would also be a new kind of claim on thin evidence.
  • It decays immediately -- the tag moves, pricing changes, per timestamp-volatile-claims.md.

The correction: the 1200-line threshold is a hard gate, not advisory

Entry 1 first landed at 36 lines, taking memories/github.md from 1175 to 1211. I ran scripts/check-memory-file-size.py, saw it report the finding and exit 0, read its own docstring saying a crossing "should not block an unrelated PR", and kept the entry on that basis, arguing in this body that trimming to satisfy an advisory instrument inverts what the instrument is for.

validate then failed:

FAIL: this repo's own memories/ is under the 1200-line default
12 passed, 1 failed

scripts/test_check_memory_file_size.py asserts the corpus is clean, and that test is not advisory. The script exits 0; the test suite does not. I had run the first and not the second, so my evidence never covered the claim I made from it -- the shape fail-fast.md describes, where a check's scope is narrower than the conclusion drawn from it.

Fixed properly rather than papered over:

  • Entry 1 trimmed 36 lines to 24, keeping the table, the 101-row count, the not-the-projection finding, merged_by, the hedged mechanism, and the Do/Don't. memories/github.md is now 1199 lines and test_check_memory_file_size.py reports 13 passed, 0 failed.
  • Issue 1007 rewritten: retitled, the "nothing turns red" claim retracted in a visible note rather than edited away, urgency raised, and the observation added that issue 811 carries the identical wrong claim. Its real content is now that this file had 24 lines of headroom against an enforced gate, so trimming is a workaround and the split is the fix.

Searched, and concluded already covered or absent

Normalized for whitespace, backticks, asterisks and underscores on both needle and haystack, since this corpus breaks lines mid-phrase and the needle needs the same transform as the text.

  • Entry 1: merged_at, merged: false, list_pull_requests, fields projection. The only prior merged_at hit is CLAUDE.md, unrelated.
  • Entry 2: isolation: "worktree", not in a git repository, WorktreeCreate, give every subagent. Zero hits for either precondition string anywhere in the corpus.
  • Entry 3: name the specific gate, which gate, two different gates, quote the error verbatim, paraphrase an error, attribute the failure, misattributed, a category word, generic descriptor, names one specific mechanism, superficially similar errors. The two wrong mechanism hits were read and are about choosing the wrong mechanism to build, not about misattributing a failure.
  • Checked and judged to cover a neighbouring case rather than this one: ardi.md's "Verify a blocker you assert" (whether, not why), fully-clean.md's eighth case (the tool's message misleads; here the message was accurate and my paraphrase was not), and metacognitive-monitoring.md's cause-claim type (which prescribes asking what else explains it, but not that two gates exist or that the error text separates them).

Verification

Run after committing, on the current head 8105b6c (which also carries a merge of main, since main advanced to b16fe72 while this PR was open):

  • Banned punctuation, three-dot range, in Python: 0 banned glyphs and 0 non-ASCII characters over 170 added lines. An earlier run found 2 em-dashes, both in the gip edit where I had imitated the surrounding file's style -- the exact trap ascii-punctuation-in-source.md names. Fixed with targeted edits, not a file-wide replace, per that same fragment's scope-creep warning.
  • NLB_BASE_REF=origin/main check-new-line-breaks.py: No lines missing semantic breaks. Read from output rather than exit status, since this one genuinely is advisory.
  • test_check_memory_file_size.py: 13 passed, 0 failed -- run as the test suite, as validate.yml invokes it, not the advisory script. memories/github.md is untouched by round 1 and stays at 1199.
  • test_validate_skills.py 8/0, test_slb.py 34/0, test_check_install.py 36/0, test_rotate_claude_token.py 23/0, test_find_near_duplicates.py all passed, check-vendored-drift.py clean.
  • validate-skills.py: all skills and manifests valid. check-links.py: no broken relative links across 863 links.
  • markdownlint-cli2: Linting: 445 file(s) / Summary: 0 error(s) -- quoting the scope line, since a bare zero is not evidence on its own.
  • sync-codex-skill-wrappers.py: no drift. Run because this PR edits a skills/ file; the wrappers embed frontmatter rather than body, and my edit is body-only.
  • No claude-* model identifier anywhere in the diff.
  • Each of the three entries carries a labelled Do/Don't pair.

Merge order

None. #1006 has since merged and is folded in via the main merge; nothing else open overlaps these four files.

Copilot AI review requested due to automatic review settings August 1, 2026 03:02
@github-actions
github-actions Bot removed the request for review from Copilot August 1, 2026 03:02
Records what the merged run of #996/#999/#1003/#1004/#1005 taught that none
of those five captured, plus one candidate declined.

memories/github.md: list_pull_requests reports merged: false on every row,
merged ones included, so merged_at is the field that discriminates. Verified
across all three PR states and shown not to be an artifact of the fields
projection.

memories/preferences.md and skills/gip/SKILL.md: isolation: "worktree" needs
the session's own cwd to be inside a git repository, which the remedy added
by #1005 states without. Both places a reader meets that remedy now carry
the precondition and the explicit-worktree fallback.

shared/workflow/ardi.md: naming the specific gate when reporting a blocker.
The neighbouring rule covers whether something is blocked; this covers why,
and fires after that rule's remedy has already succeeded.

Declined: a one-off review-cost delta, which is evidence for an upstream
issue rather than a durable corpus learning.
@d-morrison
d-morrison force-pushed the ums/list-merged-worktree-precondition branch from c54da79 to 05d9f32 Compare August 1, 2026 03:06
Copilot AI review requested due to automatic review settings August 1, 2026 03:06
@github-actions
github-actions Bot removed the request for review from Copilot August 1, 2026 03:07
Comment thread memories/preferences.md Outdated
`git -C <repo> fetch origin main`, then
`git -C <repo> worktree add <path> main`.
Two details decide whether that fallback is actually clean.
Use `git -C` rather than `cd`, per the persisting-cwd bullet further down.

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.

Forward reference, per this repo's own forward-references.md rule (cited from CLAUDE.md's "Remove forward-pointing phrases from prose, not just crossref divs" section).

"per the persisting-cwd bullet further down" points at content that appears later in the file (the "Bash's cwd PERSISTS across separate calls..." bullet, ~22 lines below) — the reader hasn't reached it yet at this point in a linear read. CLAUDE.md explicitly bans this pattern: "plain-text signposting — 'as discussed below', 'in the following section', 'we'll cover this later' — pointing at content the reader hasn't reached yet, in any prose."

Since the referenced bullet is pre-existing content the diff doesn't touch, the cleanest fix is to inline a brief, self-contained rationale rather than pointing forward:

Suggested change
Use `git -C` rather than `cd`, per the persisting-cwd bullet further down.
Use `git -C` rather than `cd` -- Bash's cwd persists across separate calls
in a session, so a `cd` here would silently carry into later commands.

Line reference

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 8105b6c.

Verified first: the target is the Bash's cwd PERSISTS bullet, which sat 22 lines below the reference, so a linear reader genuinely has not reached it. That is the pattern CLAUDE.md bans.

Took your suggestion essentially verbatim, inlining the rationale rather than pointing forward:

Use `git -C` rather than `cd`, because Bash's cwd persists across separate
calls in a session, so a `cd` here silently carries into later ones.

It now reads as one of the reasons the fallback command is spelled the way it is, alongside the origin/main and --detach reasons from the finding below, so the paragraph no longer depends on anything downstream.


Generated by Claude Code

Comment thread memories/preferences.md Outdated
The rule is not wrong, it is stated without its precondition, in both places
a reader meets it: the bullet directly above, and
[`gip`](../skills/gip/SKILL.md)'s "give **every** subagent
`isolation: \"worktree\"`".

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.

Rendering bug, not cosmetic: backslash escapes don't work inside Markdown code spans. Per the CommonMark spec §6.1: "Backslash escapes do not work in code blocks, code spans, autolinks, or raw HTML." So `isolation: \"worktree\"` will render literally as isolation: \"worktree\" (with visible backslashes), not isolation: "worktree" as intended.

This is inconsistent with every other occurrence of the same phrase in this file and in skills/gip/SKILL.md (lines 277, 306, 343 here, and SKILL.md lines 102/251), all of which write it unescaped. It's also misquoting gip/SKILL.md's actual text, which reads isolation: "worktree" with no backslashes. The escaping isn't needed at all here — the enclosing "..." are plain prose quotes with no Markdown meaning, so the nested " inside the code span needs no escape.

Suggested change
`isolation: \"worktree\"`".
`isolation: "worktree"`".

Line reference

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 8105b6c.

Rendered it rather than taking the spec citation on trust, since the finding is a claim about output:

$ pandoc -f commonmark -t plain esc.md
gip's "give every subagent isolation: \"worktree\"".

$ pandoc -f gfm -t html esc.md
... <code>isolation: \"worktree\"</code>".</p>

The backslashes survive into both plain text and HTML, exactly as you said, and skills/gip/SKILL.md:102 really does read isolation: "worktree" unescaped -- so it was misquoting its own source. The unescaped form renders isolation: "worktree", matching that line character for character.

Also confirmed the inconsistency claim across the file: preferences.md lines 277, 306, 319, 343 and SKILL.md 102/251 are all unescaped, and line 329 was the only body-prose exception. The only other backslash-escaped quotes in the corpus are inside YAML frontmatter description: strings, where the escape is required and correct -- so nothing else needed touching.


Generated by Claude Code

Comment thread memories/preferences.md Outdated
Comment on lines +335 to +336
`git -C <repo> fetch origin main`, then
`git -C <repo> worktree add <path> 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.

The prescribed fallback command routinely fails on the exact branch name it hard-codes. git worktree add <path> main refuses with fatal: 'main' is already checked out at '<other-path>' whenever main is already checked out anywhere else — which this repo's own git worktree guidance elsewhere already documents (memories/git.md: "Plain git checkout main in a linked worktree correctly refuses when main is checked out in the primary (or any other) worktree").

Two consequences:

  1. This corpus's own session-start convention actively triggers it. CLAUDE.md's "Keep ai-config and repo checkouts fresh" point 1 says to check that the local clone "is on main" — which is exactly the state that makes even the first invocation of this fallback fail.
  2. The gip fan-out use case is defeated entirely. skills/gip/SKILL.md:114 uses this identical command to "create each worktree explicitly" for "every" subagent — but since the branch name is always the literal main, only the first worktree can succeed; every subsequent one collides and errors.

Every other worktree instruction elsewhere in this corpus uses a new branch or --detach instead of reusing a shared branch name (e.g. memories/preferences.md:268: worktree add -b <branch> ... origin/main; skills/ums/SKILL.md:178: worktree add -b "ums-<topic>" ... origin/main; skills/cascade/SKILL.md:43: worktree add --detach <dir>). This new fallback is the only one that names a shared branch literally.

Suggested fix (also applies to the identical command in skills/gip/SKILL.md:114, and removes the need for the stale-local-main check two lines below since it no longer touches the local main ref at all):

git -C <repo> fetch origin main
git -C <repo> worktree add -b <slug> <path> origin/main

Line reference

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 8105b6c, and the finding is right -- but I did not take the suggested command, because measuring it showed it fails on exactly the concurrent fan-out it is meant to serve.

I built a throwaway repo (git 2.43.0) whose local main sat five commits behind origin/main, and ran five worktree creations per round, sequentially and concurrently.

form sequential concurrent
add <path> main, main checked out 0/5 0/5
add <path> main, main free 1/5 see below
add -b <slug> <path> origin/main (suggested) 5/5 failed in 4 of 5 rounds
add -b <slug> --no-track <path> origin/main 5/5 5/5 in all 5 rounds
add --detach <path> origin/main 5/5 5/5 in all 5 rounds

Your diagnosis holds exactly. With main checked out -- this corpus's own session-start state -- every attempt refuses with fatal: 'main' is already used by worktree at '<path>'. With main free, the first agent claims it and the other four get the same refusal, which is the fan-out defeated as you described.

The concurrent row is worse than the error, and is the part I would not have predicted. Run genuinely in parallel, the already-checked-out guard is not atomic: three or four worktrees landed on main simultaneously in every one of six rounds, a state the sequential path refuses. Nothing errors. I then committed in two of them:

fr-1 committed: 40fc674
fr-2 sees main at: 40fc674      <- not its own base
fr-2 committed: e048679

So the agents stack onto each other's commits -- silently, which is the precise collision isolation: "worktree" exists to prevent. The loud refusal is the good outcome.

Why not -b <slug> ... origin/main. Branching with tracking from a remote-tracking ref writes upstream config, and that write takes a .git/config lock the racing agents lose:

error: could not lock config file .git/config: File exists
error: unable to write upstream branch configuration

Rounds scored 4/5, 4/5, 5/5, 4/5, 2/5. --no-track removes the config write and goes 5/5; --detach never creates a branch at all and also goes 5/5.

What landed: git -C <repo> worktree add --detach <path> origin/main, in both preferences.md and SKILL.md:114. --detach over --no-track because the subagent's own brief already tells it to work "on your own branch", so it cuts one inside the worktree -- and it matches cascade's existing worktree add --detach precedent you cited. The full flow (detach, checkout -b, commit, five at once) went 5/5 across three rounds, every worktree based on origin/main.

Your parenthetical about the stale-main check was right too, and I verified the mechanism rather than assuming it: fetch origin main advances origin/main (042c314..7a4a8b8) while leaving local main at 042c314. So basing on origin/main fixes the stale base in the same stroke, and the separate "verify with git log --oneline -1 and realign" step is gone. The measurement is recorded in the entry's case record, and the prose now says the concurrent mode is silent rather than loud.


Generated by Claude Code

Comment thread shared/workflow/ardi.md Outdated

**A blocker that was true when you published it can stop being true while
the PR is open, and withdrawing it is your job, not the reviewer's.**
The bullet above covers a blocker that was never true.

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 diff's insertion breaks a pre-existing back-reference into a direct contradiction. Before this PR, "the bullet above" (this line) correctly referred to the "Verify a blocker you assert..." section (the roxygen2/altdoc#76 case, about a blocker that was never true). This PR inserts a new section directly above this one — "Name the specific gate when you report a blocker..." — which is explicitly about the opposite case: its own text (line 570) says "the call was attempted, it genuinely failed, and the blocker is real. Only the attribution is wrong."

So as of this diff, "The bullet above covers a blocker that was never true" now describes a section that is explicitly about a blocker that is real — a direct contradiction between adjacent lines. This file's own convention is that bare "the bullet above" means the immediately preceding section (see e.g. lines 254, 453, 799), and names non-adjacent references explicitly (e.g. "the regression-test bullet above", "the blocker rule above") — so there's no looser reading that saves this. It also undercuts the sentence's own point: "This is the harder case, because the caveat was correct... " no longer contrasts against anything, since the new adjacent section is also about a correct caveat.

Suggested change
The bullet above covers a blocker that was never true.
The verify-a-blocker bullet above covers a blocker that was never true.

Line reference

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 8105b6c, with one extension beyond the line you flagged.

Confirmed the contradiction: the new section's line 570 reads "the call was attempted, it genuinely failed, and the blocker is real", directly above a line calling the preceding section one about a blocker that was "never true". Your reading of the file's convention holds too -- bare "the bullet above" means the adjacent section at lines 254/453/799, while non-adjacent ones are named (the regression-test bullet above, withdraw-a-stale-blocker bullet below at line 277).

I took your fix and added a clause, because naming the target alone leaves the sentence's own contrast doing less work than it should. There are now three distinct blocker cases in a row, and the reader arrives at this one having just read the middle one:

The verify-a-blocker bullet above covers a blocker that was never true, and
the gate-naming bullet between it and this one covers a real blocker whose
mechanism was misnamed.
This is the harder case, because the caveat was correct and diligent when
written, ...

That distinguishes never-true / real-but-misattributed / true-then-stale, so "the harder case" contrasts against both rather than against nothing.

One more instance of the same breakage, which the finding did not name. Line 860 read "That rule and the blocker rule above both point outward" -- also referring to Verify a blocker you assert. That was already loose before this PR (two candidates); my insertion made it three. Since my diff is what degraded it, I fixed it in the same pass rather than leaving it: it now reads the verify-a-blocker rule above, matching the wording at 611. Flagging it explicitly in case you consider it out of scope -- it is a one-word change to a line the diff otherwise does not touch.

I also swept the neighbours of all four insertion hunks for the same class, mechanically rather than by eye. The remaining adjacency references all still resolve: github.md:382 ("the bullet below") and :401 ("the entry above") both point at bullets before the insertion point; github.md:423, preferences.md:327/332, and ardi.md:567 are inside the new text and point at genuinely adjacent targets -- I checked that the two bullets github.md:423 calls "about staleness" (lines 380 and 399) really are.


Generated by Claude Code

@claude

claude Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Code review

Reviewed the diff (+120/-0 across four files: memories/github.md, memories/preferences.md, shared/workflow/ardi.md, skills/gip/SKILL.md) against the root CLAUDE.md (the only applicable one — no directory-scoped CLAUDE.md files exist under memories/, shared/, or skills/) plus a bug/logic scan of the introduced prose and shell commands.

The memories/github.md entry (the list_pull_requests-always-reports-merged:false finding) checked out clean: the table's claims were spot-checked against live gh pr view output for the three cited PRs (#1005 merged, #1006 open, #505 closed-unmerged) and matched exactly.

Four issues found, all independently verified before posting — see inline comments for full detail and citations:

  1. memories/preferences.md:338 — a forward reference ("further down") to content the reader hasn't reached yet, violating this repo's own shared/writing/forward-references.md rule.
  2. memories/preferences.md:329 — a Markdown rendering bug: backslash-escaped quotes inside an inline code span don't get processed by CommonMark, so the quoted gip text will render with literal backslashes and misquote its source.
  3. memories/preferences.md:335-336 (same command also in skills/gip/SKILL.md:114) — the prescribed fallback git worktree add <path> main hard-codes the literal branch main, which fails whenever main is already checked out elsewhere (including this repo's own primary-checkout convention from CLAUDE.md, and on every subagent after the first in gip's own fan-out use case).
  4. shared/workflow/ardi.md:611 — the new section's insertion breaks a pre-existing back-reference ("the bullet above") into a direct contradiction: the line now describes the immediately-preceding new section as being about a blocker that was "never true," while that new section explicitly says the opposite ("the blocker is real").

Verdict

Needs more work.

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Claude finished reviewView run


Code review

Reviewed the diff (+120/-0 across four files: memories/github.md, memories/preferences.md, shared/workflow/ardi.md, skills/gip/SKILL.md) against the root CLAUDE.md (the only applicable one — no directory-scoped CLAUDE.md files exist under memories/, shared/, or skills/) plus a bug/logic scan of the introduced prose and shell commands.

The memories/github.md entry (the list_pull_requests-always-reports-merged:false finding) checked out clean: the table's claims were spot-checked against live gh pr view output for the three cited PRs (#1005 merged, #1006 open, #505 closed-unmerged) and matched exactly.

Four issues found, all independently verified before posting — see inline comments for full detail and citations:

  1. memories/preferences.md:338 — a forward reference ("further down") to content the reader hasn't reached yet, violating this repo's own shared/writing/forward-references.md rule.
  2. memories/preferences.md:329 — a Markdown rendering bug: backslash-escaped quotes inside an inline code span don't get processed by CommonMark, so the quoted gip text will render with literal backslashes and misquote its source.
  3. memories/preferences.md:335-336 (same command also in skills/gip/SKILL.md:114) — the prescribed fallback git worktree add <path> main hard-codes the literal branch main, which fails whenever main is already checked out elsewhere (including this repo's own primary-checkout convention from CLAUDE.md, and on every subagent after the first in gip's own fan-out use case).
  4. shared/workflow/ardi.md:611 — the new section's insertion breaks a pre-existing back-reference ("the bullet above") into a direct contradiction: the line now describes the immediately-preceding new section as being about a blocker that was "never true," while that new section explicitly says the opposite ("the blocker is real").

Verdict

Needs more work.

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

💰 Cost: $26.7006 (review) — run

claude added 2 commits August 1, 2026 04:00
- preferences.md: drop the forward reference to the persisting-cwd bullet
  and inline its rationale instead.
- preferences.md: unescape the quotes inside an inline code span, which
  CommonMark renders literally and which misquoted gip/SKILL.md.
- preferences.md + gip/SKILL.md: base the worktree fallback on
  origin/main with --detach rather than the bare branch main. Measured:
  the old form scores 0/5 with main checked out and 1/5 with it free, and
  concurrently its guard races several worktrees onto main at once with no
  error. The suggested -b <slug> origin/main form fails four rounds in five
  on a .git/config lock; --detach scores 5/5.
- ardi.md: name the verify-a-blocker bullet explicitly at two back-
  references the new section made ambiguous.

Copy link
Copy Markdown
Collaborator Author

Review round 1: all four findings Addressed

Committed as 8105b6c (on top of a main merge, c44452d -- main had advanced to b16fe72 while this PR was open). Each finding was verified before acting; the per-finding detail and evidence are in the four inline replies.

# Finding Disposition
1 preferences.md:338 forward reference Addressed -- suggestion taken, rationale inlined
2 preferences.md:329 escaped quotes in a code span Addressed -- suggestion taken, rendering confirmed with pandoc
3 hard-coded main in the worktree fallback Addressed -- finding correct, suggested command not used
4 ardi.md:611 broken back-reference Addressed -- suggestion taken, plus a second instance found

Finding 3 is right, and its suggested fix is not

This one is mine originally -- I handed that command to the agent that wrote the entry. Rather than reason about git worktree semantics I measured it: a throwaway repo on git 2.43.0 whose local main sat five commits behind origin/main, five worktree creations per round, sequential and concurrent.

form sequential concurrent
add <path> main, main checked out 0/5 0/5
add <path> main, main free 1/5 guard races -- see below
add -b <slug> <path> origin/main (suggested) 5/5 failed in 4 of 5 rounds
add -b <slug> --no-track <path> origin/main 5/5 5/5 in all 5 rounds
add --detach <path> origin/main 5/5 5/5 in all 5 rounds

Two things the finding did not reach:

  • The naive form's concurrent failure is silent, not loud. The already-checked-out guard is not atomic, so three or four worktrees landed on main at once in every one of six rounds. Committing in two of them showed the second reading main at the first's new commit and stacking on top -- the exact collision isolation exists to prevent, with no error to notice.
  • The suggested -b <slug> ... origin/main loses a .git/config race (could not lock config file .git/config / unable to write upstream branch configuration), because branching with tracking from a remote ref writes upstream config. Rounds: 4/5, 4/5, 5/5, 4/5, 2/5.

Landed git -C <repo> worktree add --detach <path> origin/main in both preferences.md and SKILL.md:114. The suggestion's parenthetical about dropping the stale-main check was correct and is applied -- confirmed that fetch origin main advances origin/main while leaving local main untouched, so origin/main fixes collision and stale base together.

Beyond the flagged lines

Per the neighbours-of-every-hunk sweep, one further instance of finding 4's pattern: ardi.md:860's "the blocker rule above" had two candidates before this PR and three after, so I named it. Called out in the inline reply in case that reads as out of scope. All other adjacency references around the four hunks were checked and still resolve.

Also corrected something no finding raised: my first draft of the rewrite said the naive command "gets three separate things wrong" above an enumeration that did not number three. Dropped the count rather than fixing it, per avoid-hardcoding-external-data.md on counts stated next to the block they describe.

Verification, on 8105b6c

  • Banned punctuation, three-dot range, in Python: 0 banned glyphs and 0 non-ASCII characters over 170 added lines.
  • check-new-line-breaks.py (NLB_BASE_REF=origin/main): No lines missing semantic breaks. Read from output, not exit status.
  • test_check_memory_file_size.py: 13 passed, 0 failed -- run as the test suite, as validate.yml invokes it, not the advisory script. memories/github.md is untouched by this round and stays at 1199.
  • test_validate_skills.py 8/0, test_slb.py 34/0, test_check_install.py 36/0, test_rotate_claude_token.py 23/0, test_find_near_duplicates.py all passed, check-vendored-drift.py clean.
  • validate-skills.py: all skills and manifests valid. check-links.py: no broken relative links across 863 links.
  • markdownlint-cli2: Linting: 445 file(s) / Summary: 0 error(s) -- quoting the scope line, since a bare zero is not evidence on its own.
  • sync-codex-skill-wrappers.py: no drift (I edited skills/gip/SKILL.md; wrappers embed frontmatter, and the edit is body-only).
  • No claude-* model identifier in the diff.

Not merging.


Generated by Claude Code

Copilot AI review requested due to automatic review settings August 1, 2026 04:04
@github-actions
github-actions Bot removed the request for review from Copilot August 1, 2026 04:05
@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Claude finished reviewView run


Code review — PR #1008

I reviewed the current head (8105b6c95a131908d859db7744255ca824410c3f, merged with main at 7fcef4c), which pushed fixes for all four findings from the previous review round.

Prior findings: verified resolved

  1. memories/preferences.md:338 (forward reference) — Fixed. The pointer to "the persisting-cwd bullet further down" was replaced with an inlined, self-contained rationale ("Use git -C rather than cd, because Bash's cwd persists across separate calls in a session...").
  2. memories/preferences.md:329 (escaped quotes in code span) — Fixed. The quote is now unescaped: `isolation: "worktree"`, matching every other occurrence in the corpus.
  3. memories/preferences.md:335-336 / skills/gip/SKILL.md:114 (hard-coded main causing worktree collisions) — Fixed, and improved beyond the suggested fix. The author measured the originally-suggested -b <slug> ... origin/main form and found it fails 4/5 concurrent rounds on a .git/config lock race (writing upstream-tracking config), and landed on --detach instead, which scored 5/5 in all concurrent trials. This is a good example of verifying a suggested fix against real concurrent conditions rather than applying it blindly — well documented with real measurements.
  4. shared/workflow/ardi.md:611 (broken "the bullet above" back-reference) — Fixed. Now reads "The verify-a-blocker bullet above covers a blocker that was never true, and the gate-naming bullet between it and this one covers a real blocker whose mechanism was misnamed" — no longer ambiguous or self-contradictory. The author also proactively found and fixed a second instance of the same ambiguity at ardi.md:862 ("the blocker rule above" → "the verify-a-blocker rule above"), which is good since I confirmed that reference is otherwise still correct.

I re-ran check-links.py (863 links, all resolve) and a punctuation/line-break scan of the full diff (0 banned glyphs, 0 multi-sentence added lines) — both clean.

New finding

memories/preferences.md:335-336,349,356 and skills/gip/SKILL.md:114-115 — The new worktree-fallback guidance hardcodes the literal branch main (git -C <repo> fetch origin main, worktree add --detach <path> origin/main), but skills/gip/SKILL.md already establishes <default-branch> as the correct placeholder for this exact purpose elsewhere in the same file (lines 55, 144-145, 151: "note the default branch... Resolve <owner>/<repo> once", "git fetch origin <default-branch> -q && git checkout -b <slug> origin/<default-branch>").

gip is a general-purpose, repo-agnostic skill (it already parameterizes <repo> in this very command), not scoped to ai-config/gha-family repos that happen to use main. On any repo whose default branch isn't literally main (master, develop, etc.), git worktree add --detach <path> origin/main will fail outright (fatal: invalid reference: origin/main), defeating the fallback exactly in the case it exists to handle. This should use origin/<default-branch> (and fetch origin <default-branch>) to match the file's own established convention. The same fix applies to the parallel prose in memories/preferences.md, which is even more general-purpose (loaded across all repos, not just this one).

This wasn't raised in the prior review round.

Verdict

Needs more work. One new finding: hardcoded main in the new worktree-fallback commands (memories/preferences.md and skills/gip/SKILL.md) should be parameterized as <default-branch>, consistent with gip's own existing convention. All four findings from the prior round are correctly resolved.

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

💰 Cost: $6.2295 (review) — run

The worktree-isolation fallback hard-coded the literal branch `main` in
both the prescribed commands and the prose explaining them, in
memories/preferences.md and skills/gip/SKILL.md.

`gip` is repo-agnostic and already parameterizes `<repo>` in that very
command, and already uses `<default-branch>` for the subagent's own
branch step. On a repo whose default is `master` or `develop` the
prescribed pair dies outright:

  git fetch origin main
  fatal: couldn't find remote ref main

  git worktree add --detach <path> origin/main
  fatal: invalid reference: origin/main

That defeats the fallback in precisely the case it exists for. Measured
against a throwaway repo whose default branch is `develop`; both
commands succeed against `origin/develop`.

Resolution is pointed at rather than duplicated: gip's step 0 already
says to note the default branch, and ums already carries the `gh repo
view --json defaultBranchRef` recipe with its own "don't hard-code main"
note.

The measurement record at the end of the preferences.md entry keeps its
literal `main`, because those runs were made against a repo whose branch
really was `main`; parameterizing a record of commands actually executed
would falsify it. A sentence now says so, and records the new
develop-repo measurement beside it.

Copy link
Copy Markdown
Collaborator Author

Review round 2: the hardcoded-main finding, Addressed

Committed as 7abfed6. The finding is correct and I verified it rather than taking it on the review's word; two details in it needed correcting, and the recurrence is wider than the lines it named.

The failure is real, measured not reasoned

Against a throwaway repo whose default branch is develop and which has no main at all:

command as prescribed at 8105b6c result
git fetch origin main fatal: couldn't find remote ref main (rc=128)
git worktree add --detach <path> origin/main fatal: invalid reference: origin/main (rc=128)

Both succeed against origin/develop (rc=0). So the second error text the review predicted is exactly right, and the fetch half fails first with a different message, which the finding did not mention.

Correction to the finding: the placeholder citation

The finding cites gip lines "55, 144-145, 151" as already using <default-branch>. Only 144, 145, 151 do. Line 55 reads:

and note the default branch. Resolve `<owner>/<repo>` once so you can pass it to

That establishes the concept and the resolution step, but does not use the placeholder. The distinction matters for the fix, because line 55 is what I point at for resolving the value rather than a fourth place the placeholder appears.

Wider than the flagged lines

Per address-every-comment.md on a finding that is a pattern, I swept both files rather than editing the four sites named. Every occurrence, with provenance established from git diff origin/main...HEAD:

site authored by this PR? disposition
preferences.md prescriptive prose + Do/Don't (11 occurrences) yes Addressed
gip 114, 115 (named by review) yes Addressed
gip 117, 118, 120, 124 (not named by review) yes Addressed
gip 40, 71 no, pre-existing Deferred to main, see below

gip:117 is the one worth calling out: its whole subject is which ref to base a worktree on, and it hardcoded the branch while saying so, which makes it the sentence a reader is likeliest to copy.

Two pre-existing occurrences, deliberately not fixed here

gip:40 (must branch from that MR's tip, not main) and `gip:71` (`it can branch straight from `origin/main) are byte-identical to origin/main and untouched by this PR's diff. Both are triage-criteria prose rather than copyable commands.

Left alone per address-every-comment.md's main-sync rule and dont-incur-technical-debt.md's "authorship, not adjacency": fixing them on this branch would put it out of step with main on content this PR did not author, and the fix target is main itself. Flagging rather than silently dropping, since my edit does leave gip:71 and the new gip:121 describing the same choice differently. One line to overrule if you would rather I fold them in.

How it was parameterized

Resolution is pointed at, not duplicated -- gip's step 0 already says to note the default branch, and ums/SKILL.md:227-228 already carries the recipe with its own # discover the base -- don't hard-code main. So no third copy of gh repo view --json defaultBranchRef was added.

The measurement record at the end of the preferences.md entry keeps its literal main deliberately. Those runs were made against a repo whose branch really was main; parameterizing a record of commands actually executed would falsify it. A sentence now says so explicitly, notes that this is why those runs never surfaced the hardcoding, and records the develop-repo measurement beside it.

Verification, on 7abfed6

  • Banned punctuation, three-dot range, in Python: 0 banned glyphs and 0 non-ASCII over 189 added lines -- quoting the examined count, since a bare zero is not evidence on its own.
  • check-new-line-breaks.py (NLB_BASE_REF=origin/main): No lines missing semantic breaks. Read from output, not exit status.
  • test_check_memory_file_size.py: 13 passed, 0 failed -- run as the test suite exactly as validate.yml invokes it (python3 scripts/test_check_memory_file_size.py), not the advisory script. Includes PASS: this repo's own memories/ is under the 1200-line default. preferences.md is 811 lines; memories/github.md is untouched by this round and stays at 1199.
  • sync-codex-skill-wrappers.py: regenerated 175 wrappers, git status --porcelain empty afterward, so no drift. Run because this PR edits a skills/ file.
  • validate-skills.py: all skills and manifests valid. check-links.py: no broken relative links across 863 links in 426 files -- which covers the two new ../skills/ums/SKILL.md references.
  • Neighbours of every hunk re-read. The gip:128 back-reference and preferences.md's own wording were kept consistent when "stale-local-main trap" became "stale local base". The "wrong in more than one way at once" phrasing carries no count, so adding a fourth way does not stale it.
  • No claude-* model identifier in the diff.

Not verified this round: markdownlint-cli2 is not installed in this container (npx declined to fetch it), so unlike the previous round I have no result to quote for it. Only .md prose changed and no list or heading structure was touched.

Not merging.


Generated by Claude Code

Copilot AI review requested due to automatic review settings August 1, 2026 04:46
@github-actions
github-actions Bot removed the request for review from Copilot August 1, 2026 04:47

Copy link
Copy Markdown
Collaborator Author

One follow-on from 7abfed6 that I am flagging rather than fixing: the PR body is now stale, in the one copy address-every-comment.md notes a grep over the diff can never find.

Section 2 still says:

What landed is git -C REPO worktree add --detach PATH origin/main, in both files. Basing on origin/main also removes the stale-base trap ...

As of 7abfed6 what landed is origin/<default-branch> in both files, so that sentence now describes the superseded form. It is also the sentence a reader checking "what does this PR actually do" before merging is likeliest to land on.

Not editing it myself for two reasons. The body is your correction log, and adding a fourth item to a numbered [!NOTE] block you wrote is your call rather than mine. And the API hands the body back HTML-entity-escaped (&gt;, &#34;), so a full round-trip rewrite risks double-escaping the alert block and the two tables -- a worse outcome than one stale sentence that this thread already corrects.

Suggested minimal edit, if you want it: change that sentence to name origin/<default-branch>, and add a note item recording that round 2 found the hard-coded branch.


Generated by Claude Code

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor
PR Preview Action v1.8.1
Preview removed because the pull request was closed.

2026-08-01 05:18 UTC

@claude

claude Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Code review

Re-reviewed at head 7abfed6be383dd00d0d41a172c57fea75e1c6e19. All four findings from the prior review were verified fixed, and no new issues were found.

Verified fixes:

  1. memories/preferences.md forward reference -- the "per the persisting-cwd bullet further down" phrasing is gone; the rationale for git -C over cd is now stated inline and self-contained.
  2. memories/preferences.md backslash-escaped quote -- the code span now reads `isolation: "worktree"` unescaped, matching every other occurrence in the file and in skills/gip/SKILL.md.
  3. Hard-coded main in the fallback worktree command -- reworked substantially beyond the original suggestion. The new fallback resolves <default-branch> dynamically (matching gip's own step 0 and ums's existing convention) and uses worktree add --detach <path> origin/<default-branch> rather than a tracking branch. The PR body documents empirical testing (git 2.43.0, sequential and concurrent worktree creation) showing the reviewer's originally suggested -b <slug> ... origin/main form fails in 4/5 concurrent rounds on a .git/config lock race, which is why --detach was chosen instead -- a good example of testing a suggested fix against real behavior rather than applying it verbatim. Same fix applied identically in skills/gip/SKILL.md.
  4. shared/workflow/ardi.md broken back-reference -- "the bullet above" at the contradiction point now reads "The verify-a-blocker bullet above ... and the gate-naming bullet between it and this one ...", correctly disambiguating between the two adjacent sections. The second occurrence of the same ambiguous reference (further down, near "That rule and the blocker rule above") was also fixed to "the verify-a-blocker rule above".

Independently re-verified in this round (not just re-reading the diff):

  • memories/github.md is 1199 lines; python3 scripts/check-memory-file-size.py and test_check_memory_file_size.py (13 passed) both confirm it's under the 1200-line gate.
  • python3 scripts/validate-skills.py and python3 scripts/check-links.py both pass (0 broken links across 871).
  • Zero banned punctuation characters (em-dash, en-dash, curly quotes, multiplication sign) in the diff's added lines.
  • Zero multi-sentence lines detected in the diff's added lines (semantic-line-break check).
  • Cross-references check out: gip/SKILL.md's "step 0" (line 55) precedes the new content (line ~108) as claimed; ums/SKILL.md does resolve the default branch dynamically as claimed; memories/github.md's two resolve_review_thread gate errors (lines 649/652) match what ardi.md's new section describes; the fully-clean.md "constant carries no information" citation resolves; issues memories/github.md is 24 lines from the 1200-line limit, which validate enforces as a hard gate #1007 and memories/github-actions.md has crossed the 1200-line advisory threshold (1247) #811 referenced in the PR body both exist with matching titles.

Verdict

Ready for merge.

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Claude finished reviewView run


Posted the review comment: #1008 (comment)

Summary

Re-reviewed PR #1008 at head 7abfed6be383dd00d0d41a172c57fea75e1c6e19. All four findings from the prior review round were verified fixed by direct inspection of the current file contents:

  1. Forward reference in memories/preferences.md — removed, replaced with inline self-contained rationale.
  2. Backslash-escaped quote in a code span — fixed, now renders correctly.
  3. Hard-coded main in the fallback worktree command — substantially reworked with dynamic default-branch resolution and --detach, backed by documented empirical testing showing the reviewer's original suggestion actually fails under concurrency.
  4. Broken back-reference in shared/workflow/ardi.md — both occurrences of the ambiguous "the bullet above" were disambiguated.

I also independently re-ran the repo's own validators (check-memory-file-size.py, test_check_memory_file_size.py, validate-skills.py, check-links.py), scanned the diff for banned punctuation and multi-sentence lines, and spot-checked several cross-references and cited issue numbers (#1007, #811) — all checked out clean. No new issues found.

Verdict

Ready for merge.

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

💰 Cost: $7.1227 (review) — run

@d-morrison
d-morrison merged commit 3eb15a4 into main Aug 1, 2026
10 checks passed
@d-morrison
d-morrison deleted the ums/list-merged-worktree-precondition branch August 1, 2026 05:18
d-morrison added a commit that referenced this pull request Aug 1, 2026
PR #1008 parameterized the base branch across this file but left two
prescriptive instances reading the literal `main`, so one file now gave the
same instruction two ways. Deferred there rather than fixed, correctly: both
lines were byte-identical to `main`, so editing them on that branch would
have put it out of step. #1008 has since merged, which is the follow-up its
own rule prescribes.

Line 71 read `origin/main` where the surrounding steps prescribe
`origin/<default-branch>`; line 40 named `main` as the base an issue branches
from. Both now name the parameter.

Left alone: the two occurrences that are evidence rather than instruction --
the sentence naming the literal string `main` as the thing not to hard-code,
and the verbatim `fatal: invalid reference: origin/main` a reader will match
against their own terminal.

Line 71's em-dash became this diff's to fix once the line was edited, so it is
now `--`.

Co-authored-by: Claude <noreply@anthropic.com>
d-morrison added a commit that referenced this pull request Aug 1, 2026
…and two self-contradictions

Four findings, all correct, all verified against live API state rather
than reasoned about.

1. fully-clean.md's case record claimed Copilot's check run on #1008
   completed success at 04:50:41Z. There is no such check run. Neither
   #1005 nor #1008 carries ANY Copilot-attributable check context (8 and
   10 checks respectively; filtering either for /opilot/ returns 0), and
   that holds both where Copilot posted a refusal and where it was
   silent. Rewrote the mechanism: the silence is invisible on the check
   surface by construction, not misread from a green Copilot check --
   which is a stronger argument for the section's own advice. Left the
   error visible in the record rather than deleting it.

2. The prescribed lookup named user.login while tool-mappings.md's CLI
   fallback exposes author.login, and the two surfaces also disagree on
   whether the value carries [bot]. Measured on #1005: REST returns
   copilot-pull-request-reviewer[bot] under user.login, gh pr view
   returns copilot-pull-request-reviewer under author.login. Mixing them
   returns zero hits and reads as 'did not review' -- the exact false
   negative the section is about. Now a two-row table.

3. avoid-hardcoding-external-data.md said the judgment was 'never written
   down' four lines below quoting one of the two files writing it down.
   Both files state it, in fact. Replaced with the point that survives:
   an in-file rationale protects a reader, not a grep, so a sweep
   re-flags them regardless.

4. metacognitive-monitoring.md said 'four findings' then 'the five
   findings'. Reconciled, and corrected its closing claim: that entry is
   where 04:50:41Z came from, and it called its own conclusion 'exactly
   right'. It was not. A verification that adjusts a figure without
   asking whether the measured thing exists propagated the fabrication
   into fully-clean.md instead of catching it, so the record now reads
   five of six rather than five of five.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
d-morrison added a commit that referenced this pull request Aug 1, 2026
* ums: a handed finding's particulars are the half that is wrong

Three findings from the six-PR session that merged #996, #999, #1003, #1004,
#1005 and #1008, plus one candidate declined as already covered.

metacognitive-monitoring: extends 'A premise you were handed is still a claim'
to a premise handed by a reviewer rather than by a person. That section's only
detector is a hedge in the source, and a review comment carries none, so the
signal is silent exactly where the premise most often arrives. Records the
asymmetry that says which half to check: across five findings the conclusion
held five times and the particulars were wrong five times, and particulars are
what decide the edit list. Adds the two reasons the check feels done when it
is not, comprehension and delegation.

fully-clean: a third state for the same external reviewer, alongside the fifth
case's refusal. Its check run completes success having posted no review at
all, so nothing on the PR reports that a configured reviewer never weighed in.
Defeats the 'no verdict is its own state' remedy, which reads the job outcome
and is scoped to a job that failed.

avoid-hardcoding-external-data: the boundary the parameterize rule must not
cross. A quoted command that was run, a verbatim error string, and the stated
conditions of a measurement are claims about the past, so substituting a
parameter falsifies them rather than generalizing them.

Declined: that merge-base --is-ancestor reports non-ancestor for every branch
in a squash-merge repo. Measured true here, 8 of 8, all merged, but CLAUDE.md
already states it flatly at two sites.

* fully-clean: name the query that does distinguish a silent reviewer

The third-state case record closed by saying nothing anywhere on the PR
distinguished a reviewer that had approved from one that never spoke. The
sentence directly above it reports the opposite: the login-filtered review
list returned eight reviews with none from Copilot, which is exactly the
discriminator, and exactly what the section's own Do-bullet sends a reader
to fetch.

The body prose was already right -- nothing on the PR *reports* the gap on
its own -- but the case record escalated that to *distinguished*, which
contradicts the check the section exists to prescribe. Naming the query
keeps the intended contrast with the green-check signal and makes the point
land harder: every signal except the prescribed one was uninformative.

* address review: an invented check run, a two-surface field mismatch, and two self-contradictions

Four findings, all correct, all verified against live API state rather
than reasoned about.

1. fully-clean.md's case record claimed Copilot's check run on #1008
   completed success at 04:50:41Z. There is no such check run. Neither
   #1005 nor #1008 carries ANY Copilot-attributable check context (8 and
   10 checks respectively; filtering either for /opilot/ returns 0), and
   that holds both where Copilot posted a refusal and where it was
   silent. Rewrote the mechanism: the silence is invisible on the check
   surface by construction, not misread from a green Copilot check --
   which is a stronger argument for the section's own advice. Left the
   error visible in the record rather than deleting it.

2. The prescribed lookup named user.login while tool-mappings.md's CLI
   fallback exposes author.login, and the two surfaces also disagree on
   whether the value carries [bot]. Measured on #1005: REST returns
   copilot-pull-request-reviewer[bot] under user.login, gh pr view
   returns copilot-pull-request-reviewer under author.login. Mixing them
   returns zero hits and reads as 'did not review' -- the exact false
   negative the section is about. Now a two-row table.

3. avoid-hardcoding-external-data.md said the judgment was 'never written
   down' four lines below quoting one of the two files writing it down.
   Both files state it, in fact. Replaced with the point that survives:
   an in-file rationale protects a reader, not a grep, so a sweep
   re-flags them regardless.

4. metacognitive-monitoring.md said 'four findings' then 'the five
   findings'. Reconciled, and corrected its closing claim: that entry is
   where 04:50:41Z came from, and it called its own conclusion 'exactly
   right'. It was not. A verification that adjusts a figure without
   asking whether the measured thing exists propagated the fabrication
   into fully-clean.md instead of catching it, so the record now reads
   five of six rather than five of five.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
d-morrison added a commit that referenced this pull request Aug 3, 2026
fully-clean.md criterion 1 gains a block saying gh pr checks is not a
complete enumeration of a head's check runs, naming the commit
check-runs endpoint as the authority for "has everything finished",
and distinguishing this from the existing workflow-run-vs-check-run
gap two paragraphs above. It states plainly that the reason for the
omission is unestablished, names the three untested candidates, and
records the counts that disqualify each.

The fifth case's "no check run at all / by construction" claim is
corrected to what was measured, with both dates kept. On #1005 and
#1008 the commit check-runs endpoint returns one
copilot-pull-request-reviewer run each, conclusion success, while
gh pr checks returns zero for both. That also reinstates the
04:50:41Z figure a later revision retracted: check run 91327863807
on 7abfed6 reads completed_at 2026-08-01T04:50:41Z, success.

metacognitive-monitoring.md's sixth-instance paragraph asserted the
same refuted claim, so it is corrected in the same pass.

Closes #1074
d-morrison added a commit that referenced this pull request Aug 3, 2026
…fifth case (#1079)

* start: document gh pr checks incompleteness in fully-clean.md (closes #1074)

* Record that gh pr checks omits check runs, and correct the fifth case

fully-clean.md criterion 1 gains a block saying gh pr checks is not a
complete enumeration of a head's check runs, naming the commit
check-runs endpoint as the authority for "has everything finished",
and distinguishing this from the existing workflow-run-vs-check-run
gap two paragraphs above. It states plainly that the reason for the
omission is unestablished, names the three untested candidates, and
records the counts that disqualify each.

The fifth case's "no check run at all / by construction" claim is
corrected to what was measured, with both dates kept. On #1005 and
#1008 the commit check-runs endpoint returns one
copilot-pull-request-reviewer run each, conclusion success, while
gh pr checks returns zero for both. That also reinstates the
04:50:41Z figure a later revision retracted: check run 91327863807
on 7abfed6 reads completed_at 2026-08-01T04:50:41Z, success.

metacognitive-monitoring.md's sixth-instance paragraph asserted the
same refuted claim, so it is corrected in the same pass.

Closes #1074
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.

3 participants