Skip to content

docs(eval): define the committed scorecard series (#4765) - #5243

Merged
usirin merged 2 commits into
mainfrom
usirin/umut/4765-committed-scorecard-series-definition-5509CA59
Aug 10, 2026
Merged

docs(eval): define the committed scorecard series (#4765)#5243
usirin merged 2 commits into
mainfrom
usirin/umut/4765-committed-scorecard-series-definition-5509CA59

Conversation

@usirin

@usirin usirin commented Aug 10, 2026

Copy link
Copy Markdown
Member

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 = the
existing Scorecard type serialized by toJson. 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 series section
    under the existing report docs: the path, why it is committed rather than a PR comment, why it is
    colocated with the fabrika plugin, what toJson emits today (described, not prohibited — see
    below), the proposed YYYY-MM-DD UTC date spelling and the argument for it, a three-row table of
    which issue produces and which consume, and an explicit deliberately-not-decided list.
  • .glossary/TERMS.md — one committed scorecard row naming the artifact class, with the "Not"
    column separating it from the in-memory Scorecard type / --json output, from a PR comment, and
    from 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:

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
## Dependencies block, which the intake formats contract makes its single home — the earlier
amendment 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:

Scope

  • No source file, no corpus JSON, no harness behavior touched. Docs only.
  • Nothing under claude-plugins/ is modified, so none of the fenced fabrika skill trees is touched.
  • Not §CP: neither packages/fabrika-cli/ nor .glossary/ matches any CODEOWNERS row (verified by a
    live read of .github/CODEOWNERS on main).

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
## Dependencies block, it needs an explicit pre-authorization for those four numbers.

Deviations

(repair round 1)

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>
@github-actions

github-actions Bot commented Aug 10, 2026

Copy link
Copy Markdown

No preview deploy

  • No preview deploy for this PR — its diff touches no deploy-relevant path, so no preview stack was minted and e2e is not applicable. (a2a2b02)
  • web — Stage pr-5243 torn down.

@usirin

usirin commented Aug 10, 2026

Copy link
Copy Markdown
Member Author

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. pipeline-cli class-probe classify --namespaces on the 2-file diff resolves to has-code, i.e. one required namespace: review-code. No review-doc, review-skill or review-design (the glossary and packages trees are code-root paths; nothing under apps/web/src/). Diff shape confirmed first-party: 2 files, +48/-0, zero deletions.

Control-plane re-derived independently, both axes. pipeline-cli cp-classify classify returns not-control-plane [path-clear-no-content-source] (exit 3). Path axis: a live read of .github/CODEOWNERS on main matches no row against .glossary/TERMS.md or packages/fabrika-cli/src/eval/README.md (the pipeline-cli enforcement-core row is a different package). Content axis: the ADR-0164 guard-content-probe clause takes .decisions/ ADR bodies as its input and this diff contains none, so the content axis has nothing to decide — not a fail-open path read. Normal PASS/FAIL namespace, not the control-plane advisory lane.

Closing keywords. Case-insensitive (fix|close|resolve)[a-z]* +#[0-9]+ over the PR body yields exactly 1 hit: line 1, Fixes #4765, plain prose (not inside a code span or fence), intended and correct. None of #4678 / #4679 / #4680 / #4681 / #4766 / #4769 is closed by this PR — each is referenced without a keyword.


Criteria

Run-evidence bundle: PRESENT for head d5b33227 — producer run 31347574310, artifact 9047912491, manifest.commit == head, schemaVersion 1; checks 2/2 pass; tests 2424/2424 passed, 0 failed, 0 skipped.

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>
@usirin

usirin commented Aug 10, 2026

Copy link
Copy Markdown
Member Author

review-code: PASS @ a2a2b02 — merge-ready

Re-gate of PR #5243 after repair round 1. The head moved (round 1 gated d5b33227), so the prior review-code: FAIL is dead by SHA and this verdict is re-derived from scratch against a2a2b02b.

Read the PR head (§HEAD): both files under review were sourced from a2a2b02baf2e80dfcd264218537bdc2f49aedcae through a per-run ref (refs/pr/5243-rev2) whose OID was asserted equal to the pinned head before any read, and read object-wise from that ref — never from the launched session's on-disk copy, which was left untouched throughout.

Required-namespace set (emitted at dispatch, from pipeline-cli class-probe classify --namespaces, exit 0): 1 namespace → review-code. Both changed paths are code roots (.glossary/** and packages/** both match HAS_CODE_RE), so the has-docs carve-out applies and no review-doc marker is owed. No skills/** or agents/** path ⇒ no review-skill. No apps/web/src/** path ⇒ review-design neither required nor dispatched. This independently confirms round 1's derivation.

Diff at head: 2 files, +74/−0, zero deletions.glossary/TERMS.md (+1), packages/fabrika-cli/src/eval/README.md (+73).

Governing contract. #4765 carries no ### Acceptance criteria heading (it is a type:decision report-shaped issue). Flagged as a process gap upstream, not a defect of this PR — the at-least-one-AC floor should have been established at triage. The contract verified against is the newest disposition (chief-of-staff, 2026-08-10T00:14): the defining half is discharged by the 2026-08-02 founder ruling, and the residue is one doc unit.

The two round-1 FAIL rows — both genuinely discharged

Round-1 passes — re-confirmed at the new head, not re-litigated

The fourth ## Deviations entry, new this round

Standing sub-gates

Evidence

Run-evidence bundle: PRESENT for head a2a2b02b — producer run 31348361292, artifact 9048182213, manifest.commit == head, schemaVersion 1; checks 2/2 pass; tests 2424/2424 passed, 0 failed, 0 skipped.

CI at head: all check-runs green, zero failures.

Note: the 7-140 SKILL.md line band was not cited or enforced anywhere in this gate — it is dead (#4701, landed as #5240).

All criteria pass. This PR is merge-ready. review-code does not mergeship-it is the authorized merge step; merging will auto-close #4765 via Fixes #4765.

Verdict-written: 2026-08-10T02:06:40Z

@usirin
usirin added this pull request to the merge queue Aug 10, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Aug 10, 2026
@usirin

usirin commented Aug 10, 2026

Copy link
Copy Markdown
Member Author

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: added_to_merge_queue 2026-08-10T02:11:55Z → removed_from_merge_queue 2026-08-10T02:17:28Z, with no merged event and no squash commit on main.

Cause: a combined-batch CI failure, not a textual conflict. The batch ref gh-readonly-queue/main/pr-5243-c7d90b13 ran CI (run 31349143625) and the unit + client tests job failed at pnpm --filter './apps/**' test:client; ci-required failed as a consequence. This PR's own head (a2a2b02b) is green on all 45 contexts with an all-pass, commit-bound run-evidence bundle, and the diff is two markdown files (.glossary/TERMS.md, packages/fabrika-cli/src/eval/README.md) that no client test can reach — so the failure is a batch-mate's or a flake, not this PR's.

Routing back to repair/re-queue — this is NOT a shipped state (ADR 0132; GitHub "Managing a merge queue").

@usirin
usirin added this pull request to the merge queue Aug 10, 2026
Merged via the queue into main with commit ebfaf98 Aug 10, 2026
46 checks passed
@usirin
usirin deleted the usirin/umut/4765-committed-scorecard-series-definition-5509CA59 branch August 10, 2026 02:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

"scorecard" is an undefined artifact forward-referenced by four fabrika epic children

1 participant