Skip to content

fix(gate): scope wording in the worktree gate (BACKLOG #1082) - #635

Merged
wshallwshall merged 2 commits into
mainfrom
claude/builder-1-1082-scope-wording
Aug 28, 2026
Merged

fix(gate): scope wording in the worktree gate (BACKLOG #1082)#635
wshallwshall merged 2 commits into
mainfrom
claude/builder-1-1082-scope-wording

Conversation

@wshallwshall

Copy link
Copy Markdown
Collaborator

Wording fix in the worktree gate's scope reporting.

Built by builder-1. 638 gate tests, 0 failed.

The mutation result is the part worth reading: disabling the scope branch reds FOUR
wording rows and leaves THREE green -- the two verdict rows and the repository-scope
control. That split is the evidence the gate's verdict does not move, which is the
property this item most needed to protect. A mutation that reddened everything would
not have shown that.

Ledger hunk is mid-file (line 5185 of 16,376). Verified to merge cleanly against main
AND to pair cleanly with #1069's branch.

Not armed.

Co-Authored-By: Claude Opus 5 noreply@anthropic.com

wshallwshall and others added 2 commits August 27, 2026 18:28
…se (BACKLOG #1082)

Rule 3c had ZERO mentions of --global/--system, so every disarm write got the
same sentence: "would change the SHARED git configuration of <repo>". That is
false for those scopes -- the write lands in the per-user or machine-wide file.

THE VERDICT DOES NOT MOVE AND MUST NOT. Git falls back to those scopes when the
repository does not set the key, so the write can still disarm the checkout by
inheritance. An earlier filing of this as a FALSE DENY was withdrawn by three
verifiers who measured the hook genuinely not firing afterwards; flipping rule 3c
to ALLOW would have been a fail-open.

The opening and the mechanism paragraph now branch on scope. A scoped write is
told which file it actually writes and why it is refused anyway. The
repository-scope wording is unchanged and pinned by its own control, so this did
not trade one false sentence for another.

NOTHING IN THE NEW TEXT REASSURES, and the tests pin the ABSENCE of four phrases
rather than the presence of one. That is this row's round-4 lesson: segments are
judged one at a time and Write-Deny exits on the first hit, so a reassurance
prints over a real disarm when a LATER segment does a local write. A candidate
that printed "This does NOT change the shared configuration" was graded BLOCKING
by three verifiers for exactly that.

TESTED BY THE STRING, NOT THE VERDICT -- forced, not stylistic. The verdict is
identical before and after, so a row ending in a bare assert_denied cannot see
this defect, and the round-4 mutant that reinstated the old sentence survived
such a row.

Mutation: disabling the scope branch reds FOUR wording rows and leaves THREE
green -- the two verdict rows and the repository-scope control. That split is
the evidence that the verdict genuinely does not move.

A QUALIFIER THE ROW DOES NOT HAVE, measured here: whether a --global write takes
effect depends on WHERE IT IS READ FROM. From a worktree core.hooksPath is set at
worktree scope (75 of 76 config.worktree files) so global loses; from the primary
it is unset at every scope (--get exit 1, control core.bare exit 0) so global
WOULD take effect. The row states only the first. Denying is correct for both.

The multi-line residual the row names is NOT fixed here and still needs its own
item: segments split on lines and the first hit exits.

Regression: 638 passed, 0 failed across all eight gate suites plus the new file
-- 631 before, so the delta is exactly the seven tests added.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…st (BACKLOG #1082)

PR 635 is RED on three required legs with one deterministic cause:

  tests/test_tooling_partition.py::test_every_non_engine_test_is_classified
  "unclassified: ['test_worktree_gate_scope_wording.py']"

Same defect and same fix as PR 634, which is the point worth recording: two branches off one lane both
added a gate test file and neither listed it, so this is a lane habit rather than a one-off slip. The
same lane's #1296 branch DOES get it right, so the knowledge was present and the step was skipped.

Manifest, not _STAYS_WITHOUT_IMPORTING: the test drives the hook as a subprocess and does not read
engine source.

NOT A FLAKE. The lander playbook records tooling_partition as never flaky and says a re-run past one
lands a defect on purpose. Three legs, one cause, is the signature.

INSERTED IN THE FILE'S OWN ORDER, NEVER SORTED -- tests/tooling_manifest.txt is not plain lexicographic
and a sort() rewrites unrelated lines. Anchored on the following entry.

Measured, with an interpreter borrowed from a sibling worktree (this one has no venv) and VERIFIED to
read THIS tree rather than the lender's:

   red-first: reverting only this line reds test_every_non_engine_test_is_classified and nothing else
     (1 failed / 8 passed); restoring it returns 9 passed
   git diff --numstat reads 1/0 -- a re-sort would have shown roughly 22 on both sides
   rebased onto a490993 first; the rebase was clean

Rebase note for whoever pushes: this branch was 23 behind and is now ahead 1 of a490993, so the PR
head moves and needs a force-update with a lease.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@wshallwshall
wshallwshall force-pushed the claude/builder-1-1082-scope-wording branch from a3b79da to 60a9394 Compare August 27, 2026 23:30
@wshallwshall
wshallwshall added this pull request to the merge queue Aug 28, 2026
Merged via the queue into main with commit 8b6f8a0 Aug 28, 2026
39 of 40 checks passed
@wshallwshall
wshallwshall deleted the claude/builder-1-1082-scope-wording branch August 28, 2026 00:16
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