Type · planning bug (telemetry about the planner; the correction is already applied to MOTIR-3750)
Parent · MOTIR-1465, the planner-bug home. Holds up nothing, joins no sprint.
Discovered in · motir run MOTIR-3750 (motir-core#2418), while re-measuring the card's evidence before writing a line.
MOTIR-3750 carried a measurement block that is, on its face, exemplary. It named the ref, it gave two commands, and it went out of its way to state its own predicate:
Measured on motir-core
origin/main(2026-08-28), and the predicate is "every.mdunderdesign/that is not exactlydesign-notes.md", not a grep for one name:git ls-tree -r --name-only origin/main design/ | grep -E '\.md$' | grep -v -E '/design-notes\.md$' → design/org-admin/create-workspace.design-notes.md (1) git ls-tree -r --name-only origin/main design/ | grep -cE '/design-notes\.md$' → 44So 44 areas follow the convention and one does not — and that one file's notes have never reached their card either.
Everything the enumeration rule asks for is present: a ref rather than a working tree, git ls-tree rather than find, and an explicit statement of the set being quantified over.
1. The count was one high. 43, not 44. Re-run with the card's own command:
$ git ls-tree -r --name-only origin/main design/ | grep -cE '/design-notes\.md$'
43 # at a482d16b8, today's origin/main
43 # at 6e71acf21, the commit motir-marketing's lane pins
$ git log --diff-filter=DR --since=2026-08-25 origin/main -- design/
(no output — nothing deleted or renamed in the window)
So it did not drift; it was wrong when it was written. This half is the FIFTH recurrence of a well-populated family — MOTIR-3689, MOTIR-3714, MOTIR-3503, MOTIR-3109 are all "a card's population count does not survive re-measurement", and it costs little here: the load-bearing half of the claim (exactly ONE non-conforming file) reproduces exactly, and the fix is unaffected.
2. The causal sentence attached to that block was never measured at all, and it is the half no rule covers.
"That one file's notes have never reached their card either" is TRUE. The attribution — that the classifier's exact-basename arm is why — is not what happened:
design/org-admin/create-workspace.design-notes.md last touched | 2026-08-10, in #2004 (MOTIR-2542) |
scripts/upload-design-assets.mjs first landed | 2026-08-12, cacfe0180 (MOTIR-2664) |
The publisher is pull_request-only, and no pull request has touched that file in the two days plus since the publisher existed. The classifier has never had the opportunity to drop it. The absence is real and the mechanism blamed for it is innocent — it would have been guilty on the file's next edit, and that distinction is the whole difference between repair this and record this.
It mattered to the run: the card's sixth criterion offers "republished OR its absence recorded, whichever the decision above implies", and the two dispositions are chosen by exactly this fact. Under the card's own framing the honest answer looks like republish (the classifier ate it, so put it back). Under the dated one it is record — there is nothing to put back, and republishing by hand would have meant touching that file on a MOTIR-3750 branch, which the publisher routes onto MOTIR-3750, landing org-admin's spec on an unrelated card under a green check with a real evidence id.
A correct enumeration makes the sentence NEXT to it read as measured. The enumeration rule (plan-rules/phase-deepen.md's ENUMERATION limb) secures the SET: it asks whether the number can be checked, and this card answered that better than most — ref, command, explicit predicate. What it does not reach is a causal or historical claim about a member of the set, and such a claim sits inside the same paragraph, in the same confident register, separated from the measured part by a dash.
The tell is grammatical rather than analytical: "→ 1" followed by "— and that one file's notes have never reached their card either". The either borrows the credibility of the count. The command that would have falsified it is not the one that produced the count and cannot be — git ls-tree measures a tree at an instant; the claim is about a WINDOW (did any pull request carrying this file run while the mechanism existed?), and only git log answers a window.
This is the same shape as the run-time rule git log <their base>..HEAD -- <the path> decides which of two opposite findings you have — one command separates never happened from happened and was fixed — but stated at AUTHORING time, where nobody currently runs it.
plan-rules/phase-deepen.md's ENUMERATION limb gains a clause for the CAUSAL claim beside the count, in motir-meta: where a card explains a member's state by naming a mechanism ("X never published because Y drops it", "never reached", "has been carrying this since"), it owes a window command, not a snapshot one — git log --diff-filter=A|D <path> / git log <ref-when-the-mechanism-landed>..HEAD -- <path> — dating the member's edits against when the blamed mechanism first existed. A ref-and-snapshot pair does not discharge it, and the clause says why: the count and the cause are answered by different commands.— and, either, also, has never, for as long as it has existed — so it is grep-able rather than a matter of judgement.main (motir-meta is PR-only), authored Zhu Yue <zhuyue11@gmail.com> with no co-author trailer, and the rule is ADDED rather than re-worded into an existing paragraph.validate_work_item MOTIR-3775 at filing → valid: true, blockers: [], one entry:
reference · likely-missing-edge · MOTIR-3750 (implemented) — NO EDGE OWED, on two independent grounds, and the run states both rather than leaving the next reader to re-derive one.
MOTIR-1465 (the planner-bug home) and MOTIR-3750 under MOTIR-653 (Epic 8). Wiring the leaf edge would satisfy gate 4 by breaking gate 7 — the case run.md's guard #4 names explicitly, where following the instruction literally on a cross-container reference is the wrong move.And it would be wrong in kind: a planning bug is telemetry about the planner, the correction is already applied, and it holds up nothing. relates_to MOTIR-3750 is wired and is the right relationship — provenance, not precondition.
⚠️ TWO CORRECTIONS TO THIS SECTION block, with the commands and the dates.docs/decisions/design-result.md AMENDMENT 1 records the dating so the next reader of that ADR does not re-derive the wrong cause.(open)