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

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

Done
Description

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: the motir-ai mirror is MOTIR-2615, blocked_by this card because it LIFTS this card's merged wording. This card is motir-meta only, 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 claimmeasured
cli-v0.2.0's tree had no logingit show cli-v0.2.0:packages/cli/src/program.tsregister(program, 'login') at :95, logout at :114; commandCatalog.tspath: 'login' at :146
52 ahead, 20 touching packages/cli53 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 -v0.2.0 and no loginimpossible 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 logincli-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

  1. 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 of main is evidence about main ONLY, and an accurate file:line table can carry an unverified conclusion because a correctly-cited line number is what a VERIFIED precondition looks like.
  2. 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.
  3. 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.
  4. 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

  1. prompts/plan-rules.md gate 2's absence limb names git refs explicitly, with git show <ref>:<path> as the discharge and the "evidence about main only" framing stated.
  2. prompts/plan-rules.md gate 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.
  3. 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.
  4. The new text cites the fixture by key (MOTIR-2611) and the notes.html entry number, so a reader can reach the incident.
  5. 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.