Re-cut 3 of 3 — the TYPE packs: what each of the 14 types receives, and what it must not
The cut that answers the question the story exists for: a translate card must not be told to run pg_policies.
The material to place
VERIFY_EVERY_PRECONDITION alone carries, by subject mention: HTTP seam 24, design asset 23, datastore 11, test lane 9. Those runs land on the types whose cards can fire them — the datastore discharges (pg_policies, pg_roles, information_schema, row_security_active(), uniqueness and tenancy constraints, policy-read-from-the-migration) on code / migration / chore / deploy; the seam runs (routes, DTOs, response-body-vs-storage, auth surface, callable-in-state, operation cardinality, method-is-not-a-path) on code and test; the allocation sweep on design; the lane and expected-results material on test.
The remaining types receive their own bar and the cross-cutting set, and nothing else. Where a type has no rule of its own that is an implementation gap rather than evidence it needs none, and the rule is AUTHORED here — the same call the per-type bars took, and the reason MOTIR-3866 authored nine of them.
Acceptance criteria
- Every one of the 14 types resolves to at least one pack whose content its cards can act on, and the PR states per type where its rules came from: moved, authored, or already present.
- A
translate,copy,legal,research,revieworcontentcell contains no datastore, HTTP-seam or design-asset discharge. Asserted by pattern over the composed cell —pg_policies,pg_roles,information_schema,row_security_active,AUTH surface,response body,ALLOCATIONA DESIGN'S ALLOCATION TAKES AS WELL AS GIVES— not reviewed by eye.
⚠️ AMENDED 2026-08-29 (this card's own run) — the
ALLOCATIONpattern was too coarse, and following it literally would have moved a rule that belongs where it is. Measured after the cut: the bare word still reaches a quiet cell, and its source is the CROSS-CUTTING allocation-table rule — "AND AN ALLOCATION TABLE THAT NAMES AN ACTION OWES A LINE ABOUT THE SUBSTRATE THAT ACTION WRITES TO … an architecture decision record's ownership grid, a design note's panel list, a permissions matrix" — which alegalorcontentcard can absolutely author, and which is precisely the kind of card that authors one. The criterion's INTENT is no DESIGN-ASSET discharge, and the pattern that expresses it is the design sweep's own wording (A DESIGN'S ALLOCATION TAKES AS WELL AS GIVES), which after the cut is intype-designand reaches thedesigncell only.pg_rolesis ADDED to the list for the same reason in reverse — it is part of the same datastore run and the card's list happened to omit it. The criterion is asserted mechanically as amended, and it is GREEN.
- A
codecell keeps every discharge it has today; the routing baseline proves it lost nothing. - The composed size of each of the 14 type cells is stated before and after, with the largest reduction and any increase both named.
- No pack is declared empty, and every type pack is reachable.
- Authored rules are prescriptive: the register ratchet holds, and any rise is defended per marker in the PR.
Context refs
motir-aisrc/llm/planningRulePacks.ts— thetype-*packs andPACKS_BY_TYPE.motir-aitests/planningRuleRouting.test.ts— the superset proof per moved clause.- MOTIR-3898 — the cross-cutting set this is the complement of. MOTIR-3897 — the selector.
- MOTIR-3866 / motir-ai#329 — the per-type bars already shipped, which these preconditions sit beside rather than restate.
⚠️ At the estimation gate at 8 points. It stays one card because the acceptance criterion that matters — a
translatecell containing no datastore discharge — is only true once ALL the type-scoped material has been placed. Splitting it by type family would leave that criterion unassertable on every part.
Comments (0)
No comments yet — be the first to weigh in.