dashboard: per-horizon verdict breakdown + the whole seated field on duel-only rounds - #243
Merged
Conversation
…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
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
…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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
cascade/eval/koth.py,cascade/shared/receipt.py,cascade/validator/loop.py): on a scored-ladder round (window idsh<H>-…) the verdict recordsper_horizon— the decided pair's rung geomeans, the challenger's per-window win rate and the rung size — pluscohort_geomeansandcohort_per_horizonfor every judged challenger. Display only; the pooled verdict, the α/k rule andcheck_koth_paramsare untouched. All three are dropped from the canonical body when absent, so archived receipt signatures survive, and they are carried bysummarize_receiptintoreceipts/index.json.cascade/trainer/loop.py,cascade/shared/heat_status.py,cascade/shared/manifest.py): a duel-only round publishes every entrant instatus/heat.jsonasseated(seat order, rank = seat) orwaiting, withduel_only: true;heats/index.jsoncounts seated entrants as advanced. Two new informational statuses,seatedandwaiting.cascade/miner/dashboard.py):cascade heatshows a duel-only headline and the seated/waiting rows (your own row still flagged);cascade dueladds aby horizonblock (king vs challenger per rung, gap, win rate) and acohorttable 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_roundcarrying it, receipt round-trip / canonical-body drop /from_roundNaN scrubbing / index entry, the validator recording cohort fields on a realprocess_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.htmlnow reads the new fields too:cohort_geomeans/cohort_per_horizon/per_horizon), falling back to the anchor receipt; pre-ladder rows withcohort_lcbsonly still list (LCB column) — so the preview shows a change on today's data already.tests/unit/test_website_duel.pypins the contract (everyHEAT_STATUSESvalue has a pill, every display field is read, the panel is wired).