v0.129.0 — a correct code for an earlier package stops being called wrong (R-311)
gates / gates (push) Successful in 14s
gates / gates (push) Successful in 14s
Yesterday's drill proved a retained escrow package opens a set-aside store and restores planted files byte-identical, while this agent answered the customer's correct code with "the recovery code did not open the sealed bundle". Nothing had ever tried the retained packages, so a correct-but-earlier code and a mistype were genuinely indistinguishable. OffsiteKeyRecoverer gains an optional FetchRetained, consulted ONLY after the current package refuses, so the ordinary recovery pays nothing for it and cannot fail because of it. A match returns ErrCodeOpensRetained wrapped in a RetainedOpenedError carrying the supersession date - no material, no code, no password. The local API answers 422: a FIFTH status added to the R-224 switch, never a restructuring of it. Fail-safe in every direction. Nil fetcher, a hub too old for the route (404 is a clean "none"), a transport failure, a malformed package: each leaves the original refusal standing. Attempts bounded at 6 because each unwrap is ~1s of scrypt. Seven tests with REAL age crypto - the two situations are indistinguishable AT THE UNWRAP, so a faked unwrap would prove nothing. Red-proof asserted applied: remove the retained lookup and the fail-closed wrong-code error returns, which is the lie in those exact words.
This commit is contained in:
@@ -1,3 +1,37 @@
|
||||
## v0.129.0 — a correct code for an earlier package stops being called wrong (2026-08-12, R-311)
|
||||
|
||||
**The measurement this fixes.** On 2026-08-12 a recovery code that provably opens a RETAINED package
|
||||
— unsealed by hand, and it restored planted files byte-identical from a store the box itself could no
|
||||
longer open — was answered by this agent with *"the recovery code did not open the sealed bundle"*.
|
||||
The code was correct. Nothing had ever tried the retained packages, so the engine could not tell a
|
||||
correct-but-earlier code from a mistype, and the screen said so out loud: a true sentence about our
|
||||
own incuriosity, read by the customer as a statement about their code.
|
||||
|
||||
**`OffsiteKeyRecoverer` gains an optional `FetchRetained`.** It is consulted ONLY after the current
|
||||
package has refused, so the ordinary recovery pays nothing for it and cannot fail because of it. When
|
||||
one of the retained packages opens, the recoverer returns `ErrCodeOpensRetained` wrapped in a
|
||||
`RetainedOpenedError` carrying the supersession date — no material, no code, no password.
|
||||
|
||||
**The local API answers 422** ("your code is correct, it belongs to an EARLIER sealed package") — a
|
||||
FIFTH status added to the R-224 switch, not a restructuring of it. 422 rather than 400 because the
|
||||
request was well-formed AND the credential valid; a 400 would put it in the same bucket as a mistype,
|
||||
which is the defect.
|
||||
|
||||
**Fail-safe in every direction.** A nil fetcher, a hub too old to have the route (404 is a clean
|
||||
"none"), a transport failure, a malformed package: each leaves the original refusal standing,
|
||||
unchanged. The worst outcome of this feature breaking is the behaviour we had before it existed.
|
||||
Attempts are bounded (`MaxRetainedTried`, default 6) because each unwrap is ~1 s of scrypt by design
|
||||
and an unbounded loop would turn one wrong code into a minutes-long hang.
|
||||
|
||||
**New hub client call:** `FetchRetainedIdentityEscrow` → `GET /api/v1/hosts/<id>/escrow/retained`
|
||||
(hub >= v0.103.0), self-scoped by the same per-host key.
|
||||
|
||||
Seven tests with REAL age crypto, because the two situations are indistinguishable AT THE UNWRAP and a
|
||||
faked unwrap would prove nothing about what was broken. Red-proof, asserted applied: removing the
|
||||
retained lookup returns the fail-closed wrong-code error — **the lie comes back, in those words.**
|
||||
|
||||
---
|
||||
|
||||
### Gates only — 2026-08-09 (no release, no version bump, no binary published)
|
||||
|
||||
**Two guards, both owed since the 2026-08-09 install outage (R-273/R-287). Nothing that runs on a
|
||||
|
||||
Reference in New Issue
Block a user