feat(dlv): the authenticated frontier is a live quorum cell walk - #746
Merged
Merged
Conversation
Vault composition folded forward off a PREFIX LISTING read from a single
member. A set query's exhaustiveness is unfalsifiable and no signature repairs
it, so a member that omitted a key produced an answer indistinguishable from a
genuinely shorter chain — and the composer returned it as the vault's state.
The type even said so: `c_n` was documented as "a valid PREFIX, not a proven
frontier". Nothing consumed that warning.
The edge source is now the settlement-slot REGISTER CELL, read live at the
quorum the owner committed in `V_n` (field 15 — previously encoded and read by
nothing) against the storage set `V_n` names, resolved through the local
catalog and failing closed when it does not resolve. A write-once cell cannot
express omission, so q attributed members answering "nothing here" is a
positive fact rather than the absence of one.
Three outcomes per generation, and only one of them is a frontier:
empty at quorum -> the chain ends here
winner at quorum -> validate the edge and fold, or fail closed
anything else -> DLV_BINDING_EVIDENCE_UNAVAILABLE (Req 6.25, which
had zero occurrences in the tree)
`CellObservation` splits "q members agree the cell is empty" from "too few
answered" — `read_cell_quorum` returned `Ok(None)` for both, which is the
omission defect one layer down. Counting is Req 15.8: only members echoing
their own id count, only byte-identical values aggregate.
Every former skip in the fold is now a refusal. A quorum-established successor
whose settlement evidence is missing is NOT a frontier: the network has said
this generation is consumed, and reporting it as the end because a second
artifact is absent would make the walk decorative. A claimant who wins a slot
and never settles holds the vault at Incomplete — an accepted liveness cost,
never permission to manufacture maximality. Depth saturation is Incomplete too,
never "frontier at 64".
Close and settle contend for one slot per generation, so a close consumes this
cell as well. Its `x` is a public derivation anyone can recompute; what a
stranger cannot forge is that claim signed by the owner's P0-P6-proven
authority key. A close folds to the determined terminal state (both reserves
zero at parent+1) with no receipt to fetch; a stranger claiming that `x` yields
a refusal, never a vault that appears closed. `close_slot_commitment` moves to
core — it was hand-inlined twice in one function under two names.
`finish_prepared_close` now binds the PARENT it consumes rather than the
frontier: a published close claim is a real edge, so re-composition
legitimately reports parent+1, and the parent's `c_n` comes from the walk's own
`folded_parent_bindings` (the `dlv.reconcile` pattern).
The pointer records survive as a discovery hint for the owner's own reconcile,
which understates rather than invents. They are no longer consulted for
existence.
Fixture fidelity, found by the new controls: a failing member was modelled as
ANSWERING EMPTY while still echoing its id, so a fixture could manufacture a
frontier out of silence. A failing member now does not answer, matching the
live reader. Added a member that serves reads while refusing writes — the only
honest way to strand a close intent now that composing requires a readable
fleet.
Controls, each red-then-restored: the omission mutation (treating a short
quorum as a frontier turns the counting tests red); member impersonation via a
mismatched echo; a divergent write-once cell; a claimed generation without its
receipt; a winner binding a different parent state; a stale hop binding; a
receipt for another generation; and a close that refuses when the frontier
cannot be read, with a positive control proving each refusal is the rule and
not a broken fixture.
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.
The authenticated frontier: a live quorum cell walk
Work-order item 4, the last item in the sovereign-finance track that is not gated on a monetary-origin decision. The plan called this a conformance gap rather than a new mechanism, and that held up: the counting rule, the quorum-attributed cell read, and the owner-committed
qall already existed. What was missing was that composition did not use them.The defect
Vault composition folded forward off a prefix listing read from a single member. A set query's exhaustiveness is unfalsifiable and no signature repairs it, so a member that omitted a key produced an answer indistinguishable from a genuinely shorter chain — and the composer returned it as the vault's state. The type was honest about it in prose and nothing consumed the warning:
The inversion
The edge source is now the settlement-slot register cell, read live at the quorum the owner committed in
V_n(field 15 — previously encoded atstate.rs:328and read by nothing) against the storage setV_nnames, resolved through the local catalog and failing closed when it does not resolve. A write-once cell cannot express omission: q attributed members answering "nothing here" is a positive fact, not the absence of one.Req 6.25 had zero occurrences in the tree before this.
CellObservationsplits "q members agree the cell is empty" from "too few answered" —read_cell_quorumreturnedOk(None)for both, which is the same omission defect one layer down. Counting is Req 15.8: only members echoing their own id count, only byte-identical values aggregate, divergence is a conflict.Every former skip in the fold is now a refusal, and the success type carries the guarantee: a prefix cannot be constructed, so every existing caller gets frontier-or-fail without restructuring.
Your ruling, pinned
A quorum-established successor whose settlement evidence is missing is not a frontier. The network has already said this generation is consumed; reporting it as the end because a second artifact is absent would make the cell walk decorative. A claimant who wins a slot and never settles holds the vault at Incomplete — an accepted liveness cost, never permission to manufacture maximality. No clock, no age semantics. Depth saturation is Incomplete too, never "frontier at 64".
What the implementation surfaced
Close and settle contend for one slot per generation, so a close consumes this cell as well — a closed vault would otherwise have composed to "unavailable" forever. Its
xis a public derivation anyone can recompute, so thexproves nothing; what a stranger cannot forge is that claim signed by the owner's P0–P6-proven authority key. A close folds to the determined terminal state (both reserves zero at parent+1) with no receipt to fetch, and a stranger claiming thatxproduces a refusal, never a vault that appears closed.close_slot_commitmentmoves to core — it was hand-inlined twice in one function under two names (x_closeandclose_commitment, the same derivation).finish_prepared_closenow binds the parent it consumes, not the frontier. A published close claim is a real edge, so re-composition legitimately reports parent+1; the parent'sc_ncomes from the walk's ownfolded_parent_bindings, the same patterndlv.reconcileuses.Two fixture-fidelity bugs the new controls found. A failing member was modelled as answering empty while still echoing its id, so it counted as an attributed "nothing here" — a fixture could manufacture a frontier out of silence, which is exactly the defect under repair. A failing member now does not answer, matching what the live reader gets from an unreachable node. And a member that serves reads while refusing writes was added, because once composing requires a readable fleet that is the only honest way to strand a close intent.
Three silent
continues in the close-resume sweep now log why they retried.Controls (each red-then-restored, each with a positive control)
a_short_quorum_on_the_cell_is_not_a_frontieranda_member_echoing_another_id_is_uncountablered; restored, both green.a_close_refuses_when_the_frontier_cannot_be_read— nothing moves, no intent is recorded, and the same close succeeds once the fleet answers.a_contested_parent_refuses_the_close_and_moves_nothingre-cut: the refusal now comes from the frontier gate before anything is recorded, which is stronger than the abandoned intent it used to assert. The close's own contested-claim path is not dead — it still guards the compose→claim race.Boards (exact CI commands, final tree, pinned 1.98.0)
cargo test --locked --workspace --exclude dsm_storage_node -- --nocapture --test-threads=1— 3901 passed / 0 failed across 71 suites, exit 0cargo test --locked -p dsm_storage_node --no-default-features --features local-dev,strict -- --nocapture— 270 passed / 0 failed, exit 0make lint(repo root) — exit 0; pinned repo-rootcargo clippy --all-targets— exit 0bash ci/production_safety_checks.sh— exit 0Scope
No portable maximality certificate: the statement is "during this read, no successor beyond
c_nwas established", and frontier stays inherently online. Threat model unchanged (crash-fault,n=3, q=2). No storage-node keys. This does not unblock live DLV routing — that remains blocked on an honest second-asset origin.