Skip to content

fix(config): type the decided v2b block + sync worker-image pins in main's chain.toml - #457

Merged
tensorlink-dev merged 10 commits into
mainfrom
fix/chain-toml-live-pins
Nov 13, 2026
Merged

tensorlink-dev merged 10 commits into
mainfrom
fix/chain-toml-live-pins

Conversation

@tensorlink-dev

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

Copy link
Copy Markdown
Contributor

Owner-approved 2026-11-13 ("Go"). Merge + announce only on the owner's word — validators that pull main get these values.

What this fixes

An external validator crash-loops at start:

activation: refusing to start — the activation note would exceed 128 bytes and TRIM the v2b-69630f92 segment

Decided votes had been typed into the operator's deployed chain.toml but never into main, so main's file left the on-chain readiness note too long on a node whose rolling-era-king vote is still signalled (resolved from the chain, not typed). New code refuses to start rather than silently drop the v2b vote.

Changes

  1. [v2] image_decoupled_from_block = 9493200 — the decided v2b switch, typed (locked 9486000, 85.9% of stake; applied at era start 9493200). Behaviour-identical; frees its note segment. Same step as forfeit / margin-v2 on 2026-11-01.
  2. Worker-image pins synced to live (main still named rc11 / v0.9.0; the network trains on rc15 / v0.13.0):
key main now (= live)
[training] train_image_digest (v1) v0.9.0 43c07d42 v0.13.0 205ff682
[round] funded_pod_image rc11 rc15 5d41d94b
[round] worker_code_fingerprint rc11 33b0d42f rc15 2d8261aa
[v2.training] train_image_digest rc11 2fd193ca rc15 5d41d94b

Verified (python -P, no torch, against the live activation records)

  • Loads under require_vote_pin; v2 contract digest = live 7bb581e3.
  • Note budget OK for the crashing validator's note shape and ours (main as-is: still refuses; the typed v2b line is what fixes it).
  • Typed-notice rule passes for a fresh node and a tally-locked node (the switch era has started).
  • With the runtime-resolved blocks, quantile head + shared ladder switch on at 9494100, off at 9493200.

After merge: instruction to validators

Pull main, keep your state files (validator_state.db, cascade_state.json, warm_start_init.json, activation_*.json), restart. No hand edits.

Deliberately not synced

  • Vote-resolved blocks ([round] rolling/epoch rollover, [scoring] era_king/tenure/cohort, [v2] from_block): validators resolve these themselves and at least one external node holds a different rolling lock-in (9378000 vs ours 9136800).
  • budget_denomination_after / packed_sources: the repo ships them unarmed by design (test_contract_block_gate); the deployment arms them.
  • Operator-only knobs (money limits, host lists, providers, SKU walls) and blocked_hotkeys.

🤖 Generated with Claude Code

https://claude.ai/code/session_01BMT4D7eZUKUF2gocYLVFmj

…lling and packed-source rule

main still named worker-v2.0.0-rc11 (v2) and worker-v0.9.0 (v1) while the
network has trained on rc15 / v0.13.0 since 2026-10-31 / 2026-09-28, so a
validator or miner on main computed a different contract digest than the
fleet (v2 34b72ba9 vs live 7bb581e3). Synced, each = the deployed value:

- [training] train_image_digest (v1) -> 205ff682 (v0.13.0)
- [training] budget_denomination_after(_block) = points+mv20 @ 9165600
- [round] funded_pod_image / worker_code_fingerprint -> rc15 pins
- [v2.training] train_image_digest -> rc15 5d41d94b
- [static_guard] packed_sources = reject @ 9169200

Resulting digests equal live: v2 7bb581e3, v1 13a588e8.

Deliberately NOT synced: vote-resolved blocks ([round] rolling/epoch
rollover, [scoring] era_king/tenure/cohort, [v2] from_block). Validators
resolve those themselves and at least one external validator holds a
different rolling lock-in (9378000 vs ours 9136800); typing ours could
refuse it at start. Also not synced: operator-only knobs (funded money
limits, host lists, generation providers, calibration) and blocked_hotkeys.

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 3:23am UTC

