chore(skills): teach the planner conflict-aware decomposition
Why
The S17 Phase 6 workstream decomposed one management API into 42 steps, tracked
at S17 Phase 6: virtual and remote repository CRUD (#314) • Hayley Swimelar. Measuring where its merge conflicts
actually came from put them almost entirely between siblings: 33 of the 45 open
sibling pairs among the 10 open step branches conflicted with each other, while
just one of those branches conflicted with main. One wiring seam and its test
carried 58 of the 183 conflict hunks, five files were touched by all ten, and 59
hunks were comment-only.
Every one of those is a property of the decomposition, fixed before any branch exists. The planner skill said nothing about it, so each workstream rediscovers the cost mid-flight, when the plan is no longer editable.
What
docs/plans/TEMPLATE.md gains a per-step Shared seams: field, in its own
docs(plans) commit. That binds every future plan rather than this skill alone:
the field is mandatory and none is a stated value, so an empty conflict
surface reads differently from an unexamined one.
Canonical shared text dissolved only about a fifth of the measured conflicts, so the new section says ownership is not a substitute for a declared merge order.
Test plan
Ran docs:lint's three commands against both touched files:
markdownlint-cli2 0.22.1, vale --minAlertLevel error, and
lychee --offline --include-fragments. All clean, and the same three passed
again as pre-commit hooks. The repo's markdownlint globs exclude
.claude/skills/**, so Vale and lychee are what cover the skill file.
No e2e scenario impact: skill and template prose only, no service behavior.
Skill benchmark
Via /skill-creator's benchmark method: 3 runs per cell on Claude Opus against
a fixed authoring fixture (four sibling steps of a retention-policies
management API: three endpoint steps sharing a wiring file and a query-name
catalog, plus a docs-only step). Each cell prompts with its side's template
step shape and planner guidance, this branch at 6db23ef7 vs main at
9addc98a. Four assertions graded per run:
| Assertion | This branch | main |
|---|---|---|
Every step carries Shared seams:, and the docs-only step states none |
3/3 | 0/3 |
| Both shared files named as seams in every endpoint step | 1/3 | 0/3 |
| Seam settlement is ownership, not a prescribed merge order | 3/3 | 0/3 |
Endpoint steps stay parallel (Depends on: stays —) |
3/3 | 3/3 |
Findings:
- Rows 1 and 2 measure the new field, so
main's ceiling there is 0/3 by construction. Its runs still see the contention, call sibling conflicts on the shared files "expected", and leave the resolution to whoever rebases second. That is the rediscovery cost the Why section describes. - The row-2 misses are strict grading, not absent seams: two branch runs declare steps 2 and 3's seams by reference ("Same three seams and same instruments as Step 1, which owns the canonical text") instead of repeating the paths, and the grader wants the paths in every step. Read as written, every endpoint step declares both files.
- Row 4 is the regression check, and both cells hold 3/3: the added guidance does not push planners into serializing a wave the operator wants parallel.
- Grader finding: a first grader cut counted order-free idioms ("whichever branch lands first creates the anchor", "conflict in either merge order") as merge-order settlements. The scoring grader masks conditional and any-order idioms first, and still fails prescriptive ordering such as "must land first".