sprint-review¶
Schließt einen aktiven Sprint gemäß Sprint-Spec: validiert das Deploy-Artefakt und protokolliert den Value-Delivery-Audit-Trail.
Close an active sprint per the project sprint spec, validating the deployable artefact and recording the value-delivery audit trail. Invoke when the user asks to close a sprint, review a sprint, finish a sprint, ship a sprint, or wrap a sprint. Also handles equivalent German-language requests. Promotes active → review, validates artifact_ref per the release-artifact spec's per-project-type rules, confirms the named verifies_sprint_value acceptance criterion is checked, optionally chains into release-notes-curate and release-publish-trigger (operator-opt-in, recorded verbatim in ## Review notes), then promotes review → closed. Falls back to review → cancelled with a one-paragraph rationale when artefact validation fails unrecoverably. Supports resume on re-invocation per spec/claude/resumable-work/.
- Plugin:
nolte-shared - Phase: 7 Close & Release (
close-release) - Tags:
scaffolding,release - Quelle: skills/sprint-review/SKILL.md
Anwenden wenn¶
- you want to close, finish, or ship an active sprint
- you want to validate the sprint's artifact_ref against the release-artifact spec
- you want the optional chain into release-notes-curate and release-publish-trigger
Nicht anwenden wenn¶
- You want to drive day-to-day mechanics of the sprint →
sprint-execute - You want to plan or open a new sprint →
sprint-plan
Siehe auch¶
Referenziert von¶
Sprint Review¶
Closes an active sprint per spec/project/sprint/<canonical_language>.md. This skill is the canonical write authority for active → review, review → closed, and the cancellation paths from any stage. It delegates artefact validation to the rules declared by spec/project/release-artifact/<canonical_language>.md and may chain (with explicit operator opt-in) into release-notes-curate and release-publish-trigger per spec/project/release-skill-layer/<canonical_language>.md.
Why this is a skill, not an agent¶
- Externally-visible mutations gate on user confirmation — promoting a sprint to
closedis irreversible bookkeeping, the artefact-validation results need to be reviewed by the user before the promotion fires, and therelease-skill-layerchain is operator-opt-in by spec; an agent's fire-and-forget shape would lose those gates. - Orchestrator that chains other skills — this skill conditionally dispatches
release-notes-curateandrelease-publish-triggermid-flow, and falls through to a cancellation path on validation failure; the skill-orchestrates pattern (perskill-vs-agent) defaults the orchestrator to skill form. - Output flows back into the main conversation — the validation transcript, the
## Review notesaudit block, and the chosen lifecycle outcome (closedvscancelled) all belong in the user's working context, not behind an agent's structured-report boundary. - Counter-dimension considered: a narrower agent could sharpen the per-kind artefact verification step (
git rev-parse,gh release view,docker manifest inspect, etc.), but the load-bearing dimension is the multi-step orchestration with operator-opt-in branches — skill wins.
User-language policy¶
Detect the user's language and respond in it. Sprint markdown content (including ## Review notes) stays in the project's primary language; frontmatter keys, lifecycle tokens, verification command outputs (exit codes, key output lines), and any gh / git / docker invocations remain English so portfolio automation reads them deterministically.
Preconditions¶
Before mutating the sprint or dispatching any chained skill, confirm:
- Current working directory is inside a git repository with
project/sprints/populated. - The user has named the sprint to close (or there's exactly one
activesprint—use that one and confirm with the user before mutating). - The sprint's
statusisactive. Refuse onplanned(operate viasprint-executefirst),review(mid-flow recovery; ask the user how to proceed),closed, orcancelled(already terminal). - Every feature listed in the sprint's
featuresfrontmatter isdone(read each feature file and checkstatus). On any non-donefeature, stop and report the offending features; this skill doesn't drive feature transitions—sprint-executedoes. - The sprint's
featuresfrontmatter list is non-empty. An empty list makes the value-delivery contract unsatisfiable perspec/project/sprint/§Lifecycle; refuse theactive → reviewtransition with a verbatim error. - The sprint's
last_commitfrontmatter field is non-null perspec/project/sprint/§Acceptance Criteria. If it's null, hand back—sprint-executeis the canonical writer of that field.
Operations¶
The skill follows a strict order. The artefact-validation block (step 3) MUST complete before the release-skill-layer dispatch (step 5); a failure in step 3 short-circuits to step 7 (cancellation), never to step 5. The order is fixed because publishing a release whose artefact ancestry is broken is the exact failure mode release-artifact exists to prevent.
1. Promote active → review¶
- Confirm every precondition above. On any failure, stop and report; don't write.
- Set
status: reviewon the sprint's frontmatter. Don't setendedyet—the field is reserved forclosedorcancelled. - Surface the sprint summary to the user: number, slug,
value_statement, the feature list with each feature'sverifies_sprint_valuefield, and the currentartifact_ref(which MUST be non-null perspec/project/sprint/§Artefact contract; if null, refuse the transition and hand back).
2. Detect the project type¶
Use the same signals as release-skill-layer and github-issue-templates-apply per spec/project/release-artifact/ §Project-type detection:
.claude-plugin/plugin.json→ Claude pluginpyproject.tomlshape → Python application or librarypackage.json→ Node / TypeScript- declared CLI entry → CLI tool
custom_components/<name>/manifest.json→ HACS integrationmkdocs.yml(or equivalent) → documentation-only
A per-repo override at .github/release-skill-layer.yml (artifact_kinds: [...]) takes precedence; MUST NOT introduce any other override file.
3. Validate artifact_ref per the release-artifact spec¶
Parse the sprint's artifact_ref (string or list of strings) per the detected project type and the optional artifact_kinds override. For every component, run the per-kind verification command listed in spec/project/release-artifact/ §Validation at sprint closure:
- Git tag →
git rev-parse <tag> - GitHub release →
gh release view <tag> - Container image →
docker manifest inspect <image> - PyPI distribution →
pip index versions <dist> - npm package →
npm view <pkg>@<version> - Doc-site deploy URL → HEAD request
- Claude plugin →
git rev-parse <plugin-version-tag>plus a marketplace-resolution probe (read.claude-plugin/marketplace.jsonat HEAD and confirm the plugin version is listed) - HACS integration →
git rev-parse <tag>plus amanifest.jsonversion-field equality check at the artefact's commit
Then confirm: the resolved artefact's commit (when applicable) MUST equal the sprint's last_commit frontmatter field or be reachable from it. A missing or null last_commit blocks closure; surface the failure verbatim.
A bare commit SHA as artifact_ref is rejected unless the project explicitly opts in via .github/release-skill-layer.yml.
Record the verification transcript (commands run, exit codes, key output lines) for later persistence in ## Review notes. On any failure, do not proceed to step 4 or 5. Surface the failed check verbatim, ask the user whether the failure is recoverable (re-cut the artefact and rerun) or unrecoverable (cancel the sprint), and route accordingly: recoverable → stop; unrecoverable → step 7.
4. Confirm verifies_sprint_value¶
Walk the sprint's feature list and confirm:
- Exactly one feature carries a non-null
verifies_sprint_valuefield perspec/project/sprint/§Value-delivery contract. - The named
acceptance-<n>identifier exists on that feature. - The named acceptance-criterion bullet is checked (
- [x] **acceptance-<n>** …).
On any violation (zero or multiple verifies_sprint_value declarations, missing identifier, or unchecked bullet), refuse closure and surface the offence verbatim. Sprint closure with a missing or unchecked verifier is a hard violation per spec/project/sprint/ §Acceptance Criteria.
5. Operator-opt-in chain into release machinery (optional)¶
This step runs only when the project type publishes via release-publish.yml (typical for Claude plugin, Python library, Node library, CLI tool, HACS integration—the project types named by spec/project/release-artifact/ §Dispatch boundary to release machinery).
Ask the user explicitly whether to chain. The chain points are fixed:
release-notes-curate— augments the openrelease-drafterdraft body with project-context-aware sections; idempotent on re-runs perspec/project/release-skill-layer/§Skill A.release-publish-trigger— validates every gate fromspec/project/release-automation/§Pre-publish verification and dispatchesrelease-publish.ymlviagh workflow run.
Outcomes to record verbatim in ## Review notes:
- "Chained: release-notes-curate (run URL or summary), release-publish-trigger (workflow run URL)" — when the user opts in.
- "Skipped: release-notes-curate / release-publish-trigger; reason:
" — when the user declines, naming who or what dispatches publication later (operator manually, automated post-merge job, or a follow-up sprint) per spec/project/sprint/§Dispatch into release machinery.
The recording is mandatory; a sprint that closes without a recorded operator decision on the chain fails validation per spec/project/sprint/ §Acceptance Criteria.
6. Promote review → closed¶
- Set
status: closedandended: <today's ISO date>on the sprint's frontmatter. - Populate
## Review noteswith: the verification transcript from step 3 (commands and outcomes), the verifying feature's full location (features/<slug>.mdplus theacceptance-<n>ID) perspec/project/sprint/§Value-delivery contract, the operator's release-skill-layer chain decision from step 5, and any cross-references to out-of-band artefacts published during the sprint (perspec/project/release-artifact/§Out-of-band artefacts). - If the sprint's roadmap items each have every feature
done, advance theirstatustodoneperspec/project/roadmap/§Lifecycle. A roadmap item whose pending features fall outside the sprint staysactiveuntil a successor sprint closes. - Surface unconsumed blog-trigger deferrals. Per
spec/project/blog-author-trigger/§Deferral artefact (SHOULD: the source consumer'ssprint-reviewsurfaces unconsumed deferrals at sprint close so they don't accumulate silently), scanproject/blog-triggers/*.ymlfor entries withstatus: deferred. List each byfeature-slugplus itsdeferral_reasonanddeferred_at, so the operator can revisit them (re-invokeblog-author-triggerto author / update, or leave deferred). This is a read-only surfacing step; sprint-review never consumes or mutates the deferral artefact (only a later trigger run setsstatus: consumed). When the directory is absent or holds nodeferredentry, note "no unconsumed blog-trigger deferrals" and move on. - Surface the closed sprint summary to the user: path, ended date, the artefact reference, the verifying feature, the chain decision.
7. Cancellation path: review → cancelled (or earlier)¶
Triggered when step 3 fails unrecoverably (the underlying release pipeline is broken and re-cutting the artefact isn't feasible at this time) or when the user explicitly cancels at any earlier stage.
- Set
status: cancelledandended: <today's ISO date>. - Populate
## Review noteswith a one-paragraph rationale that MUST name (a) the lifecycle stage at which cancellation occurred (planned,active, orreview), and (b) why recovery wasn't feasible at this time. Missing rationale or stage citation is a hard validation failure perspec/project/sprint/§Acceptance Criteria. - Re-target every roadmap item still pointing at the cancelled sprint (
target_sprint) perspec/project/roadmap/§Sprint and feature linkage: clear tonullor point at aplannedsuccessor. Roadmap items MUST NOT advance todonefrom acancelledsprint even when every feature is individuallydone; the items remainactiveuntil a successor sprint reachesclosed. - Surface the cancelled sprint summary to the user, naming the rationale and the re-targeting outcome.
Gotchas¶
artifact_refvalidation is per-project-type. The skill reads the project type fromproject/portfolio.yml(or, when absent, from heuristic detection) and applies the matching artifact-ref shape from the release-artifact spec: a Claude plugin sprint expects a published-release tag, a Python library expects a PyPI version, a documentation-only project expects a deployed-docs commit SHA, and so on. A wrong project-type detection produces a misleading "artifact_ref invalid" refusal. The skill surfaces the detected type before validating so the operator can override.active → reviewis reversible (a failed artifact validation can route back toactive);review → closedandreview → cancelledare NOT. The skill warns explicitly before either terminal transition and requires verbatim operator confirmation.- The
verifies_sprint_valueacceptance criterion is the load-bearing closure gate. When the named criterion isn't checked on the carrying feature, the skill refusesclosedand routes tocancelled(with a clear rationale paragraph) — operators sometimes try to argue the criterion "was achieved differently"; the spec is strict that the named criterion is the audit trail, not a related observation. - Optional chaining into
release-notes-curateandrelease-publish-triggeris operator-opt-in. Defaulting to chain leads to surprise releases; the skill stays explicit about each chain hop and records the operator's opt-in verbatim in## Review notes. - Cancelled sprints leave a value-delivery gap that the next sprint must explain. When the skill cancels a sprint, the unfinished features need re-targeting (typically to the next sprint or back to the roadmap queue). The skill surfaces the affected feature IDs and asks where each one lands; nothing is silently re-targeted.
- Unconsumed blog-trigger deferrals are surfaced read-only, not consumed. At
review → closedthe skill listsproject/blog-triggers/*.ymlentries withstatus: deferred(perspec/project/blog-author-trigger/§Deferral artefact) so they stay visible, but it never edits them: thedeferred → consumedtransition is owned by a laterblog-author-triggerrun, andcancelledis operator-set. The surfacing is a SHOULD reminder, not a closure gate — a sprint still closes when deferrals remain.
Examples¶
- Read
examples/01-clean-close-claude-plugin.mdwhen closing a sprint cleanly for a Claude plugin project with all features done. - Read
examples/02-artifact-validation-fails-cancel.mdwhen artifact validation fails and the sprint must be cancelled instead of closed. - Read
examples/03-chain-into-release-skill-layer.mdwhen the user opts in to chaining intorelease-notes-curateandrelease-publish-triggerafter sprint closure.
Resumability¶
Per spec/claude/resumable-work/, this skill is resumable: true. State is persisted to .resume/sprint-review/<run-id>.yml after every successful user-approval gate and after each named phase boundary. On re-invocation, scan that directory for files with status: in_progress whose inputs: snapshot matches the current invocation; if one matches, prompt the operator with Resume run <run_id> from phase <phase> (last checkpoint <last_checkpoint_at>)? [resume / start-new / discard]. The state-file envelope (schema_version, run_id, inputs, phase, decisions[], status, ...) and the fail-closed semantics on schema or YAML errors are load-bearing in the spec; don't duplicate those rules here.
Hard rules¶
- Never call
gh release edit --draft=false,gh api -X PATCH /repos/.../releases/<id> draft=false, or any other path that flips the draft state outsiderelease-publish.yml. The rule comes fromspec/project/release-automation/,spec/project/release-skill-layer/, andspec/project/release-artifact/§Dispatch boundary to release machinery and is non-negotiable here too. The only acceptable publish path is dispatchingrelease-publish-trigger. - Never transition
active → closedwithout passing throughreview. The value-coverage check lives inreviewperspec/project/sprint/§Lifecycle. - Never close a sprint while any feature in
featuresis non-done, or while thefeaturesfrontmatter list is empty, or whilelast_commitis null, or whileartifact_refis null. Each is a hard refusal point. - Never close a sprint with zero or more than one
verifies_sprint_valuedeclarations across its features, or with the named acceptance-criterion bullet unchecked. - Never accept a bare commit SHA as
artifact_refunless the project explicitly opts in via.github/release-skill-layer.yml. - Never chain into
release-notes-curateorrelease-publish-triggerwithout the user's explicit opt-in, and never close the sprint without recording the operator's chain decision (chained or skipped) verbatim in## Review notes. - Never advance a roadmap item to
status: donefrom acancelledsprint, even when every feature is individuallydone. Re-target the pending features to a successor sprint instead. - Never edit any sprint other than the one being reviewed in this run.
sprint-planandsprint-executeown the other sprints' lifecycles. - When
spec/project/sprint/,spec/project/release-artifact/,spec/project/release-skill-layer/, orspec/project/release-automation/disagrees with this skill, the spec wins. Propose updating this skill rather than silently diverging.
Multi-model testing¶
Examples and operations in this skill are verified on Claude Sonnet 4.6 as the default model; spot-checked on Haiku 4.5 for cost-sensitive runs; Opus 4.7 is appropriate for high-stakes audits that require deeper reasoning. The skill body has no model-specific assumptions beyond standard tool-call semantics.