Request Review

…n main

The repo ships both unarmed by design (test_contract_block_gate pins it); the
deployment arms them. This PR now syncs only the worker-image pins.

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 fix(config): sync main's chain.toml to the live worker-image pins, billing and packed-source rule fix(config): sync main's chain.toml worker-image pins to the live rc15 / v0.13.0 images Nov 13, 2026
…chain.toml

The v2b-69630f92 vote locked in at 9486000 (85.9% of stake) and applied at
the era start 9493200. Typing a decided block is behaviour-identical and
frees its segment of the 128-byte on-chain readiness note (the same step
taken for forfeit / margin-v2 on 2026-11-01).

Without it, a validator whose rolling-era-king vote is still signalled
(resolved from the chain rather than typed) overflows the note once it runs
code that refuses to drop the v2b segment, and crash-loops at start
(observed 2026-11-13 00:13 UTC on an external validator). Verified against
that validator's note shape and ours; the typed-notice rule passes for a
fresh node and a tally-locked node (the switch era has started).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BMT4D7eZUKUF2gocYLVFmj
@tensorlink-dev tensorlink-dev changed the title fix(config): sync main's chain.toml worker-image pins to the live rc15 / v0.13.0 images fix(config): type the decided v2b block + sync worker-image pins in main's chain.toml Nov 13, 2026
The shipped chain.toml now types image_decoupled_from_block = 9493200, an era
start on the live 900 grid; the two tests that build a 7200/3600 seam from the
shipped file would judge it on that grid instead.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BMT4D7eZUKUF2gocYLVFmj
…te open

Mirrors how the typed forfeit / margin-v2 blocks are handled (conftest and the
per-file fixtures reset them to 0): every fixture that exercises the v2b VOTE
(image_decoupled_feature lock-ins, note budget, after-pin schedule binding,
pre-lock receipts) now resets image_decoupled_from_block to 0. The two tests
that pin the shipped file's state assert mainnet typed 9493200 / testnet 0.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BMT4D7eZUKUF2gocYLVFmj
…-at-boundary rule)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BMT4D7eZUKUF2gocYLVFmj
…g (v2b untyped)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BMT4D7eZUKUF2gocYLVFmj
The repo file ships rolling and v2 undecided (3600 grid), where 9494100
is not a settlement boundary at all; the quantile-head alignment check
needs the fleet's resolved grid, like test_knobs_ship_typed_on_mainnet.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BMT4D7eZUKUF2gocYLVFmj
The shipped file now types [v2] image_decoupled_from_block=9493200; a
fixture that pushes from_block far out must untype it or the loader's
"precedes [v2] from_block" check fires before the one under test.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BMT4D7eZUKUF2gocYLVFmj
@tensorlink-dev
tensorlink-dev merged commit 3d4bfa7 into main Nov 13, 2026
3 checks passed
@tensorlink-dev
tensorlink-dev deleted the fix/chain-toml-live-pins branch November 13, 2026 03:44
tensorlink-dev added a commit that referenced this pull request Nov 13, 2026
…as passed (#460)

check_calendar_launch trial-loaded the config with v2 armed at the era
AFTER the finalized head — correct before the date, wrong after it (the
real block is in the past: mainnet 9399600). With #457 typing
[v2] image_decoupled_from_block = 9493200, every node that pulled main
refused to start: "image_decoupled_from_block=9493200 precedes [v2]
from_block=9500400". Past the date (chain time at the finalized head),
the first poll's resolve_calendar_launch parses the config at the real
block and refuses one that cannot load there; an unreadable head
timestamp keeps the trial.


Claude-Session: https://claude.ai/code/session_01BMT4D7eZUKUF2gocYLVFmj

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

This branch was successfully deployed

1 active deployment
Preview — 46f0823a 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