Skip to content

moooon

Motir

Vibe your whole project. Bring an idea — Motir's three AI layers plan it, track it, and ship it, end to end. You're looking at Motir, built in Motir.

  • Vibe Project
  • Open Source
  • AI Agent
  • AI Loop
1
requests
0
upvotes
145
planned
1,361
shipped

Motir · Work items

MOTIR-2481Done

PLANNING BUG — a card said in its own words that the defect count was unknown, then carried a 5-point estimate and a prescribed mechanism built on that unknown

Filed by the motir run of MOTIR-2459 on 2026-08-08, which re-planned it before writing product code. This is the record of the planning defect; the corrected shape is MOTIR-2459MOTIR-2475MOTIR-2477.

What the card did

MOTIR-2459 was authored to "establish which before changing anything" and stated plainly that its own headline figures were untrustworthy: "Do not treat 184 as the defect count — deriving the real one is the first deliverable", and "that answer decides whether this is a small correction or a real backlog." That reasoning was correct and the card then contradicted it twice. It carried 5 story points / 90 minutes, and it carried acceptance criteria — "every violation the guard finds is fixed" — that are only sizeable once the count is known. A card cannot both declare a quantity unknown and commit to fixing all of it in ninety minutes.

The measured answer: 262 defects across 134 files (132 faint, 130 muted), i.e. a real backlog and roughly a 5× miss against the estimation gate's calibration table.

The second defect, which is not about sizing

The card prescribed the mechanism as well: "a repo-wide guard … Model it on the component-local guard already shipped in tests/settings/rolesPermissionsScreens.test.tsx; that one reads rendered DOM, which is what makes the aria/disabled distinction visible; a source grep cannot make it."

Both halves of that sentence are true and the conclusion does not follow. A DOM-reading guard can only see components that something RENDERS, so "repo-wide" and "reads rendered DOM" are mutually exclusive unless every component in the product gets a render harness. The card ruled out the wrong alternative: it rejected a grep, and then treated parser and grep as the same thing. A TypeScript AST sees aria-hidden, role, disabled, the ternary a class sits in and the ancestors that paint a background — exactly the structure the rule turns on — and this repo already has that shape in tests/work-items/activity-registry-totality.test.ts.

The third, found while measuring

The card noted that "the shipped a11y sweeps pass today" and asked for the cross-check that explains it. The answer: 108 of the 134 defect-carrying files sit on routes tests/e2e/shell-a11y*.spec.ts never loads, and the 26 that do are swept EMPTY, so the faint-carrying branches never render. That is a standing gap in the a11y sweeps' coverage that outlives these three cards, and no card owns it.

Acceptance criteria

  • The lesson is recorded in motir-meta/notes.html in the existing .mistake markup with the count bumped: a card that declares a quantity unknown may not carry an estimate that presumes the answer, and may not prescribe a mechanism whose feasibility depends on it.
  • The record names the generalisable tell, not just this incident: the card's own words — "deriving the real one is the first deliverable", "do not treat N as the count", "establish which before changing anything" — are the signal that the card is two cards, a MEASURE card and a FIX card whose size the first one sets.
  • It also records the mechanism half: ruling out one mechanism (a grep) is not the same as ruling in the one you name (a rendered DOM), and "repo-wide" plus "renders the component" is a contradiction to check before it becomes an acceptance criterion.
  • The a11y-sweep coverage gap is filed as its own card rather than left in this record — a finding in a bug body is not in the plan.

Close-out verification (2026-08-08)

All four criteria discharged. ACs 1–3 by notes.html #245, authored by this card's own filing session and open as motir-meta#150 (no MOTIR-<n> in its branch or title, per the sync-surface rule, so nothing will flip this card automatically). AC 4 by MOTIR-2482, filed, sized 5 pts / 60 min, blocked_by MOTIR-2477 so it cannot open against a still-red tree.

Rung-2 re-check of every citation on this card. Exact, and unusually so — say it plainly rather than implying drift that was not found:

