Repository navigation
feat(audit): decided-votes drift guard — decided_votes.toml, cascade-audit decided, CI test - #458
Merged
Merged
Conversation
…audit decided, CI test Decided on-chain votes must be typed into the release chain.toml once applied; until now that happened only on the operator's deployed file and main lagged (an external validator pulling main overflowed its readiness note, 2026-11-13). This records what the fleet decided in git, compares chain.toml and a node's lock-ins against it (exact lines to type), fails CI on drift, and logs a "type this" hint at every lock-in. Reads only. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BMT4D7eZUKUF2gocYLVFmj
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
…egardless of the typed block A typed feature keeps its computed name (the spec carries the typed block), so a missing name means changed params or a retired vote. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BMT4D7eZUKUF2gocYLVFmj
This branch was successfully deployed
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.
Owner-approved 2026-11-13 04:30 UTC ("Build this"). No runtime behaviour change, no consensus field touched, no restart needed.
Why
Decided on-chain votes (DEC-CA-0045 stake-weighted activation) are meant to be TYPED into the release
chain.tomlonce applied — behaviour-identical, and it frees the feature's segment of the 128-byte readiness note. Until tonight that typing happened only on the operator's deployed file.mainlagged for weeks; an external validator that pulledmainoverflowed its note and refused to start (OPSLOG 2026-11-13 00:13; symptom fixed by #457). Nothing connected "what the fleet decided" to "what main ships". This PR does.What
decided_votes.toml(besidechain.toml) — the one place in git recording what the fleet decided: each vote's feature name, lock block, activation block, source, and the key that types it; plus the four worker-image pins the network trains on. Rows can betype_it = false(HELD) with a reason:rolling-era-king(nodes resolved it differently — ours 9133200→9136800, one external 9374400→9378000 — so main must not type either), andprelaunch-95-r2(decided 9486000→9486900 everywhere seen; typing it is behaviour-identical and frees another segment, but it is a releasechain.tomledit awaiting the owner's word — next one-line PR).cascade/shared/decided.py—drift_report(cfg, record):TYPE(decided, applied, not typed → prints the exact[section]/key = blocklines),MISMATCH,PIN_DRIFT,STALE(a row whose feature name the config no longer computes = changed vote params = a fresh vote),PENDING(not yet applied as of the record's block — never asked early),HELD.state_report(records, record): a node'sactivation_*_state.jsonlock-ins vs the record →UNRECORDED(prints the[[vote]]row to add),DISAGREE,UNKNOWN(retired feature; our box still holds apromotion-carryrecord).cascade-audit decided [--config F] [--decided F] [--state-dir D] [--as-of-block N] [--json]— runs both reports, exit 1 on drift. Reads only.tests/unit/test_decided_votes.py::test_repo_chain_toml_and_record_are_in_syncrunsdrift_reporton the repo's own files: a vote that resolves and is not typed (or a pin moved on one side) turns CI red on the next PR, whatever it is about. Plus unit tests for every finding kind and the CLI.resolve_activation) now logsDECIDED: <feature> applies at block N — once that block has passed, type \key = N` under [section] in the release chain.toml and record it in decided_votes.toml (PR to main)` at every LOCKED IN. One lazy import; nothing else changes.docs/AUDIT.mdsection.Verified on the box (
python -P, config + stdlib only)cascade-audit decidedon the repo: in sync (4 OK votes, 2 HELD, 4 OK pins), exit 0.[TYPE] v2b-69630f92 → [v2] image_decoupled_from_block = 9493200(to add at the next quiet validator restart), the HELD prelaunch row,[UNKNOWN] promotion-carry(retired feature's state file). Pins OK. Exit 1.Not in this PR (owner decisions)
[v2] prelaunch_burn_from_block = 9486900in main (HELD row above).🤖 Generated with Claude Code
https://claude.ai/code/session_01BMT4D7eZUKUF2gocYLVFmj