SPEC-v0.11 review round two: fifteen findings, ten in round one's own fixes - #196
Merged
Merged
Conversation
…wn fixes The distribution is the lesson. Round one found what the author did not know; round two found what the author did while fixing it. Every finding was demonstrated. **Items 2 and 3 cancelled each other, and nobody looked for it in either round.** Section 3 never contained the word "prune"; section 4 contained the word "anchor" once. An honest prune deletes the prefix every older anchor's seq lives in, so in steady state every anchor older than the retention window is permanently anchor_broken and an anchoring deployment must either refuse every prune or live with a permanent tamper signal. Section 4.6 is new: a prune anchors its checkpoint BEFORE it deletes, and an anchored seq below a checkpoint is evaluated against that checkpoint's anchor. The third row of its table is what stops "superseded" becoming the hole: an attacker who erases a prefix and writes a checkpoint must also anchor it, through the provider, which is outside the store. **anchor_missing fired on every honest deployment.** Round one moved it out of CHAIN_BREAKS so it would stop failing G11 with control failed, and left the definition untouched, so it failed G28 universally instead: one honest action after an anchor puts the chain in the window section 2.4 blesses as normal. A fail-closed check that fires on the honest case is not fail-closed. **The append claim survived where it is graded.** Round one rewrote section 2.4 into a table and left "a truncated or appended chain" in section 8's G28 row, which is the text that reaches ctrlrun.guarantees/v7 and verify's output, and on ROADMAP.md's Exit line. Correcting the argument and leaving the claim in the registry is worse than not correcting it. **Section 10 let a COMMITTED ledger row be pruned unconditionally**, and a review demonstrated a third action allowed after pruning two committed rows on an exhausted budget. Round one replaced release with settlement and dropped SPEC-v0.9 section 7.3's window on the way through. Also: anchor_unavailable had no name in the closed set and no verification-time row; the prune's receipt cannot be written inside the prune's transaction, because put_receipt opens BEGIN IMMEDIATE, so the order is forced rather than chosen; "any break" made retention permanently impossible on pre-v0.6 stores, because unchained survives a prefix prune and can never be in a prefix; section 4.4's state table omitted EXECUTING, one of the five states effect.py persists; the MCP operator server blinds on the same shared read as the CLI, so item 1's scope is the read and not the terminal; the migration row still could not be an attribute path; three new citation defects in round one's new text, one quoting a paraphrase as a file's words; and six bare internal section references that this document does not have. Section 12 records both rounds. Section 11.1 became section 12 because a review is not a subsection of Out of scope. Signed-off-by: arpan <contact@arpanghoshal.com>
|
Warning Review limit reachedNext included review available in 48 minutes. View limit detailsLimit details: You’ve used the included review currently available. You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Review configuration: ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (1)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #195, because pushing to a green PR's branch is how the last four commits got stranded.
Fifteen findings, all demonstrated, ten of them in text round one wrote. The distribution is the
lesson: round one finds what the author did not know, round two finds what the author did while
fixing it. That is why v0.9 and v0.10 each needed three.
The one nobody looked for in either round
Items 2 and 3 cancelled each other. §3 never contained the word prune; §4 contained the word
anchor once. An honest prune deletes the prefix every older anchor's
seqlives in:The chain verifies and the anchor reports tampering. Anchoring hourly and pruning at ninety days,
every anchor older than the retention window is permanently broken, so under rule 2 a deployment
must either refuse every prune or accept a permanent tamper signal.
§4.6 is new: a prune anchors its checkpoint before it deletes, and an anchored
seqbelow acheckpoint is evaluated against that checkpoint's anchor. Its third row is what stops "superseded"
becoming the hole: an attacker who erases a prefix and writes a checkpoint to explain it must also
anchor that checkpoint, and anchoring goes through the provider, which is outside the store.
The round-one fixes that fixed the argument and not the artifact
G28row, the text that becomes the graded guarantee, and onROADMAP.md's Exit lineanchor_missingmoved out ofCHAIN_BREAKSso it stops failingG11[('anchor_missing', 5, ...)]. It failedG28universally insteadThe ledger one is demonstrated and is the sharpest:
Round one replaced "un-released" with settlement and dropped
SPEC-v0.9.md§7.3's window on the waythrough. §10 is the table an implementer codes refusals from.
Also
anchor_unavailablehad no name in the closed set and no verification-time row: §10's row waswritten from the
makeside only.put_receiptopensBEGIN IMMEDIATE:OperationalError: cannot start a transaction within a transaction. §4.2 and§4.5 were unsatisfiable together. The order is now forced, and the crash window is the safe one.
unchainedsurvives aprefix prune and can never be in a prefix. The rule is now "a break the prune caused".
EXECUTING, one of the five stateseffect.pypersists.read and not the terminal. A fix in
cli/main.pyalone leaves the network console blind.§references this document does not have.## 11.1became## 12, because a review is not a subsection of Out of scope.Every file-qualified cross-reference resolves. No em dashes. §12 records both rounds in the spec,
because a spec is believed and a commit message is not.
A third round is warranted, on exactly the evidence above.
Not merging.