[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71PVWCA63WBH08JHVV6WV75":3,"skill-same:01M71PVWCA63WBH08JHVV6WV75":61},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":30,"linkOnly":31,"markdownContent":32,"markdownBody":33,"frontMatter":34,"refName":35,"commitSha":36,"skillDirectory":37,"forksCount":14,"repositoryHtmlUrl":38,"repositoryHomepageUrl":6,"ownerHtmlUrl":39,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":40,"install":41,"resources":54},"01M71PVWCA63WBH08JHVV6WV75","bmad-sprint-status",null,"Summarize sprint status and surface risks. Use when the user says \"check sprint status\" or \"show sprint status\"","jsacko\u002FOpenDFIR","jsacko","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F63580474?v=4","01M71PG17HH9PJ0ME3103K2MF5","Julien Sacko","01M71PG188SHJ0DBAYX85237WG",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fjsacko\u002FOpenDFIR\u002Fblob\u002Fmain\u002F.continue\u002Fskills\u002Fbmad-sprint-status\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29],"bmad sprint status","sprint","bmad","sprint status","status","show","use","when","check","user","summarize","2026-11-10 13:02:02",false,"---\nname: bmad-sprint-status\ndescription: 'Summarize sprint status and surface risks. Use when the user says \"check sprint status\" or \"show sprint status\"'\n---\n\n# Sprint Status Workflow\n\n**Goal:** Summarize sprint status, surface risks, and recommend the next workflow action.\n\n**Your Role:** You are a Developer providing clear, actionable sprint visibility. No time estimates — focus on status, risks, and next steps.\n\n## Conventions\n\n- Bare paths (e.g. `checklist.md`) resolve from the skill root.\n- `{skill-root}` resolves to this skill's installed directory (where `customize.toml` lives).\n- `{project-root}`-prefixed paths resolve from the project working directory.\n- `{skill-name}` resolves to the skill directory's basename.\n\n## On Activation\n\n### Step 1: Resolve the Workflow Block\n\nRun: `python3 {project-root}\u002F_bmad\u002Fscripts\u002Fresolve_customization.py --skill {skill-root} --key workflow`\n\n**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:\n\n1. `{skill-root}\u002Fcustomize.toml` — defaults\n2. `{project-root}\u002F_bmad\u002Fcustom\u002F{skill-name}.toml` — team overrides\n3. `{project-root}\u002F_bmad\u002Fcustom\u002F{skill-name}.user.toml` — personal overrides\n\nAny 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.\n\n### Step 2: Execute Prepend Steps\n\nExecute each entry in `{workflow.activation_steps_prepend}` in order before proceeding.\n\n### Step 3: Load Persistent Facts\n\nTreat 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.\n\n### Step 4: Load Config\n\nLoad config from `{project-root}\u002F_bmad\u002Fbmm\u002Fconfig.yaml` and resolve:\n\n- `project_name`, `user_name`\n- `communication_language`, `document_output_language`\n- `implementation_artifacts`\n- `date` as system-generated current datetime\n- YOU MUST ALWAYS SPEAK OUTPUT in your Agent communication style with the config `{communication_language}`\n\n### Step 5: Greet the User\n\nGreet `{user_name}`, speaking in `{communication_language}`.\n\n### Step 6: Execute Append Steps\n\nExecute each entry in `{workflow.activation_steps_append}` in order.\n\nActivation is complete. Begin the workflow below.\n\n## Paths\n\n- `sprint_status_file` = `{implementation_artifacts}\u002Fsprint-status.yaml`\n\n## Input Files\n\n| Input | Path | Load Strategy |\n|-------|------|---------------|\n| Sprint status | `{sprint_status_file}` | FULL_LOAD |\n\n## Execution\n\n\u003Cworkflow>\n\n\u003Cstep n=\"0\" goal=\"Determine execution mode\">\n  \u003Caction>Set mode = {{mode}} if provided by caller; otherwise mode = \"interactive\"\u003C\u002Faction>\n\n  \u003Ccheck if=\"mode == data\">\n    \u003Caction>Jump to Step 20\u003C\u002Faction>\n  \u003C\u002Fcheck>\n\n  \u003Ccheck if=\"mode == validate\">\n    \u003Caction>Jump to Step 30\u003C\u002Faction>\n  \u003C\u002Fcheck>\n\n  \u003Ccheck if=\"mode == interactive\">\n    \u003Caction>Continue to Step 1\u003C\u002Faction>\n  \u003C\u002Fcheck>\n\u003C\u002Fstep>\n\n\u003Cstep n=\"1\" goal=\"Locate sprint status file\">\n  \u003Caction>Load {project_context} for project-wide patterns and conventions (if exists)\u003C\u002Faction>\n  \u003Caction>Try {sprint_status_file}\u003C\u002Faction>\n  \u003Ccheck if=\"file not found\">\n    \u003Coutput>sprint-status.yaml not found.\nRun `\u002Fbmad:bmm:workflows:sprint-planning` to generate it, then rerun sprint-status.\u003C\u002Foutput>\n    \u003Caction>Exit workflow\u003C\u002Faction>\n  \u003C\u002Fcheck>\n  \u003Caction>Continue to Step 2\u003C\u002Faction>\n\u003C\u002Fstep>\n\n\u003Cstep n=\"2\" goal=\"Read and parse sprint-status.yaml\">\n  \u003Caction>Read the FULL file: {sprint_status_file}\u003C\u002Faction>\n  \u003Caction>Parse fields: generated, last_updated, project, project_key, tracking_system, story_location\u003C\u002Faction>\n  \u003Caction>Parse development_status map. Classify keys:\u003C\u002Faction>\n- Epics: keys starting with \"epic-\" (and not ending with \"-retrospective\")\n- Retrospectives: keys ending with \"-retrospective\"\n- Stories: everything else (e.g., 1-2-login-form)\n  \u003Caction>Map legacy story status \"drafted\" → \"ready-for-dev\"\u003C\u002Faction>\n  \u003Caction>Count story statuses: backlog, ready-for-dev, in-progress, review, done\u003C\u002Faction>\n  \u003Caction>Map legacy epic status \"contexted\" → \"in-progress\"\u003C\u002Faction>\n  \u003Caction>Count epic statuses: backlog, in-progress, done\u003C\u002Faction>\n  \u003Caction>Count retrospective statuses: optional, done\u003C\u002Faction>\n\n\u003Caction>Validate all statuses against known values:\u003C\u002Faction>\n\n- Valid story statuses: backlog, ready-for-dev, in-progress, review, done, drafted (legacy)\n- Valid epic statuses: backlog, in-progress, done, contexted (legacy)\n- Valid retrospective statuses: optional, done\n\n  \u003Ccheck if=\"any status is unrecognized\">\n    \u003Coutput>\n**Unknown status detected:**\n{{#each invalid_entries}}\n\n- `{{key}}`: \"{{status}}\" (not recognized)\n  {{\u002Feach}}\n\n**Valid statuses:**\n\n- Stories: backlog, ready-for-dev, in-progress, review, done\n- Epics: backlog, in-progress, done\n- Retrospectives: optional, done\n  \u003C\u002Foutput>\n  \u003Cask>How should these be corrected?\n  {{#each invalid_entries}}\n  {{@index}}. {{key}}: \"{{status}}\" → [select valid status]\n  {{\u002Feach}}\n\nEnter corrections (e.g., \"1=in-progress, 2=backlog\") or \"skip\" to continue without fixing:\u003C\u002Fask>\n\u003Ccheck if=\"user provided corrections\">\n\u003Caction>Update sprint-status.yaml with corrected values\u003C\u002Faction>\n\u003Caction>Re-parse the file with corrected statuses\u003C\u002Faction>\n\u003C\u002Fcheck>\n\u003C\u002Fcheck>\n\n\u003Caction>Detect risks:\u003C\u002Faction>\n\n- IF any story has status \"review\": suggest `\u002Fbmad:bmm:workflows:code-review`\n- IF any story has status \"in-progress\" AND no stories have status \"ready-for-dev\": recommend staying focused on active story\n- IF all epics have status \"backlog\" AND no stories have status \"ready-for-dev\": prompt `\u002Fbmad:bmm:workflows:create-story`\n- IF `last_updated` timestamp is more than 7 days old (or `last_updated` is missing, fall back to `generated`): warn \"sprint-status.yaml may be stale\"\n- IF any story key doesn't match an epic pattern (e.g., story \"5-1-...\" but no \"epic-5\"): warn \"orphaned story detected\"\n- IF any epic has status in-progress but has no associated stories: warn \"in-progress epic has no stories\"\n  \u003C\u002Fstep>\n\n\u003Cstep n=\"3\" goal=\"Select next action recommendation\">\n  \u003Caction>Pick the next recommended workflow using priority:\u003C\u002Faction>\n  \u003Cnote>When selecting \"first\" story: sort by epic number, then story number (e.g., 1-1 before 1-2 before 2-1)\u003C\u002Fnote>\n  1. If any story status == in-progress → recommend `dev-story` for the first in-progress story\n  2. Else if any story status == review → recommend `code-review` for the first review story\n  3. Else if any story status == ready-for-dev → recommend `dev-story`\n  4. Else if any story status == backlog → recommend `create-story`\n  5. Else if any retrospective status == optional → recommend `retrospective`\n  6. Else → All implementation items done; congratulate the user - you both did amazing work together!\n  \u003Caction>Store selected recommendation as: next_story_id, next_workflow_id, next_agent (DEV)\u003C\u002Faction>\n\u003C\u002Fstep>\n\n\u003Cstep n=\"4\" goal=\"Display summary\">\n  \u003Coutput>\n## Sprint Status\n\n- Project: {{project}} ({{project_key}})\n- Tracking: {{tracking_system}}\n- Status file: {sprint_status_file}\n\n**Stories:** backlog {{count_backlog}}, ready-for-dev {{count_ready}}, in-progress {{count_in_progress}}, review {{count_review}}, done {{count_done}}\n\n**Epics:** backlog {{epic_backlog}}, in-progress {{epic_in_progress}}, done {{epic_done}}\n\n**Next Recommendation:** \u002Fbmad:bmm:workflows:{{next_workflow_id}} ({{next_story_id}})\n\n{{#if risks}}\n**Risks:**\n{{#each risks}}\n\n- {{this}}\n  {{\u002Feach}}\n  {{\u002Fif}}\n\n  \u003C\u002Foutput>\n  \u003C\u002Fstep>\n\n\u003Cstep n=\"5\" goal=\"Offer actions\">\n  \u003Cask>Pick an option:\n1) Run recommended workflow now\n2) Show all stories grouped by status\n3) Show raw sprint-status.yaml\n4) Exit\nChoice:\u003C\u002Fask>\n\n  \u003Ccheck if=\"choice == 1\">\n    \u003Coutput>Run `\u002Fbmad:bmm:workflows:{{next_workflow_id}}`.\nIf the command targets a story, set `story_key={{next_story_id}}` when prompted.\u003C\u002Foutput>\n  \u003C\u002Fcheck>\n\n  \u003Ccheck if=\"choice == 2\">\n    \u003Coutput>\n### Stories by Status\n- In Progress: {{stories_in_progress}}\n- Review: {{stories_in_review}}\n- Ready for Dev: {{stories_ready_for_dev}}\n- Backlog: {{stories_backlog}}\n- Done: {{stories_done}}\n    \u003C\u002Foutput>\n  \u003C\u002Fcheck>\n\n  \u003Ccheck if=\"choice == 3\">\n    \u003Caction>Display the full contents of {sprint_status_file}\u003C\u002Faction>\n  \u003C\u002Fcheck>\n\n  \u003Ccheck if=\"choice == 4\">\n    \u003Caction>Run: `python3 {project-root}\u002F_bmad\u002Fscripts\u002Fresolve_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.\u003C\u002Faction>\n    \u003Caction>Exit workflow\u003C\u002Faction>\n  \u003C\u002Fcheck>\n\u003C\u002Fstep>\n\n\u003C!-- ========================= -->\n\u003C!-- Data mode for other flows -->\n\u003C!-- ========================= -->\n\n\u003Cstep n=\"20\" goal=\"Data mode output\">\n  \u003Caction>Load and parse {sprint_status_file} same as Step 2\u003C\u002Faction>\n  \u003Caction>Compute recommendation same as Step 3\u003C\u002Faction>\n  \u003Ctemplate-output>next_workflow_id = {{next_workflow_id}}\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>next_story_id = {{next_story_id}}\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>count_backlog = {{count_backlog}}\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>count_ready = {{count_ready}}\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>count_in_progress = {{count_in_progress}}\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>count_review = {{count_review}}\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>count_done = {{count_done}}\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>epic_backlog = {{epic_backlog}}\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>epic_in_progress = {{epic_in_progress}}\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>epic_done = {{epic_done}}\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>risks = {{risks}}\u003C\u002Ftemplate-output>\n  \u003Caction>Return to caller\u003C\u002Faction>\n\u003C\u002Fstep>\n\n\u003C!-- ========================= -->\n\u003C!-- Validate mode -->\n\u003C!-- ========================= -->\n\n\u003Cstep n=\"30\" goal=\"Validate sprint-status file\">\n  \u003Caction>Check that {sprint_status_file} exists\u003C\u002Faction>\n  \u003Ccheck if=\"missing\">\n    \u003Ctemplate-output>is_valid = false\u003C\u002Ftemplate-output>\n    \u003Ctemplate-output>error = \"sprint-status.yaml missing\"\u003C\u002Ftemplate-output>\n    \u003Ctemplate-output>suggestion = \"Run sprint-planning to create it\"\u003C\u002Ftemplate-output>\n    \u003Caction>Return\u003C\u002Faction>\n  \u003C\u002Fcheck>\n\n\u003Caction>Read and parse {sprint_status_file}\u003C\u002Faction>\n\n\u003Caction>Validate required metadata fields exist: generated, project, project_key, tracking_system, story_location (last_updated is optional for backward compatibility)\u003C\u002Faction>\n\u003Ccheck if=\"any required field missing\">\n\u003Ctemplate-output>is_valid = false\u003C\u002Ftemplate-output>\n\u003Ctemplate-output>error = \"Missing required field(s): {{missing_fields}}\"\u003C\u002Ftemplate-output>\n\u003Ctemplate-output>suggestion = \"Re-run sprint-planning or add missing fields manually\"\u003C\u002Ftemplate-output>\n\u003Caction>Return\u003C\u002Faction>\n\u003C\u002Fcheck>\n\n\u003Caction>Verify development_status section exists with at least one entry\u003C\u002Faction>\n\u003Ccheck if=\"development_status missing or empty\">\n\u003Ctemplate-output>is_valid = false\u003C\u002Ftemplate-output>\n\u003Ctemplate-output>error = \"development_status missing or empty\"\u003C\u002Ftemplate-output>\n\u003Ctemplate-output>suggestion = \"Re-run sprint-planning or repair the file manually\"\u003C\u002Ftemplate-output>\n\u003Caction>Return\u003C\u002Faction>\n\u003C\u002Fcheck>\n\n\u003Caction>Validate all status values against known valid statuses:\u003C\u002Faction>\n\n- Stories: backlog, ready-for-dev, in-progress, review, done (legacy: drafted)\n- Epics: backlog, in-progress, done (legacy: contexted)\n- Retrospectives: optional, done\n  \u003Ccheck if=\"any invalid status found\">\n  \u003Ctemplate-output>is_valid = false\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>error = \"Invalid status values: {{invalid_entries}}\"\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>suggestion = \"Fix invalid statuses in sprint-status.yaml\"\u003C\u002Ftemplate-output>\n  \u003Caction>Return\u003C\u002Faction>\n  \u003C\u002Fcheck>\n\n\u003Ctemplate-output>is_valid = true\u003C\u002Ftemplate-output>\n\u003Ctemplate-output>message = \"sprint-status.yaml valid: metadata complete, all statuses recognized\"\u003C\u002Ftemplate-output>\n\u003Caction>Run: `python3 {project-root}\u002F_bmad\u002Fscripts\u002Fresolve_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.\u003C\u002Faction>\n\u003C\u002Fstep>\n\n\u003C\u002Fworkflow>\n","# Sprint Status Workflow\n\n**Goal:** Summarize sprint status, surface risks, and recommend the next workflow action.\n\n**Your Role:** You are a Developer providing clear, actionable sprint visibility. No time estimates — focus on status, risks, and next steps.\n\n## Conventions\n\n- Bare paths (e.g. `checklist.md`) resolve from the skill root.\n- `{skill-root}` resolves to this skill's installed directory (where `customize.toml` lives).\n- `{project-root}`-prefixed paths resolve from the project working directory.\n- `{skill-name}` resolves to the skill directory's basename.\n\n## On Activation\n\n### Step 1: Resolve the Workflow Block\n\nRun: `python3 {project-root}\u002F_bmad\u002Fscripts\u002Fresolve_customization.py --skill {skill-root} --key workflow`\n\n**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:\n\n1. `{skill-root}\u002Fcustomize.toml` — defaults\n2. `{project-root}\u002F_bmad\u002Fcustom\u002F{skill-name}.toml` — team overrides\n3. `{project-root}\u002F_bmad\u002Fcustom\u002F{skill-name}.user.toml` — personal overrides\n\nAny 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.\n\n### Step 2: Execute Prepend Steps\n\nExecute each entry in `{workflow.activation_steps_prepend}` in order before proceeding.\n\n### Step 3: Load Persistent Facts\n\nTreat 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.\n\n### Step 4: Load Config\n\nLoad config from `{project-root}\u002F_bmad\u002Fbmm\u002Fconfig.yaml` and resolve:\n\n- `project_name`, `user_name`\n- `communication_language`, `document_output_language`\n- `implementation_artifacts`\n- `date` as system-generated current datetime\n- YOU MUST ALWAYS SPEAK OUTPUT in your Agent communication style with the config `{communication_language}`\n\n### Step 5: Greet the User\n\nGreet `{user_name}`, speaking in `{communication_language}`.\n\n### Step 6: Execute Append Steps\n\nExecute each entry in `{workflow.activation_steps_append}` in order.\n\nActivation is complete. Begin the workflow below.\n\n## Paths\n\n- `sprint_status_file` = `{implementation_artifacts}\u002Fsprint-status.yaml`\n\n## Input Files\n\n| Input | Path | Load Strategy |\n|-------|------|---------------|\n| Sprint status | `{sprint_status_file}` | FULL_LOAD |\n\n## Execution\n\n\u003Cworkflow>\n\n\u003Cstep n=\"0\" goal=\"Determine execution mode\">\n  \u003Caction>Set mode = {{mode}} if provided by caller; otherwise mode = \"interactive\"\u003C\u002Faction>\n\n  \u003Ccheck if=\"mode == data\">\n    \u003Caction>Jump to Step 20\u003C\u002Faction>\n  \u003C\u002Fcheck>\n\n  \u003Ccheck if=\"mode == validate\">\n    \u003Caction>Jump to Step 30\u003C\u002Faction>\n  \u003C\u002Fcheck>\n\n  \u003Ccheck if=\"mode == interactive\">\n    \u003Caction>Continue to Step 1\u003C\u002Faction>\n  \u003C\u002Fcheck>\n\u003C\u002Fstep>\n\n\u003Cstep n=\"1\" goal=\"Locate sprint status file\">\n  \u003Caction>Load {project_context} for project-wide patterns and conventions (if exists)\u003C\u002Faction>\n  \u003Caction>Try {sprint_status_file}\u003C\u002Faction>\n  \u003Ccheck if=\"file not found\">\n    \u003Coutput>sprint-status.yaml not found.\nRun `\u002Fbmad:bmm:workflows:sprint-planning` to generate it, then rerun sprint-status.\u003C\u002Foutput>\n    \u003Caction>Exit workflow\u003C\u002Faction>\n  \u003C\u002Fcheck>\n  \u003Caction>Continue to Step 2\u003C\u002Faction>\n\u003C\u002Fstep>\n\n\u003Cstep n=\"2\" goal=\"Read and parse sprint-status.yaml\">\n  \u003Caction>Read the FULL file: {sprint_status_file}\u003C\u002Faction>\n  \u003Caction>Parse fields: generated, last_updated, project, project_key, tracking_system, story_location\u003C\u002Faction>\n  \u003Caction>Parse development_status map. Classify keys:\u003C\u002Faction>\n- Epics: keys starting with \"epic-\" (and not ending with \"-retrospective\")\n- Retrospectives: keys ending with \"-retrospective\"\n- Stories: everything else (e.g., 1-2-login-form)\n  \u003Caction>Map legacy story status \"drafted\" → \"ready-for-dev\"\u003C\u002Faction>\n  \u003Caction>Count story statuses: backlog, ready-for-dev, in-progress, review, done\u003C\u002Faction>\n  \u003Caction>Map legacy epic status \"contexted\" → \"in-progress\"\u003C\u002Faction>\n  \u003Caction>Count epic statuses: backlog, in-progress, done\u003C\u002Faction>\n  \u003Caction>Count retrospective statuses: optional, done\u003C\u002Faction>\n\n\u003Caction>Validate all statuses against known values:\u003C\u002Faction>\n\n- Valid story statuses: backlog, ready-for-dev, in-progress, review, done, drafted (legacy)\n- Valid epic statuses: backlog, in-progress, done, contexted (legacy)\n- Valid retrospective statuses: optional, done\n\n  \u003Ccheck if=\"any status is unrecognized\">\n    \u003Coutput>\n**Unknown status detected:**\n{{#each invalid_entries}}\n\n- `{{key}}`: \"{{status}}\" (not recognized)\n  {{\u002Feach}}\n\n**Valid statuses:**\n\n- Stories: backlog, ready-for-dev, in-progress, review, done\n- Epics: backlog, in-progress, done\n- Retrospectives: optional, done\n  \u003C\u002Foutput>\n  \u003Cask>How should these be corrected?\n  {{#each invalid_entries}}\n  {{@index}}. {{key}}: \"{{status}}\" → [select valid status]\n  {{\u002Feach}}\n\nEnter corrections (e.g., \"1=in-progress, 2=backlog\") or \"skip\" to continue without fixing:\u003C\u002Fask>\n\u003Ccheck if=\"user provided corrections\">\n\u003Caction>Update sprint-status.yaml with corrected values\u003C\u002Faction>\n\u003Caction>Re-parse the file with corrected statuses\u003C\u002Faction>\n\u003C\u002Fcheck>\n\u003C\u002Fcheck>\n\n\u003Caction>Detect risks:\u003C\u002Faction>\n\n- IF any story has status \"review\": suggest `\u002Fbmad:bmm:workflows:code-review`\n- IF any story has status \"in-progress\" AND no stories have status \"ready-for-dev\": recommend staying focused on active story\n- IF all epics have status \"backlog\" AND no stories have status \"ready-for-dev\": prompt `\u002Fbmad:bmm:workflows:create-story`\n- IF `last_updated` timestamp is more than 7 days old (or `last_updated` is missing, fall back to `generated`): warn \"sprint-status.yaml may be stale\"\n- IF any story key doesn't match an epic pattern (e.g., story \"5-1-...\" but no \"epic-5\"): warn \"orphaned story detected\"\n- IF any epic has status in-progress but has no associated stories: warn \"in-progress epic has no stories\"\n  \u003C\u002Fstep>\n\n\u003Cstep n=\"3\" goal=\"Select next action recommendation\">\n  \u003Caction>Pick the next recommended workflow using priority:\u003C\u002Faction>\n  \u003Cnote>When selecting \"first\" story: sort by epic number, then story number (e.g., 1-1 before 1-2 before 2-1)\u003C\u002Fnote>\n  1. If any story status == in-progress → recommend `dev-story` for the first in-progress story\n  2. Else if any story status == review → recommend `code-review` for the first review story\n  3. Else if any story status == ready-for-dev → recommend `dev-story`\n  4. Else if any story status == backlog → recommend `create-story`\n  5. Else if any retrospective status == optional → recommend `retrospective`\n  6. Else → All implementation items done; congratulate the user - you both did amazing work together!\n  \u003Caction>Store selected recommendation as: next_story_id, next_workflow_id, next_agent (DEV)\u003C\u002Faction>\n\u003C\u002Fstep>\n\n\u003Cstep n=\"4\" goal=\"Display summary\">\n  \u003Coutput>\n## Sprint Status\n\n- Project: {{project}} ({{project_key}})\n- Tracking: {{tracking_system}}\n- Status file: {sprint_status_file}\n\n**Stories:** backlog {{count_backlog}}, ready-for-dev {{count_ready}}, in-progress {{count_in_progress}}, review {{count_review}}, done {{count_done}}\n\n**Epics:** backlog {{epic_backlog}}, in-progress {{epic_in_progress}}, done {{epic_done}}\n\n**Next Recommendation:** \u002Fbmad:bmm:workflows:{{next_workflow_id}} ({{next_story_id}})\n\n{{#if risks}}\n**Risks:**\n{{#each risks}}\n\n- {{this}}\n  {{\u002Feach}}\n  {{\u002Fif}}\n\n  \u003C\u002Foutput>\n  \u003C\u002Fstep>\n\n\u003Cstep n=\"5\" goal=\"Offer actions\">\n  \u003Cask>Pick an option:\n1) Run recommended workflow now\n2) Show all stories grouped by status\n3) Show raw sprint-status.yaml\n4) Exit\nChoice:\u003C\u002Fask>\n\n  \u003Ccheck if=\"choice == 1\">\n    \u003Coutput>Run `\u002Fbmad:bmm:workflows:{{next_workflow_id}}`.\nIf the command targets a story, set `story_key={{next_story_id}}` when prompted.\u003C\u002Foutput>\n  \u003C\u002Fcheck>\n\n  \u003Ccheck if=\"choice == 2\">\n    \u003Coutput>\n### Stories by Status\n- In Progress: {{stories_in_progress}}\n- Review: {{stories_in_review}}\n- Ready for Dev: {{stories_ready_for_dev}}\n- Backlog: {{stories_backlog}}\n- Done: {{stories_done}}\n    \u003C\u002Foutput>\n  \u003C\u002Fcheck>\n\n  \u003Ccheck if=\"choice == 3\">\n    \u003Caction>Display the full contents of {sprint_status_file}\u003C\u002Faction>\n  \u003C\u002Fcheck>\n\n  \u003Ccheck if=\"choice == 4\">\n    \u003Caction>Run: `python3 {project-root}\u002F_bmad\u002Fscripts\u002Fresolve_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.\u003C\u002Faction>\n    \u003Caction>Exit workflow\u003C\u002Faction>\n  \u003C\u002Fcheck>\n\u003C\u002Fstep>\n\n\u003C!-- ========================= -->\n\u003C!-- Data mode for other flows -->\n\u003C!-- ========================= -->\n\n\u003Cstep n=\"20\" goal=\"Data mode output\">\n  \u003Caction>Load and parse {sprint_status_file} same as Step 2\u003C\u002Faction>\n  \u003Caction>Compute recommendation same as Step 3\u003C\u002Faction>\n  \u003Ctemplate-output>next_workflow_id = {{next_workflow_id}}\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>next_story_id = {{next_story_id}}\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>count_backlog = {{count_backlog}}\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>count_ready = {{count_ready}}\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>count_in_progress = {{count_in_progress}}\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>count_review = {{count_review}}\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>count_done = {{count_done}}\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>epic_backlog = {{epic_backlog}}\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>epic_in_progress = {{epic_in_progress}}\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>epic_done = {{epic_done}}\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>risks = {{risks}}\u003C\u002Ftemplate-output>\n  \u003Caction>Return to caller\u003C\u002Faction>\n\u003C\u002Fstep>\n\n\u003C!-- ========================= -->\n\u003C!-- Validate mode -->\n\u003C!-- ========================= -->\n\n\u003Cstep n=\"30\" goal=\"Validate sprint-status file\">\n  \u003Caction>Check that {sprint_status_file} exists\u003C\u002Faction>\n  \u003Ccheck if=\"missing\">\n    \u003Ctemplate-output>is_valid = false\u003C\u002Ftemplate-output>\n    \u003Ctemplate-output>error = \"sprint-status.yaml missing\"\u003C\u002Ftemplate-output>\n    \u003Ctemplate-output>suggestion = \"Run sprint-planning to create it\"\u003C\u002Ftemplate-output>\n    \u003Caction>Return\u003C\u002Faction>\n  \u003C\u002Fcheck>\n\n\u003Caction>Read and parse {sprint_status_file}\u003C\u002Faction>\n\n\u003Caction>Validate required metadata fields exist: generated, project, project_key, tracking_system, story_location (last_updated is optional for backward compatibility)\u003C\u002Faction>\n\u003Ccheck if=\"any required field missing\">\n\u003Ctemplate-output>is_valid = false\u003C\u002Ftemplate-output>\n\u003Ctemplate-output>error = \"Missing required field(s): {{missing_fields}}\"\u003C\u002Ftemplate-output>\n\u003Ctemplate-output>suggestion = \"Re-run sprint-planning or add missing fields manually\"\u003C\u002Ftemplate-output>\n\u003Caction>Return\u003C\u002Faction>\n\u003C\u002Fcheck>\n\n\u003Caction>Verify development_status section exists with at least one entry\u003C\u002Faction>\n\u003Ccheck if=\"development_status missing or empty\">\n\u003Ctemplate-output>is_valid = false\u003C\u002Ftemplate-output>\n\u003Ctemplate-output>error = \"development_status missing or empty\"\u003C\u002Ftemplate-output>\n\u003Ctemplate-output>suggestion = \"Re-run sprint-planning or repair the file manually\"\u003C\u002Ftemplate-output>\n\u003Caction>Return\u003C\u002Faction>\n\u003C\u002Fcheck>\n\n\u003Caction>Validate all status values against known valid statuses:\u003C\u002Faction>\n\n- Stories: backlog, ready-for-dev, in-progress, review, done (legacy: drafted)\n- Epics: backlog, in-progress, done (legacy: contexted)\n- Retrospectives: optional, done\n  \u003Ccheck if=\"any invalid status found\">\n  \u003Ctemplate-output>is_valid = false\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>error = \"Invalid status values: {{invalid_entries}}\"\u003C\u002Ftemplate-output>\n  \u003Ctemplate-output>suggestion = \"Fix invalid statuses in sprint-status.yaml\"\u003C\u002Ftemplate-output>\n  \u003Caction>Return\u003C\u002Faction>\n  \u003C\u002Fcheck>\n\n\u003Ctemplate-output>is_valid = true\u003C\u002Ftemplate-output>\n\u003Ctemplate-output>message = \"sprint-status.yaml valid: metadata complete, all statuses recognized\"\u003C\u002Ftemplate-output>\n\u003Caction>Run: `python3 {project-root}\u002F_bmad\u002Fscripts\u002Fresolve_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.\u003C\u002Faction>\n\u003C\u002Fstep>\n\n\u003C\u002Fworkflow>\n",{"name":5,"description":7},"main","6a38430d5c23377d52d12343bfc156063f577e1d",".continue\u002Fskills\u002Fbmad-sprint-status","https:\u002F\u002Fgithub.com\u002Fjsacko\u002FOpenDFIR","https:\u002F\u002Fgithub.com\u002Fjsacko","2026-06-22 14:57:27",{"source":8,"skillName":5,"commands":42,"prompt":52,"zipAvailable":53},[43,46,49],{"tool":44,"command":45},"npx","npx skills add jsacko\u002FOpenDFIR --skill bmad-sprint-status",{"tool":47,"command":48},"bunx","bunx skills add jsacko\u002FOpenDFIR --skill bmad-sprint-status",{"tool":50,"command":51},"pnpm","pnpm dlx skills add jsacko\u002FOpenDFIR --skill bmad-sprint-status","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjsacko\u002FOpenDFIR\u002Fblob\u002Fmain\u002F.continue\u002Fskills\u002Fbmad-sprint-status\u002FSKILL.md",true,[55],{"path":56,"resourceType":57,"resourceTypeDesc":58,"sizeBytes":59,"sourceHtmlUrl":60},"customize.toml","OTHER","其他",1609,"https:\u002F\u002Fgithub.com\u002Fjsacko\u002FOpenDFIR\u002Fblob\u002Fmain\u002F.continue\u002Fskills\u002Fbmad-sprint-status\u002Fcustomize.toml",[62,92,112,131,152,166],{"skillNo":63,"name":64,"nameZh":6,"description":65,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":73,"publishedAt":30},"01M71PW68SHKJ6357YZJH4ES0E","agent-tonin","Pressure-tests incident response product design against real SOC and DFIR constraints. Use when the user asks to talk to Tonin, requests the Incident Response Strategist, or needs a senior security design partner to challenge incident response automation ideas.","https:\u002F\u002Fgithub.com\u002Fjsacko\u002FOpenDFIR\u002Fblob\u002Fmain\u002Fskills\u002Fagent-tonin\u002FSKILL.md",[68],{"categoryNo":69,"categoryName":70,"taxonomyType":71,"taxonomyTypeDesc":72},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[74,75,76,77,78,79,80,81,82,83,84,85,86,87,26,25,88,89,90,91],"agent tonin","challenge","dfir","automation","security","strategist","senior","product","requests","design partner","soc","incident response","senior security","product design","design","tests","incident","ideas",{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":99,"publishedAt":30},"01M71PW3BV6P3JK7MFN31TA61D","bmad-workflow-builder","Builds, converts, and analyzes workflows and skills. Use when the user requests to \"build a workflow\", \"modify a workflow\", \"quality check workflow\", \"analyze skill\", or \"convert a skill\".","https:\u002F\u002Fgithub.com\u002Fjsacko\u002FOpenDFIR\u002Fblob\u002Fmain\u002F.continue\u002Fskills\u002Fbmad-workflow-builder\u002FSKILL.md",[98],{"categoryNo":69,"categoryName":70,"taxonomyType":71,"taxonomyTypeDesc":72},[100,101,102,21,103,26,104,27,105,25,106,107,108,82,109,110,111,28],"builder","workflow","workflow builder","bmad workflow builder","convert","workflows","quality check","modify","analyze","build","quality","a skill",{"skillNo":113,"name":114,"nameZh":6,"description":115,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":123,"publishedAt":30},"01M71PW0ETTF8DA2C6HB77FPNX","bmad-validate-prd","Validate a PRD against standards. Use when the user says \"validate this PRD\" or \"run PRD validation\"","https:\u002F\u002Fgithub.com\u002Fjsacko\u002FOpenDFIR\u002Fblob\u002Fmain\u002F.continue\u002Fskills\u002Fbmad-validate-prd\u002FSKILL.md",[118],{"categoryNo":119,"categoryName":120,"taxonomyType":121,"taxonomyTypeDesc":122},"01JBSEEDCAT000000000000031","产品经理","PROFESSION","适用职业",[124,125,21,126,127,128,25,26,129,130,28],"prd","bmad validate prd","validate","validate prd","standards","run","validation",{"skillNo":132,"name":133,"nameZh":6,"description":134,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":135,"categories":136,"keywords":140,"publishedAt":30},"01M71PVY254CKN2PNAEX41CRR9","bmad-technical-research","Conduct technical research on technologies and architecture. Use when the user says they would like to do or produce a technical research report","https:\u002F\u002Fgithub.com\u002Fjsacko\u002FOpenDFIR\u002Fblob\u002Fmain\u002F.continue\u002Fskills\u002Fbmad-technical-research\u002FSKILL.md",[137],{"categoryNo":138,"categoryName":139,"taxonomyType":71,"taxonomyTypeDesc":72},"01JBSEEDCAT000000000000021","资料检索与研究",[141,142,143,21,144,145,146,26,25,147,148,149,150,151,28],"technical research","bmad technical research","technical","research","to do","architecture","produce","do","conduct","research report","report",{"skillNo":153,"name":154,"nameZh":6,"description":155,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":156,"categories":157,"keywords":158,"publishedAt":30},"01M71PVT03ZW4PQVV5TZDNPBXH","bmad-sprint-planning","Generate sprint status tracking from epics. Use when the user says \"run sprint planning\" or \"generate sprint plan\"","https:\u002F\u002Fgithub.com\u002Fjsacko\u002FOpenDFIR\u002Fblob\u002Fmain\u002F.continue\u002Fskills\u002Fbmad-sprint-planning\u002FSKILL.md",[],[159,20,160,21,161,162,28,163,23,129,164,22,165,26,25],"bmad sprint planning","planning","sprint planning","sprint plan","tracking","generate","plan",{"skillNo":167,"name":168,"nameZh":6,"description":169,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":170,"categories":171,"keywords":175,"publishedAt":30},"01M71PVQJJX18F4Q362TSBF4HW","bmad-shard-doc","Splits large markdown documents into smaller, organized files based on level 2 (default) sections. Use if the user says perform shard document","https:\u002F\u002Fgithub.com\u002Fjsacko\u002FOpenDFIR\u002Fblob\u002Fmain\u002F.continue\u002Fskills\u002Fbmad-shard-doc\u002FSKILL.md",[172],{"categoryNo":173,"categoryName":174,"taxonomyType":71,"taxonomyTypeDesc":72},"01JBSEEDCAT000000000000002","文档处理",[176,177,21,178,179,180,28,181,182,183,184,25],"shard","doc","bmad shard doc","files","default","markdown","splits","documents","document"]