Repository navigation
fix(planning): let any session re-pin an interview-defenses digest - #10140
Conversation
repin.sh no longer refuses without a terminal or asks y/N: it rewrites the one sha256 literal, adds the reason above the pin, and prints `<label>: <old> -> <new>` for the commit message. The defenses suite's header and failure messages drop the attended-only rule; the commit records old -> new and why the defense holds, and PR review judges it, as approval and snapshot tests are re-approved by the developer and reviewed in code review. Every digest stays: phrase and whole-line pins cannot see a qualifier added beside a pinned line. Refs: #8220, #10044 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
repin.sh cut a label such as `SKILL.md "does NOT do" section ...` at its first inner quote; the capture now ends at the call line's last quote. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
PR body contract — issue linkage This PR body conforms to the issue-linkage contract. Nothing to do. |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
claude-review reviewed No findings. I read the full diff and PR context, then checked What I checked
For a person to know, not a defect: With the terminal and y/N gate gone, a lane can edit guarded interview text and re-pin its digest in the same PR. The digest then only forces the change to be acknowledged, and the PR review is the only check on whether the defense still holds. The PR body says the owner chose this on 2026-10-25, so I did not count it as a finding. Not verified: I had no shell, so I ran none of the suites. The pass counts in the PR body ( Spend and holds: The change spends nothing and sets no hold. Trusted-path globs matched none of the four changed files. |
|
claude-security-review reviewed Security review of #10140 at 942388a. The diff touches no trusted-path file (no trusted-actors, check-trusted-trigger, CODEOWNERS or .gitmodules), no plugin manifest and no workflow, so the manifest and Actions-hardening items don't apply. The skip gate does not apply either: the diff deletes a standing control, so I read it under the instruction-surface lens and the register at critical-findings: 0 IMPORTANT: the diff lets an agent re-pin the tripwire over its own edit, and the only stated authority for removing the gate is the PR text. The register's
Spend: no billed resource or paid setting changes. |
Refs: #6728
Refs: #7425
Refs: #9864
Refs: #10044
Refs: #10087
Refs: #8756
Summary
A sha256 digest re-pin in
plugins/planning/tests/interview-defenses.test.shneeded a person.tests/repin.sh(added in #8220) refused to write unless stdin and stdout were both terminals, and then asked y/N. The suite's header and every failure message said re-pinning was attended-only. So every lane PR that edited guarded interview text stopped for the owner: #10044 today, and #6728, #7425 and #9864 sit inneeds-humanfor this gate alone. The owner removed this stop on 2026-10-25. Only an intent change or a security issue stops an item; the review lanes judge everything else.This PR removes the gate. Any session, a lane included, may re-pin a digest after reading the diff of the guarded text. The commit records old -> new and why the defense still holds, and the PR review judges the change.
It clears no issue by itself. #6728, #7425 and #9864 still need their own wording edits, but nothing now blocks a lane from making them. #10087 asks for a notice that assumes the attended-only guard stays, so this PR makes it moot. The multi-label half of #8756 still stands.
Fix
tests/repin.sh:git diff --statand pager block, and exit codes 5 and 6.<label>: <old> -> <new>for the commit message.tests/interview-defenses.test.sh:ATTENDED_ONLYbecomesUPDATE_RULE: read the diff, then commit old -> new with the reason.REPIN_HINTdrops "in their own terminal (a Claude Code ! line has no terminal)".tests/repin.test.shruns every case with no terminal:label: old -> newline.planning(patch).Option chosen: (a) agents re-pin without a terminal, and every digest stays.
interview-defenses.test.sh:14-21,:65-67).:42-61). Deleting a digest reopens a hole that has already been shown to work.SKILL.mdorloop.mdalready shows the change. The digest only forces the change to be acknowledged in the same PR, and the failure names the file and section headings to diff.Basis:
*.approved.*files must be checked into source your source control."jest --updateSnapshot, and CI does not write snapshots.accept"operates exactly likereview" without the interactive step.None of these puts a person in the tool's non-interactive path. The human check is review of the committed diff, which the review lanes do here.
No other plugin carries a copy of this gate. I searched
plugins,scripts,.githubanddocs/conventionsforrepin,re-pin,attended-onlyand-t 0/-t 1terminal checks. The other "attended only" rules found are different mechanisms: a person's browser driver intestingandapp-control, andwork-items:ship run.Verification
bash plugins/planning/tests/repin.test.sh: passed 16, failed 0. Againstorigin/main's gatedrepin.shthe same suite fails 8 of 16, so the new cases can fail.bash plugins/planning/tests/interview-defenses.test.sh: PASS=172 FAIL=0.shellcheckon all three edited scripts: clean.plugins/planning/**/*.test.shsuites exited 0. One of them,shared/tests/tracer-live.test.sh, printedSKIP: no cloudflared;surface/surface.test.shreported SKIP=1.align542/542,tracer18,surface-journey249,surface-ui-c191,surface241,watch31,interview-defenses172,reattach-slice23,repin16,standards-binding9.shared/tests/ui.test.shran for more than 10 minutes. Its slowest files wereui_presence.jsat 187s andui_layout.jsat 145s.repin.shcutting a label at its first escaped quote (for example the"does NOT do"pin).repin.test.shnow uses a fixture label with escaped quotes; it passes 16/16 and fails 15/16 against the old capture.origin/mainat 2d9ac7f, which includes fix(planning): merge the exported Brief into PLAN.md in place and stop claiming the gate sees post-Confirm edits #10044.Related
repin.sh.🤖 Generated with Claude Code