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-3071Done

Planning bug: a guard's declined boundary was warranted by an unmeasured claim about its population's COMPOSITION — only the count had been measured, and the named fixture was 5 of 277

Logged by motir run MOTIR-3054. A RECORD card — the correction is already applied in MOTIR-3054's PR. Nothing is scheduled on it and it blocks nothing.

The defect

MOTIR-3014 declined one layer of the design-asset ink guard and wrote the warrant into tests/design-ink-contrast.test.ts's comment (lines 225–228 on origin/main 2bbc4643), as one sentence — corrected at close-out: the quoted sentence lives THERE ONLY, not also in tests/theme/inkContrastMockScan.ts's header, whose boundary (2) makes the weaker existence claim “a mock's stylesheet paints BOTH the product surface it specifies AND the board it is presented on”. The header's own unmeasured distribution is one paragraph further down, in the FAINT arm (“the dominant population of faint text is the board chrome above”) — same defect, different population, and MOTIR-3054's fix retires it:

"277 findings across 51 files, dominated by the board chrome a mock is PRESENTED on rather than the surface it specifies — the fold measurements, the panel captions, the numbered annotations."

The count was measured. The composition was not.

The rung-2 evidence

Running the shipped scanner over design/** at origin/main 2bbc4643 reproduces the count exactly — 277 findings, 51 files. Grouping those same findings by the class that carries the ink:

carrierfindingswhat it is
.drill29roadmap drill-down row
.tbtn28toolbar button
.chev + .lane-chevron39backlog-region / board-swimlane collapse
.mnum14roadmap month header
.meta9sprint-header metadata
.icon-btn8icon button
.pr-meta / .col-count / .lr-id / .q-snippet21PR metadata, column count, link id, triage snippet
.foldNote5the board annotation the sentence was written around

The population is dominated by the PRODUCT surface the mock exists to specify. .caption 6 / .lede 3 / .sw-cap 3 / .foldNote 5 — the genuine board chrome — total 17 of 277 (6.1%). (Close-out correction: .panelNote is 0 of the 277, not a minority member — it declares color: var(--el-text-muted) at repository-set-quick-view.mock.html:812 and repository-set.mock.html:659, but the surface walk resolves the page white under it, where muted clears AA, so the guard never had a verdict to decline there.)

Why it matters, rather than being a wording slip

The claim propagated. MOTIR-3054 was filed to settle the question the decline deferred — does a design board's own chrome owe AA? — and framed that decision around the same fixture ("the clearest fixture is .foldNote"). Answered YES-EXEMPT on that framing, the exemption would have covered all 277 sites and silenced the guard over the product surface: exactly the failure the guard exists to catch, reintroduced by its own exemption, and silently (a structural marker is inherited, so an element under a marked wrapper stops being ruled on without saying so).

It was answered the other way only because the run classified the population before deciding.

Fix applied / Resolution taken

Applied in MOTIR-3054's PR, on the record rather than silently:

  • The scanner header's boundary (2) is deleted, with the classification written in its place (the table above, in prose) and the two loads the decision actually bears named.
  • docs/decisions/design-board-chrome-aa.md records the decision, the composition, and the exemption-cost argument.
  • violations() no longer filters on via; the whole 277 is swept and the arm is enforced at zero.
  • The remaining boundary (--el-text-faint, 1745/101) is declined for SIZE, stated as such, with the chrome argument explicitly named as spent so it cannot be re-derived. MOTIR-3068 owns it.
  • Lesson: notes.html #317 (locate by content — "A guard's declined boundary was warranted by what its population WAS"; the numeral drifts on append collisions).

What would have prevented it

An existing rule, not performed: plan-rules/phase-deepen.md's precondition-verification rule already says a claim is verified against shipped reality before it is written down. What is new here is only WHERE it applies — inside a sentence whose other half was measured, so the unverified half inherited the measured half's confidence.

Disposition, SETTLED AT CLOSE-OUT: SHARPEN — a trigger widening, not a lesson. This REVERSES the filing pass's own default ("LESSON, not a rule change; one occurrence; read in RULE register the draft needs the incident to make sense"), on four checks it did not run:

  1. The 0-grep across all three homes, against a populated control. dominated · dominant · histogram · distribution · a minority return 0 over prompts/plan-rules/*.md + prompts/run.md and 0 over motir-ai/src/llm/planningRulePacks.ts; the control (precondition) returns 3 in the same sweep. The seven mostly / majority hits are kind-leaf-deepen.md's "a manual/human item is one whose SEQUENCE is MOSTLY MANUAL" classifier and core.md's "anchor / majority repo" — instructions to judge by the bulk, never to measure it. The check exists under no vocabulary.
  2. The register test, run by writing the draft rather than predicting it. The clause is three lines, situation → discharge, and slots beside its two existing siblings (A COUNTED SET, A NAMED TEST HOME) needing no knowledge of this incident. "The draft needs the incident to make sense" was a self-assessment, and writing it falsifies it.
  3. The ORDER test, in the shape that outranks a family count. The governing limb — phase-deepen.md's A COUNTED SET — was LOADED, PERFORMED and CORRECT: MOTIR-3014 measured 277/51, recorded the reproduction command on the card, and both re-derive exactly today. Its discharge output is a NUMBER, and that discharged number is precisely what lent the undischarged half its credibility. A rule defeated by another rule's success, which is the strongest promote ground available at ×1 and does not depend on the occurrence count.
  4. The named home was wrong. The filing pass nominated "a limb on the NEGATIVE-claim rule". This is not a negative — it is a positive distributional claim, and the NEGATIVE limb's discharge (carry the search, not the verdict) does not produce a histogram. Left as filed, the promotion would have landed one limb away from where it fires.

And it propagated onto a PLAN card, which settles which corpus governs it: MOTIR-3054's explanationMd restates the same unmeasured distribution one step further from the truth — "half the work would be restyling annotations… and the other half would be invisible under it" — measured, 6.1% and 93.9%. So this is a claim class a card-authoring pass writes, not only a code-comment one, and plan-rules/phase-deepen.md is its pack.

Landed as a FOLD, not a new card (MOTIR-2953 W7b, with its mirror MOTIR-2954): 2953 is todo, pins motir-meta, and already edits phase-deepen.mdSHARED_PLANNING_RULES — the same file set the fold rule exists to keep one card on. Sized 35 → 55 min / 2 → 3 pts, inside the 60-minute agent-run ceiling; the clause is marked independently droppable and carries its own ACs 8–11 and a fold-history table.

Close-out verification (2026-08-19, a second session)

Every rung-2 citation on this card was re-executed rather than re-read, in a detached worktree at the commit the card names (origin/main 2bbc4643), with the shipped scanner. Nothing was run in another session's tree.

The count reproduces, and so does the composition — which is the point, since this card's own lesson is re-derive the COMPOSITION, not the number. 277 findings / 51 files / class layer 0, exact. Grouped by the class carrying the ink, 65 groups summing to 277:

drill 29 · tbtn 28 · chev 20 + lane-chevron 19 (= 39) · mnum 14 · meta 9 · (inline style, no class) 9 · icon-btn 8 · st-sub 8 · region-dates 7 · sect 7 · caption 6 · pr-meta 6 · lr-id 6 · q-snippet 5 · foldNote 5 · then a 50-group tail of ≤ 4.

The table in The rung-2 evidence above is right row for row (its .pr-meta / .col-count / .lr-id / .q-snippet bucket is 6 + 4 + 6 + 5 = 21). Two things it does not say and now does: it accounts for 153 of 277, the remaining 124 being that tail — .st-sub, .region-dates, .sect and the rest, product surface again, so the verdict is if anything understated; and .panelNote is 0, corrected inline above.

The fix is applied, in flight, not yet on origin/main. MOTIR-3054 is in_progress with no PR open (gh pr list --head subtask/MOTIR-3054-mock-chrome-aa[]) and a dirty worktree carrying the sweep. Read there, read-only, all four limbs hold: boundary (2) replaced by the classification plus the two loads it bears; violations() filters on ink === 'muted' with no via arm; docs/decisions/design-board-chrome-aa.md present (10 695 bytes); the FAINT arm re-declared on SIZE (1745 / 101) with the chrome argument named as spent — "it is not available as a reason a second time" — which is what retires the header's own unmeasured distribution.

The lesson is on origin/main, and its numeral is right for once. notes.html #317 (695d9fc, motir-meta PR #251), located by content and by number; #318 exists after it, so no collision renumber is pending. Its text carries the same "wrote the decline into the scanner's header and the spec's comment" imprecision corrected above — left as published, per the historical-record rule; the correction lives here and on the widening card.

MOTIR-2907 check: clean, and worth saying so. MOTIR-3014 is done and its description carries no compositional claim at all — the defective sentence was authored in CODE, in the same run, not on the card. Nothing to amend there. MOTIR-3054's explanation does carry it ("half the work"), and it is flagged in a comment on that card rather than edited, because a sibling session holds it mid-run.

Nothing about this card is blocked_by MOTIR-3054. A record card closes on correction verified + lesson on origin/main; the correction was verified by reading it, and its merge adds no information this close-out lacks. The advisory disposition in the explanation below still stands.

Context refs

  • tests/theme/inkContrastMockScan.ts — where the claim lived, and where the correction landed.
  • tests/design-ink-contrast.test.ts — the same sentence, in the spec's comment.
  • docs/decisions/design-board-chrome-aa.md — the decision and its evidence.
  • motir-meta/notes.html #317 — the lesson.
  • MOTIR-2953 / MOTIR-2954 — W7b, where the promote verdict landed.