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-2963

(motir-ai) Mirror W8 into `SHARED_PLANNING_RULES` — a decision's close-out asks BOTH directions, and its *Consumed by* header is the inward worklist

Blocked
Description

Repo: motir-ai. One PR. Type: content · Executor: coding_agent. The SHIPPED half of MOTIR-2962blocked_by it, because this card LIFTS that card's wording rather than re-deriving it. A standing planning RULE has two homes (motir-meta/prompts/plan-rules/ for the manual planner, SHARED_PLANNING_RULES for the product's), and a rule present in only one means the shipped planner keeps planning the old way.

Where it lands

src/llm/planningRulePacks.tsRECONCILE_EXISTING_NOT_DONE_WORK — the constant that already carries the OUTWARD sweeps this mirrors the inverse of: the superseded-prerequisite unlink, "SWEEP FROM THE TAKER'S SEAT, NOT ONLY THE DONOR'S", and W5's "AND THE TAKER INHERITS THE DONOR'S BLOCKERS, NOT ONLY ITS SCOPE". The new clause is appended in the same voice and the same \`` -escaped template-literal style. (treeGeneration.ts` only re-exports the constant since the 2026-08-17 move — edit the pack file, not the re-export.)

Measured on origin/main 2026-08-17: grep -ic inward src/llm/planningRulePacks.ts0. Nothing in the shipped corpus asks the inward question.

The clause to append (lift from MOTIR-2962's limb A; this is the shipped-voice rendering)

AND A DECISION'S CLOSE-OUT ASKS BOTH DIRECTIONS. Every sweep 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 and validation both pass — and the missing-edge advisory CANNOT see it, because it 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 decision card or an architecture-decision-record amendment closes out, TAKE THE DOCUMENT'S OWN "CONSUMED BY" HEADER AS THE WORKLIST — a decision that lists its consumers by key has already done the enumeration — and for each key, diff that card's ACCEPTANCE CRITERIA against the sections just written. Not "does this card still make sense?" (it will, and that is the trap) but "WHICH SENTENCE IN IT DOES §2 MAKE FALSE?" A PATH, A SIGNATURE, AN OWNER, A PLACEMENT: those are the clauses a decision moves, and a criterion states them in passing, which is exactly why nobody re-reads them. Any contradicted clause is an AMENDMENT MADE ON THE RECORD with its date and its evidence, saying what was NOT dropped — dropping a criterion silently and amending it with evidence look identical afterwards and are opposite in kind. A contradiction that changes a consumer's SCOPE rather than its wording is a re-plan of that card, not a note. THE HEADER'S KEY LIST SAYS WHERE TO START, NOT WHERE TO STOP.

Acceptance criteria

  1. RECONCILE_EXISTING_NOT_DONE_WORK in src/llm/planningRulePacks.ts carries the clause above, keeping the constant's existing register (uppercase for the load-bearing imperatives, no work-item keys, no repo-local paths — the constant ships to every tenant, so it must stay project-agnostic exactly as its neighbours are).
  2. The wording is lifted from MOTIR-2962's limb A, not re-derived: the four moved-clause shapes (path · signature · owner · placement), the Consumed by-as-worklist instruction, the amend-on-the-record form and the start-not-stop bound all survive the transfer. Name any deliberate divergence in the PR body with its reason.
  3. grep -ic inward src/llm/planningRulePacks.ts ≥ 1 where it was 0 — the same absence measurement MOTIR-2962 quotes, taken again after the edit.
  4. Whatever unit test or snapshot asserts the composition of SHARED_PLANNING_RULES is updated in the same PR and passes; pnpm typecheck and the changed-file tests are green (the full suite is the PR's CI, not a local run).
  5. ORDERING: this card is blocked_by MOTIR-2962 and reads on its MERGED wording — do not open this PR against an unmerged sibling branch. Every criterion above is checkable on this PR's own diff at merge.

Context refs

  • MOTIR-2962 — the motir-meta half: the arrow diagram, the absence measurement, the ×1 warrant argument and the fixture. Read it in full before writing a line here.
  • MOTIR-2955 — the planning-bug record that produced both cards; notes.html #304 on motir-meta origin/main carries the lesson and prompt hint.
  • MOTIR-2931 / MOTIR-2914 / MOTIR-2924 — the three most recent mirrors of this exact shape, for the register and the size.
  • src/jobs/handlers/replan.ts — imports SHARED_PLANNING_RULES, which is why a rule missing here is missing from re-planning as well as fresh generation.