Okr progress narrator
Skill KirKruglov/claude-skills-kit/skills/status-reports-and-stakeholder-updates/okr-progress-narrator
70+ curated agent skills for Claude Cowork and Claude.ai — ready-to-use tools for non-technical users: project management, productivity, and AI workflow automation
npx -y skills add KirKruglov/claude-skills-kit --skill okr-progress-narratorAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 14 stars14 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Transform raw OKR data (metrics, percentages, notes) from files or pasted text into a readable narrative progress update for stakeholders. Use when preparing weekly or quarterly OKR reports, board updates, or team syncs. Triggers: 'okr update', 'narrate okr progress', 'stakeholder okr update', 'generate okr report', 'okr status update', 'окр апдейт', 'нарратив по OKR', 'прогресс-апдейт для стейкхолдеров', 'оформи OKR', 'прогресс по целям'.
SKILL.md
10.7 KB, as published. Nobody here has run it
OKR Progress Narrator
This skill takes raw OKR data — tables, lists, or free-form notes with objectives, key results, current values, and targets — and converts them into a structured narrative progress update in okr-update-YYYY-MM-DD.md. The output is designed to be shared directly with stakeholders: executive summary, per-objective narrative, KR status table, risks, and next steps.
Input:
- OKR data as a file (
.md,.txt,.csv) or pasted text in chat - Optional: period label (Q1 2026, Sprint 12), audience (CEO, board, team), tone
Output:
okr-update-YYYY-MM-DD.md— narrative update with executive summary, per-objective sections, and risk block
Language Detection
Detect the user's language from their message and OKR data:
- If Russian (or Cyrillic content): respond and write the output document in Russian, using the output template below with translated section headers (e.g., "Итоговая сводка", "Цели", "Ключевые риски", "Следующие шаги")
- If English: respond and write the output document in English with standard headers
- If ambiguous: use the language of the trigger phrase
- Translate objective/KR names to the output language if the source is mixed-language
Instructions
Step 1: Validate and Parse Input
-
Identify the input source:
- File path provided: Read the file. Supported formats:
.md,.txt,.csv - Text pasted in chat: Use the message content directly
- No input provided: Ask the user via AskUserQuestion to provide OKR data (file or paste)
- File path provided: Read the file. Supported formats:
-
Parse OKR structure — detect one of these layouts:
- Markdown table: columns map to Objective / Key Result / Current / Target / %Progress / Status / Notes
- Indented list:
Objective:orO1:as headers,- KR:orKR1.1:as children - CSV/TSV: use header row to identify columns
- Free-form text: extract Objective/KR pairs using keyword matching (Objective, Goal, KR, Key Result, Target, Цель, КР, Результат)
-
For each Key Result, identify:
- Name / description
- Current value (numeric or qualitative)
- Target value (if present)
- Direction: whether higher or lower values are better (default: higher is better)
- If metric name contains keywords like "churn", "rate" (in negative context), "cost", "time", "latency", "errors": assume lower is better
- Otherwise: higher is better
- % progress (compute if current + target present):
- If higher is better:
round(current / target * 100) - If lower is better and current ≤ target:
✅ exceeded (goal met) - If lower is better and current > target: shortfall percentage =
round(((current - target) / target) * 100)(used to classify severity, not as actual progress)
- If higher is better:
- Status (on track / at risk / off track) — use provided value, or derive from % (see Step 2)
- Notes / context (optional)
-
If file cannot be read or OKR structure is unrecognizable:
- Stop. Report: "Could not recognize OKR structure in [filename / input]. Please provide data with Objective and Key Result fields."
-
Capture optional parameters:
- Period: from user message or file metadata (e.g., "Q2 2026", "April")
- Audience: CEO / board / team / general (default: general)
- Tone: formal / conversational (default: formal)
- Focus: all / at-risk-only / highlights-only (default: all)
Step 2: Classify Status
For each Key Result:
- If status is explicitly provided in the data → use it as-is
- If status is absent but a qualitative marker is present (e.g., "done", "completed", "✅", "achieved"):
- Mark as
✅ exceededif the description indicates completion or overachievement
- Mark as
- If status is absent but notes or context suggest risk (e.g., "blocked", "slipped", "at risk", "delayed", "behind"):
- Mark as
🟡 at risk(even if percentage is on track) - Exception: if notes clearly describe a temporary issue and the underlying metrics are strong, use percentage-based classification
- Mark as
- If status is absent but % progress is computable:
- For "higher is better" metrics:
- Determine metric category and apply appropriate threshold:
- Business-critical metrics (keywords: "revenue", "MRR", "ARR", "sales", "deal", "customer value", "engagement", "retention", "growth"): ≥ 85% on track
- All other operational/technical metrics: ≥ 70% on track
- Based on category:
- ≥ threshold:
🟢 on track - 50%–(threshold-1)%:
🟡 at risk - < 50%:
🔴 off track -
100%:
✅ exceeded
- ≥ threshold:
- Determine metric category and apply appropriate threshold:
- For "lower is better" metrics (e.g., churn, cost, latency):
- If current ≤ target:
✅ exceeded(goal met) - If current > target: classify by shortfall percentage =
((current - target) / target) * 100- Shortfall > 20%:
🔴 off track(significantly worse than target) - Shortfall 10–20%:
🟡 at risk(moderately worse than target) - Shortfall ≤ 10%:
🟢 on track(slightly worse but within acceptable margin)
- Shortfall > 20%:
- If current ≤ target:
- For "higher is better" metrics:
- If neither status nor numeric data is available:
- Mark as
⬜ no data— do not invent a status
- Mark as
Derive Objective status:
- 🟢 if all KRs are on track or exceeded
- 🟡 if any KR is at risk
- 🔴 if any KR is off track
- ⬜ if all KRs have no data
Step 3: Generate Narrative
For each Objective:
-
Write a narrative paragraph (2–4 sentences):
- What has been achieved so far
- What the current state implies (momentum, risk, or completion)
- If notes/context are available → weave them in naturally
- Do NOT repeat exact numbers already shown in the KR table
- Do NOT invent reasons for low progress if not provided in data
-
Adapt to audience:
- CEO / board:
- Lead with business impact and strategic implications
- Skip implementation details, engineering blockers, tactical issues
- Use outcome-focused language: "revenue target within reach", "market opportunity", "delivery risk identified", "strategic pivot needed"
- Emphasize why each KR matters to the business
- For at-risk items: state the business impact and mitigation approach (if known)
- Team: Include operational detail, blockers, dependencies, and next steps if present
- General (default): Neutral business tone. Balanced detail — progress + context without excessive implementation specifics
- CEO / board:
-
Apply focus filter if specified:
at-risk-only: include only 🟡 and 🔴 objectives in per-objective sectionshighlights-only: include only 🟢 and ✅ objectivesall(default): include all objectives
Edge Cases:
- KR with % > 100: show as-is, mark
✅ exceeded, phrase as achievement in narrative (e.g., "exceeded target by X%") - KR with no numeric data and no notes: write "Data not yet reported for this period"
- All KRs are 🟢 or ✅: omit "Key Risks" section entirely; do not force a risk if none exists
- Only 1 KR with no parent Objective: group under a generic "Overall Metrics" (or in Russian: "Ключевые метрики") objective header; create a single objective section
- Mixed languages in data (EN objective names + RU notes): normalize to the output language (use output language setting from Step 1); translate objective/KR names and notes if needed
Step 4: Generate Executive Summary
Write 2–4 sentences covering:
- How many objectives are on track / at risk / off track (e.g., "2 of 3 objectives are on track")
- Top highlight: the best-performing KR or achieved milestone
- Top risk: the most critical at-risk or off-track item (skip if none)
Keep the summary self-contained — it should make sense without reading the full document.
Step 5: Compile Document
Assemble the output using the template below. Apply these rules:
- Omit "Key Risks" section if all KRs are on track (🟢) or exceeded (✅); always include it if any KR is 🟡 or 🔴
- Omit "Next Steps" section if no next-step data, action items, or blockers are present in the input or notes
- Use period label if provided (e.g., "Q2 2026", "April"); otherwise use "Current Period"
- Round all percentages to nearest whole number
- If audience is CEO: ensure narrative is outcome-focused and strategic; remove tactical details
Step 6: Save Output
- Write file as
okr-update-YYYY-MM-DD.md(today's date) - Save to:
- The folder containing the input file (if file was provided)
- The working directory (if text was pasted)
- Confirm: "Saved: okr-update-[date].md — [N] objectives, [N] KRs. [N] at risk."
Output Format
# OKR Progress Update — [Period]
**Prepared:** YYYY-MM-DD
**Audience:** [if specified]
---
## Executive Summary
[2–4 sentences: overall status, top highlight, top risk]
---
## Objectives
### [Objective 1 Name] — 🟢 On Track
[Narrative paragraph: 2–4 sentences on progress, momentum, notable context]
| Key Result | Current | Target | Progress | Status |
|------------|---------|--------|----------|--------|
| [KR 1.1] | [value] | [value]| [%] | 🟢 |
| [KR 1.2] | [value] | [value]| [%] | 🟡 |
---
### [Objective 2 Name] — 🔴 Off Track
[Narrative paragraph]
| Key Result | Current | Target | Progress | Status |
|------------|---------|--------|----------|--------|
| [KR 2.1] | [value] | [value]| [%] | 🔴 |
---
## Key Risks
| Key Result | Objective | Status | Context |
|------------|-----------|--------|---------|
| [KR name] | [O name] | 🔴 | [note] |
---
## Next Steps
- [Next planned action if present in data]
---
*Generated by okr-progress-narrator · [date]*
Negative Cases
- No input provided → ask for OKR data via AskUserQuestion; do not generate a blank document
- File path provided but file does not exist → stop; report exact path checked; ask user to verify
- Input file has no recognizable OKR structure → stop; report the file name; suggest format hint
- All objectives have no data (
⬜) → generate document but flag in Executive Summary: "No quantitative data available for this period — narrative based on qualitative notes only" - Period specified but data appears to be from a different period → include a note: "Note: data timestamps suggest this may be from [inferred period]. Review before sharing."
Gives 0 of the 12 instructions most roadmap strategy skills give
Counted across 591 of the 672 authors here whose files we hold, read 2026-08-06
- read product marketing context before asking questionsin 21 of 591, across 10 files
- base price on perceived value, not costin 15 of 591, across 4 files
- compact after finalizing a planin 14 of 591, across 9 files
- differentiate tiers using features, limits, or supportin 14 of 591, across 3 files
- use Van Westendorp to find acceptable price rangein 13 of 591, across 2 files
- use MaxDiff to identify highly valued featuresin 13 of 591, across 2 files
- map topics to buyer journey stagesin 12 of 591, across 6 files
- Extract domain capabilities and classify subdomainsin 11 of 591, across 1 file
- Define bounded contexts around consistency and ownershipin 11 of 591, across 1 file
- Establish a ubiquitous language glossary and anti-termsin 11 of 591, across 1 file
- Capture context boundaries in ADRs before implementationin 11 of 591, across 1 file
- Open the strategic design template if neededin 11 of 591, across 1 file
Said here and by no other author read
- detect input language and write output in it
- ask user for data if none is provided
- parse OKR structure from files or text
- compute progress percentages for each key result
- classify key result status from data or computed progress
- derive objective status from its child key results
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once.