Repository navigation
[Task][RFC]: Qualify the integrated benchmark study upload and dashboard contract #5203
Description
Outcome / 目标
验收 benchmark study 上传、回读与看板完整链路。One task tracks this RFC's delivery; keep implementation PRs and milestone evidence here instead of creating a parallel task tree.
Canonical design: RFC. Roadmap: S11/S12, under #4574. Design acceptance is distinct from implementation, live qualification and promotion.
Current boundary
Source audit: main at ce3862e33 (2026-09-28). This is source/PR inspection, not a new test or live-qualification claim.
The contract/reducers, local upload CLI and read-only dashboard already exist; #3878 binds case insights to terminal runs. Treat this as integrated acceptance and current-checkpoint reconciliation, not a new dashboard or uploader.
Work remaining
- Map RFC acceptance to the shipped CLI → local upload/readback → derived campaign/arm/case/run views and close any evidenced integration gaps.
- Reconcile the RFC delivery checkpoint with that evidence. If every v0 criterion is already satisfied, close with evidence rather than inventing features.
Ownership and ongoing work
Reuse #3243 and existing benchmark-toolkit owners. PR #4439 is a separate evaluation program, not work to duplicate here. External sink transport requires its own existing authorization and lifecycle.
Contribution route: available for a bounded proposal/PR within this RFC. Name the intended milestone and exact files in a claim comment so simultaneous contributors do not duplicate work.
Acceptance
- Simple and factorized synthetic studies round-trip without losing countability, metric, effort, fidelity or provenance; denominators and provisional status remain visible.
- Replay/supersession, duplicate manifests, invalid identity, unknown record kind and forbidden evidence fail or reconcile according to the existing contract.
- Exercise the installed/source CLI and actual dashboard; no new scoring, real benchmark jobs, remote upload or leaderboard submission.
- Reconcile the RFC's current delivery checkpoint and this issue with the integrated revision, commands, passed/failed/untested evidence and remaining gates. Close the accepted scope only; no claim that a merged PR alone completes the RFC.
Starting points and delivery boundary
- loopx/capabilities/benchmark_toolkit/study_projection.py
- loopx/cli_commands/benchmark_study.py
- apps/presentation/dashboard/src/views/benchmark-study-page.tsx
Base: latest main. Reuse the existing typed owner and provider boundaries. Include affected CLI/frontend/Lark companions; verify real entrypoints and backend where changed. Preserve existing first-screen review and maintainer merge gates. Public artifacts contain only synthetic/public-safe evidence, no private operational state. This task does not authorize provider promotion, benchmark launches, release/deployment or unrelated protected effects.
Activity
karenchuu commentedon Sep 28, 2026
Claiming the criterion-4 slice of §7 (the
PR 2: Read-only dashboardrow in §6) on this task.Measured on
mainat6643f3670, source/PR inspection only — no new test run yet:apps/presentation/dashboard/public/benchmark-study.example.json:32shows"runtime_classification_counts": { "running_qualified": 2, "terminal_qualified": 4 }, butterminal_qualifiedis not a member ofBenchmarkRuntimeClassification(loopx/capabilities/benchmark_toolkit/runtime_observation.py:26-36), and the projection builds those keys directly from observed classifications (loopx/capabilities/benchmark_toolkit/study_projection.py:1304-1311)."factorial_contrast_count": 1at:29-30while"factorial_contrasts": []at:88, although the reducer defines that count aslen(board["factorial_contrasts"])(study_projection.py:1341).grepovertests/andexamples/finds no case that uploadsrecord_kind="runtime_observation"throughbuild_benchmark_upload_envelope, so one of the five kinds instudy_projection.py:47-53never reaches the projection the page renders from (apps/presentation/dashboard/src/views/benchmark-study-page.tsx:154-156, default source${BASE_URL}benchmark-study.example.jsonat:293).What I intend to change, exact files:
tests/capabilities/test_benchmark_study_projection.py— one new case that uploads a manifest, a board row, a case insight, a runtime observation and a behavior finding through the existing envelope/simulate path, then asserts the campaign block's classification keys are realBenchmarkRuntimeClassificationvalues and thatfactorial_contrast_count == len(factorial_contrasts).apps/presentation/dashboard/public/benchmark-study.example.json— regenerate from that reducer output so every number the default dashboard shows is derivable, plus the matchingapps/presentation/dashboard/smoke/benchmark-study-contract-smoke.tsexpectation and theloopx/web/chat/bundle-manifest.jsondigest if the smoke requires it.No schema change, no scoring decision, no transport. One open question I will raise instead of deciding for you: if the current fixture values are intentional illustrative data rather than a defect, say so and I will stop before replacing them; my default is to make the shipped default payload consistent with what the reducer can emit.
karenchuu commentedon Sep 28, 2026
Acceptance mapping done against
6643f3670, and one slice delivered: PR #5255 (test(benchmark): pin the runtime-observation path into the study campaign block).Per §7, item by item — what I could point at in the shipped tree:
maintodaystudy_projection.py:194-262types arms as factor assignments;test_benchmark_study_projection.py:305-310normalizes 2-arm, 4-arm and 5-arm designstest_benchmark_study_projection.py:326-335asserts envelope output equals the row exactlystudy_projection.py:1329-1360, authority block:1361-1371; tests at:639,:870-883benchmark-study-page.tsx:107-109,:145-158,:177-186; no benchmark names inside the reducer. Coverage was missing for the runtime-health half, and the default payload has the defect belowstudy_projection.py:502-506,:579-583,:694-709;:497-498with:478;:737-748viapreview_benchmark_experiment_board_upsertandexperiment_board.py:24-30;:424with:66-70,:382-402— tests at:338-356,:395-437,:460-501,:504-515,:518-587study_projection.py:770-776(execute: bool = False) and the receipt marksexternal_write_performed: false;benchmark_study.py:108-116needs explicit--storeand--execute; no network client in the toolkitTwo things came out of the mapping. I deliberately did not decide the second one:
Delivered in test(benchmark): pin the runtime-observation path into the study campaign block #5255. No case on
mainuploadedrecord_kind="runtime_observation", althoughstudy_projection.py:47-53accepts it and:1304-1311derives the campaign's runtime-health counts from it. The new case uploads three observations through the same envelope builder the CLI uses and pins the derived counts. Three mutations of the product — dropping that record kind, hardcoding a contrast count, dropping the classification aggregation — all leave the existing 20 cases green and all fail the new one.Yours to call.
apps/presentation/dashboard/public/benchmark-study.example.json, which is the dashboard's default payload, carries two values this reducer cannot produce::32lists"terminal_qualified": 4, andterminal_qualifiedis not a member ofBenchmarkRuntimeClassification(runtime_observation.py:30-36);:29claimsfactorial_contrast_count: 1while:88is"factorial_contrasts": [], although the count is defined aslen(board["factorial_contrasts"])(study_projection.py:1341).Repairing it changes user-visible numbers on the study page and needs a re-hashed entry in
loopx/web/chat/bundle-manifest.json, and GH-C101 keeps the dashboard surface with you, so I am asking instead of submitting: are those intentional illustrative values, or should I send the regenerated payload as a follow-up?One note for the fourth checkbox: the RFC has no delivery-checkpoint section to reconcile — its status line is a bare
Accepted, and there is nodocs/architecture/rfcs/ledger/benchmark-study-upload-dashboard-v0/directory — so the table above answers it directly rather than through a doc edit.