Track milestone progress across four layers of truth — decision state (PDR status), execution state (live issue tracker via MCP), evidence state (code-vs-PDR verification), and gate state (milestone gates). Shows honest completion, done-means warnings, and updates status only when all layers are green. Use for weekly progress checks and milestone validation.
npx skills add https://github.com/tikalk/adlc-team-skills --skill product-roadmap
Tracks product milestone progress across four layers of truth — because "done" is a stronger claim than "tasks complete":
| Layer | Question | Source |
|---|---|---|
| Decision | Was the decision made/approved? | PDR status (Proposed → Accepted → Completed) |
| Execution | Was the work done? | Live issue states via MCP (GitHub / GitLab / Jira / Linear) |
| Evidence | Does the code actually show it? | Code-vs-PDR verification (init concept) |
| Gates | Was the bar cleared? | Milestone PDR gate table |
A milestone is live only when all four layers are green. Anything less gets a done-means warning.
/product-specify or /product-init first)/product-specify)sh: scripts/bash/setup-product-roadmap.sh [--json]
ps: scripts/powershell/setup-product-roadmap.ps1
Read PDR files (memory first, drafts fallback):
{REPO_ROOT}/.adlc/memory/pdr/PDR-*.md (Accepted/Completed){REPO_ROOT}/.adlc/drafts/pdr/PDR-*.md (Proposed/Discovered)Identify milestones: PDRs with Category: Milestone. These define the roadmap structure and contain the ### Gates table, ### Features Included table, ### Done Means definition, and optional ### Tracker Milestone URL.
Extract issue URLs from all PDRs — look for ### Issues sections containing full URLs.
Detect tracker from URL host:
| URL host | Tracker | MCP tool pattern |
|---|---|---|
| github.com | GitHub | github_* MCP tools |
| gitlab.com | GitLab | gitlab_* MCP tools |
| *.atlassian.net | Jira | jira_* MCP tools |
| linear.app | Linear | linear_* MCP tools |
Query issue states — for each issue URL, use the matching MCP tool to get state (open/closed/in-progress):
GitHub: gh issue view NNN --json state,title,labels (CLI fallback if MCP unavailable)
GitLab: glab issue view NNN (CLI fallback)
Jira: jira issue view ISSUE-KEY (CLI fallback)
Linear: linear issue view ISSUE-ID (CLI fallback)
Native milestone link — if a milestone PDR has a ### Tracker Milestone URL:
Degradation ladder (when MCP or CLI unavailable):
gh/glab/jira/linear)Execution status per issue:
| State | Meaning |
|---|---|
| closed / done | ✅ Work complete |
| open + in-progress label/assignee | 🔄 In progress |
| open + unassigned | ⏳ Not started |
> Code is ground truth; PDRs are claims. A feature marked complete where the code shows nothing is drift.
For each feature PDR in a milestone, verify code evidence:
Mode A — Explicit Evidence (preferred):
### Evidence section (list of code paths/symbols)test -f "{path}" or test -d "{path}"verified (all paths exist) | stale (some paths missing) | missing (no Evidence section)Mode B — Heuristic (fallback, init-style):
Feature-Area directory exists: test -d "src/{feature-area}/"Hand-off rule: deep re-discovery is NOT roadmap's job. When evidence is missing/stale on a "Completed" item, the report says: *"⚠️ Code evidence missing — run /product-init to re-discover"*. Roadmap does lightweight checks; full discovery stays in init.
Read each milestone PDR's ### Gates table. For each gate:
| Gate type | How to check |
|---|---|
| engineering | Check linked issue states or Evidence verification |
| sign-off | Check for approval evidence (date recorded, approver named) |
| time | Calculate elapsed days since cutover date vs. required period |
Gate status: green (criterion met + evidence recorded) | pending (not yet met) | unknown (no gates section — legacy PDR)
Generate the combined four-layer progress report:
## Product Roadmap Progress
### M01: Q2 User Auth — *Done means: production traffic on new auth, legacy login retired*
Tracker: github.com/org/repo/milestone/3 (native: 67% closed, due Sep 5)
| Item | Decision | Execution | Evidence | Status |
|------|----------|-----------|----------|--------|
| PDR-003: OAuth2 login | ✅ Completed | ✅ 3/3 closed (#142–#144) | ✅ src/auth/oauth/ verified | Live |
| PDR-004: SSO | ✅ Accepted | 🔄 2/4 closed (#186–#189) | ⚠️ no evidence section | In progress |
| PDR-005: Password reset | 🔄 Proposed | ⏳ 0/2 (#190, #191) | ❌ src/auth/reset/ missing | Not started |
| Gate | Type | Owner | Status |
|------|------|-------|--------|
| Security review passed | engineering | Sec team | ✅ green |
| Clinician sign-off | sign-off | Maya | ⏳ pending |
| 7-day cooling period | time | Lead | ⏳ pending (day 3/7) |
**Features**: 1/3 · **Issues**: 5/9 closed · **Gates**: 1/3 green · **Live**: No
⚠️ Done-means check: "production traffic on new auth" cannot be true while
2 items lack execution and 2 gates are pending.
Done-means warnings — when a milestone claims "live" or "complete" but layers aren't green:
| Condition | Warning |
|---|---|
| All features Completed but issues still open | "⚠️ Features claim complete but N issues still open — execution not finished" |
| All issues closed but code evidence missing | "⚠️ Issues closed but code evidence missing — verify with /product-init" |
| All features done but gates pending | "⚠️ Features done, milestone NOT live — N gates pending: [list]" |
| Milestone marked Completed but no gates section | "⚠️ Milestone has no gates — consider adding acceptance criteria" |
Summary across milestones:
## Overall Roadmap
| Milestone | Target | Features | Issues | Gates | Live |
|-----------|--------|----------|--------|-------|------|
| M01: Q2 User Auth | Sep 5 | 1/3 | 5/9 | 1/3 | No |
| M02: Q3 Enhancements | Oct 15 | 0/2 | 0/5 | 0/2 | No |
Only if user explicitly requests update (e.g., "update" in arguments):
For each feature PDR:
CompletedFor each milestone PDR:
CompletedWrite updated PDR files with new status, preserving all other content.
Regenerate pdr.md index after any updates.
When querying issue states, detect available tools in this order:
github_* tools availablegitlab_* tools availablejira_* tools availablelinear_* tools availablegh CLIglab CLIjira CLIlinear CLI### Evidence with code paths--update blocks on pending issues/gates/evidence unless explicit override/product-implement regenerates PRD### Gates → gates layer = "no gates declared" + hint to add them### Issues → execution layer = "no tracker linkage"### Evidence → evidence layer = heuristic (Mode B)PDR_DRAFTS_DIR — {REPO_ROOT}/.adlc/drafts/pdrPDR_MEMORY_DIR — {REPO_ROOT}/.adlc/memory/pdrPRD_FILE — {REPO_ROOT}/PRD.mdgh, glab, jira, linear (fallback)| Rationalization | Reality |
|-----------------|---------|
| "The issues are all closed, so it's done." | Closed issues don't prove the code works. Evidence layer catches drift. |
| "I'll just mark the PDR as Completed manually." | Without gates green, "Completed" is a claim, not a verified state. --update blocks this. |
| "We don't need issue tracking — PDR status is enough." | Self-reported status drifts. Live tracker state is ground truth for execution. |
| "The roadmap can't reach the tracker, so let's skip it." | Degradation is built in — report "state unknown" and continue with other layers. |
--update blocked correctly on pending layers (if requested)pdr.md index regenerated after any updates--update explicitly requestedTake tikalk/product-roadmap from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.