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

(motir-meta) W7 + W7b — two `phase-deepen.md` widenings: a lifecycle VERB is a precondition, and a CHARACTERISED set owes its histogram

To Do
Description

Repo: motir-meta. ONE PR. The motir-ai mirror is its own card (blocked_by this one) — plan-rules/*.mdSHARED_PLANNING_RULES is a pinned mirror, so this is a boundary-contract pair, not a straddle.

W7 in the trigger-widening series (W1–W4b: MOTIR-2878 · W5: MOTIR-2913 · W6: MOTIR-2929). It is filed separately rather than folded into MOTIR-2878 for the two mechanical reasons the fold rule actually turns on: no file-set overlap — 2878's clauses land in run.md / phase-skeleton.md / kind-container.md and W6's in kind-leaf-deepen.md, while this one touches only phase-deepen.md, so folding prevents no collision — and 2878 already sits at estimateMinutes: 60, the estimation gate's agent-run ceiling.

W7 — the gap

plan-rules/phase-deepen.md step 1 ("Name them") enumerates SEVEN precondition kinds, and the seventh is already a behaviour, not a thing:

"and — for any card that DEPICTS or DRIVES a flow — the BEHAVIOUR / WORKFLOW it depends on (which subtask(s) SPECIFY the step set, sequence, optional-vs-mandatory split, the asks and who decides, blocking vs non-blocking, gating/skip rules)"

So the incident behind this card (notes.html #301, MOTIR-2944) is not a category nobody thought of. It is a discharge mismatch inside a limb that was loaded: the parenthetical defines the thing to go and find as a sibling CARD that specifies the flow — a plan artifact — so the discharge you perform is read the relates_to spec. There is no relates_to spec for a lifecycle the SHIPPED CODE owns, and step 2's "grep the code" reads as already-satisfied because step 1 has told you the artifact is a card.

MOTIR-2787 fell exactly in that hole. Every NOUN it named was checked and real (MAX_SCOPE_TARGETS, @@unique([projectId, scopeKey]), the dormant planning status, its transitions, with the git grep recorded). Two of its acceptance criteria were nonetheless about a system that does not exist — "release on close, submit, cancel, abandon, and job failure" names three operations the product does not ship and one (submit) whose release would have defeated the lock it was designing, and "the epic→story hand-off" has no single actor to perform it, because a session's identity IS its scope.

And the failure mode is the reason it needs its own clause rather than a broader reading of the existing one: a missing NOUN blocks you — you go looking for the route, it is not there, the guard fires. A missing VERB does not block anything. There is always some moment you can hang a release on, so the card ships, green, against tests written from its own words.

W7 — what to change: ONE clause, in prompts/plan-rules/phase-deepen.md

Widen step 1's BEHAVIOUR / WORKFLOW item so it names both discharges and says which one applies when:

  • The flow the PLAN owns (a design/spec sibling defines the step set) → unchanged: find the relates_to subtask that SPECIFIES it and ground the card in it.
  • The flow the SHIPPED CODE owns (the card says the product opens / submits / closes / cancels / abandons / hands off / expires something) → each verb is a precondition, discharged exactly as a symbol is: name the shipped operation that performs it and the row it writes. Write the mapping into the card — "close → releaseForSession; cancel → declinePlan; abandon → the lease sweep" — so the next reader inherits the check instead of repeating it. A verb with no answer is a missing precondition wearing the clothes of a design decision.
  • The lexical tell, needing no judgement: a criterion that enumerates three or more trigger names in one breath ("on close, submit, cancel, abandon, and job failure"). Enumerated lifecycles are written from intuition, and real systems rarely have five symmetrical events.
  • The sharper question the enumeration hides: would firing at this moment DEFEAT the thing being protected? A lock handed back while its holder is still working is worse than no lock, and on the page it looks exactly like diligence.

Keep it terse and in RULE register — situation → action. The incident belongs in notes.html, where it already is; this clause must read without it.

Acceptance criteria (W7)

  1. prompts/plan-rules/phase-deepen.md's step 1 BEHAVIOUR / WORKFLOW item carries the shipped-code limb: each lifecycle VERB is a precondition, discharged by naming the operation that performs it and the row it writes, with the mapping written onto the card.
  2. The clause states the asymmetry in one sentence — a missing noun blocks you, a missing verb does not — because that is why the item needs a second discharge rather than a broader reading of the first.
  3. The clause carries the lexical tell (three or more trigger names enumerated in one criterion) and the defeat question (would firing here defeat what is being protected?).
  4. A > **Warrant:** line in the file's own format naming MOTIR-2787 · 2026-08-12 · the fixture · ×1, plus its → [fixtures/phase-deepen.md#…] pointer, matching the surrounding entries exactly.
  5. The clause is in RULE register, not narrative: it reads as a standing check with no knowledge of the incident. Verified by reading it cold.
  6. No other pack is edited — core.md, kind-leaf-deepen.md, run.md, phase-skeleton.md, kind-container.md are untouched, so this PR cannot collide with MOTIR-2878, MOTIR-2913, MOTIR-2929, MOTIR-2692 or MOTIR-2700.
  7. Whatever corpus-size guard the repo runs over prompts/ is pinned on a clean origin/main worktree before the edit and quoted on both sides in the PR body, so a derived cap cannot read a 1-line overage as a regression.

Context refs

  • prompts/plan-rules/phase-deepen.md — step 1's seven-item enumeration; the item to widen is the seventh. Landed 5613440, 2026-06-19.
  • prompts/plan-rules/MANIFEST.mdphase-deepen.md's loaded when row; the widening must not change what routes the pack.
  • notes.html #301 — the incident, and its 2026-08-17 correction block, which is where this card's ground is stated.
  • MOTIR-2944 — the planning bug this discharges. MOTIR-2878 / MOTIR-2913 / MOTIR-2929 — the sibling widenings, for the file-set argument above.

W7b — a CHARACTERISED set owes its histogram, not its clearest example

Folded 2026-08-19 from MOTIR-3071's close-out. Same file, same mirror pair, different region — so it lands here rather than as a twelfth W-card, per the fold rule's file-set test. Independently droppable: if you disagree, drop this section and ACs 8–11 and ship W7 alone; nothing in W7 depends on it.

The gap

phase-deepen.md's PROSPECTIVE limb enumerates the claims that are readable today and get written without being read: A COUNTED SET and A NAMED TEST HOME. A counted set's discharge is "re-run the enumerating search yourself and RECORD the search next to the number" — and its output is a number.

The enumeration stops there. A sentence that says what a population CONTAINS — "dominated by X", "mostly Y", "largely legacy call sites", "half the work is Z" — is a second, different measurement, and no limb names it.

The fixture is MOTIR-3014, and its shape is the reason this is a widening rather than a diligence lesson: the COUNT limb was loaded, performed, and correct. Its author measured the declined population ("277 findings across 51 files"), recorded the reproduction command on the card, and the numbers re-derive exactly today. In the same sentence it wrote "dominated by the board chrome a mock is PRESENTED on rather than the surface it specifies" — never measured. Classified by the class carrying the ink, the 277 are drill 29 · tbtn 28 · chev+lane-chevron 39 · mnum 14 · meta 9 · icon-btn 8 — the product surface — and the named "clearest fixture", .foldNote, is 5. The chrome classes total 17 (6.1%). The claim then propagated to MOTIR-3054's explanationMd as "half the work would be restyling annotations", one step further from the truth, and had that card been answered YES-EXEMPT on its own framing the exemption would have silenced the guard over the product surface it exists to protect.

This is a rule defeated by another rule's SUCCESS — the discharged count is exactly what lends the undischarged half its credibility, and nothing in the sentence marks the join. The falsifying data was already in hand: the scanner records file / line / element / surface / via per finding, so the histogram was two lines from the comment that made the claim.

What to change — ONE bullet, in the PROSPECTIVE limb's enumeration, beside A COUNTED SET

  • A CHARACTERISED SET"277 findings, dominated by the board chrome" · "mostly annotations" · "largely legacy call sites" · "half of these are…". A count and a characterisation are TWO measurements, and only the first came from the tool. Discharge: group the findings by whatever CARRIES them — the class, the file, the rule, the owner — and record the top rows beside the count; or write "not classified", which is a better artefact than an unhedged "mostly X" because the next reader can tell which half to check. A named exemplar is evidence the class EXISTS; it is never evidence the class DOMINATES, and the two read identically on the page. The tell is lexical and needs no judgement: dominated by · mostly · largely · chiefly · half of · these are all just sitting next to a number the tool produced.
  • And the exemption corollary, because a characterisation is almost always the warrant for a HOLE: an exemption is priced against compliance, and a structural marker is INHERITED — the first element that lands under a marked wrapper stops being ruled on, silently. When the exemption costs more than the thing it exempts you from AND fails quietly, the composition has already decided the question.

Acceptance criteria (W7b)

  1. prompts/plan-rules/phase-deepen.md's PROSPECTIVE limb carries a third bullet, A CHARACTERISED SET, in the same shape as A COUNTED SET and A NAMED TEST HOME: trigger phrases, then a named discharge (group by the carrier, record the top rows, or write "not classified").
  2. The bullet states the exemplar/distribution asymmetry in one sentence — a named exemplar proves the class exists, never that it dominates.
  3. The bullet carries the lexical tell (dominated by / mostly / largely / half of adjacent to a measured number) and the exemption corollary (a marker is inherited, so an exemption granted on a mis-read composition fails silently).
  4. A > **Warrant:** line in the file's own format naming MOTIR-3014 · 2026-08-19 · a declined boundary warranted by an unmeasured composition, whose named fixture was 5 of 277 · ×1, plus its → [fixtures/phase-deepen.md#…] pointer, matching the surrounding entries exactly. RULE register, verified by reading it cold — the bullet must not need the fixture to make sense.

Fold history

clausefromregion of phase-deepen.mdACs
W7MOTIR-2944 / notes.html #301step 1's seventh item (BEHAVIOUR / WORKFLOW)1–5
W7bMOTIR-3071 / notes.html #317the PROSPECTIVE limb's claim enumeration8–11

ACs 6 and 7 are shared and unchanged: no other pack is edited, and the corpus-size guard is pinned on both sides.