Skip to content

fix(fabrika): derive every published KEEP-corpus figure from the enumeration (#4823) - #5177

Merged
usirin merged 2 commits into
mainfrom
usirin/publish-ruled-keeps-figure-4823-BE34AAB4
Aug 9, 2026
Merged

fix(fabrika): derive every published KEEP-corpus figure from the enumeration (#4823)#5177
usirin merged 2 commits into
mainfrom
usirin/publish-ruled-keeps-figure-4823-BE34AAB4

Conversation

@usirin

@usirin usirin commented Aug 9, 2026

Copy link
Copy Markdown
Member

The ruled KEEP corpus is a committed list you read (ruled-keeps.json), but two pages still told authors otherwise: the glossary's authoring brief entry and the fabrika authoring-brief contract both asked a brief author to pull incident rows from "the 74-issue KEEP corpus", and the contract pointed at two issues to join by hand. Both now point at the file and publish the real figure. To stop the next copy going stale, the figure is no longer typed by hand anywhere — it is computed from the enumeration, and a test checks every page that publishes it.

Fixes #4823

What changed

  • claude-plugins/fabrika/docs/authoring-brief-contract.md — field 3 now names
    ruled-keeps.json and fabrika eval keeps, publishes 66 members plus 1 pending, and keeps
    Decision (founder-decision-fork): approve the 137-issue kill batch from the #4634 sweep #4642 / Investigation: sweep the 222 open pipeline issues — which encode real incidents worth preserving as eval cases #4634 as the enumeration's provenance rather than as a recipe the reader re-runs. The
    ruling's 74 is described as superseded, not restated as fact. The worked example's caption and
    the "cannot open 74 issues" line follow.
  • .glossary/TERMS.md — the authoring brief row's field-3 clause, the definition a brief author
    reaches before the contract doc, now links ruled-keeps.json and publishes the same derived
    phrase instead of "the 74-issue KEEP corpus".
  • packages/fabrika-cli/src/eval/ruled-keeps.tspublishedFigure derives the cardinality
    phrase from the rows; publishedFigureViolations checks one artifact against it, and against
    DISCREDITED_FIGURES (the exact phrasings the 74 was published as in-tree).
  • packages/fabrika-cli/src/eval/incident-corpus/README.md — same derived phrase, so the pages
    agree by construction instead of by coincidence.
  • Tests — pure-core cases for both functions, plus a data check that declares all three published
    surfaces (corpus README, glossary, contract doc) and reads each by path.

Why this closes #4823 rather than opening a new ticket

Five of the six acceptance criteria were delivered by PR #4837 and are live at main; I verified
each rather than re-implementing it:

AC State at main
66 enumerated adjacent to the corpus, per-row verdict / borderline / coverage ruled-keeps.json, 67 rows (66 member + 1 pending); coverage joined from provenance.json at read time
Derivation recorded so the list is auditable derivation.recipe / sources / arithmetic
#4180 explicitly pending, quoting the retraction pending, pendingReason carries "hereby retracted"
README points at the enumeration, no 74 held, and this PR re-aims its figure check
Correction comment appended on #4642 comment 5162555158, appended not edited
No open issue's milestone changed this diff changes no issue

The scope line "correct the published cardinality at each place it appears" was discharged one
surface at a time — README, then provenance.json (#4838), then the contract doc and the glossary
entry here. A full-tree sweep for every DISCREDITED_FIGURES phrase now returns zero live
prose hits: the only remaining matches are the deny-list itself and two test fixtures. With that,
every criterion holds at merge.

The check reds — proven by mutation, not by reading

Each mutation applied to the worktree, the data test run, then reverted:

Mutation Result
Delete one member row from ruled-keeps.json exit 1 — every surface named: does not publish the enumerated figure '65 members plus 1 pending'
Reintroduce 74-issue KEEP corpus in the contract doc exit 1 — asserts the discredited '74-issue KEEP corpus'
Point a declared surface at a missing file exit 1 — ENOENT

The third is the point of reading each surface by path: a surface that cannot be read throws.
"Could not read it" and "it carries no stale figure" are different facts, and the check never
collapses the first into the second (ADR 0092). The surface list is asserted non-empty for the
same reason.

Also run at the repair-round head: the two ruled-keeps test files green (31 tests),
pnpm typecheck 31/31, pnpm lint:worktree clean. Round 0 additionally ran the whole
packages/fabrika-cli suite (175 files / 2485 tests) and the keeps CLI verb, which printed
66 member(s) plus 1 pending and
{"members":66,"pending":1,"borderline":7,"covered":7,"uncovered":59}; this round changes no
member row, so that output is unchanged.

Deviations

Class 1 (scope narrowing) — the positive check is a phrase match, not a parser. Said: correct
the published cardinality wherever it appears. Did: required each declared surface to carry the
derived phrase verbatim, and denied a fixed list of stale phrasings. Why: the derived half reds on
any drift, which is the failure that actually happens; a deny-list cannot catch a cardinality
someone words in a new way, and a prose parser for "the corpus size" would be a check that asserts
its own cleverness rather than the property. Disposition: no action needed — stated here so a
reviewer judges the limit rather than inferring completeness.

Class 1 (scope narrowing) — the data test reaches outside its package. Said: nothing. Did: the
fabrika-cli data test reads claude-plugins/fabrika/docs/authoring-brief-contract.md by relative
path. Why: the corpus publishes its size to a page outside the package, so a check confined to the
package would go green while the page an author reads still said 74 — the exact shape of the defect
being fixed. Disposition: for the reviewer to judge; the alternative (a repo-wide guard in
pipeline-cli) is a larger surface than this ticket asked for.

Class 2 (found a sibling defect, left it) — the stale 74 in #4649's body. Said: correct each
place the figure is published. Did: left #4649's Destination / bar bullet / Pitch untouched. Why:
it is an issue body this lane holds no claim on, and the mis-attribution guard refuses the write;
the 2026-08-08 amendment on #4823 already records the finding as #4649's own lane. Disposition:
recorded here and in the progress comment so it is not lost.

Class 3 (did not re-verify a prior result) — the 66 itself. Said: the enumeration is the
deliverable. Did: took ruled-keeps.json's membership as given and re-derived nothing against
#4634 / #4642. Why: that derivation was run twice and gated when PR #4837 landed; re-running it
here would change no row and would put a second, unreviewed derivation in the record. Disposition:
no action needed — this PR changes no member row.

(repair round 1) Retraction — an earlier round's disclosure carried a false claim. Said, in round
0: the authoring-brief contract "is the last in-tree page publishing the discredited figure". That
was wrong — .glossary/TERMS.md:35 published the same phrase, and the gate caught it. The claim is
retracted and replaced above with a sweep result rather than an assertion: every
DISCREDITED_FIGURES phrase, searched across the whole tree, returns zero live prose hits.
Disposition: fixed, not merely disclosed — the glossary row is corrected and added to SURFACES,
so the guard holds it going forward. The bound on the check (phrase match + fixed deny-list)
stands as disclosed above; what was false was the completeness premise, not the bound.

Not touched: packages/fabrika-cli/package.json (versioning is the release lane's), and the
--model alias work in flight on #5158 / #5148 — this diff does not reach the capture manifest.

@github-actions

github-actions Bot commented Aug 9, 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. (da8be91)
  • web — Stage pr-5177 torn down.

@usirin

usirin commented Aug 9, 2026

Copy link
Copy Markdown
Member Author

review-code: FAIL @ 44ce6a0

Verified against #4823 at head 44ce6a0d, read via a per-run fetched ref plus a throwaway worktree (§RO/§HEAD — the launched tree was never switched). Class probe: 5 changed files → has-code only; one required namespace, review-code. Not control plane (CONTROL_PLANE_TOUCHED='', GUARD_TOUCHING=''). CI at head: 42 SUCCESS / 4 SKIPPED / 0 failing. No unresolved review threads.

The central claim checks out — except for the one criterion it rests on

The PR argues five of six acceptance criteria were already delivered by PR #4837 and live on main, leaving only the scope line "correct the published cardinality at each place it appears." I checked all six against live main rather than taking the claim. The five hold. The one it says it closes does not.

Per-criterion

  • [PASS] 66 enumerated adjacent to the corpus, per-row verdict / borderline / coverageincident-corpus/ruled-keeps.json on live main: 67 rows, 66 member + 1 pending, 7 borderline. Each row carries issue / title / sweepVerdict / sweepReason / sweepSection / borderline / status / snapshot. Coverage is derived at read time (withCoverage joins provenance.json) rather than stored per row — a narrowing of "each row carrying … whether a case pins it", but a documented and defensible one (a committed copy would be a second source of truth that drifts from the ledger). Landed and gated with feat(fabrika-cli): publish the ruled KEEP corpus as an enumeration (#4823) #4837; not this PR's to re-litigate.

  • [PASS] Derivation recorded so the list is auditablederivation.recipe / .sources / .arithmetic, all non-empty, and ruledKeepsViolations reds if any of them empties.

  • [PASS] Worktree owner stamps are never written on the live harness path — 0 of 256 trees stamped #4180 explicitly pending, quoting the retractionstatus: "pending" with a pendingReason carrying the Decision (founder-decision-fork): approve the 137-issue kill batch from the #4634 sweep #4642 retraction verbatim ("…is hereby retracted"). The schema makes it structural: PendingRow requires pendingReason, so the row cannot be resolved by deleting a field.

  • [PASS] Corpus README points at the enumeration, publishes no 74 — holds on main; this PR re-words its figure to the derived phrase so the check binds it.

  • [PASS] Correction comment appended on Decision (founder-decision-fork): approve the 137-issue kill batch from the #4634 sweep #4642 — comment 5162555158, created_at == updated_at (appended, never edited), showing the 67+7 arithmetic.

  • [PASS] No open issue's milestone changed — this diff changes no issue.

  • [FAIL] Scope: "correct the published cardinality at each place it appears"still undischarged. The PR states the authoring-brief contract "is the last in-tree page publishing the discredited figure." It is not. .glossary/TERMS.md:35 — the canonical authoring brief vocabulary entry, the definition a brief author reaches before the contract doc — still reads:

    the incidents from the 74-issue KEEP corpus the rebuild must not regress (Decision (founder-decision-fork): approve the 137-issue kill batch from the #4634 sweep #4642)

    Present on live main and unchanged at 44ce6a0d. A full-tree sweep at head for every deny-listed phrase returns exactly one live prose hit — this one; every other hit is a test fixture or the deny-list itself.

    This is not the disclosed limit. It is the exact string in DISCREDITED_FIGURES, missed only because the surface list omits the page. Proof: adding .glossary/TERMS.md to SURFACES and running the data test reds immediately with both halves —

    ../../../../.glossary/TERMS.md: does not publish the enumerated figure '66 members plus 1 pending'
    ../../../../.glossary/TERMS.md: asserts the discredited '74-issue KEEP corpus'
    

    So the check's mechanism is sound; its enumeration of surfaces is incomplete, which is the same defect class one file over. Remedy, in scope: correct the authoring brief row in .glossary/TERMS.md to the derived phrase, and add .glossary/TERMS.md to SURFACES so the guard holds it. Merging as-is closes Publish the ruled fabrika eval corpus as an enumeration — membership is derivable but never written down, and the published size (74) is wrong #4823 with a published 74 still live in the repo's canonical vocabulary.

The two standing traps — both verified by doing, both hold

1. Does the check assert the right property? Re-ran all three claimed mutations in the head worktree, reverting between each. Every one reds:

Mutation Result
Delete one member row from ruled-keeps.json RED — both surfaces named: does not publish the enumerated figure '65 members plus 1 pending'
Reintroduce 74-issue KEEP corpus in the contract doc RED — asserts the discredited '74-issue KEEP corpus', naming the contract doc
Point a declared surface at a missing file RED — ENOENT thrown from the readFileSync inside the surface loop

The figure is genuinely derived, not typed: publishedFigure computes it from rows, and the deleted-row mutation moved the expected phrase to 65 members plus 1 pending on its own. Baseline at head: 31 tests green across both test files.

2. Can a read that did not run count as clean? No. Each surface is read by path inside the assertion, so an unreadable one throws (mutation 3). The non-empty surface assert is real and independently reds — I emptied SURFACES and got AssertionError: expected +0 to be above +0 from the ADR 0092 test, while the violations test went vacuously green beside it. That is exactly the right split: the zero-scope guard is what stops the green.

The disclosed limit — acceptable bound, correctly disclosed

Positive half = verbatim phrase match, negative half = fixed deny-list. It catches drift and a copy of the known-bad wording, not a cardinality worded a new way. For this ticket that bound is fine: the failure that actually happens is a stale copy, and a prose parser for "the corpus size" would be a check asserting its own cleverness. The disclosure is honest and well-classified. What the disclosure gets wrong is not the bound but the premise — it claims completeness of the surface set ("the last in-tree page"), and that claim is false, which is what the FAIL above rests on.

Other gate facets

  • comment-discipline — [PASS]. 118 added lines scanned. The added docblocks are load-bearing: why the figure is derived rather than literal, why the deny-list is the negative half, why the data test reaches outside its package. No narration or restatement slop.
  • deviation-disclosure — the ## Deviations section is present and well-classified (three classes, each with a disposition). Not scored as an independent FAIL row; the substantive defect is the AC row above.
  • unresolved-threads — not applicable, no review threads on this PR.
  • glossary-freshness — the extracted script returned CANNOT-EVALUATE (handle carries no BASE_REF), an environment fault in the script's own handle, not a property of the PR. Resolved by direct read at head instead: all 5 files are modified, no new feature folder, no new package, and the new exports in ruled-keeps.ts are not reachable through the package's exports map — so no new public surface. Contributes no row. The script's unbound-variable fault is being filed separately.
  • run-evidence bundle — not consulted; the in-worktree runs above are the authoritative signal (ADR 0067) and CI is green at head.

Verdict

FAIL — conjunctive. Five criteria hold, both standing traps are genuinely handled, and the mechanism is well-built. One criterion — the only one this PR set out to close — is still open, on a page the PR's own deny-list catches the moment it is declared.

Leaving #4649's stale figure untouched was the right boundary: it is an issue body this lane holds no claim on, the mis-attribution guard refuses the write, and the finding is already recorded on #4823. That call stands.

Verdict-written: 2026-08-09T20:30:15Z

usirin and others added 2 commits August 9, 2026 13:33
…eration (#4823)

The enumeration landed in PR #4837, but the ticket's scope line — correct the
published cardinality at each place it appears — was discharged surface by
surface, and one was missed: the fabrika authoring-brief contract still told
every brief author to pull incident rows from "the 74-issue KEEP corpus" and
pointed at #4642/#4634 rather than at the committed file. It predates the
correction, so it is the same defect as #4838 one directory over.

The doc now points at ruled-keeps.json and publishes 66 members plus 1 pending,
keeping #4642/#4634 as the enumeration's provenance rather than as the recipe a
reader is asked to re-run.

To stop the next copy going stale, the figure is derived rather than written:
`publishedFigure` computes it from the rows, and `publishedFigureViolations`
checks each artifact that publishes it. The data test declares both surfaces —
the corpus README and the authoring-brief contract — and reads each by path, so
an unreadable surface throws rather than counting as clean; "could not read it"
and "it carries no stale figure" are different facts.

Proven by mutation, not by reading: deleting one member row reds both surfaces
(65 members plus 1 pending is published nowhere), reintroducing the string
"74-issue KEEP corpus" reds the contract doc, and pointing a declared surface at
a missing file reds with ENOENT.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… guard it (#4823)

The `authoring brief` row still published "the 74-issue KEEP corpus" — the definition a
brief author reads before the contract doc, and the one page the previous round's
completeness claim missed. It now links `ruled-keeps.json` and carries the derived
"66 members plus 1 pending".

The mechanism was sound; its surface list was not. `.glossary/TERMS.md` joins `SURFACES`
in the data test, so the guard holds the page going forward. A full-tree sweep for every
`DISCREDITED_FIGURES` phrase now returns zero live prose hits — the remaining matches are
the deny-list itself and two test fixtures.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@usirin
usirin force-pushed the usirin/publish-ruled-keeps-figure-4823-BE34AAB4 branch from 44ce6a0 to da8be91 Compare August 9, 2026 20:39
@usirin

usirin commented Aug 9, 2026

Copy link
Copy Markdown
Member Author

review-code: PASS @ da8be91 — merge-ready

Repair round 1. The prior verdict at 44ce6a0d (comment 5233696727) was FAIL and is void. Re-gated at da8be915, read via a per-run fetched ref plus a throwaway worktree (§RO/§HEAD — the launched tree was never switched). Class probe: 6 changed files → has-code only; one required namespace, review-code. Not control plane (CONTROL_PLANE_TOUCHED='', GUARD_TOUCHING='', 6 files scanned, 0 ADRs). CI at head: 39 SUCCESS / 4 SKIPPED / 0 failing. No unresolved review threads.

File count 5 → 6. The added file is .glossary/TERMS.md — the exact page the round-0 FAIL named. The other five are unchanged in identity from round 0.

The round-0 blocker is closed, and closed the right way

The FAIL rested on one thing: .glossary/TERMS.md:35 still published 74-issue KEEP corpus, and SURFACES did not include that page. Both halves are now fixed, and I verified the fix rather than reading it.

The claim that mattered: the glossary figure is DERIVED, not hand-typed

The repair claims the glossary's 66 members plus 1 pending is the exact string publishedFigure computes from the rows, so the check's positive half binds it. A number that merely happens to match today would be this ticket's own defect one page over. Proven by mutation, not by reading: I deleted one member row from ruled-keeps.json in the head worktree and re-ran the data test. The expected phrase moved on its own to 65 members plus 1 pending, and all three surfaces red, the glossary among them:

./incident-corpus/README.md: does not publish the enumerated figure '65 members plus 1 pending'
../../../../.glossary/TERMS.md: does not publish the enumerated figure '65 members plus 1 pending'
../../../../claude-plugins/fabrika/docs/authoring-brief-contract.md: does not publish the enumerated figure '65 members plus 1 pending'

Reverted, green again (13/13 in the data file). The glossary number is bound to the enumeration, not typed beside it.

The sweep, re-run independently — this is where round 0 went wrong

Round 0's blocker existed because a sweep was assumed rather than run, so I ran it myself over the whole head tree (git grep against the fetched PR ref — every tracked path, no node_modules, no .git) for all three deny-listed phrases (74-issue KEEP corpus, 74 KEEP, ruled at 74). Six matches, zero of them live prose:

Match What it is
packages/fabrika-cli/src/eval/ruled-keeps.ts:171-173 (3 lines) the DISCREDITED_FIGURES deny-list itself
packages/fabrika-cli/src/eval/ruled-keeps.unit.test.ts:208,211 (2 lines) pure-core test fixtures asserting the deny-list reds
packages/fabrika-cli/src/eval/ruled-keeps.data.unit.test.ts:122 the corpus README's assert.notInclude(readme(), "74 KEEP")

I also swept wider than the deny-list — every \b74\b in any *.md at head co-occurring with corpus/keep/eval/fabrika — and got zero hits, so the figure is not published in some new wording the deny-list would miss. And from the other side: the derived phrase 66 members plus 1 pending appears on exactly three in-tree pages (corpus README, .glossary/TERMS.md, the authoring-brief contract), and all three are in SURFACES. The surface enumeration is now complete, checked both directions.

Per-criterion (#4823)

  • [PASS] 66 enumerated adjacent to the corpus, per-row verdict / borderline / coverageruled-keeps.json at head: 67 rows, 66 member + 1 pending, 7 borderline; each row carries issue / title / sweepVerdict / sweepReason / sweepSection / borderline / status / snapshot. Coverage is derived at read time (withCoverage joins provenance.json) rather than stored per row — a narrowing, but the defensible one (a committed copy would be a second source of truth). Landed with feat(fabrika-cli): publish the ruled KEEP corpus as an enumeration (#4823) #4837; unchanged by this diff.
  • [PASS] Derivation recorded so the list is auditablederivation.recipe / .sources / .arithmetic, all present; ruledKeepsViolations reds if any empties.
  • [PASS] Worktree owner stamps are never written on the live harness path — 0 of 256 trees stamped #4180 explicitly pending, quoting the retractionstatus: "pending", pendingReason opens with the Decision (founder-decision-fork): approve the 137-issue kill batch from the #4634 sweep #4642 ruling's EXCLUDED / HELD text and carries the retraction verbatim. Structural: PendingRow requires pendingReason.
  • [PASS] Corpus README points at the enumeration, publishes no 74 — reads "read ruled-keeps.json", "The corpus is 66 members plus 1 pending", and "Do not re-run the two-artifact join by hand". The figure is now the derived phrase, so the check binds it.
  • [PASS] Correction comment appended on Decision (founder-decision-fork): approve the 137-issue kill batch from the #4634 sweep #4642 — comment 5162555158, created_at == updated_at (appended, never edited), showing the double-count arithmetic.
  • [PASS] No open issue's milestone changed — this diff changes no issue.
  • [PASS] Scope: "correct the published cardinality at each place it appears" — the round-0 FAIL row, now discharged. .glossary/TERMS.md:35 links ruled-keeps.json and publishes the derived phrase; the page is in SURFACES; my independent full-tree sweep (above) returns zero live prose hits in either direction.

The three round-0 mutation proofs still red

Each applied in the head worktree, run, then reverted; worktree confirmed clean afterwards.

Mutation Result
Delete one member row from ruled-keeps.json RED — all three surfaces named, expected figure auto-moved to 65 members plus 1 pending
Reintroduce 74-issue KEEP corpus — applied to the glossary, the round-0 blocker page RED — ../../../../.glossary/TERMS.md: asserts the discredited '74-issue KEEP corpus'
Point a declared surface at a missing file RED — ENOENT thrown from the readFileSync inside the surface loop

The ADR 0092 zero-scope split is untouched — and still correct

I emptied SURFACES and re-ran. The zero-scope assert reds (AssertionError: expected +0 to be above +0) while the violations test goes vacuously green beside it — 1 failed / 12 passed. That is exactly the round-0 shape: the zero-scope guard is the thing that stops the green, and the repair did not "fix" it into something weaker. No regression.

The disclosure is honest

The repair-round entry retracts the false premise explicitly — round 0's "the authoring-brief contract is the last in-tree page publishing the discredited figure" is named as wrong, attributed to the gate catching it, and replaced with a sweep result rather than a fresh assertion. Critically it leaves the bound standing (phrase match + fixed deny-list, disclosed as a Class 1 narrowing): the bound was never the problem, and re-litigating it would have been the wrong repair. That is the correct split.

One accuracy nit, not a defect: the body's "What changed" sentence accounts for the remaining matches as "the deny-list itself and two test fixtures" — five of the six. The sixth (the data test's notInclude assertion) is also not live prose, so the claim's substance holds; only its enumeration is one short.

Other gate facets

  • comment-discipline — [PASS]. 121 added lines scanned. The added docblocks are load-bearing: why the figure is derived rather than literal, why the deny-list is the negative half, and — new this round — why the surface list is the check and why each surface is read by path. No narration or restatement slop.
  • deviation-disclosure — [PASS]. ## Deviations present, four classes plus the repair-round retraction, each with a disposition.
  • glossary-freshness — not applicable (no new feature folder / public package / export; detector expressible here, 50 candidate surfaces on base). Row omitted.
  • unresolved-threads — not applicable, no review threads on this PR.
  • fabrika eval layer: the execution harness, the incident corpus, and the ruled bar #4649 left untouched — confirmed live: its body still carries the stale 74 and the lane wrote nothing to it. Correct boundary — it is an issue body this lane holds no claim on, and the finding is already recorded on Publish the ruled fabrika eval corpus as an enumeration — membership is derivable but never written down, and the published size (74) is wrong #4823. That call stands from round 0.
  • Verification runs at head — the two ruled-keeps test files green (31 tests); the full packages/fabrika-cli suite green (175 files / 2485 tests); pnpm typecheck 31/31 tasks successful.

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

Read the PR head (§HEAD): all files under review sourced from da8be9155c4749f30818a4c2b9c930f385d8f4fb via the throwaway review worktree / git show "$PR_REF:<path>", never the launched checkout's working copy. Live head re-checked immediately before posting and unchanged.

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

Verdict-written: 2026-08-09T20:48:12Z

@usirin
usirin added this pull request to the merge queue Aug 9, 2026
Merged via the queue into main with commit 662a430 Aug 9, 2026
46 checks passed
@usirin
usirin deleted the usirin/publish-ruled-keeps-figure-4823-BE34AAB4 branch August 9, 2026 20:58
@github-actions github-actions Bot mentioned this pull request Aug 9, 2026
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.

Publish the ruled fabrika eval corpus as an enumeration — membership is derivable but never written down, and the published size (74) is wrong

1 participant