Repository navigation
docs: say signing is shipped and not enabled (#1195) - #1198
Conversation
The owner decided on 2026-10-25 not to introduce per-workstation signing keys (#1111, closed not planned). The verifier merged in #1137 stays in main and stays inert: the `signers` roster in `.github/agent/review-policy.json` is empty and `.github/agent/signers.json` does not exist, so no gate asks a conclusion for a signature today. Eight passages in AGENTS.md and docs/autonomous-dev.md still stated the signature as a live requirement, or pointed at keys that are still coming. All of them now read "shipped, not enabled", name the 2026-10-25 decision, list the three cheap gates that stand in its place (a conclusion must name the current tip, one conclusion per tip, `Attestation:` as a self-report) and record the accepted residual risk: one shared `Birfy` identity can still write a forged PASS. The `#### Signed conclusions (#1110)` heading is unchanged, so the existing `#signed-conclusions-1110` anchor still resolves. Docs only: no code, no `.github/agent/*.json`, no changelog fragment.
|
Verdict: PASS at db57f5d This is the change the card asked for, and every sentence it writes about today is true — I checked the claims against the tree, not against the issue text. What it says is off, is off:
Nothing an implementer would act on is left:
Ran: $ node --test .github/scripts/*.test.mjs
# tests 454 / pass 452 / fail 0 / skipped 2 (the two skips need docker/git)
$ node .github/scripts/check-mojibake.mjs --check
# ok — 0 occurrences of U+FFFD in 1109 text file(s) (22 skipped as binary)
$ grep -n -i "signature\|signed\|signing" AGENTS.md docs/autonomous-dev.md
# every hit is the dormant-mechanism description or says "not enabled"
$ node -e 'console.log(Object.keys(require("./.github/agent/review-policy.json")))'
# [ 'version', 'note', 'reviewers', 'selfReview', 'writers' ]
$ test -e .github/agent/signers.json || echo absent
# absent
$ grep -n "if (signing.enforced)" .github/scripts/review-gate.mjs
# :328 — the verifier runs only under a non-empty rosterBase and merge tree: the branch sits on Not run: Non-blocking, no re-push wanted:
|
Owner: Dev3
Reviewer: Reviewer
Base: 7fae84e
Tip SHA: db57f5d
Fixes #1195
Docs only:
AGENTS.md+docs/autonomous-dev.md. The owner decided on 2026-10-25 not to introduce per-workstation signing keys (#1111,closed not planned), so the verifier merged in#1137stays inmainand stays inert. Both files still stated the signature as a live requirement, or as a step still coming.Reproduce
On
main 7fae84e2the switch is off, and the docs say it is on:.github/agent/review-policy.jsonhas nosignerskey at all (Object.keys→version, note, reviewers, selfReview, writers), whichreview-gate.mjs:262reads as an empty roster →signingState()returnsenforced: false;.github/agent/signers.jsonis 404 atmain. So no gate asks any conclusion forSigned-by:/Nonce:/Signature:today.AGENTS.md:152— "Since A forgedWritten-by: Reviewerstill merges: the guard cannot tell which workstation wrote a Verdict #1110 the signature is what closes that gap: a conclusion also carriesSigned-by:… There is no unsigned fallback".AGENTS.md:168— "The line is parsed, not signed; a signature is the later slice of All Bots share one GitHub identity, so an independent review cannot be proved #644." (a slice that will not come).AGENTS.md:184— "AVerdict:whose signature does not verify is not a conclusion at all (A forgedWritten-by: Reviewerstill merges: the guard cannot tell which workstation wrote a Verdict #1110) … the reason the keys land before the gate does."docs/autonomous-dev.md:152— same "later slice of All Bots share one GitHub identity, so an independent review cannot be proved #644".docs/autonomous-dev.md:165-168— checklist item 7, "The report is signed by the workstation it names (A forgedWritten-by: Reviewerstill merges: the guard cannot tell which workstation wrote a Verdict #1110)", stated as a rule.docs/autonomous-dev.md:172— "so since A forgedWritten-by: Reviewerstill merges: the guard cannot tell which workstation wrote a Verdict #1110 a conclusion also has to be signed by the workstation it names".docs/autonomous-dev.md:194-198— "the keys therefore land before the gate does ([Mint one Ed25519 key per reviewing workstation (public key in the repo, private key in that Bot's secret store) #1111])" —#1111is closednot planned, so the keys never land.docs/autonomous-dev.md:216-217— "Since A forgedWritten-by: Reviewerstill merges: the guard cannot tell which workstation wrote a Verdict #1110 the signature is what closes that gap: the line still claims, the key proves."docs/autonomous-dev.md:221-222— the file table presentssigners/signers.jsonas live.That is eight passages, not the four in the issue:
AGENTS.md:168,AGENTS.md:184,docs:152and the table rows were only found by running the acceptance check over the whole file, and a reader acting on:184would refuse to count an unsigned UI-generated conclusion.What changed
Every passage now reads "shipped, not enabled", with the same three facts: the mechanism is in
mainand off; the owner decided on 2026-10-25 not to introduce keys (#1111not planned) — a decision, not a pending step; what stands in its place is three cheap gates (a conclusion must name the current tip, one conclusion per tip,Attestation:as a self-report), and the residual risk is written down rather than papered over (one sharedBirfyidentity can still write a forgedVerdict: PASS; those gates catch stale-sha and replay accidents, not deliberate forgery).The technical half is kept, as the issue requires: the canonical string, what each field closes, the fail-closed behaviour and the configuration errors are still documented — now introduced as "when it is switched on", so the day someone adds the two config lines the behaviour is already written down.
#### Signed conclusions (#1110)is untouched, so#signed-conclusions-1110still resolves. No code, no.github/agent/*.json, no changelog fragment (changelog.d/README.md: docs-only).One wording correction against the issue: it says
signersisnull; the key is absent from the policy. The code reads both the same way (Array.isArray(policy?.signers)→[]), so the text says "no such key" rather than "null".Non-blocking, not touched:
verdict-signature.mjs:111builds the error string "Mint one Ed25519 key per workstation (#1111) and store …" — it can only print when a roster exists, i.e. never today, but it points at the closed issue. Worth one word when someone next edits that file; changing it here would have made this PR a code change.What I ran
grep -nE 'Since #1110 the signature is what closes that gap|The report is signed by the workstation it names|so since #1110 a conclusion also has to be|keys therefore land before the gate does|the reason the keys land before the gate does|a signature is the later slice of #644' AGENTS.md docs/autonomous-dev.md→ base: 6 matching lines (AGENTS.md:152/:168/:184,docs:152/:165/:172), tip: 0.node --test --test-concurrency=1 .github/scripts/*.test.mjson the tip tree: tests 454, pass 452, fail 0, skipped 2; the same command on an untouchedmain 6d75f648tree: 454 / 452 / 0 / 2 — identical, so the two skips are pre-existing (docker/git-guarded) and nothing inscripts/depends on the old wording.enqueue-guard.test.mjs(#602requires theenqueue-guard.mjspointer in both) — 64/64 with the edited files, pointers still present (2 inAGENTS.md, 3 indocs/autonomous-dev.md).grep -c $'\xef\xbf\xbd'→ 0 in both files (the ci: fail a pull request whose text files carry U+FFFD #1191 gate's shape, checked directly becausecheck-mojibake.mjsenumeratesgit ls-files).Red without the source change
The check in step 1 is the whole verdict, and it is red on
main(6 unqualified lines) and green on this tip (0). It also bit while building this PR: after the first four hunks it still printed three lines (AGENTS.md:184,AGENTS.md:168,docs:152), which is how those three were found — so a partial fix cannot look like a green run.Not run
arch-docs(core/scripts/check-arch-docs.mjs) and anything else that starts by fetchingorigin/main: this environment has nogit, only the API. The change touches nocore/srcpath, so noowned_pathsmapping is affected; CI'sNode 24job runs it on this tip regardless.oxlint, desktop smoke — docs-only, not implicated.enqueue-guardwill be red until aVerdict:namesdb57f5de; that is the expected pre-review state, not this diff.Risk
Docs only, so the risk is the opposite direction of the bug: if signing is ever enabled, these paragraphs describe it as dormant and the enabling PR has to flip them back — the wording says exactly which two things turn it on (a non-empty
signersroster plussigners.json), so that is a two-line edit, not a hunt. The residual-risk sentence is the accurate record per#1111's closing note, so nobody re-reads the signature as a promise. No behaviour, no configuration, no changelog entry;AGENTS.mdis read at the start of every piece of work, which is why this was worth a PR of its own instead of riding along with#1184/#1180.