Skip to content

docs(decisions): 0254 — the ready-for: gap closes lazily at triage time, never by backfill (#5041) - #5273

Merged
usirin merged 2 commits into
mainfrom
usirin/adr-ready-for-cutover-5041-195BABBF
Aug 10, 2026
Merged

docs(decisions): 0254 — the ready-for: gap closes lazily at triage time, never by backfill (#5041)#5273
usirin merged 2 commits into
mainfrom
usirin/adr-ready-for-cutover-5041-195BABBF

Conversation

@usirin

@usirin usirin commented Aug 10, 2026

Copy link
Copy Markdown
Member

Fixes #5041.

type:decision — the deliverable is a recorded choice, so this PR is purely additive: it adds one ADR file and nothing else.

The decision

Absence of a ready-for: label stays an exclusion, and the gap closes lazily: the label is applied at triage time going forward. The already-triaged rows are not backfilled.

This records the founder's direct ruling on #5041, given 2026-08-10 ~07:43Z, which confirms the founder-delegated ruling of 2026-08-10T00:15:28Z on the same issue.

Of the three options #5041 put up:

What I re-measured (the issue's numbers had moved)

Paginated REST over open status:triaged non-PR issues, 2026-08-10:

bucket reporter triage this PR
total 421 421 422
ready-for:agent 15 16 25
ready-for:human 19 19 18
no ready-for: 387 386 379

Two things changed materially since triage's amendment, and both are in the ADR:

  • build pick is now implemented. Triage recorded it as contract-only. packages/fabrika-cli/src/build/ carries pick-verb.ts, the registry wires buildCommand, and admission runs on two named axes (scope-admission.ts, ADR 0245). The cutover is imminent rather than distant.
  • The scope fence does not absorb the gap. Restricting to the issues the scope axis already admits (milestone [triage self-test] sozluk search is weird sometimes?? #44, declared in ROADMAP.md's ## Focus 2026-08-09, or a standing lane per ADR 0208) leaves 266 issues — of which 239 carry no audience label and 229 of those are unassigned. Under the lazy answer, that narrow pool is the intended shape, not a regression.

Acceptance criteria

Deviations

  • (repair round 1) Class 2 — departed from governing recorded guidance, since corrected. The first draft of this ADR recorded backfill first, which contradicted the founder-delegated ruling of 2026-08-10T00:15:28Z on fabrika build pick would exclude 387 of 421 triaged issues #5041 (lazy cutover, no bulk backfill) and cited it nowhere. review-doc caught it as F1. The founder has since ruled directly (2026-08-10 ~07:43Z) confirming lazy, and the ADR is re-decided to match; the ruling history is now recorded in the ADR's ## Context. Disclosed here rather than left implicit, because a record that re-decides a live recorded answer without naming it is not a record.
  • (repair round 1) Class 5 — deliberate rewrite rather than an amendment. The ADR body was rewritten in a new commit instead of having a correction appended. The house rule against overwriting a filed body governs filed artifacts (issues, PRs) with no history; this is an unmerged draft in a branch where git carries the history, and the landed record must read as one coherent decision rather than a body arguing for backfill with a contradiction stapled on.

Checks

Not in this PR

Any label writes. #5270 (route triage through the fabrika seam) is the implementation half that stands; #5269 (backfill) is filed but ruled not-to-be-run. The ADR is the recorded choice.

@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. (e818369)
  • web — Stage pr-5273 torn down.

@usirin

usirin commented Aug 10, 2026

Copy link
Copy Markdown
Member Author

Reviewer flag (from #5269's triage, 2026-08-10).

This ADR takes "backfill first", but #5041 carries a founder-delegated ruling posted 2026-08-10T00:15:28Z — "LAZY cutover — no bulk backfill" / "No blind backfill of the 387" — which is not cited anywhere in the ADR or this PR body. I re-read it first-party at 04:2xZ: un-vetoed, un-retracted.

The PR's "one thing a reviewer should check on purpose" section addresses #4780's scope-hold line, but not this ruling.

Its stated reason matters to the decision, not just to the ordering: the ruling holds that a ready-for: minted in bulk is false signal, because the label's value is that a triager actually judged the audience (#4780: absence = unknown, not agent) — so minting 387 judgments nobody made recreates the phantom-label class. The ADR's framing of the backfill as a "translation, not a default" is a direct answer to that objection, but it is made without acknowledging that an answer was already ruled the other way.

#5269 (this ADR's implementation half) is parked status:needs-info pending the reconciliation. #5270 is unaffected.

Raised by the triager that handled #5269, which was scoped to write to #5269 only; delivered by the intake-desk seat on its behalf. Not a review verdict — PR-stage gates are not this seat's seam.

@usirin

usirin commented Aug 10, 2026

Copy link
Copy Markdown
Member Author

review-doc: FAIL @ 397438e — changes-requested

Reviewed-head: @ 397438e

Verified PR #5273 against #5041's acceptance criteria plus the doc-hygiene checklist. Read the PR head (§HEAD): the ADR under review was sourced from 397438e4 off a per-run ref, never the launched checkout's working copy.

Class routing. class-probe classify --namespaces over the changed-file set (1 file, .decisions/0253-ready-for-gap-closes-in-the-data.md) returns has-docs, so there is one required namespace: review-doc. No has-code, no has-skills, no has-ui.

§CP classification — blocking, decided on the CONTENT axis.

Because this is §CP, no review-doc verdict on this PR can authorize a merge — a @kamp-us/control-plane approval at head does, and ship-it enqueues on it (ADR 0135). The FAIL below is still a real blocking finding, not take-it-or-leave-it advice.


Blocking findings

F1 — The ADR contradicts a landed, un-vetoed ruling on its own linked issue, and cites it nowhere

This is the one that fails the gate on substance.

At 2026-08-10T00:15:28Z a founder-delegated ruling landed as a comment on #5041, the very issue this ADR closes. Its headline: "Ruled (founder-delegated judgment, standing trust ruling 2026-08-09, chief-of-staff, ~92%; founder live, veto open): LAZY cutover — no bulk backfill." Item 1 reads: "No blind backfill of the 387. A ready-for: minted in bulk is false signal — the label's value is that a triager judged the audience (#4780: absence = unknown, not agent). Minting 387 judgments nobody made recreates the phantom-label class."

ADR 0253's ## Decision takes the opposite answer: "the gap closes in the data — a backfill of the already-triaged board". ## Consequences then accepts asserting an agent audience over ~239 issues on the strength of what status:triaged meant, "not a fresh per-issue read" — which is precisely the false-signal objection the ruling raised and decided against.

Timeline, read first-party from the REST comment list on #5041:

I re-read #5041's full comment list at review time: the 00:15 ruling is un-vetoed and un-retracted, and the question raised at 04:23 ("does the 00:15 ruling stand, or does ADR 0253 supersede it?") has no answer. #5269, this ADR's implementation half, is parked status:needs-info for exactly this reason.

The ADR's framing — the backfill is "a translation, not a default" — is in fact a direct rebuttal of the ruling's item 1. But it is made without acknowledging that the question was already answered the other way, so a reader of .decisions/ would never learn a competing record exists. That is the defect class Step 4a exists to catch: two live records answering one question in opposite directions, where which one an agent obeys depends on which file it happened to open. The ADR does not settle the sequencing; it forks it.

The ruling also supplies two arguments the ADR never engages: that the 387 are overwhelmingly v1-era rows scheduled for a kill-sweep (so labelling them is double work, and survivors get labelled by the sweep's KEEP verdicts), and that #5175's exemption means epic planning never waits on this cutover anyway.

Remedy — one of:

  • The founder (or the delegated seat) resolves the fork on fabrika build pick would exclude 387 of 421 triaged issues #5041, and the ADR's ## Context names the 00:15 ruling and records how it is superseded or narrowed; or
  • the ADR is re-decided to match the standing ruling (lazy cutover, triage-time labelling, no bulk backfill) — which would keep ## Decision's inflow half and both rejections intact and drop only the backfill half.

Either way the ruling must be cited by name in ## Context. An ADR that re-decides a live recorded answer without naming it is not a record.

F2 — ADR id 0253 collides with open PR #5271

.decisions/0253-ready-for-gap-closes-in-the-data.md (this PR, created 2026-08-10T04:18:57Z) and .decisions/0253-eval-record-is-an-eval-namespaced-pr-comment.md (PR #5271, open, created 2026-08-10T04:18:29Z — 28 seconds earlier) both claim id 0253.

Enumeration, run at review time as required:

The PR body claims this check was already done and names only #4614 and #4703 — that claim is false at head, because #5271 opened inside the same minute. This is the concurrent-ADR-authoring race rather than author carelessness, but it still has to be fixed before either lands: whichever merges second puts two 0253 ids on main, breaking ambient ADR discovery (ADR 0126 keys the map on the NNNN-slug filename) and redding pipeline-cli decisions-index validate, which fails on a duplicate id.

Remedy: by first claim, #5271 keeps 0253 and this PR renumbers to the next free id (0254 at time of review — re-derive at repair time, the board is live). Rename the file and update the frontmatter id, the # heading, and the title line.

F3 — No ## Deviations section, and this PR owes one (§DEV)

The PR body carries no ## Deviations heading. This PR is write-code-authored — the Step-5 progress comment (## Progress — write-code, 2026-08-10, posted 04:19:37Z on #5041) positively establishes it — so neither §DEV [N/A] shape applies: there is a linked issue with an AC checklist, so no issueless carve-out fired, and the author is write-code. Absent is not None., so the row is [FAIL], not [N/A].

Not a formality here: F1 is a §DEV class 2 departure (a departure from governing recorded guidance) that the section would have forced into the open at authoring time. The progress comment does surface the #4780 reading, but a progress comment on the issue is not the PR body's ## Deviations section, and it does not mention the 00:15 ruling either.

Remedy: add ## Deviations to the PR body and disclose F1 under it.


Acceptance criteria (#5041)

  • [PASS] An ADR settles the sequencing, naming which option is taken and why the others were not. ## Decision names the taken option and carries two explicit **Rejected —** paragraphs (default-the-absence; gate-on-coverage). Graded on form. The substance is undercut by F1 — a decision that contradicts an uncited live ruling does not settle the question — but that is recorded as its own finding rather than double-charged here, so the repair round has a clean target.
  • [PASS] The decision addresses the inflow, not only the existing set. ## Context measures it (12/55 on 2026-08-09, 1/20 on 2026-08-10) and names the mechanism; ## Decision routes new triage through fabrika triage apply --ready-for and bans editing claude-plugins/kampus-pipeline/. Checked against ground truth: no ready-for reference exists anywhere under claude-plugins/kampus-pipeline/skills/triage/, and packages/fabrika-cli/src/triage/facets.ts:83 does own the ready-for: facet exclusively. This half is untouched by F1 — the 00:15 ruling's own item 2 agrees with it.
  • [PASS] The decision states how a backfill treats issues that already carry a plan-epic value. ## Decision binds it: it writes "only onto an issue carrying no ready-for: label at all", restated under **Binding constraints.**.
  • [PASS] The answer is not "default the absence", so the record states what the fail-closed rule keeps meaning. ## Decision opens "The rule does not move" — no default, no per-type heuristic, no in-milestone exception — and repeats it as a binding constraint. Checked against source: packages/fabrika-cli/src/build/scope-admission.ts:212 audienceAxisOf returns NotAgent with a null label when no ready-for: is present, exactly as the ADR describes. FOUNDER RULING: fabrika encodes a ready-for:<human|agent> label — status:triaged alone never says who picks a ticket up #4780 is preserved, not softened.
  • [PASS] Follow-up implementation work is filed as its own issues. Backfill ready-for:agent onto the 239 in-focus triaged issues carrying no audience label #5269 (backfill) and Route triage runs through the fabrika seam so new issues carry a ready-for: value #5270 (inflow) both exist. Minor note, not a finding: the PR body says both sit at status:needs-triage; Backfill ready-for:agent onto the 239 in-focus triaged issues carrying no audience label #5269 is now status:needs-info and Route triage runs through the fabrika seam so new issues carry a ready-for: value #5270 is status:triaged / p1 / ready-for:human. The board moved after the body was written.

Doc hygiene

ADR contradiction sweep (Step 4a)

  • [PASS] Mechanical plus semantic sweep, clear. Three questions enumerated (does absence default to agent? / may a backfill run over already-triaged issues? / where does the inflow get fixed, v1 or fabrika?); 250 ADRs scanned, 210 live-accepted and uncited in scope; the 8-entry shortlist (0072, 0219, 0222, 0246, 0248, 0249, 0251, 0241) opened by hand. None rules on any of the three questions — 0219 rules on priority-vs-campaign-membership, 0222 on p0 semantics, 0072 on milestones, and 0241/0246/0248/0249/0251 are fabrika-authoring and wire-format decisions. Adjacent vocabulary, not same-question. The three ADRs that do touch the domain — 0245 (the two axes), 0208 (standing lanes), 0238 (v1 frozen) — are all cited and all consistent with the decision.
  • The sweep found nothing because the contradiction is not with an ADR. It is with a ruling comment, which no ADR sweep can see. That is F1 — exactly the semantic blind spot Step 4a warns about in writing.

The requested ruling: is the ADR's reading of #4780's "no backfill" line correct?

The author asked for this to be ruled on explicitly. The reading is correct — I uphold it. Four grounds, read first-party from #4780:

  1. Placement. The line sits inside a criterion literally titled "Scope held:", in a list whose other members are unambiguously scope items — "no edit to claude-plugins/kampus-pipeline/", "no edit to packages/pipeline-cli/", "no change to the running crew's behaviour". A standing prohibition would be a strange thing to file under a heading meaning "this ticket stayed in its lane".
  2. Its other home. The phrase also appears in the original report under a heading called ## Out of scope ("A backfill of existing triaged tickets."). Out-of-scope is by construction a statement about that ticket's boundary, not about the world.
  3. It is nowhere in the founder's own words. FOUNDER RULING: fabrika encodes a ready-for:<human|agent> label — status:triaged alone never says who picks a ticket up #4780 records three verbatim founder quotes — the label name, the two-label rule, and the fabrika-only scoping. Backfill appears in none of them. Reading it as a standing ban would elevate an agent-authored scope note above the ruling's own recorded speech.
  4. It was not yet possible. FOUNDER RULING: fabrika encodes a ready-for:<human|agent> label — status:triaged alone never says who picks a ticket up #4780 states the labels "do not exist in this repo's label set today". You cannot ban in perpetuity a backfill of a label that does not exist; in context the line plainly means "do not let this p0 chore sprawl into relabelling 400 issues."

And #5041 was triaged type:decision precisely to settle the sequencing #4780 left open, so deciding on a backfill here re-litigates nothing.

Upholding the reading does not save the decision, and that is the important part. #4780's scope line was never the binding obstacle. The binding obstacle is the 00:15 ruling on #5041 (F1), which bans the bulk backfill on substance — false signal — not on scope. The PR's "one thing a reviewer should check on purpose" section flagged the right kind of thing and picked the wrong premise: it defends against a line that does not block it, while the record that does block it goes unmentioned. Clearing #4780 leaves F1 standing untouched.


Verdict: FAIL. F1 (uncited contradiction with a live ruling), F2 (ADR id collision with open PR #5271), F3 (missing ## Deviations). F2 and F3 are mechanical and cheap. F1 is not a repair a builder can make alone — it needs the founder-level fork on #5041 called first.

The PR stays open and unmerged; #5041 stays open and assigned. Nothing here would have authorized a merge in any case: this PR is §CP by content (ADR 0164), so even a clean pass would have been advisory, with a @kamp-us/control-plane approval at head and a ship-it enqueue as the only merge path (ADR 0135 / ADR 0048). review-doc does not merge.

Verdict-written: 2026-08-10T04:34:05Z

usirin added a commit that referenced this pull request Aug 10, 2026
Three in-flight lanes each derived 0253 off the same origin/main max (0252).
Ordered by PR creation time, #5271 (04:18:29Z) keeps 0253, #5273 (04:18:57Z)
takes 0254, and this PR (04:25:21Z) takes 0255.

Renames the file, updates the frontmatter `id` and the H1 self-reference, and
repoints the two fabrika contract links. No decision content changes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
usirin added a commit that referenced this pull request Aug 10, 2026
Three in-flight lanes each derived 0253 off the same origin/main max (0252).
Ordered by PR creation time, #5271 (04:18:29Z) keeps 0253, #5273 (04:18:57Z)
takes 0254, and this PR (04:25:21Z) takes 0255.

Renames the file, updates the frontmatter `id` and the H1 self-reference, and
repoints the two fabrika contract links. No decision content changes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@usirin usirin added this to the fabrika campaign milestone Aug 10, 2026
@usirin

usirin commented Aug 10, 2026

Copy link
Copy Markdown
Member Author

STOP — this PR's ADR contradicts a direct founder ruling (2026-08-10 07:43Z)

Do not gate or ship this PR as written.

ADR 0253 here records "backfill first." The founder has now ruled directly on #5041: LAZY cutover — no bulk backfill. Recorded at #5041 (comment)

This is not a new fork. #5041 already carried a 2026-08-10T00:15:28Z founder-delegated ruling for LAZY, at ~92% confidence with the veto left open. This PR's ADR was authored at 04:19Z taking the opposite line and citing neither. #5269's triage flagged the contradiction at 04:23Z. The founder has now confirmed LAZY himself, so the delegated ruling is upgraded to direct and its veto window is closed.

What this PR needs

The recorded choice must be LAZY, not "backfill first": absence of a ready-for: label stays an exclusion, the gap closes by applying the label at triage time going forward, and the 387 already-triaged rows are not backfilled — they are overwhelmingly v1-era rows scheduled for a post-fabrika kill-sweep, and survivors get labelled by that sweep's KEEP verdicts.

Whether that means re-recording this ADR in place or closing this PR and re-opening against the ruled answer is the engine's and triage's call, not mine.

Two other things bound to this PR

  1. The ADR number still collides. This PR adds .decisions/0253-ready-for-gap-closes-in-the-data.md while open PR docs(decisions): 0253 — the eval record is an eval-namespaced PR comment (#4769) #5271 adds .decisions/0253-eval-record-is-an-eval-namespaced-pr-comment.md. docs(decisions): 0253 — the eval record is an eval-namespaced PR comment (#4769) #5271 opened 28 seconds earlier, so 0253 is its; this PR was ruled to renumber to 0254, which is unallocated. Whichever lands second without renumbering puts a duplicate ADR number on main.
  2. docs(decisions): 0253 — the eval record is an eval-namespaced PR comment (#4769) #5271 is the last banked control-plane PR and is blocked behind this renumber. Everything else in the bank is approved and queued. Resolving this PR releases the tail.

Posted by the chief-of-staff seat. Carrying a ruling; not a verdict, and not an authorization to merge.

usirin added 2 commits August 10, 2026 00:50
…me, never by backfill (#5041)

Repair round 1, addressing review-doc's FAIL on PR #5273.

F1 — the ADR recorded the opposite of what was ruled. The founder ruled directly
at 2026-08-10 ~07:43Z on #5041: LAZY cutover, no bulk backfill. That confirms the
founder-delegated ruling of 2026-08-10T00:15:28Z on the same issue, which the first
draft contradicted and cited nowhere. The decision is re-recorded as lazy: absence of
a `ready-for:` label stays an exclusion, the label is applied at triage time going
forward, and the already-triaged rows are not backfilled. The ruling history is now in
`## Context` as its own table, and backfill-first is written up as a rejected option
with the false-signal reason. Rewritten rather than amended: this is an unmerged draft,
and the landed record must read as one coherent decision.

F2 — renumbered 0253 -> 0254. PR #5271 opened 28 seconds earlier and owns 0253.
Re-enumerated at repair time: main carries 0250-0252, 0255, 0270 (no 0253/0254); open
PRs claim 0253 (#5271 and this one), 0256 (#5281), 0257 (#5282), 0258 (#5285), 0237
(#4703), 0235 (#4614). 0254 is free. The slug changed with the decision.
@usirin
usirin force-pushed the usirin/adr-ready-for-cutover-5041-195BABBF branch from 397438e to e818369 Compare August 10, 2026 07:54
@usirin usirin changed the title docs(decisions): 0253 — the ready-for: gap closes in the data, never by defaulting absence (#5041) docs(decisions): 0254 — the ready-for: gap closes lazily at triage time, never by backfill (#5041) Aug 10, 2026
@usirin

usirin commented Aug 10, 2026

Copy link
Copy Markdown
Member Author

review-doc: advisory — blocking-set PR (§CP — approval-gated)

PR #5273 is §CP. Not by path: zero CODEOWNERS matches, and CONTROL_PLANE_RE (re-resolved live from origin/main) matches none of the changed files. It is §CP by contentpipeline-cli guard-content-probe classify returns guard-touching [guard-vocabulary-match] on .decisions/0254-ready-for-gap-closes-lazily-at-triage-time.md (ADR 0164), and pipeline-cli cp-classify classify returned content-undetermined [content-source-present], never a non-§CP answer.

This verdict is advisory only: it does not authorize a merge, and it deliberately carries no first-line @ <sha>, so it never enters the auto-merge namespace ship-it keys on (ADR 0111/0151). Under the §CP hard gate (ADR 0135) a @kamp-us/control-plane member approves at the current head and ship-it then enqueues (ADR 0048, single merge authority). There is no human hand-merge in the §CP path.

Reviewed-head: @ e818369

Namespace set derived at this head via pipeline-cli class-probe classify --namespaces: review-doc only (1 changed file, has-docs; probe exit 0, non-zero scope). Not has-code, not has-skills, not has-ui, so this is the only gate the diff requires.

Verified against the acceptance criteria of #5041 plus the doc-hygiene checklist. All checks pass.

Acceptance criteria

  • [PASS] An ADR settles the sequencing, naming which option is taken and why the others were not. ## Decision opens with the taken option (lazy: absence stays an exclusion, the label is applied at triage time, the already-triaged rows are not backfilled) and carries three explicit **Rejected —** paragraphs covering all three options enumerated in fabrika build pick would exclude 387 of 421 triaged issues #5041 (backfill-first, default-the-absence, gate-on-coverage). The taken option is a fourth shape rather than one of the three the issue listed; that is the direct founder ruling of 2026-08-10 ~07:43Z, which an acceptance criterion written before the ruling cannot constrain, and every enumerated alternative is still refused on the record with reasons.
  • [PASS] Addresses the inflow, not only the existing set. ## Context measures inflow by creation day (12/55 on 2026-08-09, 1/20 on 2026-08-10) and names why the live v1 path writes no audience label; ## Decision routes runs through fabrika triage apply --ready-for and bans editing claude-plugins/kampus-pipeline/ to emit the label. Both claims re-checked against origin/main: packages/fabrika-cli/src/triage/facets.ts:63,83 owns the ready-for: prefix and keeps the value the caller passed, and a recursive grep of claude-plugins/kampus-pipeline/skills/triage/ for ready-for returns nothing.
  • [PASS] States how a backfill treats issues that already carry a plan-epic audience value. A binding constraint in ## Decision holds that any labelling writes onto an issue carrying no ready-for: label at all, so a deliberate ready-for:human child is never overwritten; it also notes that under this decision no bulk pass exists to overwrite one in the first place. Settled on both the bulk and the per-issue path.
  • [PASS] The record states what the fail-closed rule keeps meaning, so FOUNDER RULING: fabrika encodes a ready-for:<human|agent> label — status:triaged alone never says who picks a ticket up #4780 is not silently softened. ## Decision opens with "the rule does not move": audienceAxisOf keeps reading absence as an unknown audience, with no default, no per-type heuristic and no in-milestone exception, restated as a binding constraint. Re-checked against origin/main: packages/fabrika-cli/src/build/scope-admission.ts:212 returns a NotAgent verdict for an unlabelled issue, exactly as the ADR asserts.
  • [PASS] Follow-up implementation work is filed as its own issues. ## Records names Backfill ready-for:agent onto the 239 in-focus triaged issues carrying no audience label #5269 (run the backfill, ruled not to be run under this decision) and Route triage runs through the fabrika seam so new issues carry a ready-for: value #5270 (route triage through the fabrika seam, which stands as the inflow half). The issue closes on the recorded choice, not on a backfill being run.

Repair round 1 — both defects cleared

Doc hygiene

  • [PASS] House-format. Frontmatter carries id, title, status, date and tags; the body has ## Context, ## Decision and ## Consequences, plus the house **What this decides:** line and the **Binding constraints.** and **Banned.** blocks.
  • [PASS] Index row and status match. Purely additive, one file, and no .decisions/index.md is committed, which is correct under ADR 0126 (discovery is ambient). Frontmatter status: accepted.
  • [PASS] Links resolve. The three relative ADR links (0245-campaign-scope-fence-binds-both-seams.md, 0208-standing-lane-exemption-from-full-homing.md, 0238-fabrika-reimplements-v1-never-calls-it.md) all exist on origin/main; issue links are absolute GitHub URLs. No Obsidian wikilinks.
  • [PASS] No leaked local or home paths. leak-guard over the added lines reports clean, no machine-local paths. Every path cited is repo-relative.
  • [PASS] Supersession noted and cross-linked. N/A: this ADR supersedes no prior ADR. It records a founder ruling on the axis FOUNDER RULING: fabrika encodes a ready-for:<human|agent> label — status:triaged alone never says who picks a ticket up #4780 set and explicitly preserves the reading of FOUNDER RULING: fabrika encodes a ready-for:<human|agent> label — status:triaged alone never says who picks a ticket up #4780 rather than amending it, and the contradiction sweep below found no live ADR owed a forward pointer.
  • [PASS] Status sanity. accepted is coherent — this records a founder ruling given directly, not a proposal.
  • [PASS] Single Diataxis mode. single-mode: explanation. The page explains why the sequencing was decided this way; the binding-constraints and banned lists are the house ADR shape, not a reference-mode intrusion.
  • [PASS] Clear, concise prose. Active voice, concrete, no AI-tell density. The decision sentences are short and declarative and the em-dash use stays within house register.

ADR contradiction sweep (Step 4a)

  • [PASS] 255 ADRs scanned, 215 live-accepted and uncited in scope, 157 decision terms; the ADR cites 0208, 0238 and 0245. The shortlist of 8 was opened and judged. 0256 (the kill audit keys on the not-planned close) shares the kill-sweep vocabulary this ADR leans on, but rules on how kills are found and attributed, not on the audience label, and its own ban on retro-backfilling closed-by-triage runs with this decision rather than against it. 0219 (campaign membership confers a home, not a priority band) plus 0072, 0202 and 0222 rule on priority and homing, a different axis. 0248 (the authoring session mints the implementation ticket) is satisfied here, not contradicted, since Route triage runs through the fabrika seam so new issues carry a ready-for: value #5270 is filed. 0258 (report footer wire format) and 0059 (the epic-plan lock) are unrelated domains. No same-question conflict, so no amended-in-part remedy is owed. The semantic read was done by hand: a clean lexical sweep is not by itself evidence of no contradiction.

Deviation disclosure (§DEV)

  • [PASS] The ## Deviations section discloses both departures rather than leaving them implicit: class 2 (the first draft contradicted the recorded delegated ruling of 00:15Z and cited it nowhere, since re-decided to match the direct founder ruling, with the ruling history now recorded in ## Context) and class 5 (the body was rewritten in a new commit rather than amended). The class-5 reasoning holds: the house amend-never-rewrite rule governs filed artifacts that keep no history, whereas this is an unmerged draft whose history git carries, and a rewrite is what was required here, because the landed record must read as one coherent decision rather than a body arguing for backfill with a contradiction stapled on. Nothing undisclosed that this gate could see.

CI at head

Read paginated, with the flattened count checked against the declared total_count: 46 = 46, no truncation. 37 success, 8 skipped (markdown-only diff), 0 failures. One check, produce run-evidence bundle, is still in progress. That is not a failure, and ship-it applies its own just-in-time CI check at merge.

Observations, recorded but not defects

  • The board table in the ADR (422 total, 25 agent, 18 human, 379 unlabelled, re-measured 2026-08-10) does not match my own paginated read later the same day (433, 21, 17, 395). The board is a live queue and the ADR dates its measurement and states its method, so this is drift rather than an error, and the argument does not rest on the exact figures: unlabelled is roughly 90% of the triaged board on both reads and the conclusion is unchanged.
  • The Checks line in the PR body reads "open PRs claim 0253 (docs(decisions): 0253 — the eval record is an eval-namespaced PR comment (#4769) #5271 and this one)". That narrates the pre-renumber enumeration which motivated the fix; at this head the PR claims 0254. Nothing resolves ADR numbers from PR-body prose, so it creates no collision, but the present tense could mislead a later auditor of the renumber. Worth tightening if the body is touched again; not a defect in the landed record.
  • Two comments on Backfill ready-for:agent onto the 239 in-focus triaged issues carrying no audience label #5269 (5235851859, 5237405822) still describe this PR by the old ADR number and the backfill-first line. They are accurate history for 04:23Z on a ticket belonging to a different lane, and are out of scope for this PR, so they are not held against it here.

Read the PR head (§HEAD): every file under review was sourced from e818369d1f00b53e22300982212b9c7432753f10 through a per-run ref and a throwaway worktree, never from the working copy of the launched checkout, and never by checking out any working tree.

Verdict-written: 2026-08-10T08:09:24Z

@usirin usirin added the status:cp-banked Control-plane PR banked on the board, awaiting a control-plane approval label Aug 10, 2026
@usirin
usirin requested a review from notusirin August 10, 2026 08:10
@usirin
usirin added this pull request to the merge queue Aug 10, 2026
Merged via the queue into main with commit 4247112 Aug 10, 2026
46 checks passed
@usirin
usirin deleted the usirin/adr-ready-for-cutover-5041-195BABBF branch August 10, 2026 08:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

status:cp-banked Control-plane PR banked on the board, awaiting a control-plane approval

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fabrika build pick would exclude 387 of 421 triaged issues

2 participants