Skip to content

eval: block-gated scored horizon ladder (inert until configured) - #241

Closed
tensorlink-dev wants to merge 2 commits into
mainfrom
eval-horizon-ladder
Closed

eval: block-gated scored horizon ladder (inert until configured)#241
tensorlink-dev wants to merge 2 commits into
mainfrom
eval-horizon-ladder

Conversation

@tensorlink-dev

Copy link
Copy Markdown
Contributor

Adds a block-gated multi-horizon window draw for the round verdict, dormant by default.

Knobs ([eval]): scored_horizons = [] and scored_from_block = 0. With the defaults every code path is byte-identical to the single-horizon draw. When both are set, rounds whose epoch-boundary block is at or past the gate draw their verdict windows as a horizon ladder: each horizon gets its own seeded even-by-domain draw over the snapshot's raw series (n_windows split evenly across horizons, rung sizes equalised), and the pooled rows flow through the unchanged round statistic — no changes to evaluate_round, the bootstrap, or the receipt schema.

Why pooling works unchanged: with equal rung sizes the geometric mean over the concatenated rows equals the geometric mean of per-horizon geomeans, and the cluster bootstrap keys on upstream feed ids, so rows from one feed resample jointly across horizons.

Coverage:

  • validator verdict draw (_verdict_windows)
  • trainer heat screen (ranks on the same ladder at the heat's window budget) and the unsigned composition block
  • audit tier-2 replay (applies each round's own rule via the receipt's epoch_start_block, same as the jittered mix)
  • calibration telemetry's calib_draw now delegates to the shared horizon_draw (byte-identical ids/draws), so the two draws cannot drift

Rollout shape: mix_from_block precedent — deploy everywhere first, then activate via config at a future epoch boundary. [training] and the contract digest are untouched.

Tests: config round-trip, gate semantics, draw determinism/equalisation/eligibility, pooled-equals-blend property, source plumbing, and the verdict branch.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Ewrx7YTJ46UosQFgLfDhPf

[eval] scored_horizons + scored_from_block draw the verdict (and heat
screen) windows as per-horizon seeded even-by-domain draws with equalised
rung sizes; the pooled rows flow through the unchanged round statistic,
so equal rungs weight horizons equally and the cluster bootstrap
resamples feeds jointly across horizons. Defaults keep every path
byte-identical to the single-horizon draw; activation follows the
mix_from_block release-then-activate shape, and audit replay applies
each round's own rule via the receipt's epoch_start_block. The
calibration draw now delegates to the shared horizon_draw so the scored
and telemetry draws cannot drift.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ewrx7YTJ46UosQFgLfDhPf
@vercel

vercel Bot commented Sep 2, 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 Sep 3, 2026 12:16am UTC

Request Review

tensorlink-dev added a commit that referenced this pull request Sep 2, 2026
…d go-live block (owner 2026-09-02)

[eval] scored_horizons / scored_from_block = 8991900 — PR #241's knobs, set
to the SAME block as [round] funded_activation_block so the two flips are
one coordinated validator update. Ignored by loaders without #241; on the
merged tree the ladder is () at 8991899 and (64, 256, 720) at 8991900
(verified). Runbook: #241 must be in the deployed release; check the
current pool's >= 784-step eligibility (the 720 rung sizes every rung)
before the block.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y65PT2wahVQnhE1SjWXyGW
tensorlink-dev added a commit that referenced this pull request Sep 2, 2026
…uel settle (owner 2026-09-02)

- Drop the pre-gate hold: before funded_activation_block the funded
  knobs read "off" and legacy rounds keep running (last one Thu 20:30 UTC,
  6-8h); the first 12h boundary after it, 8992800 (≈ Fri 08:30 UTC), is
  the go-live block for BOTH the funded field and PR #241's ladder.
- Keep the 12h epoch grid (owner): epoch_blocks 3600, no scheduled seam,
  max_rounds_per_day 2. The 3h grid is a later switch.
- one_submission_per_hotkey bug: funded entries burned at the heat settle,
  BEFORE their legs ran, so a leg requeued unburned (sold-out/rate-limit/
  infra) was terminally failed as "burned" by the next round's filter.
  Funded entries now burn at the DUEL settle per outcome — trained or
  generator-failed → spent; auth/market/infra → still re-fundable.
  Testnet runs the rule off, which is why the E2E never showed it.
- Docs: spent-hotkey rollover rule (fresh hotkey, reveal after the Thu
  20:30 cutoff), 12h cadence, block table; seam tests build their pairs
  explicitly instead of matching shipped literals.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y65PT2wahVQnhE1SjWXyGW
Each rung was drawn at the full per-rung ask and then truncated to the
scarcest rung's count with r[:m]. horizon_draw sorts its picks by pool
index, so the truncation kept filename order and silently undid the
even-by-domain draw on every rung larger than the scarcest: on the
2026-07-19 mainnet snapshot the h64 rung's healthcare share fell from 13
to 4 while h720 kept 7 (review 2026-09-02, verified on the real pool).

Now the rung size is min(per-rung ask, smallest horizon's eligible-series
count) and every rung is drawn even-by-domain AT that size; an empty
horizon still raises, and an unequal draw (cannot happen by construction)
fails loud rather than judging on an unequal ladder. Consensus-critical:
this must be in the release before scored_from_block activates.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y65PT2wahVQnhE1SjWXyGW
@tensorlink-dev

Copy link
Copy Markdown
Contributor Author

Landed on main via #242 (merge 1cf4730), which was stacked on this branch and carries commit 763ca23 unchanged.

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