MotirBuilding in public
MOTIR · moooon
onMotir
You’re viewing a public project. Anyone can view it — no account needed. Sign in to submit, upvote, or comment on requests.View-only — you can’t edit work items
MOTIR-2962

(motir-meta) W8 — the INWARD limb of a decision's close-out: an ADR's own *Consumed by* list is the worklist (`core.md` + `run.md`)

To Do
Description

Repo: motir-meta. One PR. Type: content · Executor: coding_agent. Filed 2026-08-17 by the close-out of MOTIR-2955, the planning-bug record whose "What would have prevented it" this card lands. The mirror half is the motir-ai card that is blocked_by this one.

This is a WIDENING of two existing paragraphs' triggers — no new gate is added.

The gap, stated as an arrow

A decision spends its value in two directions at the moment it merges. Every clause this corpus holds points OUTWARD, and each of them was correctly applied by the run that produced the fixture:

existing clausethe question it asks
plan-rules/core.md a deferral is a card (~line 606) + its greppable trigger-phrase list, explicitly scoped to "an ADR §, a decision record"what does this § defer to NOTHING?
plan-rules/core.md gate 8 · Referrers swept (~line 141) — the design-asset ALLOCATION limb, the migration-callers limb, the taker's-seat limb, the fourth arrowwhich cards' SCOPE or EDGES does this artifact MOVE?
the mirror's RECONCILE_EXISTING_NOT_DONE_WORK (motir-ai/src/llm/planningRulePacks.ts)the same two, in the shipped planner

