curate: 15 trap.d/ fragments -- 3 new rules, 6 merged, 3 declined, 3 deferred - #1735
Merged
Merged
Conversation
…deferred /oss:curate pass over the 15 fragments waiting in trap.d/. Every fragment was re-confirmed against the current tree (grep/read/reproduce) before deciding, since several were audit findings that could already have been fixed by a later commit. Promoted (3 new rules, each with a reproduced must-fire payload and a must-stay-silent control against an unrelated scripts/ file): - paths/00-manual/worktree-reap-precedence-bug.md (#1637): gh pr list returns newest-first, branch_merge_state only makes MERGED sticky, so an older CLOSED row can overwrite a newer OPEN one and plan_reap force- removes a live lane's worktree. Reproduced against the real function. - paths/00-manual/release-gate2-comment-age-type.md (#1706): a string comment-age value reaches a bare `<` comparison with no type check and crashes with the same exit code (1) as a genuine blocked disposition -- reproduced directly with a fake payload. - paths/00-manual/review-return-backref-fenced-code.md (#1727): the _BACKREF regex fires on back-reference-shaped phrases quoted as repro text inside a fenced code block, misclassifying a fully-stated message as referred-not-stated -- reproduced against the incident's own message. Merged (6, each confirmed still live before merging): - paths/00-manual/loop-prose-parity.md gains five bullets: #1681 (release gate 2's comment-age null requirement never stated), #1689 (a handback line with no documented reader), #1695 (triager hardcodes a literal label spelling), #1705 (findings.md names a gh-labels call that supertool refuses), #1721 (tick-order.md's DOCTOR_ROOT missing the same staleness check gate 3 already got). - vocabulary/00-manual/could-not-tell-shallow-clone.md gains a paragraph for #1692: statusline.py's since_floor has the same shallow-clone gap release_delta.py already guards against. Declined (3): #1690's doctor-role-marker fragment (fixed by #1728, agents/doctor.md already clears its own marker) and #1690's changelog overclaim fragment (already corrected inside the v0.41.1 release commit) are both already-shipped work; #1701 is a narrow, self-referential CLAUDE.md citation drift, not a recurring pattern a rule could catch. Traced in paths/00-manual/00-README.md. Deferred, left unchanged (3): #1630, #1660, #1667 all still need the same thing the 2026-09-17 pass already named for them (a design decision on a reap sweep, an instrumented CI run, and old CI logs that may no longer be retrievable) -- nothing here changes that. Part of #1637, #1706, #1727, #1681, #1689, #1690, #1692, #1695, #1701, #1705, #1721. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
/oss:curate pass over the 15 fragments waiting in
trap.d/. Every fragmentwas re-confirmed against the current tree (grep/read/reproduce) before
being decided, since several were release-audit findings that could
already have been fixed by a later commit.
This PR is the review. It closes nothing --
no_closeis set -- becausethis pass consumed each fragment into a rule, a merge or a decline instead
of doing the issue's own underlying work.
Promoted -- 3 new rules
Each has a reproduced must-fire payload and a must-stay-silent control
against an unrelated
scripts/*.pyfile (checked with the shippedpre-path-hook.shdirectly, both directions, per/oss:curate's ownfiring-proof requirement).
.claude/jit-context/paths/00-manual/worktree-reap-precedence-bug.md(Part of doctor: clear the launcher skew WAIT, disposition the repair arm's writes, and reap idle worktrees #1637):
gh pr listreturns newest-first, andbranch_merge_stateonly makesMERGEDsticky -- every other rowunconditionally overwrites
state, so the last-processed (oldest) rowwins. A branch whose newer PR is OPEN and whose older PR is CLOSED reads
"closed"overall, andplan_reapthen force-removes a live lane'sworktree. Reproduced by reading the real loop in
scripts/worktree_reap.py..claude/jit-context/paths/00-manual/release-gate2-comment-age-type.md(Part of release_gate2.py: three absence/format defects share one rendering #1706):
latest_review_comment_age_minutesas a string reachesa bare
age < threshold_minuteswith no type check and crashes with thescript's own
EXIT_BLOCKEDcode -- a malformed field renders exactlylike "in-flight, release blocked" rather than "could not tell".
Reproduced directly:
echo '[{"number":1,"review_decision":"NONE","lane_active":false,"latest_review_comment_age_minutes":"5"}]' | python3 scripts/release_gate2.py --prs-json -raises
TypeErrorand exits 1..claude/jit-context/paths/00-manual/review-return-backref-fenced-code.md(Part of review_return.py's referred-not-stated heuristic false-triggers on a fully-enumerated FINDINGS message that merely uses a back-reference phrase #1727):
_BACKREFfires on a back-reference-shaped phrasequoted as example/repro text inside a fenced code block, misclassifying
a message that fully states every finding as
referred-not-stated.Reproduced against the incident's own reviewer message via
review_return.py --framed.Merged -- 6, into 2 existing rules
Each confirmed still live against the current tree (direct grep/read)
before merging.
.claude/jit-context/paths/00-manual/loop-prose-parity.mdgains fivebullets, all confirmed live:
release.mdnever states the comment-age field needsan explicit
null, never an omitted key, for a PR with no reviewcomment.
agents/scheduler-step.md'sPLUGIN-ROOT: could-not-runhandback line has no documented reader anywhere in
commands/run.md.agents/triager.md's priority floor still hardcodesthe literal
priority-lowinstead of the declaredlabels.priority.findings.mdnames agh-labels:repo:OWNER/NAMEcallthat the installed supertool refuses outright (reproduced:
gh-labels takes at most one argument, got 2).tick-order.md'sDOCTOR_ROOTresolution never gotthe same stale-root check Gate 3 resolved-install can return a stale plugin root, and the spawn resolves its own root independently #1721 built for gate 3.
.claude/jit-context/vocabulary/00-manual/could-not-tell-shallow-clone.mdgains one paragraph:
rel ?/?on a repo with no version tag hides a measured numerator -- every commit is banked toward the first release #1692 --statusline.py'ssince_floorhas the identicalshallow-clone truncation gap
release_delta.pyalready guards against.Declined -- 3
Traced in
.claude/jit-context/paths/00-manual/00-README.md:doctor spawn never clears its role marker, so /oss:run's first tick after step 1 always refuses (#1716 composition) #1728;
agents/doctor.mdclears its own marker as its last act.already corrected inside the v0.41.1 release commit's own history;
changelog.d/1690.fixed.mdno longer exists and the shippedCHANGELOG.mdentry makes no such claim.CLAUDE.mdcitation drift(a stale line reference in its own release-history prose), not a
recurring pattern a rule could catch, and outside what this pass may
rewrite.
Deferred -- 3, left unchanged in
trap.d/1630.fifty-one-worktrees-accumulate-because-every-reap-gate-declines,1660.pytest-leg-margin-arithmetic-ignores-pre-run-tests-step-overheadand
1667.next-minor-pin-guard-failed-on-one-leg-and-passed-on-threewereall already deferred by the 2026-09-17 pass for reasons that still hold
(a design decision on a separate reap sweep, an instrumented CI run, and
CI logs from an old run that may no longer be retrievable). Nothing new
here changes that, so they stay in
trap.d/untouched.Test plan
pytest tests/test_content_invariants.py tests/test_trap_scaffold_1302.py tests/test_trap_curate_905.py --no-cov -q-- 237 passedpytest tests/test_oss_rules.py tests/test_jit_layer_readers.py tests/test_jit_rule_migration_245.py --no-cov -q-- 104 passedpre-path-hook.sh/pre-prompt-hook.sh, both directionsgit status --porcelain trap.d/showed every deletion as tracked (D), recoverable viagit checkout --, before committing🤖 Generated with Claude Code
[AI-generated]