claimverified
MOTIR-2459 carried 5 pts / 90 minget_work_item_activity history: storyPoints 5→3 and estimateMinutes 90→40 in one edit at 2026-08-08T22:01:29Z — exact
tests/settings/rolesPermissionsScreens.test.tsxexists on origin/main
tests/work-items/activity-registry-totality.test.tsexists on origin/main
tests/e2e/shell-a11y.spec.tsSHELL_ROUTESexists; the symbol opens at :39; nine path: entries — the "nine routes" figure is exact
262 = 132 faint + 130 mutedconsistent; note the 132 is 122 violations + 10 class constants attached to no element, two kinds under one word

One citation IS wrong, and it is this card's own. The context ref read "the estimation gate (the 8-point / 1-hour ceiling) this card was authored past." There is no 8-point ceiling: plan-rules.md:2463 sets the scale at 1 / 2 / 3 / 5 / 8 with 13+ ⇒ split, so 8 is the top of the range, not a bound a 5-point card crossed. And the 1-hour ceiling (:2450) is on agent run time EXCLUDING CI, while estimateMinutes sums agent + CI — so 90 minutes does not breach it on its face either. No ceiling was crossed. The gate this card was authored past is the HEDGE limb, which is the same correction the lesson needed.

Promote verdict — LESSON, no sharpening (the card posed no promote question; recorded so the next reader does not re-open it)

The lesson's stated reason was false, and the reason is the half a future rule gets written from. notes.html #245 claimed "no gate compares a card's estimate to its own prose" and that the hedged-estimate limb "fires on a disclaimer attached to the number." Two clauses reach this card, and in both it is the governing sentence, not the illustrations:

  1. The hedged-estimate limb is about the WORK. "If the size depends on an unanswered question, the card is blocked ON that question … it does not carry a placeholder into the ready set." MOTIR-2459 said the size depended on an unanswered question in its own words — "that answer decides whether this is a small correction or a real backlog."
  2. The warning-in-your-own-card's-body rule IS the two-parts-of-one-card read the entry said nothing performs: "re-read its OWN description for a sentence naming something the card needs and does not have; if one exists the card is not sealable." The limb names it as its own remedy — "a hedge is simultaneously an unsized leaf AND a prerequisite you owe a card for."

ORDER test. Both landed in prompts/plan-rules.md and in SHARED_PLANNING_RULES (motir-ai/src/llm/treeGeneration.ts) — one commit, fcddcbd, 2026-08-01 20:16:45Z — against a card authored 2026-08-08 20:31:50Z. Seven days and fifteen minutes, same planner, both homes always-injected ⇒ diligence miss, not a trigger gap (the MOTIR-2280 discriminator: a rule whose general clause covers the case while its examples do not is a diligence miss). Do not sharpen the estimation gate for this.

Not a mechanization candidate either. The tell is lexical and self-contained, which is MOTIR-2164's THIRD TIER profile — but 2164's own discriminator refuses it: a rule nobody has read is a diligence problem and needs no machinery, and the rule that would be mechanized here was never run. No card is owed; MOTIR-2432 stays scoped to gate 14's ACTOR axis.

What IS worth carrying, and it went into the entry: the camouflage. Every illustration under the hedge limb is attached to a number; every uncertainty sentence in this card was attached to the workload, four paragraphs above the number, reading as scoping rather than hedging. A reader scanning for the rule's examples finds none of them and stops before the clause that governs them. notes.html #245 was amended on its open branch (faf30ce) to say this instead, and its prompt hint now says to run the limb by its governing sentence, not by its examples.

Context refs

  • MOTIR-2459 — the re-scoped survivor, whose header carries the re-plan note.
  • MOTIR-2455 — the incident that settled the rule this card was to enforce.
  • motir-meta/prompts/plan-rules.md — the estimation gate: the hedged-estimate limb (:2413) and the warning-in-your-own-card's-body rule are what this card was authored past, both mirrored in SHARED_PLANNING_RULES. (Corrected at close-out: there is no 8-point ceiling — the scale is 1/2/3/5/8 with 13+ ⇒ split, :2463 — and the 1-hour ceiling at :2450 is agent time excluding CI.)
  • tests/e2e/shell-a11y.spec.tsSHELL_ROUTES, the nine-route swept set the cross-check was run against.