en un clic
milestone
Manage milestones: new, complete, audit, gaps.
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Menu
Manage milestones: new, complete, audit, gaps.
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Basé sur la classification professionnelle SOC
Run multiple phases hands-free. Chains discuss, plan, build, and verify automatically.
Start a new project. Deep questioning, research, requirements, and roadmap.
Execute all plans in a phase. Spawns agents to build in parallel, commits atomically.
Configure settings: depth, model profiles, features, git, and gates.
Execute the next logical step automatically. No prompts, no decisions — just do it.
Systematic debugging with hypothesis testing. Persistent across sessions.
| name | milestone |
| description | Manage milestones: new, complete, audit, gaps. |
| allowed-tools | Read, Write, Bash, Glob, Grep, Task, AskUserQuestion |
| argument-hint | new|complete|audit|gaps [version] |
STOP — DO NOT READ THIS FILE. You are already reading it. This prompt was injected into your context by Claude Code's plugin system. Using the Read tool on this SKILL.md file wastes ~7,600 tokens. Begin executing Step 1 immediately.
Before ANY tool calls, display this banner:
╔══════════════════════════════════════════════════════════════╗
║ PLAN-BUILD-RUN ► MILESTONE ║
╚══════════════════════════════════════════════════════════════╝
Then proceed to Step 1.
You are running the milestone skill. Milestones represent significant project checkpoints — a set of phases that together deliver a cohesive chunk of functionality. This skill handles the full milestone lifecycle: creation, completion, auditing, and gap analysis.
This skill runs inline for most subcommands, but spawns agents for audit.
references/questioning.md — Questioning patterns for milestone review decisionsreferences/ui-brand.md — Status symbols, banners, milestone celebration formatReference: skills/shared/context-budget.md for the universal orchestrator rules.
Reference: skills/shared/agent-type-resolution.md for agent type fallback when spawning Task() subagents.
Additionally for this skill:
Before any phase-modifying operations (archiving phases, updating ROADMAP.md/STATE.md/PROJECT.md), acquire a claim:
acquireClaim(planningDir, sessionId)
If the claim fails (another session owns this project), display: "Another session owns this project. Use /pbr:progress to see active claims."
On completion or error (including all exit paths), release the claim:
releaseClaim(planningDir, sessionId)
Milestones are the rhythm of the project. They force you to step back, verify everything works together, and create a clean snapshot before moving on. Never skip the audit — integration issues hide at milestone boundaries.
Parse $ARGUMENTS for the subcommand and optional version:
$ARGUMENTS format: {subcommand} [{version/name}]
Examples:
"new" → subcommand=new, arg=none
"new User Auth" → subcommand=new, arg="User Auth"
"complete v1.0" → subcommand=complete, arg="v1.0"
"complete 1.0" → subcommand=complete, arg="v1.0" (auto-prefix v)
"preview v1.0" → subcommand=preview, arg="v1.0"
"audit v1.0" → subcommand=audit, arg="v1.0"
"audit" → subcommand=audit, arg=current milestone
"gaps" → subcommand=gaps, arg=most recent audit
If no subcommand recognized: Show usage:
Usage: /pbr:milestone <subcommand> [version]
Subcommands:
new [name] — Start a new milestone cycle
complete [ver] — Archive completed milestone
preview [ver] — Dry-run of complete (show what would happen)
audit [ver] — Verify milestone completion
gaps — Create phases to close audit gaps
CRITICAL — After parsing the subcommand, run init command before any manual state reads:
node plugins/pbr/scripts/pbr-tools.js init milestone
Store the JSON result as blob. This single call replaces multiple file reads across all subcommands:
blob.state.current_phase, blob.state.status — current phase and status from STATE.mdblob.state.last_milestone_version, blob.state.last_milestone_completed — milestone historyblob.has_roadmap — whether ROADMAP.md existsblob.has_project — whether PROJECT.md existsblob.milestones — array of milestone sections parsed from ROADMAP.md (each with name and phases_range)blob.existing_archives — array of existing archive directory namesblob.phase_count — total phase countblob.config.mode, blob.config.planning, blob.config.git — config settingsIf blob.error is set, display the error banner and stop (no project found).
newStart a new milestone cycle with new phases.
Read current state from init blob:
blob.milestones for existing milestone sections from ROADMAP.mdblob.state.current_phase and blob.state.status for current positionblob.has_project to check if PROJECT.md exists (read it for milestone history if needed)blob.phase_count for total phase countGet milestone details via AskUserQuestion:
$ARGUMENTS, use it and skip the name questionDetermine phase numbering:
Mini roadmap session:
Run a condensed version of the /pbr:new-project questioning flow:
a. Ask about major components needed (via AskUserQuestion):
b. For each area, ask:
c. Generate phases from the areas:
Update ROADMAP.md: Append new milestone section:
---
## Milestone: {name}
**Goal:** {goal statement}
**Phases:** {start_num} - {end_num}
### Phase {N}: {name}
**Goal:** {goal}
**Requirements:** {REQ-IDs mapped to this phase}
**Success Criteria:** {verifiable conditions for phase completion}
**Depends on:** {prior phases}
### Phase {N+1}: {name}
...
Create phase directories: For each new phase:
.planning/phases/{NN}-{slug}/
Update PROJECT.md (create if needed): Add milestone to the active milestones list:
## Active Milestones
### {name}
- **Phases:** {start} - {end}
- **Created:** {date}
- **Status:** In progress
CRITICAL (no hook) -- DO NOT SKIP: Update STATE.md frontmatter AND body with new milestone info.
CRITICAL (no hook) -- DO NOT SKIP: Generate root MILESTONE.md file.
8b. Generate root MILESTONE.md:
Read the current milestone section from ROADMAP.md (the ## Milestone: section just created in Step 5) and STATE.md for current phase and status. Write MILESTONE.md at the project root with:
# Current Milestone: {name}
**Version:** {version} | **Status:** In Progress | **Created:** {date}
**Goal:** {goal}
## Phases
| Phase | Goal | Status |
|-------|------|--------|
| {N}. {name} | {goal} | Pending |
...
---
*Auto-generated by `/pbr:milestone new`. Updated by `/pbr:autonomous`.*
Milestone branch creation (when git.branching is 'milestone'):
When starting a new milestone and git.branching is milestone:
git switch -c pbr/milestone-v{version}/pbr:milestone complete is runCommit if planning.commit_docs: true:
docs(planning): start milestone "{name}" (phases {start}-{end})
Confirm with branded output — read ${CLAUDE_SKILL_DIR}/templates/new-output.md.tmpl and fill in {name} (milestone name), {count} (phase count), {N} (first phase number).
previewDry-run of milestone completion — shows what would happen without making any changes.
Determine version:
complete: use $ARGUMENTS or ask via AskUserQuestionIdentify milestone phases:
Verification status check:
result frontmatterPreview archive structure:
.planning/milestones/v{version}/
├── ROADMAP.md (snapshot)
├── STATS.md (would be generated)
├── REQUIREMENTS.md (snapshot)
└── phases/
├── {NN}-{slug}/ (moved from .planning/phases/)
│ ├── PLAN-01.md
│ ├── SUMMARY.md
│ └── VERIFICATION.md
└── ...
Show what would change:
Display summary:
╔══════════════════════════════════════════════════════════════╗
║ PLAN-BUILD-RUN ► MILESTONE PREVIEW — v{version} ║
╚══════════════════════════════════════════════════════════════╝
Phases to archive: {count}
✓ Verified: {verified_count}
⚠ Unverified: {unverified_count}
⚠ Stale verification: {stale_count}
Archive location: .planning/milestones/v{version}/
Git tag: v{version}
Ready to complete? Run: /pbr:complete-milestone v{version}
CRITICAL (no hook): This subcommand is READ-ONLY. Do not create directories, move files, modify STATE.md, modify ROADMAP.md, or create git tags. Only read and display.
completeArchive a completed milestone and prepare for the next one.
Determine version:
$ARGUMENTS: use it (auto-prefix v if missing)Check verification debt across ALL phases:
blob.milestones to find the target milestone's phase rangegaps_found or human_needed or partial → verification debt existsVerification Debt:
- Phase {N}: {status} ({count} outstanding items)
Verify all phases are complete:
For each phase in the range, check for VERIFICATION.md
If any phase lacks VERIFICATION.md:
Present the warning context: Unverified phases:
CRITICAL -- DO NOT SKIP: Present the following choice to the user via AskUserQuestion before proceeding:
Use AskUserQuestion (pattern: yes-no from skills/shared/gate-prompts.md):
question: "{count} phases haven't been verified. Continue with milestone completion?"
header: "Unverified"
options:
- label: "Continue anyway" description: "Proceed despite unverified phases (not recommended)"
- label: "Stop and review" description: "Run /pbr:verify-work for unverified phases first"
Timestamp freshness check:
For each phase that has a VERIFICATION.md, compare its checked_at frontmatter timestamp against the most recent SUMMARY.md file modification date in that phase directory (use ls -t or file stats).
If any SUMMARY.md is newer than its VERIFICATION.md checked_at:
CRITICAL -- DO NOT SKIP: Present the following choice to the user via AskUserQuestion before proceeding:
Use AskUserQuestion (pattern: stale-continue from skills/shared/gate-prompts.md):
question: "{count} phases were modified after verification. Re-verify or continue?"
header: "Stale"
options:
- label: "Re-verify" description: "Run /pbr:verify-work for affected phases (recommended)"
- label: "Continue anyway" description: "Proceed with potentially outdated verification"
Gather milestone stats:
# Get commit range for this milestone's phases
git log --oneline --since="{milestone start date}" --until="now"
# Count files changed
git diff --stat {first_milestone_commit}..HEAD
Collect:
Extract accomplishments: Read all SUMMARY.md files for milestone phases:
provides fields (what was built)key_decisions fieldspatterns fieldstech_stack unionMilestone branching (config-gated):
Read blob.config.git.branching (or fall back to reading config if blob unavailable).
milestone:
a. Check if milestone branch exists: git branch --list pbr/milestone-v{version}
b. If branch exists:
pbr/milestone-v{version} to main?"
header: "Merge milestone branch?"
options:
git switch maingit merge --no-ff pbr/milestone-v{version} (no-ff to preserve milestone history)git branch -d pbr/milestone-v{version}none, phase, or disabled: no milestone branch operationsArchive milestone documents:
CRITICAL (no hook): Pre-flight safety checks BEFORE archiving. Do NOT skip this step.
Before creating or moving anything, verify the destination is safe:
blob.existing_archives to see if the version directory already exists╔══════════════════════════════════════════════════════════════╗
║ ERROR ║
╚══════════════════════════════════════════════════════════════╝
Archive destination `.planning/milestones/{version}/` already contains files.
Completing this milestone would overwrite the existing archive.
**To fix:** Run `/pbr:health` or manually inspect `.planning/milestones/{version}/`.
Use a different version number (e.g., {version}.1) or remove the existing archive first.
Ask the user via AskUserQuestion whether to use a different version or abort.CRITICAL (no hook): Back up ROADMAP.md BEFORE any destructive operations. Do NOT skip this step.
Use the compound init-milestone command to atomically create the archive directory, copy ROADMAP.md, copy REQUIREMENTS.md (if present), and update STATE.md:
pbr-tools compound init-milestone {version} --name "{milestone_name}" --phases "{start}-{end}"
This MUST happen before any of the following: moving phase directories, collapsing ROADMAP.md sections, or further STATE.md updates.
The compound command creates the archive directory and copies ROADMAP.md + REQUIREMENTS.md. Now move phase directories and create STATS.md:
.planning/milestones/{version}/STATS.md — milestone statistics.planning/milestones/{version}/phases/{NN}-{slug}/ — move each milestone phase directory from .planning/phases/ into the archiveCRITICAL (no hook): Move phase directories from .planning/phases/ to archive NOW. Do NOT skip this step.
Move phases: For each phase belonging to this milestone, move (not copy) its directory from .planning/phases/{NN}-{slug}/ to .planning/milestones/{version}/phases/{NN}-{slug}/. This keeps the active phases directory clean for the next milestone.
CRITICAL (no hook): Write STATS.md to .planning/milestones/{version}/STATS.md NOW. Do NOT skip this step.
Stats file content:
Read ${CLAUDE_SKILL_DIR}/templates/stats-file.md.tmpl for the stats file format. Fill in all {variable} placeholders with actual data gathered in Steps 3-4.
5b. Archive stale research data:
After archiving phase directories, prune stale research/intel/codebase data that predates the milestone:
pbr-tools data prune --before {milestone_start_date}
Where {milestone_start_date} is the earliest phase start date from the milestone (derived from the first SUMMARY.md start_time or the milestone creation date).
Update PROJECT.md:
## Completed Milestones
### {name} ({version})
- **Completed:** {date}
- **Phases:** {start} - {end}
- **Key deliverables:** {summary}
CRITICAL (no hook): Run PROJECT.md evolution review NOW. Do NOT skip this step.
6b. PROJECT.md Evolution Review: After moving the milestone to completed status, review and evolve the project definition:
Good (decision worked well), Revisit (decision caused issues), or Pending (outcome not yet clear)CRITICAL (no hook): Update ROADMAP.md with collapsed milestone section NOW. Do NOT skip this step.
Collapse completed phases in ROADMAP.md:
Replace detailed phase entries with a <details> collapsed summary (backward compat: also recognized by -- COMPLETED text):
<details>
<summary>## Milestone: {name} ({version}) — SHIPPED {date}</summary>
| Phase | Status |
|-------|--------|
| {N}. {name} | Completed |
| {N+1}. {name} | Completed |
Completed: {date} | Archive: `.planning/milestones/{version}/`
</details>
7a. Update milestone index:
After collapsing the milestone, update or create a ## Milestones index section near the top of ROADMAP.md (after the title, before the first active milestone). Each entry is one line:
## Milestones
| Version | Name | Status | Date |
|---------|------|--------|------|
| {version} | {name} | SHIPPED | {date} |
If the section already exists, append a row. If it does not exist, create it.
CRITICAL (no hook): Update STATE.md to mark milestone as complete NOW. Do NOT skip this step.
7b. Update STATE.md:
.planning/STATE.md frontmatter to reset to idle state:
current_phase: nullphase_slug: nullphase_name: nullphases_total: 0status: "idle"progress_percent: 0plans_total: 0plans_complete: 0last_activity: "{date} Milestone {version} complete"7c. Record milestone completion in STATE.md frontmatter:
last_milestone_version: "{version}"last_milestone_completed: "{ISO datetime}"Run state reconcile after archival to reset phases_total and current_phase to reflect the next milestone's phases:
pbr-tools state reconcile
This command re-derives phase counts from ROADMAP.md and reports any phantom phase rows (progress table rows with no corresponding directory on disk). Review and remove phantom rows manually if no longer needed.
CRITICAL (no hook): Reconcile ROADMAP phase statuses NOW. Do NOT skip this step.
7c2. ROADMAP Reconciliation: After state reconcile, run a full reconciliation pass to fix any stale phase statuses across the entire ROADMAP:
pbr-tools roadmap reconcile
7d. Aggregate learnings into KNOWLEDGE.md from milestone phases:
CRITICAL (no hook): Run learnings aggregation NOW. Do NOT skip this step.
node ${CLAUDE_PLUGIN_ROOT}/scripts/milestone-learnings.js .planning/milestones/{version} --project {project-name-from-STATE.md}
This script aggregates SUMMARY.md patterns, decisions, and deferred items into the project-scoped .planning/KNOWLEDGE.md (table format with K/P/L-prefixed IDs). It also writes to the global ~/.claude/learnings.jsonl for cross-project use.
pbr-tools learnings check-thresholds
If any thresholds are triggered, display each as a notification:
Note: Learnings threshold met — {key}: {trigger}. Consider implementing the deferred feature.
7e. Run calibration for all evaluative agents on expanded corpus:
pbr-tools calibrate all
This re-analyzes corpus data for all evaluative agents (verifier, audit, integration-checker, plan-checker) and updates .planning/intel/{agent}-calibration.md with gap patterns and recommendations. The calibration data informs each agent's few-shot examples.
Git tag:
git tag -a {version} -m "Milestone: {name}"
Generate RETROSPECTIVE.md:
The CLI (pbr-tools.js milestone complete) auto-generates a RETROSPECTIVE.md entry. Verify it exists at .planning/RETROSPECTIVE.md. If the CLI was not used (manual completion), create the entry using ${CLAUDE_PLUGIN_ROOT}/templates/RETROSPECTIVE.md.tmpl as the format reference. Fill in {version}, {name}, {date}, and the "What Was Built" section from MILESTONES.md accomplishments. Leave other sections as placeholders for the user to fill.
9aa. Insights integration:
Check for a recent /insights HTML report:
find ~/.claude/insights/ -name "*.html" -mtime -7 2>/dev/null | head -1
If a recent report exists (modified within 7 days):
.planning/RETROSPECTIVE.md with 3-5 bullet points summarizing the most relevant insights for this milestone's workIf no recent report exists: Display this suggestion after the RETROSPECTIVE.md is generated:
Tip: Run /insights to capture workflow patterns from this milestone's sessions.
Insights feed into future audits and help the planner avoid repeated friction.
9a. Commit:
git add .planning/milestones/ .planning/phases/ .planning/ROADMAP.md .planning/PROJECT.md .planning/STATE.md .planning/RETROSPECTIVE.md
git commit -m "docs(planning): complete milestone {version}"
CRITICAL (no hook): Generate changelog entry NOW. Do NOT skip this step.
9b. Generate changelog entry:
Generate a user-facing changelog entry for this milestone. Read all SUMMARY.md files from the milestone phases (now in .planning/milestones/{version}/phases/) and categorize deliverables into Keep a Changelog sections:
provides fields)fix: type)Format each entry with a bolded feature name followed by an em-dash and description:
### Added
- **Feature name** — What it does and why it matters
- **Another feature** — Description focusing on user impact
Rules for good entries:
Install/upgrade: \npx @sienklogic/plan-build-run@latest``Draft the full entry and present it to the user for review:
Use AskUserQuestion:
question: "Here's the draft changelog for {version}. Want to edit it before writing?"
header: "Changelog"
options:
- label: "Looks good" description: "Write this to CHANGELOG.md as-is"
- label: "Edit" description: "I'll provide corrections"
- label: "Skip changelog" description: "Don't update the changelog for this release"
If writing to CHANGELOG.md:
git add CHANGELOG.md
git commit -m "docs: update changelog for {version}"
9c. Push milestone to remote:
Use AskUserQuestion to ask the user how they want to publish the milestone:
question: "How should this milestone be published to GitHub?"
header: "Publish"
options:
- label: "Push tag + commits" description: "Push the v{version} tag and any unpushed commits to origin"
- label: "Skip for now" description: "Keep everything local — push later manually"
git push origin main --follow-tags to push both commits and the annotated tag in one command. Display success or error.git push origin main --follow-tags"9d. Automatic npm release:
After pushing, automatically run the npm release to publish this milestone:
npm run release -- --minor
Display the output to the user. The --minor flag is used because milestone completions always represent new features.
npm run release manually after fixing the issue.If config.deployment.smoke_test_command is set and non-empty:
Run the command via Bash
If exit code 0: display "Smoke test passed" with command output
If exit code non-zero: display advisory warning:
⚠ Smoke test failed (exit code {N})
Command: {smoke_test_command}
Output: {first 20 lines of output}
This is advisory only — the milestone is already archived. Surface it as a potential issue for the user to investigate.
Confirm with branded output — read ${CLAUDE_SKILL_DIR}/templates/complete-output.md.tmpl and fill in {version}, {count} (phases, plans, commits), {lines}, {duration}.
NEXT UP block after milestone complete:
After displaying the branded complete-output banner, always display a NEXT UP routing block:
╔══════════════════════════════════════════════════════════════╗
║ ▶ NEXT UP ║
╚══════════════════════════════════════════════════════════════╝
**Start the next milestone** — continue development with new phases
`/pbr:milestone new`
**Also available:**
- `/pbr:release` — tag and publish this milestone as a GitHub Release
- `/pbr:status` — review project state before continuing
<sub>`/clear` first → fresh context window</sub>
This ensures the milestone complete subcommand never ends in a routing dead end.
auditVerify milestone completion with cross-phase integration checks.
Determine target:
blob.milestones to identify the most recent active milestone)Read all VERIFICATION.md files for milestone phases (use blob.milestones to identify the phase range):
gaps_found statusesSpawn integration checker:
Display to the user: ◆ Spawning integration checker...
Spawn Task(subagent_type: "pbr:integration-checker"). Read ${CLAUDE_SKILL_DIR}/templates/integration-checker-prompt.md.tmpl, fill in {version or "current"}, {list of phase directories}, and {phase SUMMARY.md paths}, then use the filled template as the Task() prompt.
Check integration-checker completion:
After the integration-checker completes, check for ## INTEGRATION CHECK COMPLETE in the Task() output. If the marker is absent, warn: ⚠ Integration checker did not return completion marker — results may be incomplete. Proceed with whatever findings were returned but note the incomplete status in the audit report.
Check requirements coverage:
provides fieldsWrite audit report:
Create .planning/{version}-MILESTONE-AUDIT.md using the structured template:
Read ${CLAUDE_PLUGIN_ROOT}/templates/MILESTONE-AUDIT.md.tmpl for the audit report format with YAML frontmatter scores. Fill in all {variable} placeholders with actual data from the audit. The YAML frontmatter MUST include scores (requirements, phases, integration, flows), gaps array, and tech_debt array.
Spot-check: After writing, verify .planning/{version}-MILESTONE-AUDIT.md exists on disk using Glob. If missing, re-attempt the write. If still missing, display an error and include findings inline.
Report to user using branded banners — read ${CLAUDE_SKILL_DIR}/templates/audit-output.md.tmpl. The template contains all 3 variants (PASSED, GAPS FOUND, TECH DEBT). Select the appropriate section based on audit result. Fill in {version}, {count}, {gap 1}, {gap 2} as applicable.
gapsCreate phases to close gaps found during an audit.
Find most recent audit:
*-MILESTONE-AUDIT.md in .planning//pbr:audit-milestone first."Read audit report:
Prioritize gaps:
Group by priority:
Present to user:
Gaps from milestone audit:
Must fix ({count}):
- {gap}: {description}
Should fix ({count}):
- {gap}: {description}
Nice to fix ({count}):
- {gap}: {description}
**CRITICAL -- DO NOT SKIP**: Present the following choice to the user via AskUserQuestion before proceeding:
Use AskUserQuestion (pattern: multi-option-priority from `skills/shared/gate-prompts.md`):
question: "Which gaps should we address? ({must_count} must-fix, {should_count} should-fix, {nice_count} nice-to-fix)"
header: "Priority"
options:
- label: "Must-fix only" description: "Address {must_count} critical/high gaps"
- label: "Must + should" description: "Address {must_count + should_count} critical through medium gaps"
- label: "Everything" description: "Address all {total_count} gaps including low priority"
- label: "Let me pick" description: "Choose specific gaps to address"
- If "Must-fix only": filter to must-fix gaps for phase creation
- If "Must + should": filter to must-fix + should-fix gaps
- If "Everything": include all gaps
- If "Let me pick" or "Other": present individual gaps for selection
Group into logical phases:
Update ROADMAP.md: Add gap-closure phases after the current milestone phases:
### Phase {N}: Fix {area} (gap closure)
**Goal:** Address gaps found in milestone audit
**Gaps addressed:**
- {gap 1}
- {gap 2}
**Success criteria:** All addressed gaps pass verification
Create phase directories:
.planning/phases/{NN}-fix-{slug}/
Commit:
docs(planning): add gap-closure phases from milestone audit
Confirm with branded output — read ${CLAUDE_SKILL_DIR}/templates/gaps-output.md.tmpl and fill in {count} (gap-closure phases created), {N} (first gap phase number), {name} (phase name).
All subcommands use blob.state and blob.config from the init call for reading state. All subcommands update STATE.md on write:
new: Sets current milestone, resets phasecomplete: Clears current milestone, updates historyaudit: Notes audit status and dategaps: Updates phase count and roadmap infoReference: skills/shared/commit-planning-docs.md for the standard commit pattern.
All subcommands commit if blob.config.planning.commit_docs is true:
new: docs(planning): start milestone "{name}" (phases {start}-{end})complete: docs(planning): complete milestone {version}audit: docs(planning): audit milestone {version} - {status}gaps: docs(planning): add gap-closure phases from milestone auditTags (complete only):
git tag -a {version} -m "Milestone: {name}"Reference: skills/shared/error-reporting.md for branded error output patterns.
For all edge case handling, see ${CLAUDE_SKILL_DIR}/templates/edge-cases.md.
Key scenarios: no ROADMAP.md, no phases, no gaps found, version collision, partially verified, large milestone (8+ phases).