The INWARD question — whose acceptance criteria did this decision just falsify? — is stated nowhere. Measured on origin/main, 2026-08-17:

  • grep -ric inward prompts/plan-rules/*.md → the only hit is type-migration.md's unrelated "follow the entry point inward"; grep -ic inward prompts/run.md0.
  • grep -ic inward motir-ai/src/llm/planningRulePacks.ts (origin/main) → 0.
  • grep -ric "consumed by" prompts/plan-rules/*.md2, and both are the corpus's OWN decision-record headers (DECISION.md, COMPRESSION.md). The convention that would answer the question is already written in this repo, by these packs, about themselves — and no rule reads it.
  • grep -ric "blast radius" prompts/0.

The second limb — the RUN-TIME backstop is scoped to a design blocker, and the fixture was a decision blocker

run.md line 386, "A done design blocker that merged AFTER the card was authored OUTRANKS the card — EVERY kind, not only UI", is the check that actually caught the fixture. Its "EVERY kind" widens the card being RUN, never the BLOCKER: line 398 reads "any card you are about to run whose blocked_by includes a design card — code, test, a story's own criteria, a service card, any kind". MOTIR-729 is subtask/**decision**. The 2026-08-08 rule was written from a design fixture and its blocker set was never widened with it; the run that caught this one read past the word.

This matters beyond tidiness, and it is what makes the fixture's ten un-swept consumers a disposition rather than a deferral: with the blocker set widened, each remaining consumer of MOTIR-729 is covered by the backstop at its own dispatch, by mechanism. Left as design-only, they are covered by whichever run happens to read generously.

The widening (the text to land)

Limb A — plan-rules/core.md, adjacent to a deferral is a card (that clause is the OUTWARD half of the same close-out):

⚠️ AND THE CLOSE-OUT ASKS BOTH DIRECTIONS — INWARD, WHOSE CRITERIA DID THIS DECISION JUST FALSIFY? Every clause above points OUTWARD: what does this artifact leave unowned, unbuilt, undeferred? A decision's INWARD debt is the mirror image, and it is invisible by construction — nothing is missing; a sentence somewhere else has merely stopped being true. The card it falsifies is elsewhere, complete, well-formed, and reads exactly as it did yesterday, so readiness, validate_work_item and the advisory tier all pass: likely-missing-edge scans a card's own description for not-done references, and the reference it would need to flag points at a card that is done. No query returns "clauses that stopped being true." So when a type: decision card (or any ADR amendment) closes out: take the document's own Consumed by / Supersedes header as the WORKLIST — an ADR that lists its consumers by key has already done the enumeration — and for each key get_work_item it and diff its acceptance criteria against the sections you just wrote. Not "does this card still make sense?" — it will, and that is the trap — but the pointed form: "which sentence in it does §2 make FALSE?" A path, a signature, an owner, a placement: those are the clauses a decision moves, they are short enough that a criterion states them in passing, and that is exactly why nobody re-reads them. Any clause the decision contradicts is an amendment to make on the record, with its date and merge commit, saying what was NOT dropped — dropping a criterion silently and amending it with evidence look identical in the diff and are opposite in kind. A contradiction large enough to change a consumer's SCOPE rather than its wording is THE REPLAN ACTION on that card, not a note. The header's key list says where to START, not where to STOP — the same bound gate 8's allocation limb already carries.

Limb B — run.md line 398, one word: the backstop fires on a blocked_by design OR decision card — any blocker whose deliverable is a SPEC rather than code. The section heading's "EVERY kind, not only UI" then means both halves of the edge, which is what it already claims.

Warrant lines, in COMPRESSION.md § Decision 1's printed two-line form:

Warrant: MOTIR-729 · 2026-08-17 · an ADR run swept outward cleanly and never inward; the card it falsified was the FIRST key in its own Consumed by header · ×1 → [fixtures/core.md#a-decisions-close-out-asks-both-directions]

Why ×1 is enough — the corollary RAN, and ran cleanly, in one direction

MOTIR-2280's standing discriminator refuses a widening when the governing clause covers the case and merely was not performed. The ORDER test does not save this one, and neither does the diligence reading — the fixture is the strongest possible evidence that the corpus was READ. The MOTIR-729 run amended its OWN criterion 1 (docs/adr/docs/decisions/, with rung-2 evidence), amended its OWN criterion 4 (a merged design's re-allocation), filed MOTIR-2932 for the production grant §6 left unowned, and filed MOTIR-2933 as the planning bug about that gap. Four correct acts, every one of them discharging an existing clause. What did not fire has no clause to fire from: not one of those four asks the inward question, and the grep above shows why — the word does not appear in the corpus. A rule that was read, applied four times, and stopped at the boundary of what it says is a TRIGGER gap, not a diligence miss — the same totality-vs-diligence line MOTIR-2878's W3 and MOTIR-2913's W5 turn on.

And the blast radius is what makes ×1 the wrong denominator. A design allocates elements between a handful of cards; a decision is consumed by everything downstream of it. MOTIR-729's header names eleven consumers besides the one that caught it, across three stories and two epics.

Acceptance criteria

  1. plan-rules/core.md carries limb A, placed adjacent to the a deferral is a card cluster (the outward half of the same close-out), naming the type: decision / ADR-amendment trigger, the Consumed by header as the worklist, the four clause shapes a decision moves (path · signature · owner · placement), the amend-on-the-record form, and the keys-say-where-to-START bound. grep -c 'INWARD' prompts/plan-rules/core.md ≥ 1 where it was 0.
  2. run.md line ~398's blocker set reads design OR decision, and the section's own summary line (line 18) and guard #3's cross-reference (line ~748) do not contradict it. grep -n 'includes a design card' prompts/run.md returns no line that still names design alone.
  3. A fixtures/core.md entry at anchor #a-decisions-close-out-asks-both-directions records the fixture: MOTIR-729 merged 2026-08-17T21:59+02:00 (dc58d5d0, motir-core#2097), MOTIR-2896 authored 11:32 UTC the same day, criterion 2 said lib/auth/ where ADR §2 says lib/platform/auth.ts, and every readiness signal read green.
  4. The MANIFEST / ASSIGNMENT routing is consistent — if the limb lands anywhere other than core.md, MANIFEST.md's route for it is updated in the same PR; if it lands in core.md, no routing change is owed. State which in the PR body.
  5. ORDERING: criteria 1–4 are checkable on THIS card's own PR diff against origin/main at merge; none reads on post-merge state, and none reads on the motir-ai mirror, which is a separate card and a separate repo.
  6. The corpus scripts (COMPRESSION.conserve.py / verify.py) are run and their verdict quoted in the PR body — see Known trap below; a red script that was red before this diff is reported, not chased.

Deliberately NOT in this PR

  • The motir-ai mirror. ONE SUBTASK = ONE REPO = ONE PR; it is the sibling card that is blocked_by this one, and it LIFTS this wording rather than re-deriving it.
  • A retroactive sweep of MOTIR-729's ten remaining consumers (MOTIR-1167, MOTIR-730, MOTIR-731–735, all of Story 10.2 / MOTIR-736, Story 10.3 / MOTIR-745 incl. MOTIR-749 + MOTIR-751). This is a DISPOSITION, not a deferral, and limb B is what makes it one: with the run-time backstop's blocker set widened to decision, every one of those cards gets the calendar diff at its own dispatch, before its first line of code — which is exactly how the eleventh was caught, at a cost of one git log -1 --format=%cI. They are also nearly all blocked and far downstream, so no run is imminent. If limb B is dropped from this PR, this disposition dies with it and the sweep becomes a card that must be filed — say so in the PR body rather than shipping limb A alone in silence.

Known trap

COMPRESSION.conserve.py cannot express "a gate gained a sub-bullet" and treats an enumeration's COUNT NUMERAL as surviving text (MOTIR-2934) — limb A adds a clause to a numbered cluster, so expect that class of complaint. core.md is also 683 lines against the 620-line cap MOTIR-2898 already found no room in; report the measurement, do not silently re-flow the file.

Context refs

  • MOTIR-2955 — the planning-bug record this lands, and notes.html #304 (on origin/main, motir-meta PR #231) — its lesson + prompt hint, which limb A's wording lifts.
  • MOTIR-729 / motir-core/docs/decisions/platform-staff-auth.md — the ADR and its Consumed by header; MOTIR-2896 — the amended consumer, whose amendment note is the model for the on-the-record form.
  • prompts/plan-rules/core.md ~141 (gate 8) and ~606 (a deferral is a card) · prompts/run.md 386–412 (the calendar check) and ~748 (guard #3's cross-reference).
  • MOTIR-2913 (W5) and MOTIR-2917 — the two nearest precedents for a widening card's shape and its meta+mirror split.