success-plan-progress-review
$
npx mdskill add t0ddc3by/claude-for-customer-success/success-plan-progress-reviewGenerates a structured progress review artifact from an existing success plan canvas
- Identifies and reviews milestone status (On Track / At Risk / Missed) for each customer account.
- Assesses OCV outcome progress (Delivered / In Progress / Not Started / Blocked) based on provided updates.
- Evaluates the met/not-met status of success criteria against plan targets, providing detailed analysis.
- Prepares a pre-work note and optional customer-facing summary for upcoming QBRs.
SKILL.md
.github/skills/success-plan-progress-reviewView on GitHub ↗
--- name: success-plan-progress-review description: "Reviews an existing success plan canvas and generates a structured progress review artifact with milestone scorecard, OCV outcome ratings, CSM action list, and optional customer-facing summary and QBR pre-work note." version: "1.0.0" author: [email protected] tags: [csm, success-plan, progress-review, customer-success] deployment_target: plugin --- # /csm:success-plan-progress-review [PROPOSED] ## Overview `csm:success-plan-progress-review` generates a structured progress review artifact by reading an upstream success plan canvas and incorporating milestone and OCV updates provided by the CSM. ## Use When - A CSM needs to generate a structured progress review against an existing success plan canvas - Reviewing milestone status (On Track / At Risk / Missed) for a customer account - Assessing OCV outcome progress (Delivered / In Progress / Not Started / Blocked) - Evaluating success criteria met/not-met status against plan targets - Preparing for a QBR and need a pre-work note or customer-facing summary - Capturing a point-in-time progress snapshot for an account ## Do NOT Use For - Generating or modifying success plan canvases — use `csm:success-plan-canvas [operation=generate]` - Sending or drafting customer communications — use `csm:customer-comms` - Health score calculation or portfolio-level reporting — use `rev-ops:portfolio-health-report` - Automated milestone detection — the CSM provides milestone updates explicitly - Writing to OCV files — this skill is read-only with respect to canvas and OCV files ## Typical Activation "/csm:success-plan-progress-review Acme Corp" "How is [account] tracking against their success plan?" "Review progress on [customer]'s goals" "Pull the success plan progress for [account] before my QBR" **Inter-skill contract:** ``` csm:success-plan-canvas [operation=generate or refresh] ↓ emits context/success-plan-[safe_account]-[YYYY-MM-DD].md csm:success-plan-progress-review [operation=review] ↓ reads canvas file → emits context/progress-review-[safe_account]-[YYYY-MM-DD].md ``` This skill is the downstream consumer. The upstream canvas must exist before a review can be generated. --- ## Operations ### operation: review Reviews an existing success plan canvas and produces a dated progress review document. **Upstream canvas file resolution:** The skill locates the canvas at `context/success-plan-[safe_account]-[canvas_date].md`. If `canvas_date` is not provided, the skill scans for the most recent canvas file for the account using the `safe_account`-derived filename prefix. If no canvas file is found, the skill returns the following error and produces no partial output: ``` Error: No success plan canvas found for [account_name]. Expected file: context/success-plan-[safe_account]-[YYYY-MM-DD].md Run csm:success-plan-canvas [operation=generate] first. ``` **Inputs:** | Field | Type | Required | Description | |-------|------|----------|-------------| | `operation` | string | Yes | Must be `"review"` | | `account_name` | string | Yes | Account name — used to locate upstream canvas file and derive `safe_account` | | `csm_name` | string | Yes | Name of CSM conducting the review — display-only | | `review_date` | string | No | ISO date of review (defaults to today if not provided) | | `canvas_date` | string | No | ISO date of canvas to review against (defaults to most recent canvas for account) | | `milestone_updates` | list | Yes | List of milestone objects: `{milestone_name, status, notes}` where `status` is one of `On Track`, `At Risk`, `Missed` | | `ocv_updates` | list | No | List of OCV outcome objects: `{outcome_name, status, notes}` where `status` is one of `Delivered`, `In Progress`, `Not Started`, `Blocked` | | `key_benefits_realized` | list | No | CSM-provided list of concrete benefits the customer has already realized since the plan was created. When provided, rendered as a subsection of the Progress Scorecard and optionally surfaced in the customer-facing summary | | `success_criteria_status` | list | No | List of success criteria assessment objects: `{criterion, met, notes}` where `met` is boolean. When provided, adds a Success Criteria Evaluation section | | `include_customer_summary` | boolean | No | Default: `false`. When `true`, generates a customer-facing summary section using templates from `reference/customer-summary-templates.md` | | `include_qbr_note` | boolean | No | Default: `false`. When `true`, generates a QBR pre-work note section | | `notes` | string | No | CSM freeform notes — appended to the review document as display-only text | **`safe_account` derivation:** `account_name` → lowercase → replace all non-alphanumeric characters with `-` → collapse consecutive hyphens to a single `-` → trim to 30 characters. Examples: - `"Acme Corp"` → `acme-corp` - `"TechCo, Inc."` → `techco-inc` - `"Global Health & Wellness Partners"` → `global-health-wellness-partners` **Auto-ID generation:** Format: `REVIEW-[ACCT]-[YYYYMMDD]` - `ACCT`: first 4 alphabetic characters of `account_name`, uppercased, non-alpha characters stripped before extraction - `"Acme Corp"` → `ACME` - `"TechCo"` → `TECH` - `"123 Systems"` → `SYST` - `YYYYMMDD`: review date Example: `REVIEW-ACME-20260517` **Output artifact structure:** The review document contains up to 7 structured sections. Three are always present; four are conditional: | Section | Always Present | Condition | |---------|---------------|-----------| | Progress Scorecard | Yes | Always; includes `### Key Benefits Already Realized` subsection when `key_benefits_realized` is provided | | OCV Outcome Status | No | `ocv_updates` list provided and non-empty | | Success Criteria Evaluation | No | `success_criteria_status` list provided | | CSM Action List | Yes | Always (may note "No actions required — all milestones On Track" if applicable) | | Customer-Facing Summary | No | `include_customer_summary: true`; includes benefits realized when `key_benefits_realized` provided | | QBR Pre-Work Note | No | `include_qbr_note: true` | | Notes | Yes | Always (rendered as empty section if no `notes` provided) | Section assembly order in the output file is fixed: Progress Scorecard → OCV Outcome Status → Success Criteria Evaluation → CSM Action List → Customer-Facing Summary → QBR Pre-Work Note → Notes. **Console summary returned after successful execution:** ``` Review generated. review_id: REVIEW-[ACCT]-[YYYYMMDD] account: [account_name] csm: [csm_name] review_date: [review_date] canvas_ref: [plan_id from canvas frontmatter] at_risk: [n] missed: [n] file: context/progress-review-[safe_account]-[YYYY-MM-DD].md ``` **Output file naming pattern:** ``` context/progress-review-[safe_account]-[YYYY-MM-DD].md ``` Multiple reviews on the same date for the same account overwrite the prior file (no versioning in v1.0.0). --- ## Output Format **YAML frontmatter fields in the output file:** ```yaml --- review_id: REVIEW-ACME-20260517 account_name: Acme Corp canvas_reference: context/success-plan-acme-corp-2026-05-17.md plan_id: CANVAS-ACME-20260517 review_date: 2026-05-17 csm_name: Jane Smith created_at: 2026-05-17T14:00:00Z created_by: [email protected] milestone_summary: on_track: 3 at_risk: 1 missed: 0 includes_key_benefits_realized: true includes_success_criteria_evaluation: false includes_customer_summary: false includes_qbr_note: true --- ``` **Immutable fields (set at creation; not modified in subsequent operations):** | Field | Reason | |-------|--------| | `review_id` | Identity key | | `created_at` | Audit timestamp | | `created_by` | Audit identity | | `canvas_reference` | Source artifact reference — must match upstream canvas used at review time | | `account_name` | Account identity | **Document body header:** ```markdown # Progress Review: [account_name] — [review_date] **CSM:** [csm_name] **Review Date:** [review_date] **Canvas Reference:** [plan_id] --- ``` **Progress Scorecard section format:** ```markdown ## Progress Scorecard | Milestone | Status | Notes | |-----------|--------|-------| | [milestone_name] | On Track / At Risk / Missed | [notes] | ### Key Benefits Already Realized (Conditional — present when key_benefits_realized provided) - [benefit 1] - [benefit 2] ``` **OCV Outcome Status section format (conditional):** ```markdown ## OCV Outcome Status | Outcome | Status | Notes | |---------|--------|-------| | [outcome_name] | Delivered / In Progress / Not Started / Blocked | [notes] | ``` **Success Criteria Evaluation section format (conditional):** ```markdown ## Success Criteria Evaluation | Criterion | Met | Notes | |-----------|-----|-------| | [criterion] | Yes / No | [notes] | ``` **CSM Action List section format:** ```markdown ## CSM Action List (Actions generated from At Risk and Missed milestones per milestone-rating-guide.md) | Milestone | Status | Recommended Action | |-----------|--------|--------------------| | [milestone_name] | At Risk / Missed | [action] | (When all milestones are On Track: "No immediate actions required — continue monitoring.") ``` **Customer-Facing Summary section format (conditional):** ```markdown ## Customer-Facing Summary (Tone determined by milestone mix per customer-summary-templates.md) [Customer-facing narrative paragraph(s)] **Key Benefits Realized** (conditional — when key_benefits_realized provided) [Benefits realized in customer-facing language] ``` **QBR Pre-Work Note section format (conditional):** ```markdown ## QBR Pre-Work Note **Milestone Summary:** [on_track] on track, [at_risk] at risk, [missed] missed **Key Wins:** [list] **Open Risks:** [list] **Suggested Discussion Agenda:** - [item] ``` **Notes section format:** ```markdown ## Notes [CSM freeform notes, or empty] ``` --- ## Pre-flight Read `~/.claude/plugins/config/claude-for-customer-success/csm/CLAUDE.md` and `~/.claude/plugins/config/claude-for-customer-success/company-profile.md`. If either is missing or contains `[PLACEHOLDER]` markers, stop and prompt for `/csm:cold-start-interview`. Note from config: - CS motion — shapes how directive vs. collaborative the progress review framing is - Health model — provides context for milestone status interpretation and escalation thresholds - Escalation matrix — required if milestone ratings trigger escalation routing - Integrations — determines which data sources are available for canvas and OCV resolution **`context/` path resolution:** Inter-skill artifacts (`context/success-plan-*` and `context/progress-review-*`) resolve relative to the session working directory at runtime. In a Claude Code plugin deployment, this is the directory from which Claude Code is launched. Both this skill and `csm:success-plan-canvas` must operate from the same working directory for the inter-skill contract to hold. **G-code dependency:** All G-code guardrails referenced in this skill (G1–G9) are defined in the CLAUDE.md config loaded above. If Pre-flight halts or config is missing, G-codes are undefined — do not proceed with partial config. --- ## Reasoning Protocol > Blueprint: `references/reasoning-blueprint.md` (on-demand only) Before generating output, apply these primers: 1. **CLASSIFY** — Determine operation validity and data completeness before proceeding: - Is `operation` present and equal to `"review"`? If absent or any other value → return an error and halt before any output. - Is `account_name` non-empty? If not → reject immediately with a clear error; do not attempt canvas resolution. - Does an upstream canvas file exist for this account (located via `canvas_date` or most-recent scan)? If not → return the canonical canvas-not-found error and halt; produce no partial output. - Are `milestone_updates` provided and non-empty? If absent → halt with a missing-required-input error; the progress scorecard cannot be generated without milestone data. - CLASSIFY is complete when: operation confirmed as `"review"`, `account_name` validated, canvas file located and readable, `milestone_updates` present. 2. **CONSTRAINTS** — Apply before generating any output (blocking before non-blocking): - **C-1 BLOCKING**: `account_name` must be non-empty — reject all operations if absent; `safe_account` derivation cannot proceed. - **C-2 BLOCKING**: Canvas file must exist for the target account before any review output is generated — return the canonical error message exactly as specified; do not generate partial output. - **C-3 BLOCKING**: `milestone_updates` must be provided and non-empty — the Progress Scorecard is always-present and cannot be built without milestone data. - **C-4 BLOCKING**: Each `milestone_updates[].status` value must be one of `On Track`, `At Risk`, `Missed` — halt with a validation error on any invalid value; do not process the remaining list. - **C-5 BLOCKING**: Each `ocv_updates[].status` value (when provided) must be one of `Delivered`, `In Progress`, `Not Started`, `Blocked` — halt with a validation error on any invalid value. - **C-6 Non-blocking**: `safe_account` derivation (lowercase → replace non-alphanumeric with `-` → collapse hyphens → trim to 30 chars) must be applied before any file path construction — never use raw `account_name` in a path. - **C-7 Non-blocking**: Canvas content is read-only; this skill never writes to canvas files or OCV files under any condition — write scope is `context/progress-review-*` only. - G5: Internal data (health scores, ARR, expansion signals) must never appear in customer-facing output - G7: Flag any data older than 30 days with source date and staleness indicator 3. **EXPERT CHECK** — What a veteran CSM verifies before generating a progress review: - Do the `milestone_updates` statuses reflect the current state rather than the planned state? A CSM who copies milestone names from the canvas without providing actual status assessments produces a review that adds no signal. Flag if all milestones are listed as `On Track` with no notes — this pattern often signals incomplete input rather than genuine account health. - For `At Risk` milestones: does each entry include a `notes` field with a specific reason? A bare `At Risk` status without a root cause observation produces a CSM Action List with generic recommendations — flag for input enrichment. - For `Missed` milestones: has the escalation threshold check (Step 8, `reference/milestone-rating-guide.md` § 2) been applied? A missed milestone on a high-ARR account or near-renewal account may trigger escalation — this check must not be skipped. - If `include_customer_summary: true`: does the milestone mix support the tone selected from the template? A cautionary summary generated from an all-`On Track` milestone set is misaligned — verify tone selection against the actual milestone_summary counts. - If `include_qbr_note: true`: are `key_benefits_realized` entries present? A QBR Pre-Work Note without Key Wins forces the template to fall back to `On Track` milestones — this produces weaker pre-work material; prompt the CSM to provide explicit benefits if absent. 4. **ANTI-PATTERNS** — Mistakes to catch before generating output: - **AP-1 Partial output on canvas-not-found**: beginning any section generation before the canvas file has been confirmed readable — the error path must halt all output, not produce a partial review with a warning appended. - **AP-2 Invalid status values silently coerced**: accepting a `milestone_updates[].status` of `"Delayed"` or `"Complete"` and mapping it to a valid enum value — invalid values must surface as validation errors, not be silently normalized. - **AP-3 Customer-facing summary with internal language**: allowing health tier labels (`Red`, `Yellow`, `Green`), escalation routing details, ARR values, or internal action items to appear in the Customer-Facing Summary section — customer output is firewalled from internal language. - **AP-4 Notes field overwrite**: if a prior review file exists for the same account and date, overwriting prior notes without surfacing the conflict — v1.0.0 behavior is overwrite, but the CSM should be aware. - **AP-5 QBR note without risk acknowledgment**: generating a QBR Pre-Work Note that lists only Key Wins when At Risk or Missed milestones are present — the Open Risks section must reflect the milestone mix, not be omitted for tone reasons. **After execution**, verify: - Does the output file contain all required sections in fixed order (Progress Scorecard → OCV Outcome Status → Success Criteria Evaluation → CSM Action List → Customer-Facing Summary → QBR Pre-Work Note → Notes)? Are conditional sections present only when their conditions were met? - Is the YAML frontmatter complete? Are `review_id`, `canvas_reference`, `plan_id`, `milestone_summary` counts, and all `includes_*` boolean flags correctly populated? - For any `At Risk` or `Missed` milestones: does the CSM Action List contain specific actions (not generic "monitor closely" entries)? - Is the `safe_account` derivation applied correctly in the output file path? Does `canvas_reference` point to the exact canvas file that was read? - Is the customer-facing language firewall intact? No health scores, escalation identifiers, ARR values, or internal routing language in the Customer-Facing Summary or QBR Pre-Work Note. - Confidence: [High] if canvas file confirmed readable with complete frontmatter, all milestone statuses are valid enum values, and `milestone_updates` entries include notes / [Medium] if canvas file located but some frontmatter fields missing, or milestone entries lack notes for At Risk/Missed statuses / [Low] if canvas file not found and operating on CSM-provided description only, or if `milestone_updates` statuses are unvalidated — state which. Execute the following steps in order for every `review` operation. Do not skip steps or reorder them. **Step 1 — Resolve `safe_account`** Derive `safe_account` from `account_name`: lowercase → replace all non-alphanumeric characters with `-` → collapse consecutive hyphens → trim leading/trailing hyphens → truncate to 30 characters. Store as the path-construction token. The original `account_name` is `display_account` — used only in document content. **Step 2 — Locate upstream canvas file** If `canvas_date` is provided, attempt to read `context/success-plan-[safe_account]-[canvas_date].md`. If `canvas_date` is not provided, scan `context/success-plan-[safe_account]-*.md` for the most recent file by date suffix. If no matching canvas file is found, return the error message exactly as specified and halt — produce no partial output: ``` Error: No success plan canvas found for [account_name]. Expected file: context/success-plan-[safe_account]-[YYYY-MM-DD].md Run csm:success-plan-canvas [operation=generate] first. ``` **Step 3 — Read canvas frontmatter** From the located canvas file, extract: `plan_id`, `plan_type`, `csm_name` (if `csm_name` input is not provided), and `account_stage`. These values populate the review document frontmatter and inform section structure expectations based on `plan_type` (initial vs expansion vs renewal-refresh). **Step 4 — Generate `review_id`** Format: `REVIEW-[ACCT]-[YYYYMMDD]`. Derive `ACCT`: strip all non-alphabetic characters from `account_name`, take the first 4 characters, uppercase. Derive `YYYYMMDD` from `review_date` (or today if not provided) with hyphens removed. **Step 5 — Build Progress Scorecard** Iterate `milestone_updates`. Validate each `status` value against the allowed enum (`On Track`, `At Risk`, `Missed`); halt with validation error on any invalid value. Count on_track, at_risk, and missed totals for `milestone_summary`. Render the milestone status table. If `key_benefits_realized` is provided and non-empty, append the `### Key Benefits Already Realized` subsection and set `includes_key_benefits_realized: true`. **Step 6 — Build OCV Outcome Status section (conditional)** If `ocv_updates` is provided and non-empty, validate each `status` value against the OCV enum (`Delivered`, `In Progress`, `Not Started`, `Blocked`). Render the OCV outcome status table. If `ocv_updates` is absent or an empty list, omit this section entirely. **Step 7 — Build Success Criteria Evaluation section (conditional)** If `success_criteria_status` is provided, render the success criteria table with `met` displayed as `Yes` / `No`. Set `includes_success_criteria_evaluation: true`. Apply evaluation logic from `reference/milestone-rating-guide.md` § 4 — flag unmet criteria with no corresponding At Risk or Missed milestone for additional CSM action items. **Step 8 — Build CSM Action List** Apply action generation logic from `references/milestone-rating-guide.md` § 3. For each `At Risk` milestone, generate investigation and intervention actions. For each `Missed` milestone, generate recovery and escalation actions. Apply escalation threshold logic from § 2. If all milestones are `On Track`, render: "No immediate actions required — continue standard monitoring cadence." **Step 9 — Build Customer-Facing Summary (conditional)** If `include_customer_summary: true`, select the appropriate tone template from `reference/customer-summary-templates.md` based on the milestone mix (positive / cautionary / escalation). Incorporate `key_benefits_realized` using customer-facing language guidance from that file. Set `includes_customer_summary: true`. **Step 10 — Build QBR Pre-Work Note (conditional)** If `include_qbr_note: true`, generate the QBR Pre-Work Note using the template from `reference/customer-summary-templates.md` § 5. Populate Key Wins from `key_benefits_realized` (or On Track milestones if key_benefits_realized is absent). Populate Open Risks from At Risk and Missed milestones. Set `includes_qbr_note: true`. **Step 11 — Assemble and write output file** Construct the YAML frontmatter block with all required fields. Assemble document sections in fixed order: Progress Scorecard → OCV Outcome Status → Success Criteria Evaluation → CSM Action List → Customer-Facing Summary → QBR Pre-Work Note → Notes. Write the complete document to `context/progress-review-[safe_account]-[review_date].md`. Return the console summary. --- ## Reviewer note > **⚠️ Reviewer note** > - **Sources:** [CS Platform ✓ live — usage, milestone data | CS Platform [configured but unverified] | CRM ✓ live — account context | CRM [configured but unverified] | document storage: canvas from [date] | user provided | not connected — conversation context only] > - **Data as of:** [timestamp per source] > - **Flagged for your judgment:** [N items marked `[review]` inline | none] > - **Before sending:** Confirm progress data is current (CS Platform data >30 days old is directional only). Do not share internal health score components in customer-facing progress summary. --- ## Security & Permissions - **Network access:** none - **Filesystem read scope:** `context/success-plan-*` (upstream canvas files — read-only); `context/progress-review-*` (own output files — read for conflict detection) - **Filesystem write scope:** `context/progress-review-*` only - **Subprocess execution:** none - **Dynamic code execution:** none This skill does not read, write, or modify any file outside the `context/` directory. It does not write to canvas files or OCV files under any condition. --- ## Trust & Verification - `account_name` is sanitized via the `safe_account` function (alphanumeric + hyphen, max 30 chars) for all filesystem path construction. The unsanitized value (`display_account`) is used only in document content — never in path construction. - `milestone_updates` and `ocv_updates` list items (including `milestone_name`, `outcome_name`, and `notes` fields) are treated as display-only. They are never used in filesystem path construction, logic branching, or code execution. - `notes` input is treated as display-only freetext. It is rendered into the Notes section of the output document without interpretation. - `csm_name` is treated as display-only. It is never used in filesystem path construction. - Canvas content loaded from the upstream file is rendered into the review document as display content. It is never executed, evaluated, or interpolated into skill logic. - All path construction uses only `safe_account` (derived from `account_name`) and `review_date` (ISO date). No other user input reaches path construction. --- ## Reference Files The following reference files are loaded on-demand during skill execution: | File | Purpose | Loaded When | |------|---------|-------------| | `references/progress-review-schema.md` | Canonical review record format, YAML frontmatter field definitions, section assembly order, field validation rules, auto-ID generation rules | Every `review` operation | | `references/milestone-rating-guide.md` | Rating criteria for On Track / At Risk / Missed; escalation thresholds; CSM action generation logic per rating; Success Criteria evaluation logic; Measures of Success assessment; Key Benefits Already Realized guidance | Every `review` operation | | `references/customer-summary-templates.md` | Customer-facing language templates by milestone status (positive, cautionary, escalation tones); QBR pre-work note structure and language guidance | When `include_customer_summary: true` or `include_qbr_note: true` | | `references/reasoning-blueprint.md` | Problem classification taxonomy, domain heuristics, common failure modes, and expert judgment patterns for this skill | On-demand per Reasoning Protocol | --- ## Examples ### Example 1 — Basic progress review ``` csm:success-plan-progress-review operation: review account_name: Acme Corp csm_name: Jane Smith milestone_updates: - milestone_name: "Complete onboarding for 3 admin users" status: On Track notes: "All 3 admins completed training last week" - milestone_name: "Achieve 80% DAU adoption in core module" status: At Risk notes: "Currently at 52% DAU; adoption stalled in ops team" - milestone_name: "Complete integration with Salesforce" status: Missed notes: "IT resourcing delayed; now targeting Q3" ``` **What this produces:** - Reads `context/success-plan-acme-corp-[most-recent-date].md` - Creates `context/progress-review-acme-corp-2026-05-17.md` - Output includes: Progress Scorecard, CSM Action List, Notes - Console summary: 1 At Risk, 1 Missed --- ### Example 2 — Full review with OCV updates, success criteria, customer summary, and QBR note ``` csm:success-plan-progress-review operation: review account_name: Acme Corp csm_name: Jane Smith review_date: 2026-05-17 canvas_date: 2026-03-01 milestone_updates: - milestone_name: "Complete onboarding for 3 admin users" status: On Track notes: "All 3 admins certified" - milestone_name: "Achieve 80% DAU adoption in core module" status: At Risk notes: "52% DAU — ops team lagging" ocv_updates: - outcome_name: "Reduce manual reporting time by 40%" status: In Progress notes: "Reporting automation deployed; measuring impact" - outcome_name: "Enable real-time pipeline visibility" status: Delivered notes: "Live dashboards confirmed by VP Sales" key_benefits_realized: - "Admin team onboarded and self-sufficient — no support tickets in 30 days" - "Real-time pipeline dashboard live — VP Sales confirmed visibility improvement" success_criteria_status: - criterion: "3 admin users certified" met: true notes: "All 3 completed certification 2026-04-15" - criterion: "80% DAU in core module" met: false notes: "Currently 52%; ops team adoption lagging" include_customer_summary: true include_qbr_note: true notes: "QBR scheduled for 2026-06-01. Ops team adoption is the key risk to address." ``` **What this produces:** - Reads `context/success-plan-acme-corp-2026-03-01.md` (explicit canvas_date) - Creates `context/progress-review-acme-corp-2026-05-17.md` - Output includes all 7 sections: Progress Scorecard (with Key Benefits Already Realized subsection), OCV Outcome Status, Success Criteria Evaluation, CSM Action List, Customer-Facing Summary (with benefits realized), QBR Pre-Work Note, Notes - Console summary: 1 At Risk, 0 Missed