NK-WP-0049-T33: independent attempt receipt verifier, retained location and ACME reissue step
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 2s

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 696317@bnt-lap001
Assistant-Session: bab9e511-0915-45b3-926a-2fab552edff6
This commit is contained in:
tegwick 2026-10-23 00:22:50 +02:00
parent 710dc99585
commit 4c4c7c4569
4 changed files with 290 additions and 11 deletions

View file

@ -568,19 +568,44 @@ hidden key prompt.
deny `openbao:admin`). A pass shows founder authority for this one attempt. It
is not native acceptance and not single use. The NK49 execution keeps single-use
consumption and cleanup.
3. **TLS/trust input per T35 disposition** (founder decision
`9f9d0d88-837a-433c-8a11-d30b633b0073`). Under reissue, record the public chain
with railiance-cluster `tools/public-tls-metadata.py` at attempt time and compare
it to the admission. Under original recovery, use only the custody path that
RCLUSTER-WP-0018-T03/T04 delivers. No self-signed substitute is allowed. The TLS
key stays in the owner's own terminal.
3. **TLS/trust input: ACME reissue** (founder decision
`9f9d0d88-837a-433c-8a11-d30b633b0073`, resolved 2026-10-21 = A). The
`kc.coulomb.social` TLS identity is reissued through `letsencrypt-prod` ACME
HTTP-01 and chains to ISRG Root X1 (trust sha256 `22b557a2…43d1`). The original
key is not required, and no self-signed substitute is allowed.
**Before the real attempt**, the owner (railiance-cluster) rehearses the same
issuance against Let's Encrypt staging. This protects the duplicate-certificate
limit of 5 per week. At attempt time, record the public chain with
railiance-cluster `tools/public-tls-metadata.py` and check SAN
`kc.coulomb.social` plus the ISRG Root X1 chain. Abort if HTTP-01 cannot
complete or the chain differs. The TLS key stays in the owner's own terminal.
4. **Existing six-argument launcher** `tools/bootstrap-recovery/run-isolated-keycape.sh`
with the reviewed admission digest. Its T34 source closure and abort/cleanup
behaviour are unchanged. The private manifest is derived and the archive
registration is compared to the selector inside custody only.
Still open before T33 can close: T35 owner metadata (RCLUSTER-WP-0018-T02) and
the founder disposition; the execution deadline, safe receipt location and
independent receipt verifier fixed in the packet; the anchor installed on the
attempt host. Public observations are in
5. **Safe receipt and independent verification.** The launcher prints
`Safe receipt: <tmpdir>/recovery.json`. Before anyone copies it, verify it
from a separate shell against a clean checkout at the reviewed commit:
```sh
python3 -I tools/bootstrap-recovery/verify-keycape-attempt-receipt.py \
--receipt <tmpdir>/recovery.json \
--transfer-receipt <verified transfer receipt> \
--source-root <clean checkout>/tools/bootstrap-recovery \
--not-after <admission window end, ISO 8601 with offset>
```
The admission window, at most 24 h and signed by the founder, is the execution
deadline. Retain the receipt only on exit 0 (`verified`), and keep it at
`docs/evidence/<date>-nk49-t18-keycape-attempt/recovery.json` together with the
verifier output. On exit 1, keep it out of Git and report the findings. Do not
repair it by hand. The verifier refuses secret-shaped content, open cleanup
obligations, daemon uncertainty, any claim of consumer reconnect or human MFA,
a ciphertext that differs from the transfer receipt, and source that differs
from the checkout. A pass is not consumer continuity (T18), retained-factor MFA
(T19) or owner acceptance.
Still open before T33 can close (2026-10-23): the anchor installed on the attempt
host (SECRETS-WP-0015-T04, founder- and root-owned) and the owner's Let's Encrypt
staging rehearsal from step 3. T35, T36 and T39 are done. The deadline, receipt
location and verifier are fixed above. Public observations are in
`docs/evidence/2026-10-21-nk49-t33-readiness/readiness-observation.json`.