Repo: motir-ai. One PR. Type: content · Executor: coding_agent. The SHIPPED half of MOTIR-2962 — blocked_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.
src/llm/planningRulePacks.ts → RECONCILE_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.ts → 0. Nothing in the shipped corpus asks the inward question.
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.
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).grep -ic inward src/llm/planningRulePacks.ts ≥ 1 where it was 0 — the same absence measurement MOTIR-2962 quotes, taken again after the edit.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).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.notes.html #304 on motir-meta origin/main carries the lesson and prompt hint.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.