Skip to content

fix(v2): calendar-launch startup trial skipped once the launch date has passed (validators refusing to start after #457) - #460

Merged
tensorlink-dev merged 1 commit into
mainfrom
fix/calendar-launch-after-date
Nov 13, 2026
Merged

tensorlink-dev merged 1 commit into
mainfrom
fix/calendar-launch-after-date

Conversation

@tensorlink-dev

Copy link
Copy Markdown
Contributor

URGENT — external validators that pulled main since #457 refuse to start. Reported by an external validator 2026-11-13 ~13:10 UTC:

ValueError: [v2] launch_at_utc = '2026-10-30T12:00:00Z' schedules a v2 config that does not load: [v2] image_decoupled_from_block=9493200 precedes [v2] from_block=9500400. Complete the v2 configuration or clear launch_at_utc before starting this service

Cause

check_calendar_launch (validator + trainer startup) trial-loads the config with v2 armed at the era start after the finalized head. Before the launch date that is the right guess. After it, the real block is in the past (mainnet v2 = 9399600, resolved from finalized timestamps), so the trial block is fake. #457 typed [v2] image_decoupled_from_block = 9493200; against the fake trial block 9500400 the loader's "must not precede [v2] from_block" check fires, so the node refuses to start. Before #457 that field was 0 and the check never fired. No test ran this startup check with the shipped file at a head past the launch, so CI was green.

Our own nodes were not affected: the operator's deployed chain.toml types [v2] from_block = 9399600, so the launch is not "pending" there.

Fix

Once chain time at the finalized head is at or past launch_at_utc, skip the trial. 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 (the safe side). Before the date nothing changes.

Typing [v2] from_block = 9399600 in main instead does not work: main ships the rollover undecided (3600 grid), and 9399600 is only an era start on the 900 grid each node resolves on chain.

Verified (python -P, config only)

  • Reproduces the validator's exact message (from_block=9500400) on main e488d2d.
  • Fixed: the startup check passes; resolve_calendar_launch lands on 9399600 with v2b 9493200; the pre-date trial still runs and still refuses a bad config.
  • Regression test test_shipped_file_starts_after_the_launch_date_with_the_typed_v2b_switch.

After merge, validators

Pull main, keep your state files, restart. No hand edits.

🤖 Generated with Claude Code

https://claude.ai/code/session_01BMT4D7eZUKUF2gocYLVFmj

…as passed

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.

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 1:23pm UTC

Request Review

This branch was successfully deployed

1 active deployment
Preview — 452de9c7 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