Delivery Timeline
Generates a delivery timeline from a completed milestones.yaml. Asks for delivery parameters (production deploy date, QA rounds, days per QA session), updates milestones with day estimates, and produces timeline.yaml with two sections: a relative-day timeline and a real-date workback schedule anchored to the production deploy date.
Prerequisites
- Completed
{base_directory}/implementation/milestones.yaml(output from/implementation-planner)
Usage
/delivery-timeline [base-directory]If no directory is provided, auto-detect by looking for implementation/milestones.yaml in the current directory.
If not found, prompt the user: "Where are your planning artifacts located?"
Wait for the user to provide a path before proceeding. Store as base_directory.
Process
Step 1: Determine Base Directory and Load Milestones
If no directory parameter was provided, check if implementation/milestones.yaml exists in the current directory.
- If found, use current directory as
base_directory - If not found, prompt: "Where are your planning artifacts located?" and wait for user response
Once base_directory is determined:
Read {base_directory}/implementation/milestones.yaml and extract each milestone's id, name, dependencies, and estimated_duration.
Also read meta.ordering_strategy if present. Store as ordering_strategy. If absent, default to foundation-first.
The ordering_strategy value drives structural differences in Steps 6 and 7:
multi-pr: PR/review/merge cycles are inserted after each milestone in the development timeline; the fixed pre-QA PR block in Step 7 is omitted.- All other strategies (
single-feature-branch,value-first,risk-first,vertical-slice,foundation-first): standard single-PR post-development flow (no change to current behavior).
Step 2: Gather Delivery Parameters
Ask the user the following three questions. You may present them together in a single message:
- Production deploy date — "What is your desired production deploy date? (YYYY-MM-DD)"
- QA rounds — "How many rounds of QA are required?"
- QA days per round — "How many days should be allotted for each QA session?"
If the provided production deploy date falls on a Saturday or Sunday, warn the user:
"Note: [date] falls on a weekend. Would you like to use [previous Friday] or [next Monday] instead?"
Wait for the user to confirm or correct before proceeding. Store the confirmed values as:
production_deploy_date(ISO 8601 date string)qa_rounds(integer ≥ 1)qa_days_per_round(integer ≥ 1)
Step 3: Convert Durations to Days
Convert each milestone's estimated_duration string to a whole number of business days using this table:
| estimated_duration | estimated_days |
|---|---|
| 0.5 weeks | 3 |
| 1 week | 5 |
| 1.5 weeks | 8 |
| 2 weeks | 10 |
| 2.5 weeks | 13 |
| 3 weeks | 15 |
| 3.5 weeks | 18 |
| 4 weeks | 20 |
| N weeks | N × 5 (rounded up to nearest whole day) |
For durations expressed in days already (e.g., 5 days), use the number as-is.
Step 4: Update milestones.yaml
Add estimated_days to every milestone entry in {base_directory}/implementation/milestones.yaml. Do not modify any other fields.
Example — before:
- id: m0
name: Foundation & Project Setup
estimated_duration: 1 weekAfter:
- id: m0
name: Foundation & Project Setup
estimated_duration: 1 week
estimated_days: 5Step 5: Determine Project Size
Calculate total_development_days by summing estimated_days across all milestones.
Large project if either condition is true:
total_development_days > 30- Number of milestones > 5
Large projects receive two rounds of QA feedback by default, but this is overridden by the user-provided qa_rounds value from Step 2. is_large_project is still recorded in the summary for informational purposes.
Step 6: Build the Development Timeline
Starting at Day 0, assign a completion_day to each milestone in dependency order. Each milestone's start_day is the business day after its last dependency completes (or 0 if no dependencies). Its completion_day is start_day + estimated_days.
Day calculation formula:
- No dependencies:
start_day = 0 - Has dependencies:
start_day = max(dependency.completion_day) + 1(next business day after dependencies complete) completion_day = start_day + estimated_days
For sequential milestone chains (each depends on the previous):
m0: start_day=0, completion_day=0+estimated_days(m0)=5
m1: start_day=5+1=6, completion_day=6+estimated_days(m1)=16
m2: start_day=16+1=17, completion_day=17+estimated_days(m2)=27
...For parallel milestones (sharing same dependency), they all start the day after that dependency completes. They share the same start_day but their completion_day is calculated independently based on their individual estimated_days.
Standard strategies (all except multi-pr)
last_milestone_day = the highest completion_day among all milestones.
multi-pr strategy
After each milestone, insert four PR cycle phases before the next milestone may start. Use the milestone id as a prefix (e.g. for m0: m0-pr-creation, m0-pr-review, m0-review-feedback, m0-merge).
| id pattern | name pattern | estimated_days | notes |
|---|---|---|---|
| [milestone-id]-pr-creation | [Milestone Name] PR Creation | 0 | Opened on milestone completion_day |
| [milestone-id]-pr-review | [Milestone Name] PR Review | 2 | |
| [milestone-id]-review-feedback | [Milestone Name] Review Feedback Implementation | 2 | |
| [milestone-id]-merge | [Milestone Name] Merge | 0 | Same day as review-feedback completion |
The PR cycle adds 4 business days of overhead after each milestone. The next milestone's start_day = completion_day of its predecessor's merge phase + 1 (starts the day after merge completes).
For sequential milestones under multi-pr:
m0: start_day=0, completion_day=0+estimated_days(m0)=5
m0-pr-creation: start_day=5, completion_day=5 # 0 days, opens same day
m0-pr-review: start_day=5, completion_day=5+2=7
m0-review-feedback: start_day=7, completion_day=7+2=9
m0-merge: start_day=9, completion_day=9 # 0 days, merges same day
m1: start_day=9+1=10, completion_day=10+estimated_days(m1)=20
# ... repeat for each milestoneFor parallel milestones under multi-pr, each branch gets its own PR cycle. A milestone depending on multiple parallel predecessors starts the day after the latest merge completion_day among them (max(merge.completion_day) + 1).
last_milestone_day = the highest completion_day of the final [milestone-id]-merge phase across all milestones.
Step 7: Append Post-Development Timeline
Add delivery phase items starting from last_milestone_day. Each item has a start_day (day the work begins) and completion_day (day the work is done). Items with estimated_days: 0 complete on the same day they start.
Use qa_rounds and qa_days_per_round from Step 2 to drive the QA section.
Fixed Pre-QA Phases
Standard strategies (all except multi-pr): Include the full PR/merge/deployment block below. This represents the single end-of-project PR.
| id | name | estimated_days | notes |
|---|---|---|---|
| post-pr-creation | PR Creation | 0 | Opened on last milestone day |
| post-pr-review | PR Review | 2 | |
| post-review-feedback | Review Feedback Implementation | 2 | |
| post-merge | Merge | 0 | Same day as feedback impl |
| post-deployment | Deployment | 1 |
multi-pr strategy: Omit post-pr-creation, post-pr-review, post-review-feedback, and post-merge — those cycles already occurred per-milestone in Step 6. Start directly with post-deployment.
| id | name | estimated_days | notes |
|---|---|---|---|
| post-deployment | Deployment | 1 | Final deployment after all milestones merged |
QA Phases (repeated for each round 1..qa_rounds)
For each round R from 1 to qa_rounds, generate the following phases using qa_days_per_round as the QA Deadline duration. Use round-specific ids (e.g. post-qa-r1-deadline, post-qa-r2-deadline). When qa_rounds == 1, ids may omit the round suffix (e.g. post-qa-deadline).
| id pattern | name pattern | estimated_days | notes |
|---|---|---|---|
| post-qa-rR-deadline | QA Deadline (Round R) | qa_days_per_round | Time allotted for QA team testing |
| post-qa-rR-feedback-impl | QA Feedback Implementation (Round R) | 3 if (R == 1 and qa_rounds > 1) else 2 | |
| post-qa-rR-pr | QA PR (Round R) | 0 | |
| post-qa-rR-feedback | QA Feedback (Round R) | 2 if (R == 1 and qa_rounds > 1) else 1 | |
| post-qa-rR-merge | QA Merge (Round R) | 0 |
Fixed Post-QA Phase (all projects)
| id | name | estimated_days |
|---|---|---|
| post-signoff | Signoff | 1 |
Step 8: Build Workback Schedule
Map every timeline item (milestones + delivery phases) to a real calendar date by working backwards from production_deploy_date.
Anchor point: production_deploy_date = the real date for completion_day of post-signoff (the final day of the timeline, total_delivery_days).
Business day arithmetic: When counting backwards, skip Saturdays and Sundays. One business day back from a Monday is the previous Friday.
For each timeline item:
completion_date=production_deploy_dateminus (total_delivery_days−item.completion_day) business daysstart_date=production_deploy_dateminus (total_delivery_days−item.start_day) business days
project_start_date = production_deploy_date minus total_delivery_days business days (Day 0).
Include all items from timeline in the same order. Also append a final entry for production-deploy with date: production_deploy_date.
Step 9: Generate timeline.yaml
Write {base_directory}/delivery/timeline.yaml.
Create directory if it doesn't exist:
mkdir -p {base_directory}/deliveryOutput Format
Updated milestones.yaml
The estimated_days field is added to each milestone entry. All other content is preserved exactly.
timeline.yaml Schema
The output document includes: version, project, generated, milestones_file, summary (total days, project size, QA rounds, delivery model), timeline (milestones + delivery phases with start_day/completion_day/estimated_days), and workback (production deploy date, project start date, real calendar schedule).
See references/output-spec.md for the complete document specification with all fields, phase types, and workback calculation rules.
See references/example.yaml for a full example.
Example Output
See references/example.yaml for a complete sample timeline.
Gap Analysis
After generating timeline.yaml, perform a gap analysis and report findings inline.
Checks
Coverage
- Every milestone in
milestones.yamlappears intimeline.yaml - All milestone dependencies are respected (no milestone completes before its dependencies)
estimated_dayswas added to every milestone inmilestones.yaml
Duration Reasonableness
- No single milestone has
estimated_days: 0(flag for review) - No milestone exceeds 30 days without a note explaining the scope
- Duration conversions match the table in Step 2
Project Size Classification
is_large_projectcorrectly reflectstotal_development_days > 30ORmilestone_count > 5- QA rounds in
timeline.yamlmatch user-providedqa_rounds - QA Deadline phases each use
qa_days_per_rounddays
Delivery Model
ordering_strategywas read frommilestones.yaml(or defaulted tofoundation-first)delivery_modelintimeline.yamlsummary matches the resolved strategy- For
multi-pr: each milestone has a corresponding[milestone-id]-pr-creation / pr-review / review-feedback / mergeblock in the timeline;post-pr-creationthroughpost-mergeare absent from post-development phases - For all other strategies:
post-pr-creationthroughpost-mergeare present in post-development phases; no per-milestone PR blocks exist
Timeline Integrity
completion_dayvalues are strictly increasing for sequential milestones- Parallel milestones have correct independent
completion_dayvalues - Post-development phases follow immediately after
last_milestone_day total_delivery_days=completion_dayofpost-signoff
Workback Integrity
project_start_date=production_deploy_dateminustotal_delivery_daysbusiness daysproduction-deployentry date matchesproduction_deploy_date- All
completion_datevalues are on weekdays (Mon–Fri) workback.schedulecontains all entries fromtimelinein the same orderpost-signoffcompletion_date =production_deploy_date
Gap Analysis Report
After generating files, output a brief inline report:
## Timeline Gap Analysis
**Project:** [name]
**Delivery Model:** [ordering_strategy]
**Total Development Days:** [n] ([n] weeks)
**Total Delivery Days:** [n] (including post-dev phases)
**Project Size:** [Small / Large] ([reason if large])
**QA Rounds:** [n] × [qa_days_per_round] days each
**Production Deploy:** [YYYY-MM-DD]
**Project Start:** [YYYY-MM-DD]
**Checks:**
✓ All [n] milestones included
✓ Dependency order respected
✓ Duration conversions applied
[✓ / ✗] estimated_days added to milestones.yaml
[✓ / ✗] QA rounds match user-specified value ([n] rounds)
[✓ / ✗] All workback dates land on weekdays
[✓ / ✗] post-signoff completion_date = production_deploy_date
**Issues:** [none / list issues]
**Recommendations:** [none / list recommendations]If issues are found, ask:
"I found the following timeline issues: - [Issue 1] - [Issue 2] Would you like to: 1. Fix these issues now 2. Proceed with the timeline as-is 3. Manually adjust the estimates before generating"