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

Planning bug: MOTIR-3750's measurement block secured the SET and left the CAUSAL sentence beside it unmeasured — the file it blames the classifier for was last touched two days BEFORE the classifier existed (and the count was one high)

Done
Description

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.

What the card said

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 .md under design/ that is not exactly design-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$'
  → 44

So 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.

What re-measurement found — TWO things, and the second is the one worth a card

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 familyMOTIR-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 touched2026-08-10, in #2004 (MOTIR-2542)
scripts/upload-design-assets.mjs first landed2026-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.

Root cause

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.

Acceptance criteria

  1. 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.
  2. The clause names the tell in the words a card actually uses — a causal sentence appended to a measurement with — and, either, also, has never, for as long as it has existed — so it is grep-able rather than a matter of judgement.
  3. It does NOT restate the existing enumeration limb, and says explicitly that a card can satisfy that limb completely and still carry this defect. MOTIR-3750 is the fixture: it stated its own predicate unprompted. (The fixture is that card's AUTHORED TEXT, already in the tenant — see the advisory disposition below.)
  4. The count half is cross-referenced, not re-litigated. Cite MOTIR-3689 / MOTIR-3714 / MOTIR-3503 / MOTIR-3109 as the existing family and add nothing to it — this card's contribution is the causal limb, and a fifth restatement of re-measure the number would bury it.
  5. The corpus edit lands as a PR, never a direct commit to 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.

Advisory dispositions

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.

    1. This card consumes nothing from that card's unmerged branch. The reference in criterion 3 is to MOTIR-3750's authored text — the measurement block quoted above — which is in the tenant and readable right now. The corpus clause can be written, reviewed and merged with motir-core#2418 still open; nothing in criteria 1–5 reads a file that PR creates.
    2. The edge would be CROSS-PARENT, which gate 7 forbids. This card sits under 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.

Correction already applied

  • MOTIR-3750's body now carries both corrections in a ⚠️ TWO CORRECTIONS TO THIS SECTION block, with the commands and the dates.
  • motir-core#2418's body carries them under "Two things the card said that turned out not to be true".
  • The sixth criterion was dispositioned as ABSENCE RECORDED, and docs/decisions/design-result.md AMENDMENT 1 records the dating so the next reader of that ADR does not re-derive the wrong cause.

Resolution

(open)