PLANNING BUG — MOTIR-2611 measured only `main`, inferred the TAG's tree from that, and shipped the inference as a fact: every row of its evidence table was about the branch the defect could not be in
Filed by THE REPLAN ACTION on MOTIR-2611, 2026-08-10, per plan-procedure.md step 5.
Re-scoped 2026-08-10 by guard #5 (the one-repo-per-subtask gate). As authored this card straddled
motir-meta+motir-ai, and its own AC 5 said so — which is gate 1's "a card that DECLARES ITS OWN SPLIT has already performed the analysis and stopped one edit short". The split is now performed: themotir-aimirror is MOTIR-2615,blocked_bythis card because it LIFTS this card's merged wording. This card ismotir-metaonly, one PR.
What was assumed
MOTIR-2611 asserted that cli-v0.2.0's tree predated motir login, that the sandbox image built from it therefore could not carry the command, and that cutting cli-v0.2.1 was the fix. It was authored high, dispatched, and its first execution step would have been an irreversible npm publish.
The rung-2 evidence that it was false
| the card's claim | measured |
|---|---|
cli-v0.2.0's tree had no login | git show cli-v0.2.0:packages/cli/src/program.ts → register(program, 'login') at :95, logout at :114; commandCatalog.ts → path: 'login' at :146 |
52 ahead, 20 touching packages/cli | 53 ahead, 4 touching packages/cli; the program.ts diff is 4 lines, both copy edits |
| the published image cannot have it | :claude == :claude-0.2.0 == one index digest sha256:44d9022… from release run 31280497216; extracting the CLI tarball from BOTH arch layers and running it gives 0.2.0 with login first under SETUP COMMANDS |
motir -v → 0.2.0 and no login | impossible from any published artifact: 0.1.0 has no login, 0.1.1 and 0.2.0 both do |
The defect in the PLANNING, not in the diagnosis
The card's evidence table has seven rows. Six are measurements of main and one is a tag name. Not one row measures the tag's TREE — the only place the asserted absence could live. The conclusion "cli-v0.2.0's tree had no login" appears in the prose as a finding, but it was never a reading; it was inferred from "login is on main" plus "main is ahead of the tag", which entails nothing about whether the tag also has it.
This is gate 2's ABSENCE direction, applied to a REF instead of a path. The gate already says a card whose deliverable is an edit asserts its target text is not there, and must grep before asserting the gap. Here the asserted gap was login ∉ cli-v0.2.0, and git show <tag>:<path> is that grep — one command, never run. Every existing statement of the rule names a file, so a claim about a git ref reads as out of its scope, and a table of correctly-cited main line numbers is exactly what a verified precondition looks like ([[unverifiable-precondition-is-a-hypothesis]] is the same shape at a different tier).
The second, sharper limb: an artifact was OBTAINABLE and nobody obtained it. Gate 13(a) makes a card PULL an artifact before calling it published; the mirror case — pulling it before calling it BROKEN — has no gate at all. docker is unavailable in this sandbox, and the actual verification (fetch the manifest anonymously, pull the layer holding /tmp/motir-cli.tgz, install it, run motir help) cost four commands and no credential. A card asserting a defect IN a published artifact is asserting something checkable, and checkable claims about artifacts are the exact class this repository has now been wrong about four times.
Do this
- Gate 2's absence limb — add the git-REF direction. An absence asserted of a TAG / BRANCH / RELEASE is discharged by reading THAT ref:
git show <ref>:<path>. State the trap explicitly: a reading ofmainis evidence aboutmainONLY, and an accuratefile:linetable can carry an unverified conclusion because a correctly-cited line number is what a VERIFIED precondition looks like. - Gate 13 — add limb (d), the mirror of (a). A card asserting a DEFECT IN a published artifact must OBTAIN that artifact and reproduce the defect, by the same consumer-side route (a) requires for calling one delivered. Note the asymmetry that let this through: limbs (a)–(c) all guard OVER-claiming delivery, so nothing pointed at the opposite direction.
- Include the no-docker recipe in gate 13, concretely enough to run — the anonymous token → manifest index → per-arch manifest → layer blob → install → run chain, plus check EVERY architecture (the arches are built by separate runs minutes apart). Its absence is what made the check feel unavailable when it was four commands.
- Update the gate-2 and gate-13 lines in the per-card gate checklist at the top of the file so the executable index matches the expanded rules below it.
Acceptance criteria
prompts/plan-rules.mdgate 2's absence limb names git refs explicitly, withgit show <ref>:<path>as the discharge and the "evidence aboutmainonly" framing stated.prompts/plan-rules.mdgate 13 carries the reproduce-the-defect limb, labelled as the mirror of (a), with the credential-free, docker-free recipe stated concretely enough to run and the every-architecture caveat included.- Both the checklist entries (items 2 and 13 at the top of the file) and the expanded rules below carry the addition — the file's own convention that the checklist is the executable index of the rules.
- The new text cites the fixture by key (MOTIR-2611) and the
notes.htmlentry number, so a reader can reach the incident. - The change lands via a branch + PR with no
MOTIR-<n>in the branch or title (the motir-meta PR-title rule); the card reference goes in the PR body.
Already discharged — do NOT redo
notes.html #253 was written by the replan itself and merged as motir-meta PR #161 on 2026-08-10. This card does not touch notes.html.
Context refs
motir-meta/prompts/plan-rules.md— the per-card gate checklist (gate 2 at ~:56, gate 13 at ~:236) and The plan-time gates section below it.motir-meta/notes.html#253 — the merged lesson this rule change generalises.- The family this joins: MOTIR-1980, MOTIR-2010, MOTIR-2131 — three prior published ≠ obtainable ≠ current instances, all found by a human consuming the artifact, none by a check. This is the fourth, and the first where the artifact was FINE — a previously unrecorded failure direction.
Out of scope
SHARED_PLANNING_RULES and everything else in motir-ai — that is MOTIR-2615, which lifts this card's wording after it merges. Write the wording here so it can be lifted and generalised without re-deriving intent; note that the shipped mirror may name no Motir repo, so avoid making the rule's meaning depend on one.