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

Planning bug: eleven cards were cut on a measurement the SAME pass created a card to replace — and one target survived only in a title

Done
Description

Filed by the motir run MOTIR-2797 that ran MOTIR-2817 and then re-planned its siblings. The correction is already applied — this card is telemetry, not scheduled work.

The defect

MOTIR-2797 was decomposed into eleven batch cards, each cut on a throwaway grep reporting 876 call sites — 577 in-scope, 157 out-of-scope, 142 needs-binding-first.

The same pass created MOTIR-2817, whose entire job is to BUILD the classifier that replaces that grep, and whose acceptance criteria said so explicitly: "If the real numbers differ, the CLASSIFIER wins and this card updates the story body." The plan knew the number was provisional and cut eleven cards on it anyway.

Measured: 458 in-scope, 227 not-gated + 17 pre-auth = 244 out-of-scope, 120 needs-binding-first, and 352 already-bound — a population the old table had no column for.

The gap is not carelessness. Almost all of it is one thing: the grep ran BEFORE MOTIR-2755 merged, and that story's own twenty fixture batches bound a large share of these very reads on the way past. They left the backlog by being fixed. The remainder is a grep counting LINES where an AST counts CALLS.

Three consequences, in rising order of cost

  1. Every batch card's count was wrong. Cosmetic; recoverable by editing titles.
  2. A SPLIT outlived its justification. tests/integration/work-items was cut across two cards (A–L / M–W) purely because it measured 94 — the heaviest target in the suite. It measures 53. Two cards would have edited the same files and the same shared ratchet line for no review benefit. Unlike the number, a stale split is invisible: both cards named real directories, validated clean and read ready.
  3. A target survived only in a TITLE. tests/integration/backlog24 sites, the third-largest target — was named by no card body. It appeared once, in the title of a card whose body listed other things. A reader opening every card and reading what each promised would have found nobody doing it.

Why the gates did not catch (3)

validate_work_item reads edges, not prose. The per-card gate checklist (plan-rules/core.md) reads each card's acceptance criteria — where the directory never appeared. A title is not a commitment: no gate reads it, and a runner works to the criteria. Same family as notes.html #219 — the failure is not a wrong statement, it is a statement in a place nothing reads.

The cheapest fix was available and free

The batch cards could have been authored as titles + edges only, with targets and counts filled in after MOTIR-2817 ran. The titles-first skeleton rule already prescribes titles before descriptions; this is the case where that gap is load-bearing rather than stylistic. It would have prevented all three consequences at zero cost.

Applied

  • MOTIR-2818MOTIR-2828 archived, each with a comment naming its replacement and the reason.
  • Ten replacements created — MOTIR-2834MOTIR-2843 — cut on the classifier's per-directory report, each pinned to motir-core, each with both content axes.
  • MOTIR-2837 names tests/integration/backlog in its BODY and its acceptance criteria, and its title says the directory was previously unowned.
  • MOTIR-2843 carries no fixed file list on purpose — its scope is "whatever the classifier still reports", which is the shape that cannot go stale.
  • MOTIR-2829 rewired onto the ten, its numbers restated, and a new clause added: UNTOUCHED_OUT_OF_SCOPE_FLOOR must SURVIVE at non-zero, which the pre-re-plan card would have silently dropped.
  • MOTIR-2797's title corrected from 577 → 458 — the op-replan rule's own tell: "a title carrying the dead mechanism is an unswept card."
  • notes.html lesson logged as #282 (motir-meta PR #193, authored 2026-08-16 by the motir run MOTIR-1465 sweep). #266corrected 2026-08-16: this card originally cited #266, which is MOTIR-2848's prose-dependency entry, filed the same day. The lesson for THIS defect had never been written; it was located by CONTENT, not by the number.

The lesson

A count in a card body is a claim about a moving world, and the cards cut from it inherit its expiry date. This is the sweep-the-referrers corollary rotated onto a new axis: no mechanism changed and no card was falsified — a sibling story simply did some of the work, which is the most ordinary thing that can happen in a plan, and it invalidated a decomposition nobody had reason to re-read.