Property Project Manager · Monthly Operations Performance PPT
The core isn't 'putting data on slides', it's arranging the story according to the audience's cognitive sequence: first make the operational fundamentals clear, then pinpoint anomalies to responsible people with deadlines.
This Skill's Knowledge is Stored in Two Places
| File | Who Reads It | What It Contains |
|---|---|---|
SKILL.md (this file) | Humans / Agent | Why it's presented this way: narrative rationale, attribution methods, expression discipline |
deck_spec.json | Tool | How to implement: number of slides, order, conclusion sentence templates, color palette |
deck_spec.json is this skill's machine-readable knowledge. Change it to adjust the PPT's slide count and narrative approach—no Python code changes needed:
{
"page_rules": [ // ← 'How many slides for the PPT' is defined here
{"max_minutes": 10, "sections": [7 sections]},
{"max_minutes": 20, "sections": [11 sections]},
{"max_minutes": 40, "sections": [16 sections]}
],
"sections": [{
"key": "revenue", "label": "Revenue", "layout": "chart",
"data": {"value_column": "Bill Amount (CNY)", "group_column": "Charge Item"},
"narrative": [ // ← Conclusion sentence templates: from 'reciting numbers' to 'giving judgment'
{"when": "top_share > 0.9",
"so_what": "{top_name} accounts for {top_share_pct}% of revenue; the structure is singular and risk-resistance is weak; next month, public-area income should be made a special focus."},
{"when": "", "so_what": "...default clause..."}
]
}],
"theme": {"colors": {...}, "palette": [...]} // ← Color scheme is also knowledge
}
How the Conclusion Sentence Templates Work
The engine selects the first matching template from the list based on the when condition and fills the {placeholders} with actual data.
Available placeholders (auto-calculated from data): {total} {count} {top_name} {top_share} {top_share_pct} {group_count} {bottom_name} {bottom_value} …
Formatting suffixes: {total:万} (÷10000) {share:1%} (ratio → percentage) {count:,} (thousands separator) {value:2} (decimal places)
Supported conditions: > >= < <= == !=, and/or/not, has(x)/empty(x). Unparseable conditions are treated as 'not matched' and will not cause errors.
When data is missing, honestly degrade: annotate the page title with 'Data missing, pending supplement', and never impersonate using a different column. For example, if the 'Cost' page declares the column
Cost Itembut the data lacks it, the page will explicitly state what is missing.
Metrics Must Be Calculated from Data, Not Manually Transmitted
The derived section declares 'how to calculate', and the tool handles the calculation:
"derived": {
"Received Amount (CNY)": {"expr": "Bill Amount (CNY) - Unpaid Amount (CNY)"}, // row-by-row, becomes a new column
"Collection Rate": {"expr": "Received Amount (CNY) / Bill Amount (CNY) * 100",
"scope": "total", "format": "{:.2f}%"} // Calculates one **single number** for the total sum
}
⚠ The default
scopeisrow(calculates row by row, result becomes a new column); ratio-type metrics MUST usescope: "total"— calculating ratios row by row and then summing will lead to absurd values like 1,476,800%.
The calculated values are automatically merged into the narrative fact table, so {Collection Rate} can be directly used in conclusion sentence templates.
Verified with actual data (2、应收信息.xlsx): Collection rate = 92.48%, Arrears rate = 7.52%. Cross-checking by 'Payment Status' group matches perfectly (sum of unpaid for paid rows = 0).
Expressions are only allowed to reference column names and numeric constants, parsed with an ast whitelist — no eval. Expressions like __import__('os') will be rejected.
Cross-Table Joins Are Only Necessary When Dimensional Data is Not in the Main Table
Use datasets + join to declare 'which table to use, which columns to pick, and which key to join on':
"datasets": {
"properties": {"file": "1、房产客户信息.xlsx", "key_column": "Property Code",
"pick": {"Actual Chargeable Area (m²)": "Actual Chargeable Area"}}
},
"join": {"dataset": "properties", "left_on": "Property Full Name", "how": "left"}
Order: join first, then calculate derived metrics — otherwise, the dimensional columns referenced by the derived expression won't exist yet.
Lesson Learned: Measure first, then decide if a join is needed. Initially, we thought 'the collection rate needs a cross-table join', but after measuring, we found Table 2 already contained both the bill amount and unpaid amount—the calculation could be done with only one table. The real need for a join was for the 'Average Unit Price' (the area data was in Table 1).
Three Deliverables Are Mandatory
| Deliverable | Form | Purpose |
|---|---|---|
| ① PPTX Report | 16:9 Editable Presentation | Slides for 'viewing' |
② Validation Report checks.json | JSON (output by the pptx_check tool) | Evidence of structural integrity |
| ③ Speaking Script | Chat body / Markdown (template in references/03-SpeakingScript.md) | Verbatim script for 'speaking' |
When to Use This Skill
- Property project monthly/quarterly operations analysis PPT
- Regional operations center, general manager performance report
- Need cost overrun attribution, collection rate analysis, per-capita efficiency analysis
- Keywords: 'Project manager monthly report', 'Operations review meeting materials', 'Project operations dashboard PPT'
Five-Stage Processing Pipeline
User Input Data
|
v
+-------------------+
| Stage 1: | Parse input, fill defaults, validate metrics
| Data Understanding |
+-------------------+
|
v
+-------------------+
| Stage 2: Data | Revenue/Cost/Collection/Efficiency calculation, sort deviations, anomaly attribution
| Analysis |
+-------------------+
|
v
+-------------------+
| Stage 3: PPT | Determine page count, chart types, conclusion titles for each page
| Structure Planning |
+-------------------+
|
v
+-------------------+
| Stage 4: Content | Construct DATA dictionary, generate conclusion sentences, fill script
| Generation |
+-------------------+
|
v
+-------------------+
| Stage 5: Call PPT | Execute build_deck.py → Validate → Deliver
| Tool |
+-------------------+
|
v
Generate .pptx + checks.json + Speaking Script
Stage 1: Data Understanding
1.0 Where the Data Comes From (Three Paths, by Priority)
| Priority | Method | Description |
|---|---|---|
| 1 | User provides data in the conversation | Agent fills data into the data parameter |
| 2 | User provides a file name / clue | Skill automatically searches common directories for the file and extracts data (see below) |
| 3 | Neither provided | Generate with default template, and issue a data insufficiency warning |
Automatic Data Retrieval: When data is empty, the skill will:
- Parse the
requestfor file name clues (e.g., 'last month's sales table') - Perform a fuzzy file match in
data/commonanddata/inbox - Read the file with pandas, automatically infer date column / amount column / grouping column
- Convert to the contract structure (amount ÷10000 to 10k CNY, ratios as decimals)
- Save as
input_data.jsonfor the generation script
So the user only needs to say 'Use last month's sales table to make an operations analysis PPT' without providing the path — provided the file is already in data/common.
Override the search root: SKILL_COMMON_DIRS=D:\Tables;E:\MonthlyReports
Disable automatic data retrieval: auto_resolve_data=False
Property Project Data Sources (Measured Metrics in data/common)
| Table | File | Purpose | Metric Explanation |
|---|---|---|---|
| Table 2 | 2、应收信息.xlsx | Main Table (15,876 rows) | Revenue grouped by 'Charge Item'; 'Bill Amount/Unpaid Amount' derives collection rate (measured 92.48%) |
| Table 1 | 1、房产客户信息.xlsx | Dimension Table: Actual Chargeable Area | Join on 'Property Code' = Main Table's 'Property Full Name' → derive Average Unit Price (measured 0.30 CNY/m²·period) |
| Table 4 | 4、欠款明细报表.xlsx | Dimension Table: Arrears Causes (7 types) | Header is on row 2 (header_row=1), footer has a total row (auto-dropped); join on 'Property Full Name' → Arrears Attribution page |
| Table 5 | 5、房产收缴率明细表.xlsx | Not used | Three-row composite header, wide-table format, prone to conflict with Table 2's derived metrics; always use Table 2's derivation as the standard |
Honest Degradation Statement: This project's data has no cost, budget, headcount, or work order data. The Cost page has been replaced with an 'Arrears & Collections' page (with real usable data), and the Efficiency page only retains 'Average Unit Price' which is supported by data. The aging quartile (0-30/31-90/91-180/180+ days) data is not in Table 2 — when needed, the main agent should first invoke the collections sub-agent (arrears_analysis) for aging analysis, then inject the results into this skill via extra_facts.
1.1 Parse User Input → Extract Basic Information
| Element | Default / Example | Description |
|---|---|---|
| Project Name | XX Community | Required; if missing, mark as 'To be supplemented' |
| Report Period | This Month | Required |
| Currency Unit | 10k CNY | Unified throughout the entire report, no mixing; if raw data is in 'CNY', must ÷10000 |
| Ratio Format | Decimal | 0.952 = 95.2%; passing 95.2 will be rendered as 9520% |
| Comparison Baseline | Monthly Budget + Previous Month | At least one reference system |
| Presentation Duration | 20 minutes | Determines the page count |
1.2 Data Completeness Check — Seven Required Data Groups
Check if the user has provided the following seven groups of data. For each missing group, mark the corresponding page as 'Pending Supplement':
| # | Data Group | Specific Fields |
|---|---|---|
| 1 | Revenue Breakdown | Property Fee, Public Area Income, Diversified Operations, Other (Actual + Budget values) |
| 2 | Cost Breakdown | Labor, Public Energy, Outsourcing, Maintenance & Repair, Materials, Management Fee (Actual + Budget values) |
| 3 | Collection Data | Current Receivable / Current Received / Opening Old Arrears / Old Arrears Recovered |
| 4 | Aging Stratification | 0-30 / 31-90 / 91-180 / 180+ days overdue balance |
| 5 | Efficiency Data | Headcount, Managed Area, Work Order Volume, Labor Cost |
| 6 | Anomaly Accounts | Top 3-5 accounts with largest deviation and their traceable events |
| 7 | Last Month's Action Items | Completion status (must be reported back to form a closed loop) |
1.3 Data Metric Validation
Before proceeding to analysis, the following red lines must be checked against the data metrics:
- Public Area Income legally belongs to all owners and must be listed separately; it cannot be counted as operating profit
- Current Period Collection Rate denominator = current month's receivable bill amount; must not include old arrears recovery
- Labor Cost must include social insurance, housing fund, overtime pay, and outsourced labor converted to equivalent
- Energy Consumption must distinguish between 'public area apportionment' and 'property's own use'
- One-time expenditures (emergency repairs, major repairs) are listed separately and not included in the monthly comparable metrics
- Per-capita efficiency must be judged in conjunction with the labor cost rate, not just by headcount changes
Stage 2: Data Analysis
2.1 Analysis Sequence (MUST follow this order, do not change)
Revenue Analysis → Cost Analysis → Collection Rate Analysis → Per-Capita Efficiency Analysis → Anomaly Account Attribution
Reason for the order: The collection rate is the result of service quality (unresolved complaints → owners refuse to pay), so placing it after revenue/cost analysis makes the causal relationship valid; anomaly attribution must be built on the four operational fundamentals, otherwise the discussion will be unfocused.
2.2 Revenue Analysis
- Calculate actual vs budget deviation for each revenue item
- Calculate budget completion rate = Current month recognized revenue / Current month budgeted revenue
- Calculate revenue structure proportion
- Public area income listed separately, annotated 'Belongs to all owners, not included in operating profit'
2.3 Arrears Attribution Analysis (Originally Cost Analysis, No Cost Data in This Project)
This project data has no cost accounts, so this section is changed to arrears attribution by reason for non-payment — a page that affects cash flow as much as costs in property operations:
- Use the main table's 'Unpaid Amount (CNY)' grouped and aggregated by the joined 'Arrears Cause' (measured total 36,400 CNY, fully reconciled with the arrears detail report on a per-household basis)
- ⚠ Do not use the joined 'Total Arrears Amount (CNY)' for aggregation — it's a per-household total and will be duplicated by multiple bill rows for the same household
- Arrears causes are stratified into four types with corresponding collection strategies: Service Disputes (reform first, then collect) / Objective Difficulties (installment plan) / Malicious Default (escalate with formal letter) / Lost Contact Vacant (on-site verification)
- When cost data becomes available, simply replace the
arrearssection indeck_spec.jsonwith thecostsection; the tool chain doesn't need to change
2.4 Collection Rate Analysis — Three-Level Indicator Breakdown
| Indicator | Calculation Method |
|---|---|
| Current Period Collection Rate | Current month received / Current month receivable (excluding old arrears recovery) |
| Cumulative Collection Rate | Year-to-date received / Year-to-date receivable |
| Old Arrears Recovery Rate | Historical arrears recovered this period / Total old arrears at beginning of period |
Combined with an Aging Pyramid: 0-30 / 31-90 / 91-180 / 180+ days. The longer the aging, the lower the recovery probability (only 10%~20% for 180+ days).
Arrears cause stratification: Service Disputes / Objective Difficulties / Malicious Default / Lost Contact Vacant. The first two rely on service recovery, the latter two rely on collection mechanisms.
2.5 Per-Capita Efficiency Analysis
| Indicator | Calculation Method |
|---|---|
| Managed Area per Capita | Managed building area ÷ (Own + Outsourced equivalent headcount) |
| Output per Capita | Operating revenue ÷ Total project headcount |
| Work Orders per Capita | Completed work orders ÷ Number of engineering staff |
| Labor Cost Rate | Labor cost ÷ Operating revenue (inverse indicator, lower is better) |
⚠ Trap: Replacing in-house staff with outsourced staff will make the denominator smaller and the numbers look better. This must be judged in conjunction with the labor cost rate.
2.6 Anomaly Account Attribution — Three-Layer Penetration Method
This is the most valuable step of the entire analysis.
| Layer | Question to Answer | Output |
|---|---|---|
| Layer 1: Quantify Deviation | Is it a volume variance, price variance, or metric variance? | Deviation amount + Deviation rate |
| Layer 2: Driving Factors | Break down to a traceable event | A single verifiable event description |
| Layer 3: Responsibility Assignment | Controllable / Partially controllable / Uncontrollable; who is primary responsible | Responsible department + Correction action + Deadline |
Example of labor cost deviation breakdown:
Deviation = Headcount deviation × Budget average wage (volume variance)
+ Budget headcount × Average wage deviation (price variance)
+ Method / One-time factors (method variance)
Writing Rules:
- ❌ 'Energy consumption increased' → ✅ 'Energy consumption exceeded budget by 21,000 CNY: the basement lighting renovation delay led to full-month use of old fixtures (12,000 CNY) + extended test runs for three elevator annual inspections (9,000 CNY)'
- ❌ 'Maintenance costs exceeded budget' → ✅ 'Maintenance costs exceeded budget by 13,000 CNY: emergency repair of a burst sewage pipe in Building #5 cost 13,000 CNY (uncontrollable)'
Attribution without a responsible person and deadline is no attribution at all.
Stage 3: PPT Structure Planning
3.1 Presentation Order (Six-Section Format, Do Not Change)
① One-Page Conclusion (30-second decision)
② Revenue: Where the money comes from → Property Fee / Public Area Income / Diversified Operations / Other
③ Arrears and Collections: Who owes the money → Four strata of arrears causes: Service Disputes / Difficulties / Malice / Lost Contact
④ Collection Rate: Collecting it or not → Current / Cumulative / Old Arrears / Aging Stratification
⑤ Per-Capita Efficiency: Is the headcount worth it → Average Unit Price / Area per Capita / Labor Cost Rate / Work Orders per Capita
⑥ Anomaly Account Attribution → Three-Layer Penetration: Quantified Deviation → Driving Event → Responsibility & Controllability
⑦ Summary and Action Items → 3~5 items, each with responsible person + deadline + quantified acceptance criteria
3.2 Page Count Planning
| Duration | Suggested Pages | Structure Handling |
|---|---|---|
| 10 minutes | 6~8 pages | One-page conclusion + Revenue & Cost + Anomaly TOP3 + Action items |
| 20 minutes | 12~16 pages | Full six sections, anomaly attribution selects TOP5 |
| 40 minutes | 20~28 pages | Add trend comparisons (3~6 month), peer benchmarking, deep dives on specific topics |
3.3 Chart Selection
| Analysis Content | Chart Type |
|---|---|
| Revenue Actual vs Budget | Dual-series column chart |
| Cost Deviation Ranking | Bar chart (Red/Yellow/Green semantic colors) |
| Collection Rate + Aging | Layered column chart + Three-level indicator cards |
| Per-Capita Efficiency Trend | Column + Line combo chart (secondary axis for cost rate) |
| Anomaly Attribution | Bar chart + Attribution table |
| Action Items | Action cards (Responsible person/Deadline/Acceptance criteria) |
3.4 Page Structure Template
┌──────────────────────────────────────────────────────────────────┐
│ Header: Page Number + Conclusion-Type Title + Phase Tag │
├──────────────────────────────────────────────────────────────────┤
│ │
│ Chart / Data Visualization Area │
│ │
├──────────────────────────────────────────────────────────────────┤
│ Conclusion Bar: so_what conclusion sentence │
├──────────────────────────────────────────────────────────────────┤
│ Footer: Metric explanation │
└──────────────────────────────────────────────────────────────────┘
Stage 4: Content Generation
4.1 Construct the DATA Dictionary
Based on the analysis results from Stage 2, populate the standardized DATA dictionary.
DATA = {
"Project": "<Project Name>",
"Period": "<YYYY Month M>",
"Revenue": {"Property Fee": 0, "Public Area Income": 0, "Diversified Operations": 0, "Other": 0},
"Revenue Budget": {...},
"Costs": {"Labor Cost": 0, "Public Energy": 0, "Outsourcing Fee": 0, "Maintenance & Repair": 0, "Materials & Consumables": 0, "Management Fee & Others": 0},
"Cost Budget": {...},
"Collection": {"Current Receivable": 0, "Current Received": 0, "Old Arrears Opening": 0, "Old Arrears Recovered": 0},
"Aging": {"0-30 days": 0, "31-90 days": 0, "91-180 days": 0, "180+ days": 0},
"Efficiency": {"Managed Area per Capita": 0, "Output per Capita": 0, "Labor Cost Rate": 0, "Work Orders per Capita": 0},
"Trend Months": [...],
"Trend Revenue": [...],
"Trend Costs": [...],
"Budget Completion Rate": 0,
"Cost Rate": 0,
"Budget Cost Rate": 0,
"This Month's Conclusion": "<Three-sentence summary: operation result + largest anomaly + first action for next month>",
"Largest Anomaly": "<Account with the largest deviation and its amount>",
"First Action": "<Highest priority action for next month>",
}
4.2 Generate Conclusion Sentences for Each Page (so_what)
Each page must generate a conclusion sentence; do not leave it blank for the audience to guess.
| Page | Conclusion Sentence Pattern |
|---|---|
| One-Page Conclusion | "Revenue is essentially on target; cost is the only area where we lost points this month; fix costs first, and the collection rate will naturally recover." |
| Revenue | "The diversified operations gap of X 10k CNY needs to be recovered next month; public area income cannot be counted as operating profit to beautify performance." |
| Costs | "The first two deviations are partially controllable and are accounts that must be corrected this month; the latter two are due to uncontrollable/method factors." |
| Collection Rate | "The collection rate is the result of service quality: this month's complaint closure rate is X%, and repair timeliness rate is Y%, which are the upstream causes of the collection rate gap." |
| Per-Capita Efficiency | "Efficiency hasn't deteriorated, but the cost rate has been rising for two consecutive months; structural adjustments in scheduling and outsourcing settlement are needed next month." |
| Anomaly Attribution | "The delay in last month's action item (XXX) is the direct cause of the energy overrun; it must be closed this month, otherwise it will recur next month." |
| Summary Actions | "Next month's targets: Revenue X 10k CNY, cost rate to drop below Y%; Risk alert: XXX needs to be reported in advance." |
4.3 Content Expression Discipline
These 6 rules determine whether the report is professional; they must be followed during content generation:
- The title states the conclusion, not the section name. ❌ 'Cost Analysis' → ✅ 'Cost exceeds budget by 39,000 CNY; labor and energy together account for 92% of the deviation'
- One 'so what' per page. There must be a conclusion line below every chart
- Numbers must include their metric definition and timeframe. ❌ 'Collection rate 92%' → ✅ 'Current period collection rate 92.0% (metric: current month received / current month receivable, excluding old arrears recovery)'
- Color semantics are fixed throughout the entire report: On Target = Green (#2EA06A), Warning = Yellow (#E8A31D), Below Target = Red (#D9453D)
- Anomaly attribution must close the loop: Account / Deviation Amount / Deviation Rate / Primary Cause / Controllability / Responsible Department / Deadline
- Details go in the appendix; the main body only contains conclusion charts
4.4 Generate the Speaking Script
Following the template in references/03-SpeakingScript.md, generate a three-segment script for each page:
| Segment | Content | Duration |
|---|---|---|
| Conclusion First | What is the conclusion of this page | 10 seconds |
| Data Support | Key numbers + metric + reference system | 30 seconds |
| Root Cause & Action | Why + whose + when + how to verify | 30 seconds |
Script Red Lines:
- Conclusion first, process second
- Quantifiers must be actionable: ❌ 'Cost reduction and efficiency improvement' → ✅ 'Overtime pay decreased by 30% month-over-month; account check at month-end'
- Don't speak without numbers: Any adjective must be backed by a number
- Must be verifiable: For every number, you must be able to answer 'Where can I check this?'
- Proactively take ownership of controllable issues: Start by saying 'It's my responsibility; I will fix it by [time]'
- Don't fabricate what you can't answer: The standard reply is 'I need to verify this number with finance; I will provide a written response by the end of today'
Stage 5: Call PPT Tool
5.1 Execute the Generation Script
Dependency on the python-pptx library. Execute this skill's generation script:
pip install python-pptx
python <skill-dir>/scripts/build_deck.py
The script reads the DATA dictionary and outputs a 16:9 (13.333 × 7.5 inches) editable presentation.
build_pptx(data, output_path) produces 4 files (same name, different suffixes) in one call:
| File | Content |
|---|---|
<name>.pptx | Presentation file |
<name>.speech.json | Page-by-page speaking script (machine-readable version of deliverable ③) |
<name>.speech.md | Page-by-page speaking script (can be directly pasted into chat body) |
<name>.deck.json | Page ↔ Section metadata (for alignment check by validation tool) |
To add a new page: Follow the page function pattern in the script:
add_slide() → header(s, idx, Conclusion-Type Title, Phase Tag) → chart → so_what(s, Conclusion Sentence)
When adding a new section, remember to register the key content keywords for that section in SECTION_KEYWORDS, otherwise the validation tool cannot verify the content of each page.
5.2 Structural Validation (Must Execute)
Call the pptx_check tool in the Capability Center to perform structural validation and produce checks.json:
router.execute("pptx_check", {
"file_path": "<output>.pptx",
"expected_count": <page_count>,
"must_contain": "Anomaly account attribution,Current period collection rate,Per-capita,Action items",
"out": "<output>.checks.json",
})
It checks the following aspects and gives a pass / warn / fail verdict:
| Check | Description |
|---|---|
package / ooxml / open | File validity, OOXML package structure, can it be opened |
aspect | Is it 16:9 |
count | Does page count match expectations |
contains | Do key content items exist |
section_content | Per-page check for 'the key content that section should have' |
so_what | Does each page have a conclusion sentence at the bottom (cover page/roadmap/appendix exempted) |
overflow | Does text overflow shapes (estimation based on font metrics) |
color_semantics | Are only the defined semantic colors used |
chart_data | Do the number of categories/series in charts match the source |
no_empty_slide | Are there any empty slides |
Verdict rules: Any fail → must be fixed before delivery; warn → requires manual confirmation (usually an estimation error).
overflowis an estimation, not a true layout. Getting awarnwith very few items is normal; if there are many items or text is clearly cropped, use visual validation in 5.3 to confirm.If the tool name is unavailable, fall back to calling the module function directly:
tool.common.pptx_check_tool.check_pptx(...).
5.3 Visual Validation (Optional, Depending on the Environment)
libreoffice --headless --convert-to png <file.pptx> --outdir preview
⚠ LibreOffice may not be installed in the environment. If unavailable, fall back to:
- Reading the shapes and text of each page with
python-pptxand manually checking key pages; or - Drawing approximate thumbnails with PIL based on page dimensions (only to see layout distribution, not a true rendering)
Check each page: Check if text is cropped, if chart numbers match the data source, and if color semantics are consistent.
5.4 Deliver
Deliver all three items simultaneously:
- PPTX File — Editable 16:9 presentation
- checks.json — Structural integrity validation report (produced by
pptx_check, verdict should bepass) - Speaking Script — Written directly in the chat body, format as per
references/03-SpeakingScript.md, with a time allocation table + leader follow-up Q&A contingency plan (≥6 pairs)
Pitfalls and Anti-Patterns
- ❌ Starting with a specific complaint or dispute — without establishing the operational fundamentals, the audience can't gauge its significance
- ❌ A page full of numbers — only 'what it is', no 'why' or 'so what'
- ❌ Only reporting deviation amounts without naming the responsible person — no tasks can be formed from the meeting
- ❌ Using 'objective factors' as an explanation — must fall back to specific events
- ❌ Not reporting back on last month's action items — the report loses its closed loop
- ❌ Reporting only one number for the collection rate — must break it down into Current / Cumulative / Old Arrears / Aging
Directory Structure
ppt_skill/
├── SKILL.md # This file: Five-stage pipeline instructions
├── references/
│ ├── 01-ReportLogic.md # Six-section framework, page count control, expression discipline
│ ├── 02-IndicatorSystemAndAttribution.md # Indicator metrics table, three-layer attribution, chart selection
│ └── 03-SpeakingScript.md # Per-page script template, time allocation, follow-up Q&A contingency plan
├── assets/
│ └── Sample-PropertyProjectMonthlyPerformanceAnalysis.pptx
├── scripts/
│ └── build_deck.py # Generation script (just change DATA to reuse)
└── checks.json # Sample historical validation report (re-generated by pptx_check at runtime)
Dependent Capability Tools
| Capability | Location | Purpose | Mandatory |
|---|---|---|---|
pptx_check | tool/common/pptx_check_tool.py | Stage 5.2 structural validation, produces checks.json | Mandatory |
| LibreOffice | External Application | Stage 5.3 visual validation (convert to PNG) | Optional, falls back if not installed |
pptx_check is a general-purpose tool independent of this skill, provided through the Capability Center:
from core.capability import CapabilityRouter
from tool.common.pptx_check_tool import PptxCheckTool
router = CapabilityRouter()
router.add_tool(PptxCheckTool()) # Skill and tool are registered at the same level
A Skill is not a Tool, so registration uses
add_skill(build_capability_routerhandles this automatically), whilepptx_checkis a tool and usesadd_tool.