PLANNING BUG — measured a stale design asset file-by-file inside the right folder, and the surface had three mocks, so the card's own grep would have returned 0 with 17 sites still stale
Filed by the motir run of MOTIR-2500, against the pass that authored it. No code deliverable — the deliverable is the RULE + the LESSON. See MOTIR-2500's run-time amendment for the full measurement.
What happened
MOTIR-2493 fixed the shipped /backlog row composition and correctly filed the stale design asset as its own card, because a design/** diff cannot ride a subtask/* branch. That much was right, and the split was well-reasoned.
The card then measured the defect in exactly two files — design/backlog/backlog.mock.html (22 grep hits) and design/backlog/design-notes.md (two prose sites) — and wrote its first acceptance criterion as a grep pinned to one of them:
grep -c 'role="row"' design/backlog/backlog.mock.htmlreturns 0
design/backlog/ contains three *.mock.html files, and all three draw the same ranked rows:
| file | <div role="row"> elements | in the card? |
|---|---|---|
backlog.mock.html | 21 | yes |
backlog-filter.mock.html | 9 | no |
backlog-scale.mock.html | 8 | no |
38 row elements, of which the card could see 21. None had a legal parent — the folder contains no grid, rowgroup, gridcell, table or treegrid anywhere — so every one of them was the same aria-required-parent violation, equally ready to be copied into code by the next agent that trusted the asset.
Why this one is worth logging
The failure mode is that the card would have passed. Fix backlog.mock.html alone and AC 1's grep returns 0, the design-guard lane goes green, the PR reads as a complete fix, and 17 stale sites remain in the folder the design-reference rule sends the next agent to open first. That is the same shape as notes.html #215 (a migration that moved one of two callers): the straggler now sits on a path nobody maintains, and it reads as done from every angle the plan can see.
It is also not the mistake notes.html #234 already covers. #234's lesson is "put design/<area>/ in the file set you grep" — a sweep that never looked at design/ at all. This pass DID look at design/backlog/. It opened the right folder, greped the right string, and still missed two thirds of the sites, because it treated the area as a FILE rather than as a SET. A rule that says "remember design assets" does not reach it; the gap is one level finer.
The tell was visible without any extra work: design-notes.md's own surface table — the first thing in the file — lists all three mocks by name, with backlog-filter.mock.html described as "EXTENDS the backlog surface" and backlog-scale.mock.html as "the large-backlog shape". Two entries that say, in the asset's own words, these draw the same rows. The card cited that file, quoted two lines from it, and did not read its index.
The deliverables (both, per a RULE has TWO homes)
- A
notes.htmlLESSON — the incident above, with the prompt-engineering hint: when a card's acceptance criterion is a grep, the PATH in that grep is the claim. Scope it to the directory that owns the concept, not the file you happened to open — and if the folder is a design area, read itsdesign-notes.mdsurface table first, because it enumerates the sibling mocks for you. - A
plan-rules.mdRULE amendment — extend gate 8's sweep-the-referrers corollary with a design-area limb: an asset set is a FOLDER. A surface's panels are routinely split across sibling*.mock.htmlfiles (main / at-scale / filtered / empty), so a per-FILE measurement of an asset defect is incomplete by construction. Measure withgrep -rcoverdesign/<area>/, list every file that hits in the card, and give each one the two options gate 8 already allows — this card's scope, or a named sibling — with no third.
Acceptance criteria
motir-meta/notes.htmlcarries a new.mistakeentry matching the existing markup, with the count bumped, capturing: what was measured, the three-file reality, why the card would have passed anyway, and how it differs from #234.motir-meta/prompts/plan-rules.mdgate 8 carries the design-area limb above, stated so it fires at AUTHORING time (when the grep is written), not only at run time.- The rule names the concrete check —
grep -rc '<pattern>' design/<area>/plus reading that area'sdesign-notes.mdsurface table — rather than a general exhortation to be thorough. - Lands as a branch + PR against
motir-meta, with noMOTIR-<n>in the branch name or PR title (the motir-meta sync carve-out); this card's key goes in the PR BODY.
Context refs
- MOTIR-2500 — the card, and its run-time amendment carrying the corrected measurement.
motir-meta/prompts/plan-rules.md— gate 8, the sweep-the-referrers corollary and its migration limb.motir-meta/notes.html— entry #234 (the ADR rename that never grepeddesign/), the nearest existing lesson and the one this refines.design/backlog/design-notes.md— the surface table at the top that names all three mocks.