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

Planning bug: two of MOTIR-3451's acceptance criteria were never RUN before they were written — one quotes markup the file has never carried, the other asserts an output that was already false

Done
Description

Planning bug — filed by the motir run MOTIR-3451 session, 2026-08-25. The correction is already applied to MOTIR-3451 (both criteria amended on the record, with evidence); this card is the telemetry.

What happened

MOTIR-3451 is a clean, well-authored bug card: the defect was real, reproduced at the reporter's base and at HEAD, and the fix landed in one commit (motir-core#2276, 254 deletions, one file). Two of its six acceptance criteria were nonetheless false as written, and both were falsifiable by running the very command they quote.

1 · A criterion quoted a literal string it had RETYPED, and the retyping added markup

Criterion 2 asked for

grep -c 'The element split with MOTIR-2546 — \*\*WITHDRAWN\*\*' returns 1

The shipped heading is not bold, and never has been:

$ git grep -c 'WITHDRAWN\*\*' origin/main -- design/shell/design-notes.md
(no match)
$ git grep -n 'element split with MOTIR-2546' origin/main -- design/shell/design-notes.md
699:### The element split with MOTIR-2546 — WITHDRAWN (MOTIR-2674, 2026-08-11)

The card's body had the same bold form in its prose, so the error was made once and propagated into the criterion. Read literally, the criterion returns 0 on a correct fix — the exact inversion of what it is for. The run had to decide whether it had failed the card or the card had misquoted the file, and only a git grep on the ref settled it.

2 · A criterion asserted a command "prints nothing" without ever running it

Criterion 6 asked that

for f in design/*/design-notes.md; do grep '^## ' "$f" | sort | uniq -d; done prints nothing

At origin/main 7e97e2ed — and at the card's own base dacf711b — that command prints nine files. Eight are unrelated to this defect: they repeat per-panel boilerplate headings (## Where it lives, ## Token / a11y rules honoured, ## Primitives composed (no hand-rolling), ## Panels (review EACH — mistake #31)), which is a sectioning convention in those areas' notes. The criterion asserts a property of the whole design/ tree that was already false when it was written, and stays false after a perfect fix.

The intent is recoverable and correct — the criterion's own next sentence is "a duplicate found in another area is its own card", which only makes sense if the author expected other areas to appear. The differential form ("design/shell/design-notes.md leaves the list and nothing joins it") is what was meant, and it is satisfied.

The shape underneath both

They look like two different mistakes and they are one: a criterion stated as a command plus an expected output was written from the card author's model of the file rather than from the file. One retyped a string; one predicted an output. Neither cost anything to check — a git grep on the ref, and one run of the loop — and both were checkable at authoring time, from the same shell the author was already using to read the file.

This is the same family as the ENUMERATION limb in plan-rules/phase-deepen.md (a card COUNTING a population owes the ref the count was taken on), widened one notch: a card QUOTING or PREDICTING owes the same ref. A count is not the only measurement a criterion can smuggle in unverified.

Why it is worth a card and not just a note

Both defects are individually trivial and both were absorbed by the run in minutes. What makes them worth recording is that they are indistinguishable, from inside the run, from the fix being wrong. A grep -c returning 0 where the card says 1 is the signature of an incomplete fix; a sweep printing nine files where the card says none is the signature of a fix that broke eight other areas. The run's first duty on either signal is to suspect itself, and both times the suspicion was misplaced. That is a real cost paid by every session that meets a criterion of this shape, and it scales with how careful the runner is.

Acceptance criteria

  • plan-rules/phase-deepen.md's NEGATIVE/ENUMERATION limb pair gains a third limb — a QUOTATION limb — stating that a criterion which quotes a literal string from a tracked file, or predicts a command's output, must be produced BY that command against a named ref (git grep/git show <ref>:<path>), never retyped from reading. Cite MOTIR-3451's two criteria as the fixture.
  • The limb names the two failure signatures explicitly — a retyped quote acquiring markup the file lacks, and a whole-tree assertion that is already false — because both read to the runner as a failed fix rather than a wrong card.
  • No existing limb text is reworded to make room; this is additive.
  • motir-meta is the target repo, so the PR carries MOTIR-<id> in its branch and title (run.md's narrowed motir-meta rule — the PR IS this card's deliverable).

Context refs

  • MOTIR-3451 — the card, with both criteria amended on the record and the evidence inline.
  • motir-core#2276 — the fix PR, whose body disposes of both criteria.
  • plan-rules/phase-deepen.md — the NEGATIVE and ENUMERATION limbs this extends.
  • design/shell/design-notes.md at origin/main 7e97e2ed — where both criteria were falsified.