Enforce the plan template's mandatory Shared seams field with a gate
Problem
The per-step - **Shared seams:** field is mandatory in
docs/plans/TEMPLATE.md (none is a stated value, never an omitted field)
as of chore(skills): teach the planner conflict-aware... (!1898 - merged) • Hayley Swimelar • 19.4. No gate checks it:
docs:lint(markdownlint, Vale, lychee) checks prose and links, not template structure.implement-step/SKILL.mdenumerates the per-step fields twice (the plan template bullet under Context to load, and precondition 2, "The plan follows the template") and neither enumeration namesShared seams:.validate-step/SKILL.md's template-shape check reads "per-stepFiles/Acceptance/Testsentries" and does not name it either.
A plan that omits the field therefore passes every gate. Until one of the options below lands, the mandate binds through the plan-MR review pass alone.
Options
- Add
Shared seams:to the per-step field enumerations inimplement-step/SKILL.mdandvalidate-step/SKILL.md, so a plan missing the field fails the template-shape precondition at step time. The monolith step skills need the same sweep, and their enumerations were not audited here. - Add a structural check to the docs lint surface: a script asserting every
### Step N:block under## Implementation Stepsindocs/plans/*.mdcarries the field, wired wheredocs:lintruns.
The two compose, and option 2 is the only one that fails before a plan MR merges. Plans merged before the field existed do not carry it, so the check needs a future-only ratchet, for example allowlisting the plan files that exist when it lands, the same shape the comment-caps gate uses.
Sequencing
Option 1's implement-step/SKILL.md edit collides with
chore(skills): add open-time conflict hygiene t... (!1899 - merged) • Hayley Swimelar • 19.4 while that MR is open: it owns the
file. Land the enumeration edits with or after that MR.
Raised by @mkhalifa3 on the template hunk (discussion).