Parent
Refs #2933. Split out of Lane D (#2937) on 2026-08-19 after adversarial validation showed the originally-designed mechanism was broken and structurally larger than the mode addition it rode on. Lane D keeps the spec lens + ladder + C13/C15/C16 verdicts; this item owns the container-scoped review.
What to build
When the last sub-item of a spec container closes, one cumulative review of the shipped whole — across however many PRs — against the container's spec body. Two skills already route to this and currently land on nothing: plugins/work-items/skills/decompose/SKILL.md:244-252 ("a close-out review of the shipped whole against the container body" → "the review plugin's spec-fidelity machinery when installed") and plugins/work-items/skills/ship/SKILL.md:107-108 (both all-sub-items-closed rows, split by execution shape). planning:plan close-out step 4 sequences the same ritual. Container #2933's own acceptance criteria require this before it can close.
Constraints established by validation (do not re-derive)
- No seam verb returns a closing PR. The seam's public surface is
create-item, get-item, claim, renew-lease, reclaim, link-blocks, add-sub-item, list-sub-items, list-frontier, capabilities. The only closing-PR machinery is a GitHub-only GraphQL query over closedByPullRequestsReferences (adapters/github/README.md, used by reclaim.sh) — and its documented reduction filters MERGED out, the inverse of what close-out needs.
- "Union of merge commits" is not a usable basis. This repo squash-merges by default (
plugins/source-control/skills/pull-request/SKILL.md:39,77), which produces no merge commit and no second parent; docs/conventions/topic-docs/README.md:479-481 confirms squash carries none of the branch ancestry. A commit set is also not a diff range without a named base.
- The basis differs per execution shape. For
integration branch → single PR (plugins/work-items/reference/execution-shape.md:63) there are no per-item PRs at all — the container's recorded **Integration branch:** line is the handle. For per-item PRs, the squash commits on the default branch are.
- The container body is not readable through the seam (no
body field in the normalized item object) — it needs the provider-mechanic read, presence-gated, same as Lane D's corrected ladder rung 2.
- quality-gate declares ONE review diff base (
quality-gate/SKILL.md:25-27) and parses no flags today (fanout has the only flag-parsing precedent). A container-scoped basis is a structural change to that skill, not a mode row — which is why placement is re-opened here rather than assumed.
- The contract slice is pruned before merge, so at close-out time
docs/topics/<slug>/PLAN.md is gone from main and recovery is best-effort — the tracker container body is the only durable spec source at this moment.
- Non-GitHub providers:
jira declares list-sub-items: false (exit 6) and local-markdown has no PR concept and is barred from containers entirely — state the degradation honestly rather than pretending neutrality.
What to decide
Placement (a quality-gate mode with an explicit second basis / its own skill / a work-items ritual calling review machinery), the per-shape diff-basis derivation, and how the two existing routes get updated to name the real target.
Acceptance criteria
Blocked by
Parent
Refs #2933. Split out of Lane D (#2937) on 2026-08-19 after adversarial validation showed the originally-designed mechanism was broken and structurally larger than the mode addition it rode on. Lane D keeps the spec lens + ladder + C13/C15/C16 verdicts; this item owns the container-scoped review.
What to build
When the last sub-item of a spec container closes, one cumulative review of the shipped whole — across however many PRs — against the container's spec body. Two skills already route to this and currently land on nothing:
plugins/work-items/skills/decompose/SKILL.md:244-252("a close-out review of the shipped whole against the container body" → "the review plugin's spec-fidelity machinery when installed") andplugins/work-items/skills/ship/SKILL.md:107-108(both all-sub-items-closed rows, split by execution shape).planning:plan close-outstep 4 sequences the same ritual. Container #2933's own acceptance criteria require this before it can close.Constraints established by validation (do not re-derive)
create-item, get-item, claim, renew-lease, reclaim, link-blocks, add-sub-item, list-sub-items, list-frontier, capabilities. The only closing-PR machinery is a GitHub-only GraphQL query overclosedByPullRequestsReferences(adapters/github/README.md, used byreclaim.sh) — and its documented reduction filtersMERGEDout, the inverse of what close-out needs.plugins/source-control/skills/pull-request/SKILL.md:39,77), which produces no merge commit and no second parent;docs/conventions/topic-docs/README.md:479-481confirms squash carries none of the branch ancestry. A commit set is also not a diff range without a named base.integration branch → single PR(plugins/work-items/reference/execution-shape.md:63) there are no per-item PRs at all — the container's recorded**Integration branch:**line is the handle. For per-item PRs, the squash commits on the default branch are.bodyfield in the normalized item object) — it needs the provider-mechanic read, presence-gated, same as Lane D's corrected ladder rung 2.quality-gate/SKILL.md:25-27) and parses no flags today (fanouthas the only flag-parsing precedent). A container-scoped basis is a structural change to that skill, not a mode row — which is why placement is re-opened here rather than assumed.docs/topics/<slug>/PLAN.mdis gone frommainand recovery is best-effort — the tracker container body is the only durable spec source at this moment.jiradeclareslist-sub-items: false(exit 6) andlocal-markdownhas no PR concept and is barred from containers entirely — state the degradation honestly rather than pretending neutrality.What to decide
Placement (a
quality-gatemode with an explicit second basis / its own skill / a work-items ritual calling review machinery), the per-shape diff-basis derivation, and how the two existing routes get updated to name the real target.Acceptance criteria
decompose/SKILL.mdandship/SKILL.mdroutes updated to name it (they currently point at machinery that does not exist)Blocked by
specmode is the most likely host and settles the finding-class enum this reuses)