Skip to content

config: type every decided vote in main — rollover 9136800, v2 launch 9399600, pre-launch burn 9486900 (no archive RPC on restart) - #462

Merged
tensorlink-dev merged 10 commits into
mainfrom
feat/pin-decided-launch-blocks
Nov 14, 2026
Merged

tensorlink-dev merged 10 commits into
mainfrom
feat/pin-decided-launch-blocks

Conversation

@tensorlink-dev

@tensorlink-dev tensorlink-dev commented Nov 13, 2026 •

Copy link
Copy Markdown
Contributor

Types the fleet's decided rollover and the resolved v2 launch into main's chain.toml, so a validator restarting on main needs no activation history and no archive RPC. Before this, a node restarting on main had to read old chain timestamps on its first poll (a lite RPC fails with "use an archive endpoint or pin…"), and #457's typed v2b switch made the old startup trial refuse to start at all (fixed separately in #460).

What is typed

key was now
[round] epoch_blocks / epoch_blocks_prev / epoch_activation_block 3600 / 0 / 0 900 / 3600 / 9136800
[round] rolling_from_block 0 9136800
[scoring] era_king_from_block, tenure_blocks_from_block, cohort_maxt_increment_from_block 0 9136800
[v2] commit_from_block 0 9395601
[v2] from_block 0 9399600
[v2] prelaunch_burn_from_block absent (vote) 9486900
  • 9136800 = the rollover the operator's node locked in (9133200 → 9136800); the trainer's published 900-block settlements have followed it since 2026-10-31.

  • 9395601 / 9399600 read from the archive node: block 9395601 is stamped exactly 2026-10-30T09:00:00Z (commit_open_at_utc); 9396501 is the 12:00:00Z crossing (launch_at_utc), next era start on the decided grid = 9136800 + 73×3600 = 9399600.

  • 9486900 = the decided prelaunch-95-r2 block (lock 9486000) on every node seen. Behaviour-identical: emission_policy applies the burn only before the first v2 settlement and v2 is active from 9399600, so it never applied. With it typed, no vote is left open in the release (a fully typed node's own note payload is empty; validators then simply don't rewrite their commitment — audited safe).

Equivalence (proven)

apply_activation(old_main, 9136800) + resolve_calendar_launch against the real chain stamps equals the new main in every config section except activation.resolved_block / resolved_prelaunch_burn_block (the typed-vs-resolved markers; receipts then omit the optional stamped blocks — bytes only, no verdict change). Training contract digests (v1 and v2) unchanged. Pinned by test_shipped_main_restarts_on_a_lite_rpc_without_reading_history.

Effect on validators

  • Pull + restart: starts with no archive RPC; nothing reads historical timestamps.
  • The one external node whose record says 9374400 → 9378000: the typed value wins over its record (configured_rollover); the grids coincide from 9378000, so its live scoring is unchanged; only replay of pre-9378000 history changes (towards what the trainer published).
  • Nodes that don't pull: unchanged.
  • RISK (audited): typed nodes publish a bare readiness note (no 9133200:9136800 pair). An OLD-release node starting from a BLANK activation state could then fail to adopt the decided rollover and halt. Mitigation in the announcement: pull main before any restart; never start an old release on blank state.

Drift guard

decided_votes.toml: rolling-era-king moves from HELD to typed (reads OK); prelaunch-95-r2 moves from HELD to typed. No row is held.

Tests

  • tests/unit/predecision_main.py: the release file with the decided lines untyped (exact inverse; test_predecision_main_is_the_exact_inverse pins it to exactly these 9 keys + values). Scenario fixtures (fake block clocks, the rollover vote, dated-launch resolution) and the session cfg fixture load it; shipped-file tests assert the typed values, with the old vote/pre-launch assertions kept on the pre-decision file.
  • Three independent audits (config/consensus paths; test diff; the prelaunch round) (config/consensus paths; test diff for weakened coverage). Findings fixed: missing exactness test, one loosened assertion, a misleading test name, a fixture that had silently left the live 900 cadence, an over-permissive None branch.
  • docs/AGENT_MINING.md config table regenerated.
  • Note: commit 850a26d's message says "Revert TEMP(ci)" but it carries the audit test fixes; the ci.yml restore is 9b8231b (ci.yml identical to main's). Squash merge.

🤖 Generated with Claude Code

https://claude.ai/code/session_01BMT4D7eZUKUF2gocYLVFmj

tensorlink-dev and others added 2 commits November 13, 2026 21:50
…h (9399600 / commit 9395601) in main

A restarting node on main no longer needs activation history or an archive
RPC: with every block typed the calendar startup trial and the first-poll
timestamp resolution are both skipped. Values = what a live node computes:
apply_activation(main, 9136800) + resolve_calendar_launch on the real chain
(9395601 stamped 2026-10-30T09:00:00Z, 9396501 the 12:00:00Z crossing).
Config-equivalence: every section identical except activation.resolved_block.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BMT4D7eZUKUF2gocYLVFmj
@vercel

vercel Bot commented Nov 13, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
cascade Ready Ready Preview Nov 13, 2026 11:35pm UTC

Request Review

…t regression test

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BMT4D7eZUKUF2gocYLVFmj
…shipped-file facts assert the typed values

Scenario fixtures (fake block clocks, the rollover vote, dated-launch
resolution) load the release file with the decided blocks untyped (exact
inverse, see tests/unit/predecision_main.py); tests about the shipped file
assert the typed rollover / launch, with the old behaviour kept on the
pre-decision file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BMT4D7eZUKUF2gocYLVFmj
…es the audit test fixes despite its message

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BMT4D7eZUKUF2gocYLVFmj
@tensorlink-dev tensorlink-dev changed the title config: type the decided rollover + resolved v2 launch in main (no archive RPC on restart) config: type the decided rollover (9136800) + resolved v2 launch (9399600) in main — no archive RPC on restart Nov 13, 2026
@tensorlink-dev
tensorlink-dev marked this pull request as ready for review November 13, 2026 22:53
…om_block = 9486900)

Decided on every node seen (9486000 -> 9486900). Behaviour-identical: the
burn applies only before the first v2 settlement and v2 is active from
9399600, so it never applied; typing frees the last note segment and leaves
no vote open in the release. Drift guard: prelaunch-95-r2 typed (OK); no row
HELD. predecision_main removes the line (it was absent before).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BMT4D7eZUKUF2gocYLVFmj
…shipped file; shipped v2 carries 9486900; restore ci.yml from main

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BMT4D7eZUKUF2gocYLVFmj
…urn vote reopened); merge-test None branch only for the shipped config

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BMT4D7eZUKUF2gocYLVFmj
@tensorlink-dev tensorlink-dev changed the title config: type the decided rollover (9136800) + resolved v2 launch (9399600) in main — no archive RPC on restart config: type every decided vote in main — rollover 9136800, v2 launch 9399600, pre-launch burn 9486900 (no archive RPC on restart) Nov 13, 2026
@tensorlink-dev
tensorlink-dev merged commit 4f2c277 into main Nov 14, 2026
3 checks passed
@tensorlink-dev
tensorlink-dev deleted the feat/pin-decided-launch-blocks branch November 14, 2026 00:15

This branch was successfully deployed

1 active deployment
Preview — 96676b3d Deployed Nov 13, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant