I3354 — A pure scorecard function computes each proof test's status, counted sample, effect and losses from committed records, and withholds a verdict until the registered sample is complete
Add economics::proof::scorecard(root): per test, status not_run (protocol not registered, instrument not built, or no counted record, each named), running (counted sample below the registered minimum, no verdict word and no effect shown), else passed, failed or inconclusive by the registered decision. paired: the suite's primary verdict as I3366's functions compute it. trials: min_successes and all_must_pass over counted trials. window: passed when the window closed and every field's not-observed share is within its bound, failed when one exceeds it, running while open. Losses list every invalid pair with its failing side, every pair or trial against the favourable direction, and every uncounted record with its reason. Totals per status are included. Fixture tests only; no capability.
BLOCKED wave 2 · p1 · implementation profile · parallel safe
Blocked. This issue cannot start until I3351, I3353, I3366 are done. The status is derived from that, not declared.
Objective
Add economics::proof::scorecard(root): per test, status not_run (protocol not registered, instrument not built, or no counted record, each named), running (counted sample below the registered minimum, no verdict word and no effect shown), else passed, failed or inconclusive by the registered decision. paired: the suite's primary verdict as I3366's functions compute it. trials: min_successes and all_must_pass over counted trials. window: passed when the window closed and every field's not-observed share is within its bound, failed when one exceeds it, running while open. Losses list every invalid pair with its failing side, every pair or trial against the favourable direction, and every uncounted record with its reason. Totals per status are included. Fixture tests only; no capability.
Why
The owner's report of 2026-10-19 asks that T1 to T6 be settled by measurement, losses included; a typed verdict is the forecast the report rejects. The critique split the original scorecard issue because a calculator, three decision kinds and a capability with its projections were more than one reviewable pull request. Withholding the verdict while running answers the critique's point that a republished report would otherwise show interim verdicts during the runs.
Current state
No function computes a proof status. stats.rs:260 provides bootstrap_median_clustered for the token metric, which suits a median of ratios, not a binary acceptance outcome.
Desired state
scorecard(root) over the tracked plan reads six not_run rows with their reasons; fixtures drive each status and each loss reason.
Scope
- apps/majordomus-cli/src/economics
- apps/majordomus-cli/tests/economics.rs
Out of scope
- Declaring a capability or regenerating projections (I3355)
- Any statistic not in stats.rs
- Rendering
Dependencies
- I3351READY A proof plan is a validated record in which each protocol is frozen by its own digest, so registering one test never stales another's records
- I3353BLOCKED A trial is a typed record that carries its protocol's digest, refuses what the protocol does not declare, and redacts what its publication basis does not permit
- I3366READY The economics calculator decides a binary paired outcome by an exact task-level test, intervals a continuous paired difference by task-clustered bootstrap, and turns either into one verdict
What waits on this
- I3355BLOCKED majordomus economics proof serves the scorecard on the command line, HTTP and MCP from one capability declaration
- I3358BLOCKED economics check refuses a guaranteed claim of value that no passed proof test backs, in the claims matrix only
- I3372BLOCKED The registered corpus is run in both arms, its records are committed, and its verdict is published with its losses and its origin
- I3384BLOCKED The first delivery window is measured at its close and published with its denominators, the work not accepted and the checkouts it could not read
- I3389BLOCKED The mesh suite is run in both arms and its guarded verdict is published with its losses
- I3394BLOCKED The mesh lab's work-fault evidence from CI is committed as T5 trials and the T5 verdict is published with every failed trial
Acceptance criteria
- Fixtures drive each of the five statuses, and not_run for each of its three reasons
- A paired fixture whose test does not reject reads inconclusive, never passed
- A running fixture shows no verdict word and no effect
- Per-status totals equal the number of tests
- A stale record, a record under another digest and one recorded before registered_at appear under losses and change no status
Validation
- cargo test --manifest-path apps/majordomus-cli/Cargo.toml --test economics
- cargo fmt --manifest-path apps/majordomus-cli/Cargo.toml --check
Evidence required
- test_proof_status_is_computed
- test_uncounted_records_are_listed
Evidence
None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.
Timeline
- started
- —
- verified
- —
- completed
- —
Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.
Canonical record: .ai/repo/project/issues/I3354.yaml. Read it back with majordomus plan show I3354.