Skip to content

Container close-out review — invocable cumulative review of a shipped container against its spec #3027

Description

@kyle-sexton

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

  • An invocable, documented close-out review flow with a diff basis derivable for BOTH execution shapes
  • decompose/SKILL.md and ship/SKILL.md routes updated to name it (they currently point at machinery that does not exist)
  • Provider degradation stated (GitHub-only paths named as such; jira/local-markdown behavior explicit)
  • Container Spec: Shipping-lifecycle absorption (Pocock Shipping section) #2933 can run it against itself — the dogfood test

Blocked by

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.priority: needs-triageDefault until a priority tier is assigned.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions