Repository navigation
Grade each pair of process Trials with a Grader panel, beside the Verdict - #1948
Merged
Merged
Conversation
…dict The Bar can name a Grader panel: --panel-seat harness=..,model=..[,effort=..] seats, several per family, a vote unit (--panel-vote family|model, family by default) and the arm-family rule (--panel-arm-family-rule on|off, on by default). Each seat reads every finished pair of process Trials in a fresh sandboxed session per presentation order. The blind packet holds the Ticket, the criteria, a fixed rubric, and per side the outcome, the diff against the base and the Pair evidence, with A and B shuffled per pair and swapped in the second order. Validated calls are saved by Arm, so a resume asks only for missing ones. A Grader's call that flips with the order is a tie. Seats from either Arm's family are reported but don't vote while another family sits. Each family takes its own majority first, or each Model votes; a call needs more than half the votes, and a tied merge call is not ready. Every seat's calls and the panel's result are reported under panel (result format 10) and in the text view, beside the unchanged Verdict. Closes #1882
Remove identifying added lines from panel packet diffs, as reports already are, and read diffs within the Bar's timeout. Share one private Grader session between the model Grader and the panel. Decode the preference as an enum, name ballots, seat calls and the Arm shown as A plainly, key per-Model votes by Model, call the sides Trials in the prompt, and grade with the panel after the model Grader.
Keep the Grader panel beside #1885's blind pairwise page: the panel's result fills each Pair's panel calls, for the page's reveal and people–panel agreement, and its contract shares ArmPreference.
This was referenced Nov 10, 2026
Merged
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.
Closes #1882
Summary
The Bar can name a Grader panel. Each seat reads every finished pair of process Trials blind, once in each presentation order. Every seat's calls and the panel's vote are reported beside the Verdict, which they don't change.
--panel-seat harness=<h>,model=<m>[,effort=<e>](repeatable),--panel-vote family|modeland--panel-arm-family-rule on|off. They are part of the Bar, so changing them after the first Trial is refused. The Console's structured start options accept the same three.bar.panelandpanel: [PanelPair], and the text view addsPanel …lines.docs/experiment-results.md,docs/eval-tasks.md(packet contract), the guide, the glossary's Bar entry, code navigation, the new Panel Grader prompt and the three hand-written site pages are all updated.Model: …, are removed from panel packets.Evidence
Execution evidence
refs/remotes/origin/issue-1872built in a temporary worktree):thirdshift experiment HEAD --panel-seat harness=claude,model=judge-one --jsoncargo test --test experiments panelvotes: falsewhile the Arms run on Claude, and vote with the rule off.cargo test --bin thirdshift panel::testscovers a family split before the panel votes, OpenCode families and seat parsing.console::start::experimentcovers the panel options.scripts/affected-tests origin/issue-1872on 4adf30b passed: site tests, Console tests,cargo build --lockedand the fullcargo test(795 s). Generated output was checked withcargo test --bin thirdshift prompts_page(14 passed) andnpm run docs:check --prefix site(exit 0).Visual evidence
None: no rendered UI changes. The Console Experiment page is unchanged; the blind pairwise page is #1885.
Merge Danger
Door: two-way
With no
--panel-seat, the Bar has nopaneland saved Experiments read as before. Format 10 only adds fields.Blast Radius: Experiments
Format 10 changes
formatin the Experiment JSON and the OpenAPI constant. Only Experiments whose Bar names a panel run panel sessions. A panel Grader that fails or answers invalidly pauses the Experiment, as an unavailable model Grader already does, and the resume asks only for the missing calls.Review
Reports: Standards found 8 findings and Spec found 6.
Addressed:
majoritytakes iterators; one flag string per Console array.Ballot,SeatCalls,shown_as_aandfirst_order;Seatedwas removed.identifying_lines_an_arm_commits_stay_out_of_the_packet.Review coverage:
src/trial.rs,src/trial/reports.rs(blind_diff) andsrc/evals/experiment/model_grader.rs(the sharedsession). The fix commit also re-edited files the reviewers had read:panel.rs,panel/tests.rs,prompt.rs,experiment.rs,console/start/experiment.rs, the docs andtests/experiments/panel.rs.prompts/README.md,prompts/panel-grader.md,site/prompts/index.htmlandsite/docs/index.html. The Standards reviewer read all of them. Regeneration was checked as listed under Evidence.Unaddressed findings
Standards
docs/agents/domain.mdsends new terms to/domain-modeling. "Grader panel" is already defined, and the docs define a seat's family where it is used.Setup.harness: String+Harness::named(..).expect(..)pattern (src/evals/experiment.rsSetup::choice). A family is shown and grouped, never matched against a closed set.arm_familiesis mild Feature Envy. It has one caller. The model Grader's exact-Model rule is a different rule, so there is no second user to move the walk ontoDescriptionfor.panel::prepareandmodel_grader::prepareboth reuse an Arm's pinned Harness. Kept separate: the panel also reuses earlier seats' pins, and the model Grader picks its Harness from User config.Spec
outcome. Kept as part of "the evidence": a Trial that stopped to ask or failed has no pull request to merge, which the merge call needs.docs/eval-tasks.mddocuments it.docs/experiment-results.mdversioning.cargo test --bin thirdshift a_hosted_model_takes_its_makers_familyfailed withleft: "fireworks-ai",right: "moonshot", as designed. Whether family should mean model lineage (docs/research/eval-grader-panel.mdQ5.c) is a Spec decision, filed as Decide whether a Grader panel seat's family is its host or its Model's maker #1949.cargo test --test experiments panel::a_failing_panel_grader_does_not_withhold_the_verdict, gaveinvalid panel Grader response; see private Grader artifactswithleft: Some(1),right: Some(0): the invalid response paused the Experiment. That is the intended behaviour: Spec: blind pairwise grading of process Trials by a Grader panel and people #1872 says the panel "pauses grading as an unavailable Grader does now", and a resume asks only for the missing calls. The panel now runs after the model Grader, so the pause holds back no model Score.Security
None. The review checked the panel Grader sessions (same private session and bounded response read as the model Grader), the Harness pinned before Trials run,
git diffin Trial repositories (a local probe found that repository config such asdiff.external, textconv,core.fsmonitorandcore.pagerruns nothing under these flags), and the Console'spanel_*options (keys are checked against the schema and values re-parsed).Built with claude 2.1.314 · opus · default effort
Security review outcome
No unaddressed introduced findings.