Claude-skills-kit generate-plan-fact-report
git clone https://github.com/KirKruglov/claude-skills-kit
T=$(mktemp -d) && git clone --depth=1 https://github.com/KirKruglov/claude-skills-kit "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/project-management-kit/generate-plan-fact-report" ~/.claude/skills/kirkruglov-claude-skills-kit-generate-plan-fact-report && rm -rf "$T"
skills/project-management-kit/generate-plan-fact-report/SKILL.mdgenerate-plan-fact-report
Language Detection
Determine the language of the user's request:
- If the request is in Russian → use templates with
suffix-ru - Otherwise → use templates with
suffix-en
All output (headings, labels, comments, instructions) must match the detected language.
Triggers
Russian: «сформируй план-факт», «подготовь отчёт план/факт», «сравни план и факт» English: "generate plan-fact report", "plan vs actual", "variance report"
1. Input Data
| Data | Required | Source | Notes |
|---|---|---|---|
| Project plan | yes | knowledge () | Milestones, timelines, budget. If budget is missing — Section 3 is not generated |
| Actual data | yes | chat | User provides: actual milestone completion dates, actual costs by budget line, deliverable status. Free-form — agent structures it |
| Project charter | no | knowledge () | For deliverables list (Section 1, scope). If unavailable — request the list from the user |
| Report type | no | chat | (default) or . Affects header label only — logic is identical |
If required data is missing — request it:
To generate the plan-vs-actual report, the following are needed: 1. Project plan (project-plan.md) — in knowledge or paste into chat. 2. Actual data — in any format: — milestone completion dates (completed, not completed, actual date); — actual costs by budget line; — which deliverables have been delivered and which have not. Available: [list what is present]. Missing: [specify].
2. Execution Algorithm
- Check input data. Verify project plan and actual data are present. Missing → request using the template in §1. Do NOT generate a placeholder report. Present → proceed to step 2.
- Structure actual data. If free-form — organize across three dimensions: timelines (milestone dates), budget (costs by line), scope (deliverables). Note ambiguities and clarify with the user.
- Check for data conflicts. If plan data in chat conflicts with
— do NOT resolve independently. List the conflicts and ask which data is current. Exception: if the user explicitly corrects the plan in chat — apply the correction.project-plan.md - Determine report period. From actual data: project start → date of last recorded fact. If the user specified a period explicitly — use it.
- Read the template
orplan-fact-report-ru.md
from project knowledge (based on detected language).plan-fact-report-en.md - Extract planned data from
: milestones with dates, budget lines with amounts, deliverables list.project-plan.md - Compare plan vs. actual. For each row: calculate variance (absolute and %), assign status per §3 reference table.
- Fill template sections per Section 3 rules.
- Evaluate whether Section 4 is needed. Check statuses for all three dimensions independently: Timelines, Budget, Scope. Scope is a full dimension equal to timelines and budget. If at least one of the three has status
orattention
(including scope with incomplete deliverables) → fill Section 4. Only if all three arecritical
→ remove Section 4 entirely.on track - Validate the result using the checklist in Section 5.
- Present the result in chat:
- What was done: "Plan-vs-actual report generated for period [dates] based on [list sources]."
- Assumptions: list all (if any).
- Key variances: brief (1–3 lines) — main discrepancies and their statuses.
- Required action: "Approve, revise, or reject."
- Do not include internal file paths. Filename only: "Report saved as plan-fact-report.md."
- Wait for user response.
- Approval → finalize the document.
- Revisions → revise and present updated version. After the 3rd iteration — ask: "Continue revising or lock current version?"
- After approval:
- Offer the user text for
andlog.md
.project-state.md - Always notify, regardless of report type and variance statuses: "Plan-vs-actual report approved. Next task available: generate-closure-report (project closure report). Start?"
- Offer the user text for
3. Section Fill Rules
Reference: Variance Status Calculation
Applied to each parameter in Section 1 (summary) and to rows in Sections 2–3.
| Variance, % (absolute value) | Status |
|---|---|
| ≤ 10% | |
| 11–25% | |
| > 25% | |
Sign convention: positive = overrun / delay / shortfall; negative = savings / ahead of schedule / surplus.
Section 1. Summary
Three rows — aggregated variances across three dimensions.
- Timelines: Plan — total project duration (working days or calendar days). Actual — actual duration as of report date. If project is not complete — show actual duration with note "project not complete."
- Budget: Plan — total from
(orproject-plan.md
). Actual — sum of actual costs. Currency from input data.project-charter.md - Scope: Unit — number of deliverables from project charter (
, Section 2 "Project Deliverables"). Plan — total count. Actual — delivered count. If charter unavailable — request the deliverables list from the user.project-charter.md
For each row: calculate absolute variance, variance %, status per reference table.
Summary commentary — required text block after the table. 1–2 sentences per dimension: nature of variance and its cause. If status is
on track — state the fact without detailed analysis.
Section 2. Timelines
Row-by-row comparison of milestones from
project-plan.md.
- Include all milestones from the plan — not only completed ones.
- If a milestone is not complete — enter
in "Actual Date." Variance — dash.not complete - Variance in days:
. Positive = delay, negative = ahead of schedule.actual_date - planned_date - "Variance reason" — fill from user-provided actual data. If reason not stated — enter
.[clarify]
Section 3. Budget
Row-by-row comparison of cost lines from
project-plan.md (or project-charter.md).
- Include all cost lines from the plan. If no actual data for a line — actual = 0, note "data not provided" in comment.
- Last row — Total: sum of all rows. Verify: total actual = sum of actual rows.
- If a cash flow plan (breakdown by period) is unavailable — use linear distribution of budget over project duration, note
in comment. State as assumption.estimated - Currency — uniform across the entire report, from input data.
If budget is missing from the project plan and charter — Section 3 is not generated. Replace with note: "Budget section not included: planned budget data unavailable." In the summary (Section 1), replace the budget row with: "Budget — data unavailable."
Section 4. Recommendations / Next Steps
Conditional section. Generate only if at least one of the three dimensions (Timelines, Budget, Scope) has status
attention or critical. Scope is an independent dimension — its critical/attention status triggers Section 4 independently, even if timelines and budget are on track. If all three are on track — remove Section 4 entirely.
- For each variance with status
orattention
— formulate a recommended action.critical - Specify the owner (from project data) and deadline (if determinable from context). If not —
.[clarify] - Minimum 1 recommendation per
variance.critical
Header Metadata
: 1.0Version
: current generation dateDate
:Fileplan-fact-report.md
:Document status
(at generation). After approval —draft
.approved
:Period{{start_date}} — {{end_date}}
:Report type
orinterim
(from input; defaultfinal
)interim
: filename (e.g.Planned data source
)project-plan.md
: source description (e.g. "PM data provided in chat")Actual data source
4. Placeholder Reference
Placeholders
in the template are fill targets, not auto-substitution variables. Replace each with the corresponding value from input data.{{}}
| Placeholder | Required | Source | Allowed Values |
|---|---|---|---|
| yes | plan / charter | text |
| yes | system | YYYY-MM-DD |
| yes | plan / chat | YYYY-MM-DD |
| yes | chat | YYYY-MM-DD |
| yes | chat (default: interim) | / |
| yes | context | filename of planned data source |
| yes | context | description of actual data source |
| yes | plan | number + unit (days / working days) |
| yes | actual | number + unit |
| yes | calculated | signed number |
| yes | calculated | signed % |
| yes | calculated | / / |
| yes | plan / chat | currency symbol (₽, $, €) |
| no | plan | number |
| no | actual | number |
| no | calculated | signed number |
| no | calculated | signed % |
| no | calculated | / / |
| yes | charter / plan | number (deliverable count) |
| yes | actual | number (delivered count) |
| yes | calculated | signed number |
| yes | calculated | signed % |
| yes | calculated | / / |
| yes (≥1) | plan | milestone name |
| yes | plan | YYYY-MM-DD |
| no | actual | YYYY-MM-DD or |
| no | calculated | signed day count or dash |
| no | actual / agent | text or |
| no | plan | cost line name |
| no | plan | number |
| no | actual | number |
| no | calculated | signed number |
| no | calculated | signed % |
| no | actual / agent | text |
| no | calculated | sum of planned rows |
| no | calculated | sum of actual rows |
| no | calculated | difference of totals |
| no | calculated | % variance of total |
| no | agent | issue / observation description |
| no | agent | recommended action |
| no | project data | owner or |
| no | agent | deadline or |
5. Validation Checklist
Before presenting the result to the user — verify:
- All required placeholders replaced with values
- No
placeholders remaining in the text (except removed optional rows){{}} - Report period is valid: start_date < end_date
- Section 1 (summary) contains exactly 3 rows: timelines, budget, scope (if budget missing — 2 rows + note)
- Variance statuses calculated per §3 reference table (≤10% / 11–25% / >25%)
- Section 2: all milestones from the plan included (not only completed)
- Section 2: incomplete milestones show "not complete," variance is a dash
- Section 3: total = sum of rows (verify arithmetic)
- Section 3: if budget missing — section replaced with note
- Section 4: present if any
/attention
variances; absent if allcriticalon track - All agent assumptions listed when presenting the result
- Document status =
draft - File:
stated in headerplan-fact-report.md
6. Dependencies
Consumes (input):
— from skillproject-plan.md
(milestones, budget, timelines)generate-project-plan
— from skillproject-charter.md
(deliverables for scope metric)generate-charter- Actual data — from the user (via chat)
Produces (output): plan-vs-actual report → consumed by:
— Phase 6, Closinggenerate-closure-report
After approval, the user must upload
plan-fact-report.md to project knowledge so it is available for generate-closure-report.
7. Usage Example
User command:
Generate a plan-vs-actual report. Project plan is in knowledge. Actual data: — M1 (Go/No-Go): completed 11.04, on time. — M2 (Plan approved): completed 25.04, on time. — M3 (Prototype): completed 12.05, 3-day delay — design approval. — M4 (Development): not complete. — Budget: AWS — $10,400 (planned $8,000), design — $10,000 (on plan), rest on plan. — Deliverables: 3 of 5 delivered.
Agent response (after generation):
Plan-vs-actual report generated for period 07.04.2026 — 12.05.2026 based on: project-plan.md (knowledge), actual data from chat.
Assumptions:
- Budget lines without explicit data: actual = planned.
- Duration: actual — 35 days (from start to report date), planned — 63 days (full project). Project not complete.
Key variances:
- Scope: 3/5 deliverables (−40%) — status
.critical- AWS budget: +$2,400 (+30%) — status
.criticalRequired: approve, revise, or reject.
[report text]
Changelog
| Date | Version | Change |
|---|---|---|
| 2026-03-27 | 1.1 | §2 step 9: scope is an independent trigger for Section 4 (all three dimensions listed explicitly); §2 step 13: generate-closure-report offer is mandatory regardless of statuses; §3 Section 4: clarified that scope independently activates the section |
| 2026-03-26 | 1.0 | Skill created. Output format .md. Status calculation rules, conditional Section 4, scope metric — deliverables |