Sprint Status Workflow
Goal: Summarize sprint status, surface risks, and recommend the next workflow action.
Your Role: You are a Developer providing clear, actionable sprint visibility. No time estimates — focus on status, risks, and next steps.
Conventions
- Bare paths (e.g.
checklist.md) resolve from the skill root. {skill-root}resolves to this skill's installed directory (wherecustomize.tomllives).{project-root}-prefixed paths resolve from the project working directory.{skill-name}resolves to the skill directory's basename.
On Activation
Step 1: Resolve the Workflow Block
Run: python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow
If the script fails, resolve the workflow block yourself by reading these three files in base → team → user order and applying the same structural merge rules as the resolver:
{skill-root}/customize.toml— defaults{project-root}/_bmad/custom/{skill-name}.toml— team overrides{project-root}/_bmad/custom/{skill-name}.user.toml— personal overrides
Any missing file is skipped. Scalars override, tables deep-merge, arrays of tables keyed by code or id replace matching entries and append new entries, and all other arrays append.
Step 2: Execute Prepend Steps
Execute each entry in {workflow.activation_steps_prepend} in order before proceeding.
Step 3: Load Persistent Facts
Treat every entry in {workflow.persistent_facts} as foundational context you carry for the rest of the workflow run. Entries prefixed file: are paths or globs under {project-root} — load the referenced contents as facts. All other entries are facts verbatim.
Step 4: Load Config
Load config from {project-root}/_bmad/bmm/config.yaml and resolve:
project_name,user_namecommunication_language,document_output_languageimplementation_artifactsdateas system-generated current datetimeproject_context=**/project-context.md(load if exists)- YOU MUST ALWAYS SPEAK OUTPUT in your Agent communication style with the config
{communication_language}
Step 5: Greet the User
Greet {user_name}, speaking in {communication_language}.
Step 6: Execute Append Steps
Execute each entry in {workflow.activation_steps_append} in order.
Activation is complete. If activation_steps_prepend or activation_steps_append were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
Paths
sprint_status_file={implementation_artifacts}/sprint-status.yaml
Input Files
| Input | Path | Load Strategy |
|-------|------|---------------|
| Sprint status | {sprint_status_file} | FULL_LOAD |
Execution
<workflow> <step n="0" goal="Determine execution mode"> <action>Set mode = {{mode}} if provided by caller; otherwise mode = "interactive"</action> <check if="mode == data"> <action>Jump to Step 20</action> </check> <check if="mode == validate"> <action>Jump to Step 30</action> </check> <check if="mode == interactive"> <action>Continue to Step 1</action> </check> </step> <step n="1" goal="Locate sprint status file"> <action>Load {project_context} for project-wide patterns and conventions (if exists)</action> <action>Try {sprint_status_file}</action> <check if="file not found"> <output>sprint-status.yaml not found. Run `/bmad:bmm:workflows:sprint-planning` to generate it, then rerun sprint-status.</output> <action>Exit workflow</action> </check> <action>Continue to Step 2</action> </step> <step n="2" goal="Read and parse sprint-status.yaml"> <action>Read the FULL file: {sprint_status_file}</action> <action>Parse fields: generated, last_updated, project, project_key, tracking_system, story_location</action> <action>Parse development_status map. Classify keys:</action> - Epics: keys starting with "epic-" (and not ending with "-retrospective") - Retrospectives: keys ending with "-retrospective" - Stories: everything else (e.g., 1-2-login-form) <action>Map legacy story status "drafted" → "ready-for-dev"</action> <action>Count story statuses: backlog, ready-for-dev, in-progress, review, done</action> <action>Map legacy epic status "contexted" → "in-progress"</action> <action>Count epic statuses: backlog, in-progress, done</action> <action>Count retrospective statuses: optional, done</action> <action>Parse action_items list if present. Set open_action_items = entries with status "open" or "in-progress"</action><action>Validate all statuses against known values:</action>
-
Valid story statuses: backlog, ready-for-dev, in-progress, review, done, drafted (legacy)
-
Valid epic statuses: backlog, in-progress, done, contexted (legacy)
-
Valid retrospective statuses: optional, done
-
Valid action item statuses: open, in-progress, done
<check if="any status is unrecognized"> <output>
Unknown status detected: {{#each invalid_entries}}
{{key}}: "{{status}}" (not recognized) {{/each}}
Valid statuses:
- Stories: backlog, ready-for-dev, in-progress, review, done
- Epics: backlog, in-progress, done
- Retrospectives: optional, done
- Action items: open, in-progress, done </output> <ask>How should these be corrected? {{#each invalid_entries}} {{@index}}. {{key}}: "{{status}}" → [select valid status] {{/each}}
Enter corrections (e.g., "1=in-progress, 2=backlog") or "skip" to continue without fixing:</ask> <check if="user provided corrections"> <action>Update sprint-status.yaml with corrected values</action> <action>Re-parse the file with corrected statuses</action> </check> </check>
<action>Detect risks:</action>
- IF any story has status "review": suggest
/bmad:bmm:workflows:code-review - IF any story has status "in-progress" AND no stories have status "ready-for-dev": recommend staying focused on active story
- IF all epics have status "backlog" AND no stories have status "ready-for-dev": prompt
/bmad:bmm:workflows:create-story - IF
last_updatedtimestamp is more than 7 days old (orlast_updatedis missing, fall back togenerated): warn "sprint-status.yaml may be stale" - IF any story key doesn't match an epic pattern (e.g., story "5-1-..." but no "epic-5"): warn "orphaned story detected"
- IF any epic has status in-progress but has no associated stories: warn "in-progress epic has no stories" </step>
- Project: {{project}} ({{project_key}})
- Tracking: {{tracking_system}}
- Status file: {sprint_status_file}
Stories: backlog {{count_backlog}}, ready-for-dev {{count_ready}}, in-progress {{count_in_progress}}, review {{count_review}}, done {{count_done}}
Epics: backlog {{epic_backlog}}, in-progress {{epic_in_progress}}, done {{epic_done}}
Next Recommendation: /bmad:bmm:workflows:{{next_workflow_id}} ({{next_story_id}})
{{#if open_action_items}} Open Action Items: {{#each open_action_items}}
- {{action}} — {{status}} (epic {{epic}}, owner: {{owner}}) {{/each}} {{/if}}
{{#if risks}} Risks: {{#each risks}}
-
{{this}} {{/each}} {{/if}}
</output> </step>
<action>Read and parse {sprint_status_file}</action>
<action>Validate required metadata fields exist: generated, project, project_key, tracking_system, story_location (last_updated is optional for backward compatibility)</action> <check if="any required field missing"> <template-output>is_valid = false</template-output> <template-output>error = "Missing required field(s): {{missing_fields}}"</template-output> <template-output>suggestion = "Re-run sprint-planning or add missing fields manually"</template-output> <action>Return</action> </check>
<action>Verify development_status section exists with at least one entry</action> <check if="development_status missing or empty"> <template-output>is_valid = false</template-output> <template-output>error = "development_status missing or empty"</template-output> <template-output>suggestion = "Re-run sprint-planning or repair the file manually"</template-output> <action>Return</action> </check>
<action>Validate all status values against known valid statuses:</action>
- Stories: backlog, ready-for-dev, in-progress, review, done (legacy: drafted)
- Epics: backlog, in-progress, done (legacy: contexted)
- Retrospectives: optional, done
- Action items (if present): open, in-progress, done <check if="any invalid status found"> <template-output>is_valid = false</template-output> <template-output>error = "Invalid status values: {{invalid_entries}}"</template-output> <template-output>suggestion = "Fix invalid statuses in sprint-status.yaml"</template-output> <action>Return</action> </check>
<template-output>is_valid = true</template-output>
<template-output>message = "sprint-status.yaml valid: metadata complete, all statuses recognized"</template-output>
<action>Run: python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow.on_complete — if the resolved value is non-empty, follow it as the final terminal instruction before exiting.</action>
</step>