Skip to content

dashboard: per-horizon verdict breakdown + the whole seated field on duel-only rounds - #243

Merged
tensorlink-dev merged 3 commits into
mainfrom
duel-dashboard
Sep 6, 2026
Merged

dashboard: per-horizon verdict breakdown + the whole seated field on duel-only rounds#243
tensorlink-dev merged 3 commits into
mainfrom
duel-dashboard

Conversation

@tensorlink-dev

@tensorlink-dev tensorlink-dev commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Dashboard follow-up to #242 for duel-only rounds: the verdict is broken down by horizon and the whole seated field is listed, in the public docs and in the miner CLI.

What changes

  • Validator / receipt (cascade/eval/koth.py, cascade/shared/receipt.py, cascade/validator/loop.py): on a scored-ladder round (window ids h<H>-…) the verdict records per_horizon — the decided pair's rung geomeans, the challenger's per-window win rate and the rung size — plus cohort_geomeans and cohort_per_horizon for every judged challenger. Display only; the pooled verdict, the α/k rule and check_koth_params are untouched. All three are dropped from the canonical body when absent, so archived receipt signatures survive, and they are carried by summarize_receipt into receipts/index.json.
  • Trainer / standings (cascade/trainer/loop.py, cascade/shared/heat_status.py, cascade/shared/manifest.py): a duel-only round publishes every entrant in status/heat.json as seated (seat order, rank = seat) or waiting, with duel_only: true; heats/index.json counts seated entrants as advanced. Two new informational statuses, seated and waiting.
  • CLI (cascade/miner/dashboard.py): cascade heat shows a duel-only headline and the seated/waiting rows (your own row still flagged); cascade duel adds a by horizon block (king vs challenger per rung, gap, win rate) and a cohort table with every judged challenger's geomean vs the king, its LCB against the margin, per-horizon gaps, and who took the throne. Legacy documents and receipts render as before.
  • docs/MINER.md: "Reading a duel-only round".

Rollout

No config, no contract, no consensus change. Validators on this release publish the extra receipt fields; ones that are not simply publish receipts without them. Trainer restart for the standings, validator restart for the receipt fields, CLI users pull.

Tests

tests/unit/test_duel_dashboard.py: the breakdown on ladder ids and its absence on legacy ids, evaluate_round carrying it, receipt round-trip / canonical-body drop / from_round NaN scrubbing / index entry, the validator recording cohort fields on a real process_round, the standings doc and index summary, and both CLI renders (legacy rows unchanged). Full unit suite green.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Ewrx7YTJ46UosQFgLfDhPf

Public website (added 2026-09-04)

The Vercel page is static JS fed by S3 JSON, so the branch was invisible there. cascade/website/index.html now reads the new fields too:

  • Cohort block under the verdict: every judged challenger with its observed geomean vs the king, LCB vs the margin (cleared / under), per-horizon gaps, and who took the throne. Sourced from the receipts index row (cohort_geomeans / cohort_per_horizon / per_horizon), falling back to the anchor receipt; pre-ladder rows with cohort_lcbs only still list (LCB column) — so the preview shows a change on today's data already.
  • By-horizon table for the decided pair on ladder rounds.
  • Heat panel → "Duel field — seated" on duel-only rounds: seat order, seated / waiting pills, no score columns (nobody was screened).

tests/unit/test_website_duel.py pins the contract (every HEAT_STATUSES value has a pill, every display field is read, the panel is wired).

…n duel-only rounds

Validator: on a scored-ladder round the verdict records a per-horizon
breakdown (king/challenger rung geomeans, per-window win rate, n) for the
decided pair, plus every judged challenger's observed geomean and per-
horizon breakdown (cohort_geomeans / cohort_per_horizon). Display only —
the pooled verdict is unchanged; the fields are dropped from the canonical
receipt body when absent so archived signatures survive, and they ride the
public receipts index.

Trainer: a duel-only round's standings list every entrant as `seated`
(seat order) or `waiting`, flagged `duel_only`, instead of a bare no-screen
notice.

CLI: `cascade heat` renders seated/waiting rows and a duel-only headline;
`cascade duel` adds a `by horizon` block and a `cohort` table listing all
judged challengers with geomean vs king, LCB vs margin, and per-horizon
gaps. Legacy docs and receipts render exactly as before.

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

vercel Bot commented Sep 3, 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 6, 2026 11:27pm UTC

Request Review

…ublic dashboard

The Vercel page is static JS fed by S3 JSON, so the PR's new receipt and
heat-status fields were invisible there (the "dashboard" this branch touched
was the `cascade round` CLI). Now the page reads them too:

- verdict panel gains a cohort block: every judged challenger with its
  observed geomean vs the king, LCB vs the margin (cleared / under), the
  per-horizon gaps, and who took the throne — sourced from the receipts
  index row (cohort_geomeans / cohort_per_horizon / per_horizon), falling
  back to the anchor's full receipt; pre-ladder rows with cohort_lcbs only
  still list (LCB column), single-challenger rounds hide the block;
- a "by horizon" table for the decided pair on ladder rounds;
- the heat panel switches to a seated / waiting field on duel-only rounds
  (no score columns — nobody was screened), titled "Duel field — seated".

tests/unit/test_website_duel.py pins the contract: every HEAT_STATUSES
value has a pill, every display field is read, the panel is wired.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ewrx7YTJ46UosQFgLfDhPf
Both sides add per-challenger receipt fields next to cohort_lcbs; kept both:
cohort_stats (#245) alongside cohort_geomeans / cohort_per_horizon (#243).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ewrx7YTJ46UosQFgLfDhPf
@tensorlink-dev
tensorlink-dev merged commit cd3885a into main Sep 6, 2026
3 checks passed
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