docs(eval): define the committed scorecard series (#4765) - #5243
Conversation
The founder ruled the scorecard's storage, location and format on #4765 -- one committed JSON file per eval run at claude-plugins/fabrika/reports/eval/<date>.json, bytes = toJson(Scorecard) unchanged. That ruling lived only in issue comments, so a builder of #4679/#4680/#4681 still had to go find it or invent a second on-disk shape. Writes it down where the builders read: a section in the eval README naming the path, the byte contract, the date convention, which of the three issues produces and which consume, and what is deliberately left to #4680/#4766/#4769. Plus one glossary row. The build order (#4678 -> #4680 -> #4681, #4679 an independent producer #4681 also blocks on) is restated for a reader only -- the authoritative topology stays in epic #4649's ## Dependencies block, its single home under the intake formats contract. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
No preview deploy
|
|
review-code: FAIL @ d5b3322 — not merge-ready Verified PR #5243 against the acceptance criteria of #4765, graded against the governing disposition (comment 5234585850, chief-of-staff 2026-08-10): the defining half is discharged by the 2026-08-02 founder ruling, and the residue is one doc unit. Classification. Control-plane re-derived independently, both axes. Closing keywords. Case-insensitive Criteria
Run-evidence bundle: PRESENT for head Failing criteria above must be addressed before this PR can merge. The PR stays open and unmerged; #4765 stays open and assigned. Re-request review once the failing criteria are satisfied. Scoping note for the repair: both findings are edits to the two files already in the diff — no code, no new file, no re-opened design question. The transcription is accurate everywhere else, and the disclosed cross-issue non-action is correct and needs no repair. Verdict-written: 2026-08-10T01:47:56Z |
…ettled (#4765) The review-code FAIL on PR #5243 found two places where a transcription-only unit read as a ruling. 1. The byte contract ('toJson output, no added keys') silently resolved a live tension: #4637 ruling 4 requires date + CLI + harness-version pins, and #4680 a per-row source commit, none of which the Scorecard type carries. Restate it as what toJson emits today, scope the ruled part to the scorecard body, and add the #4637-vs-current-shape tension to the not-decided list as #4680's call. The tension is surfaced, not resolved here. 2. The UTC YYYY-MM-DD date spelling is marked as this unit's proposal for #4680 to confirm, and also listed as open. No source rules it. The .glossary/TERMS.md row is softened to name the artifact class rather than fix its byte contract, since the glossary is canonical vocabulary. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
review-code: PASS @ a2a2b02 — merge-ready Re-gate of PR #5243 after repair round 1. The head moved (round 1 gated Read the PR head (§HEAD): both files under review were sourced from Required-namespace set (emitted at dispatch, from Diff at head: 2 files, +74/−0, zero deletions — Governing contract. #4765 carries no The two round-1 FAIL rows — both genuinely discharged
Round-1 passes — re-confirmed at the new head, not re-litigated
The fourth
|
|
ship-it: merge-queue ejection detected — PR #5243 was enqueued but the queue dropped it without merging (still open, no longer queued, not merged). Timeline: Cause: a combined-batch CI failure, not a textual conflict. The batch ref Routing back to repair/re-queue — this is NOT a shipped state (ADR 0132; GitHub "Managing a merge queue"). |
Fixes #4765
What this lands
The scorecard's defining half was already ruled on the issue (founder, 2026-08-02): one
committed JSON file per eval run at
claude-plugins/fabrika/reports/eval/<date>.json, format = theexisting
Scorecardtype serialized bytoJson. The ruling lived only in issue comments,so a builder of #4679/#4680/#4681 still had to go find it — or invent a second on-disk shape, which
is the exact failure the issue was filed about.
This PR is the doc unit the newest disposition on the issue named as the residue: write the
already-ruled facts down where the builders read, restate the ruled build order, and name what is
still open rather than settling it.
Two files, no code:
packages/fabrika-cli/src/eval/README.md— a new### The committed scorecard seriessectionunder the existing report docs: the path, why it is committed rather than a PR comment, why it is
colocated with the fabrika plugin, what
toJsonemits today (described, not prohibited — seebelow), the proposed
YYYY-MM-DDUTC date spelling and the argument for it, a three-row table ofwhich issue produces and which consume, and an explicit deliberately-not-decided list.
.glossary/TERMS.md— onecommitted scorecardrow naming the artifact class, with the "Not"column separating it from the in-memory
Scorecardtype /--jsonoutput, from a PR comment, andfrom the repo-root
reports/.What is ruled vs what this unit only proposes
The unit's premise is that nothing new is decided here, so the two places where a description could
be misread as a ruling are marked as such in both files:
Scorecardathead is
{decisionRef, framing, baseline, cells}andtoJsonis a bareJSON.stringify— nodate, no CLI version, no harness version, no per-row source commit. Founder ruling 4 on Decision (founder-decision-fork): what 'done' means for v2, and the eval bar #4637
("committed to the repo, dated, pinned to model + CLI + harness version"), epic fabrika eval layer: the execution harness, the incident corpus, and the ruled bar #4649's Given
block, and committed scorecards, the trend co-gate, and the model-churn re-run contract #4680's open acceptance criteria all require pins the type does not carry. That tension
predates this PR and is not resolved here — it is now the first entry in the README's
not-decided list, and committed scorecards, the trend co-gate, and the model-churn re-run contract #4680 owns the call.
YYYY-MM-DDUTC date spelling is this unit's proposal. The 2026-08-02 ruling says<date>.jsonand nothing more; Decision (founder-decision-fork): what 'done' means for v2, and the eval bar #4637 says only "dated". The lexicographic-sort argument is statedas an argument, and committed scorecards, the trend co-gate, and the model-churn re-run contract #4680 — which already owns the same-date collision rule — confirms or replaces
it.
The build order, and where it stays authoritative
The order across the four eval-layer children is #4678 → #4680 → #4681, with #4679 an
independent producer that #4681 also blocks on.
The README states it for a reader only. The authoritative topology stays in epic #4649's
## Dependenciesblock, which the intake formats contract makes its single home — the earlieramendment on the issue is right that a per-child restatement would create a second source that can
drift, so this PR does not create one either.
The ordering hazard the report named — #4679 (Phase 3) is told to commit a baseline scorecard while
#4680 (Phase 4) is what defines the committed series — is what the written definition actually
removes: with the path, the type and the open questions all recorded now, #4679 knows what it is
writing and what it must wait on.
Constraint on the sibling lanes — stated, not decided here
Both siblings are separate lanes, and this PR deliberately leaves their calls open. Named in the
README's not-decided list so neither finds its decision pre-made:
a per-run record is a separate artifact or rides inside a committed scorecard file depends on the
same open pin question above, which is committed scorecards, the trend co-gate, and the model-churn re-run contract #4680's to settle; where it lives and what it looks like is
#4678's eval-result record has no defined shape, namespace, or storage location #4769's call.
dispersionand "two-week decline" are undefined, and one gates a merge-blocking red #4766 (dispersionand the "two-week decline" are undefined) — not constrained either way.A trend criterion reads a series of these files; this PR records what a file is, not what a decline
is. Naming the window, the sample floor and the threshold stays entirely fabrika grading chain:
dispersionand "two-week decline" are undefined, and one gates a merge-blocking red #4766's.in the file, the
<date>spelling, and what a second run on the same date does to thefilename.
Scope
claude-plugins/is modified, so none of the fenced fabrika skill trees is touched.packages/fabrika-cli/nor.glossary/matches any CODEOWNERS row (verified by alive read of
.github/CODEOWNERSonmain).Not done here — a blocked cross-issue write, surfaced rather than dropped
The newest disposition asked for the order to be transcribed onto the four children (#4678,
#4679, #4680, #4681) so each names its dependency. Those are comment writes on four issues this run
did not create and was not pre-authorized to write to, so they were not made. Flagging it rather
than silently skipping: if the per-child transcription is still wanted on top of the epic's
## Dependenciesblock, it needs an explicit pre-authorization for those four numbers.Deviations
(repair round 1)
review-code: FAILoffered either (a) disclose the Decision (founder-decision-fork): what 'done' means for v2, and the eval bar #4637 tension in the not-decided list and soften the byte contract,
or (b) scope the byte contract to the scorecard body and leave the pin carrier to committed scorecards, the trend co-gate, and the model-churn re-run contract #4680. This
round does both halves of (a) plus the body-scoping of (b) and still does not state where
the pins go — deliberately, because picking a carrier would be the same over-reach one level down.
<date>convention is kept, relabelled rather than removed. The verdict allowed eithermarking it a proposal or moving it to the not-decided list. It is now both: marked a proposal at
its site and listed as committed scorecards, the trend co-gate, and the model-churn re-run contract #4680's open call, so a reader who only reads one of the two still sees it
is unsettled.
#4678's eval-result record has no defined shape, namespace, or storage location #4769 per-run record is "a separate artifact, not extra keys inside these files" — the same
undisclosed prohibition applied to a second lane. That sentence is now stated as open.
FOUNDER RULING: move the eval harness into fabrika-cli under the Effect-platform conventions — one ruler, not two #4777 cross-reference, the producer/consumer table, the build order, the single-source-of-topology
note, and the disclosed cross-issue non-action are untouched.