sprint-execute¶
Drives the daily mechanics of an active sprint: lifecycle transitions, feature-list sync, last_commit updates.
Drive the daily mechanics of an active sprint per the project sprint spec. Invoke when the user asks to start a sprint, start a feature, mark a feature in progress, mark a feature done, sync a sprint's feature list, or update the sprint's last commit. Also handles equivalent German-language requests. Promotes a planned sprint to active when the first feature starts, drives feature lifecycle transitions (ready → in_progress, in_progress → done), keeps the ## Features body list and features frontmatter in lockstep, updates last_commit whenever a feature reaches done, and refuses to start a feature whose sprint isn't this one while another sprint is already active. Supports resume on re-invocation per spec/claude/resumable-work/.
- Plugin:
nolte-shared - Phase: 4 Build (
build) - Tags:
lifecycle - Source: skills/sprint-execute/SKILL.md
Use when¶
- you want to start a sprint or start a feature in an active sprint
- you want to mark a feature in_progress or done
- you want to sync the sprint's feature list with frontmatter
Don't use when¶
- You want to plan or open a new sprint file →
sprint-plan - You want to close an active sprint at the review gate →
sprint-review - You want to decompose a roadmap item into features →
feature-decompose
See also¶
Referenced by¶
Sprint Execute¶
Drives the lifecycle of an active sprint per spec/project/sprint/<canonical_language>.md. This skill is the canonical write authority for planned → active promotion, feature ready → in_progress and in_progress → done transitions inside the sprint's scope, the last_commit frontmatter field, and the ## Features body / features frontmatter sync. It deliberately doesn't close the sprint—sprint-review owns active → review and beyond.
Why this is a skill, not an agent¶
- The at-most-one-active-sprint invariant requires user-visible refusal — when the user asks to start a feature whose sprint isn't the currently
activeone, the skill must surface the offending sprint number and the conflictingactivesprint to the user, not silently fail; an agent's structured-report shape can't carry the recovery dialogue cleanly. - Output flows back into the main conversation — feature transitions, sprint promotions, and
last_commitupdates all change frontmatter the user is iterating on; isolating them behind an agent boundary would obscure the running picture. - Mid-flow confirmation on lifecycle promotion —
planned → activehappens as a side effect of the firstready → in_progress, but the operator deserves a one-line "starting sprint" confirmation; that gate is core to the contract. - Counter-dimension considered: a tool-restricted agent (read + a single frontmatter writer) could perform the bidirectional invariant check cleanly, but the load-bearing dimension is the user-facing refusal path on the parallel-active-sprint conflict — skill wins.
User-language policy¶
Detect the user's language and respond in it. Sprint and feature markdown content stays in the project's primary language; frontmatter keys, lifecycle tokens, feature / sprint IDs, and the SHA strings written into last_commit are always English.
Preconditions¶
Before mutating any sprint or feature file, confirm:
- Current working directory is inside a git repository with
project/sprints/andproject/features/populated. - The user has named (or implied) a single concrete operation: start the next sprint, start a specific feature, mark a specific feature done, or sync the body / frontmatter of a specific sprint. If the request is ambiguous, ask before mutating.
- At most one sprint is currently
active. If two or more areactive, that's a pre-existing invariant violation perspec/project/sprint/§Lifecycle; stop, report the offending sprint files, and hand back—repair is the operator's job.
Operations¶
This skill performs whichever of the operations below the user's request maps to. Each operation is its own deterministic block; the skill never silently extends one operation into another (no "started a feature, may as well close the sprint while I'm here").
1. Promote planned → active¶
Triggered as a side effect of the first ready → in_progress transition on a feature whose sprint field matches a planned sprint, or directly when the user explicitly asks to start the sprint.
Steps:
- Read every
project/sprints/*.mdfile's frontmatter. Confirm no sprint is currentlyactive. If another sprint isactive, refuse the promotion with a verbatim error naming the conflicting sprint's number and slug, and stop. The at-most-one-active-sprint invariant comes fromspec/project/sprint/§Lifecycle and is the canonical refusal point. - Confirm the target sprint is the lowest-numbered
plannedsprint. Promoting a higher-numberedplannedsprint while a lower-numbered one exists is forbidden per the same spec section. - Set
status: activeandstarted: <today's ISO date>in the sprint's frontmatter. - Surface a one-line confirmation to the user: "Starting sprint
— ".
2. Transition a feature ready → in_progress¶
Triggered when the user asks to start a specific feature.
Steps:
- Read the feature file's frontmatter. Confirm
status: readyandsprint: <NNNN>is non-null. - Read the sprint
<NNNN>file's frontmatter. The feature'sidMUST appear in the sprint'sfeatureslist; if not, the back-reference is broken (perspec/project/sprint/§Roadmap and feature linkage). Stop and report the inconsistency. - Enforce the at-most-one-active-sprint invariant. Determine the sprint's current
status: active→ continue to step 4.plannedand no other sprint isactive→ invoke operation A first, then continue.plannedwhile another sprint isactive→ refuse the transition, surface the conflictingactivesprint, and stop. Don't promote, don't transition, don't sync; the operator must close or cancel the conflicting sprint first per the spec's invariant.review,closed, orcancelled→ refuse; the sprint is past activation.- Set
status: in_progresson the feature. - Mark the feature's roadmap item
activeif it's stillproposedperspec/project/roadmap/§Lifecycle.
3. Transition a feature in_progress → done¶
Triggered when the user asks to mark a feature done.
Steps:
- Read the feature file. Confirm
status: in_progress. Confirm every acceptance-criterion checkbox in## Acceptance criteriais checked, and every## Test hooksentry has statuspassingorskipped(perspec/project/feature/§Lifecycle and gates). Stop and report any unchecked criterion orpending/failinghook. - Confirm the sprint named by the feature's
sprintfield isactiveorreviewperspec/project/feature/§Lifecycle and gates. - Set
status: doneandended: <today's ISO date>on the feature. - Update the sprint's
last_commit. Rungit rev-parse HEADto resolve the most recent commit SHA on the current branch, then write the result to the sprint'slast_commitfrontmatter field. This is the canonical write authority for that field perspec/project/sprint/§Frontmatter schema;last_commitanchors the artefact ancestry check thatsprint-reviewruns at closure. - Surface the updated sprint state to the user: features remaining
in_progress,last_commitSHA, and a hint thatsprint-reviewbecomes invokable when every feature in the sprint isdone. - Dispatch the
feature → doneblog trigger. This transition is the trigger event named inspec/project/blog-author-trigger/§Trigger event. After surfacing the sprint state, dispatchblog-author-triggerfor the just-completed feature so the operator decides whether it warrants a blog post (new / update / defer). The dispatch is the reference wiring for that spec;blog-author-triggerowns the briefing derivation, the three-way operator choice, and the deferral artefact — this step only fires it and hands over the featureid/slug. The dispatch is skippable on operator request (it doesn't gate thedonetransition, which is already complete by step 3), and it is a no-op shape when the source consumer declares no blog consumer inCLAUDE.md.
4. Sync ## Features body bullets with features frontmatter¶
Triggered when the user adds or removes a feature mid-sprint, or when a stale body / frontmatter divergence is detected during another operation.
Steps:
- Read the sprint file. Diff the
featuresfrontmatter list against the## Featuresbody bullets (each bullet is expected to link toproject/features/<slug>.mdand show the feature's current status). - Refuse partial updates. If the user's request mutates only the body or only the frontmatter, stop and report; the body and the frontmatter list MUST be updated in the same operation per
spec/project/sprint/§Roadmap and feature linkage. - Apply the requested addition or removal to both surfaces atomically. When adding a feature mid-sprint, also set the feature file's
sprintfield to this sprint's number (and check that no other sprint already references it). When the added feature is stilldraft, this skill is the mid-active-sprint write authority for thedraft → readyflip perspec/project/feature/§Frontmatter schema; before flipping, verify the full §Lifecycle gate (non-empty## Description, ≥ 1acceptance-<n>bullet, populatedconsistency_checkwith a non-emptyfindingsarray, populated## Consistency notes). If the gate fails, refuse the addition and route the operator tofeature-decompose; never fabricate the consistency check here. When removing, clear the feature file'ssprintfield (set to null).
5. Decline transitions outside this skill's scope¶
The following requests are out of scope for this skill:
active → reviewand any subsequent transition — owned bysprint-review.- Cancelling a sprint at any stage —
sprint-reviewwrites the cancellation rationale perspec/project/sprint/§Hobby-scale variability. - Mutating
value_statementon a sprint that's alreadyactive— refuse and hand back. The field is frozen after activation perspec/project/sprint/§Roadmap and feature linkage; the recovery path iscancelledplus a fresh sprint, owned bysprint-review. - Mutating
roadmap_itemsorartifact_refon a sprint that's alreadyactive— refuse and hand back.roadmap_itemsmay be edited only whileplanned(persprint-plan);artifact_refissprint-review's authority at closure.
When the user asks for any of the above, stop and surface the correct skill to invoke instead.
Gotchas¶
- The at-most-one-active-sprint invariant is the most common operator stumbling block. Trying to start a feature whose sprint is
plannedwhile a different sprint is alreadyactiveis forbidden — the skill refuses with a verbatim error naming the conflicting sprint. Operators routinely expect "starting a feature on sprint N+1 should auto-close sprint N"; the spec deliberately doesn't allow that auto-promotion path. Close the active sprint viasprint-reviewfirst, then start the next. last_commitis updated only when a feature reachesdone. A feature transitioningready → in_progressdoesn't bumplast_commit; a sprint mid-progress can have a stalelast_commitbetween feature completions. Don't readlast_commitas "most recent commit on this branch" — read it as "commit at which the most recent feature in this sprint was marked done."- The
## Featuresbody list and thefeaturesfrontmatter array are kept in lockstep by Operation D. Mutating only one surface is a partial-write failure mode;sprint-executerefuses partial mutations and the operator has to update both atomically. - Acceptance criteria and test hooks are gated separately for the
in_progress → donetransition. Operation C confirms both: every acceptance-criterion checkbox is checked AND every test hook reportspassingorskipped. A skill or test hook still inpendingblocks the transition even when the criteria are visually checked off. - Roadmap-item promotion to
status: activeis a side effect of the first feature transitioning toin_progressfor that roadmap item. The skill writes the promotion silently (no operator dialogue), but the operator should be aware that aproposedroadmap item flips toactivethe first time a tied feature starts work.
Examples¶
- Read
examples/01-start-feature-promotes-sprint.mdwhen starting the first feature in a planned sprint, which also promotes the sprint toactive. - Read
examples/02-mark-feature-done-updates-last-commit.mdwhen marking a featuredoneand verifying thatlast_commitis updated on the sprint. - Read
examples/03-refuse-when-other-sprint-active.mdwhen a second sprint would become active and the skill must refuse the transition.
Resumability¶
Per spec/claude/resumable-work/, this skill is resumable: true. State is persisted to .resume/sprint-execute/<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 allow two sprints to be
activesimultaneously. The at-most-one-active-sprint invariant is non-negotiable perspec/project/sprint/§Lifecycle; on conflict, refuse the offending feature transition and surface the conflicting sprint to the user. - Never transition a feature to
in_progresswhile itssprintfield points at aplannedsprint that can't be promoted right now (because another sprint is stillactive). The feature transition fails andplanned → activedoesn't fire. - Never mutate the
## Featuresbody bullets without mutating thefeaturesfrontmatter list in the same write, and vice versa. Partial updates are forbidden. - Never mark a feature
donewhile any acceptance-criterion checkbox is unchecked or any test-hook status ispendingorfailing. - Never write
last_commiton a sprint as a side effect of anything other than a feature in that sprint reachingdone. The field's only canonical writer is operation C. - Never transition a sprint past
activefrom this skill.active → review,review → closed,review → cancelled, and the cancellation paths from any earlier state aresprint-review's authority. - Never alter
value_statementon anactivesprint. If reality has shifted, the sprint must be cancelled and rescheduled perspec/project/sprint/§Roadmap and feature linkage. - When
spec/project/sprint/orspec/project/feature/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.