From e9f331d80f90d61b91477f7939e1461abc0d1426 Mon Sep 17 00:00:00 2001 From: g1g2 Date: Thu, 2 Jul 2026 09:15:25 +0800 Subject: [PATCH 1/2] Vendor Anthropic's data-free financial skills MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Import 21 skills from anthropics/financial-services (Apache 2.0, commit 4aa51ed) that carry no external-data dependency — they run purely on user-supplied inputs, logic, or formatting. They sit as top-level siblings to the repo's own data/ and backtesting/ skills. - Output/check engines: xlsx-author, pptx-author, audit-xls, clean-data-xls, ib-check-deck, deck-refresh - Model math: lbo-model, merger-model, returns-analysis, unit-economics - Doc drafting/process: ic-memo, teaser, process-letter, cim-builder, dd-checklist, dd-meeting-prep, deal-screening, deal-tracker, investment-proposal, kyc-doc-parse, kyc-rules Excluded meta-skills (skill authoring, not finance): skill-creator, ppt-template-creator. Supplied runtime assets the source referenced but never shipped: - lbo-model/scripts/recalc.py (replaces /mnt/skills/public/xlsx/recalc.py) - lbo-model/examples/LBO_Model.xlsx (standard LBO template skeleton) Add LICENSE.anthropic-skills (Apache 2.0) and ATTRIBUTION.md. Co-Authored-By: Claude Opus 4.8 (1M context) --- ATTRIBUTION.md | 54 ++++ LICENSE.anthropic-skills | 202 ++++++++++++++ audit-xls/SKILL.md | 156 +++++++++++ cim-builder/SKILL.md | 105 +++++++ clean-data-xls/SKILL.md | 50 ++++ dd-checklist/SKILL.md | 117 ++++++++ dd-meeting-prep/SKILL.md | 103 +++++++ deal-screening/SKILL.md | 60 ++++ deal-tracker/SKILL.md | 90 ++++++ deck-refresh/SKILL.md | 111 ++++++++ ib-check-deck/SKILL.md | 78 ++++++ ib-check-deck/references/ib-terminology.md | 49 ++++ ib-check-deck/references/report-format.md | 67 +++++ ib-check-deck/scripts/extract_numbers.py | 305 +++++++++++++++++++++ ic-memo/SKILL.md | 88 ++++++ investment-proposal/SKILL.md | 88 ++++++ kyc-doc-parse/SKILL.md | 48 ++++ kyc-rules/SKILL.md | 47 ++++ lbo-model/SKILL.md | 274 ++++++++++++++++++ lbo-model/examples/LBO_Model.xlsx | Bin 0 -> 9903 bytes lbo-model/scripts/recalc.py | 66 +++++ merger-model/SKILL.md | 111 ++++++++ pptx-author/SKILL.md | 43 +++ process-letter/SKILL.md | 75 +++++ returns-analysis/SKILL.md | 119 ++++++++ teaser/SKILL.md | 80 ++++++ unit-economics/SKILL.md | 95 +++++++ xlsx-author/SKILL.md | 42 +++ 28 files changed, 2723 insertions(+) create mode 100644 ATTRIBUTION.md create mode 100644 LICENSE.anthropic-skills create mode 100644 audit-xls/SKILL.md create mode 100644 cim-builder/SKILL.md create mode 100644 clean-data-xls/SKILL.md create mode 100644 dd-checklist/SKILL.md create mode 100644 dd-meeting-prep/SKILL.md create mode 100644 deal-screening/SKILL.md create mode 100644 deal-tracker/SKILL.md create mode 100644 deck-refresh/SKILL.md create mode 100644 ib-check-deck/SKILL.md create mode 100644 ib-check-deck/references/ib-terminology.md create mode 100644 ib-check-deck/references/report-format.md create mode 100644 ib-check-deck/scripts/extract_numbers.py create mode 100644 ic-memo/SKILL.md create mode 100644 investment-proposal/SKILL.md create mode 100644 kyc-doc-parse/SKILL.md create mode 100644 kyc-rules/SKILL.md create mode 100644 lbo-model/SKILL.md create mode 100644 lbo-model/examples/LBO_Model.xlsx create mode 100644 lbo-model/scripts/recalc.py create mode 100644 merger-model/SKILL.md create mode 100644 pptx-author/SKILL.md create mode 100644 process-letter/SKILL.md create mode 100644 returns-analysis/SKILL.md create mode 100644 teaser/SKILL.md create mode 100644 unit-economics/SKILL.md create mode 100644 xlsx-author/SKILL.md diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md new file mode 100644 index 0000000..c52c0c1 --- /dev/null +++ b/ATTRIBUTION.md @@ -0,0 +1,54 @@ +# Attribution + +The following top-level skills are vendored from Anthropic's open-source +[`anthropics/financial-services`](https://github.com/anthropics/financial-services) +repository, licensed under **Apache License 2.0** (see `LICENSE.anthropic-skills`). + +- Source commit: `4aa51ed3d379731f8f9beff498d749580372699c` (2026-06-26) +- Imported: 2026-07-02 + +Only skills that carry **no external-data dependency** were vendored — they operate +purely on user-supplied inputs, logic, or formatting (no SEC/EDGAR, market-data, +or enterprise-system connectors). They sit as siblings to the repo's own `data/` +and `backtesting/` skills. + +## Vendored skills (21) + +**Output / check engines** +`xlsx-author`, `pptx-author`, `audit-xls`, `clean-data-xls`, +`ib-check-deck`, `deck-refresh` + +**Model math** +`lbo-model`, `merger-model`, `returns-analysis`, `unit-economics` + +**Document drafting / process** +`ic-memo`, `teaser`, `process-letter`, `cim-builder`, `dd-checklist`, +`dd-meeting-prep`, `deal-screening`, `deal-tracker`, `investment-proposal`, +`kyc-doc-parse`, `kyc-rules` + +Each was taken from the richest copy present in the source repo's `plugins/` tree +(a single skill can appear in multiple plugins). Skill contents are unmodified +except for the local additions below. + +## Not vendored (meta-skills, deliberately excluded) + +`skill-creator` and `ppt-template-creator` were dropped — both are meta-skills for +*authoring skills*, not financial capabilities, and `ppt-template-creator` depended +on `skill-creator`. + +## Local additions / modifications + +The source repo referenced a few runtime assets it never actually shipped. Supplied +locally so the vendored skills resolve standalone: + +- `lbo-model/scripts/recalc.py` — LibreOffice-headless formula recalc helper, + replacing the source's `/mnt/skills/public/xlsx/recalc.py` sandbox path (the + reference in `lbo-model/SKILL.md` was repointed to `scripts/recalc.py`). +- `lbo-model/examples/LBO_Model.xlsx` — standard LBO template skeleton + (Assumptions · Sources & Uses · Operating Model · Debt Schedule · Returns · + Checks), formula-driven per the skill's blue/black/green conventions. The source + referenced this template but did not include it. + +`pptx-author`'s optional `templates/firm-template.pptx` is intentionally not +supplied — the skill already falls back to default layouts when no template is +mounted. diff --git a/LICENSE.anthropic-skills b/LICENSE.anthropic-skills new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSE.anthropic-skills @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/audit-xls/SKILL.md b/audit-xls/SKILL.md new file mode 100644 index 0000000..a2cae1d --- /dev/null +++ b/audit-xls/SKILL.md @@ -0,0 +1,156 @@ +--- +name: audit-xls +description: Audit a spreadsheet for formula accuracy, errors, and common mistakes. Scopes to a selected range, a single sheet, or the entire model (including financial-model integrity checks like BS balance, cash tie-out, and logic sanity). Triggers on "audit this sheet", "check my formulas", "find formula errors", "QA this spreadsheet", "sanity check this", "debug model", "model check", "model won't balance", "something's off in my model", "model review". +--- + +# Audit Spreadsheet + +Audit formulas and data for accuracy and mistakes. Scope determines depth — from quick formula checks on a selection up to full financial-model integrity audits. + +## Step 1: Determine scope + +If the user already gave a scope, use it. Otherwise **ask them**: + +> What scope do you want me to audit? +> - **selection** — just the currently selected range +> - **sheet** — the current active sheet only +> - **model** — the whole workbook, including financial-model integrity checks (BS balance, cash tie-out, roll-forwards, logic sanity) + +The **model** scope is the deepest — use it for DCF, LBO, 3-statement, merger, comps, or any integrated financial model before sending to a client or IC. + +--- + +## Step 2: Formula-level checks (ALL scopes) + +Run these regardless of scope: + +| Check | What to look for | +|---|---| +| Formula errors | `#REF!`, `#VALUE!`, `#N/A`, `#DIV/0!`, `#NAME?` | +| Hardcodes inside formulas | `=A1*1.05` — the `1.05` should be a cell reference | +| Inconsistent formulas | A formula that breaks the pattern of its neighbors in a row/column | +| Off-by-one ranges | `SUM`/`AVERAGE` that misses the first or last row | +| Pasted-over formulas | Cell that looks like a formula but is actually a hardcoded value | +| Circular references | Intentional or accidental | +| Broken cross-sheet links | References to cells that moved or were deleted | +| Unit/scale mismatches | Thousands mixed with millions, % stored as whole numbers | +| Hidden rows/tabs | Could contain overrides or stale calculations | + +--- + +## Step 3: Model-integrity checks (MODEL scope only) + +If scope is **model**, identify the model type (DCF / LBO / 3-statement / merger / comps / custom) and run the appropriate integrity checks below. + +### 3a. Structural review + +| Check | What to look for | +|---|---| +| Input/formula separation | Are inputs clearly separated from calculations? | +| Color convention | Blue=input, black=formula, green=link — or whatever the model uses, applied consistently? | +| Tab flow | Logical order (Assumptions → IS → BS → CF → Valuation)? | +| Date headers | Consistent across all tabs? | +| Units | Consistent (thousands vs millions vs actuals)? | + +### 3b. Balance Sheet + +| Check | Test | +|---|---| +| BS balances | Total Assets = Total Liabilities + Equity (every period) | +| RE rollforward | Prior RE + Net Income − Dividends = Current RE | +| Goodwill/intangibles | Flow from acquisition assumptions (if M&A) | + +If BS doesn't balance, **quantify the gap per period and trace where it breaks** — nothing else matters until this is fixed. + +### 3c. Cash Flow Statement + +| Check | Test | +|---|---| +| Cash tie-out | CF Ending Cash = BS Cash (every period) | +| CF sums | CFO + CFI + CFF = Δ Cash | +| D&A match | D&A on CF = D&A on IS | +| CapEx match | CapEx on CF matches PP&E rollforward on BS | +| WC changes | Signs match BS movements (ΔAR, ΔAP, ΔInventory) | + +### 3d. Income Statement + +| Check | Test | +|---|---| +| Revenue build | Ties to segment/product detail | +| Tax | Tax expense = Pre-tax income × tax rate (allow for deferred tax adj) | +| Share count | Ties to dilution schedule (options, converts, buybacks) | + +### 3e. Circular references + +- Interest → debt balance → cash → interest is a common intentional circ in LBO/3-stmt models +- If intentional: verify iteration toggle exists and works +- If unintentional: trace the loop and flag how to break it + +### 3f. Logic & reasonableness + +| Check | Flag if | +|---|---| +| Growth rates | >100% revenue growth without explanation | +| Margins | Outside industry norms | +| Terminal value dominance | TV > ~75% of DCF EV (yellow flag) | +| Hockey-stick | Projections ramp unrealistically in out-years | +| Compounding | EBITDA compounds to absurd $ by Year 10 | +| Edge cases | Model breaks at 0% or negative growth, negative EBITDA, leverage goes negative | + +### 3g. Model-type-specific bugs + +**DCF:** +- Discount rate applied to wrong period (mid-year vs end-of-year) +- Terminal value not discounted back +- WACC uses book values instead of market values +- FCF includes interest expense (should be unlevered) +- Tax shield double-counted + +**LBO:** +- Debt paydown doesn't match cash sweep mechanics +- PIK interest not accruing to principal +- Management rollover not reflected in returns +- Exit multiple applied to wrong EBITDA (LTM vs NTM) +- Fees/expenses not deducted from Day 1 equity + +**Merger:** +- Accretion/dilution uses wrong share count (pre- vs post-deal) +- Synergies not phased in +- Purchase price allocation doesn't balance +- Foregone interest on cash not included +- Transaction fees not in sources & uses + +**3-statement:** +- Working capital changes have wrong sign +- Depreciation doesn't match PP&E schedule +- Debt maturity schedule doesn't match principal payments +- Dividends exceed net income without explanation + +--- + +## Step 4: Report + +Output a findings table: + +| # | Sheet | Cell/Range | Severity | Category | Issue | Suggested Fix | +|---|---|---|---|---|---|---| + +**Severity:** +- **Critical** — wrong output (BS doesn't balance, formula broken, cash doesn't tie) +- **Warning** — risky (hardcodes, inconsistent formulas, edge-case failures) +- **Info** — style/best-practice (color coding, layout, naming) + +For **model** scope, prepend a summary line: + +> Model type: [DCF/LBO/3-stmt/...] — Overall: [Clean / Minor Issues / Major Issues] — [N] critical, [N] warnings, [N] info + +**Don't change anything without asking** — report first, fix on request. + +--- + +## Notes + +- **BS balance first** — if it doesn't balance, everything downstream is suspect +- **Hardcoded overrides are the #1 source of silent bugs** — search aggressively +- **Sign convention errors** (positive vs negative for cash outflows) are extremely common +- If the model uses VBA macros, note any macro-driven calculations that can't be audited from formulas alone diff --git a/cim-builder/SKILL.md b/cim-builder/SKILL.md new file mode 100644 index 0000000..2fecd02 --- /dev/null +++ b/cim-builder/SKILL.md @@ -0,0 +1,105 @@ +--- +name: cim-builder +description: Structure and draft a Confidential Information Memorandum for sell-side M&A processes. Organizes company information into a professional, investor-ready document with consistent formatting and narrative flow. Use when preparing sell-side materials, drafting a CIM, or organizing company data for a sale process. Triggers on "CIM", "confidential information memorandum", "offering memorandum", "info memo", "draft CIM", or "sell-side materials". +--- + +# CIM Builder + +## Workflow + +### Step 1: Gather Source Materials + +Ask for available inputs: +- Management presentations +- Historical financials (3-5 years) +- Budget/forecast +- Company website and marketing materials +- Customer data (anonymized if needed) +- Org chart +- Prior presentations or board decks +- Quality of earnings report (if available) + +### Step 2: CIM Structure + +Standard CIM table of contents: + +**I. Executive Summary** (2-3 pages) +- Company overview — what they do, why they win +- Investment highlights (5-7 key selling points) +- Financial summary — headline revenue, EBITDA, growth, margins +- Transaction overview — what's being sold, indicative timeline + +**II. Company Overview** (3-5 pages) +- History and founding story +- Mission and value proposition +- Products and services description +- Business model and revenue streams +- Key differentiators and competitive advantages + +**III. Industry Overview** (3-5 pages) +- Market size and growth dynamics (TAM/SAM/SOM) +- Key industry trends and tailwinds +- Competitive landscape +- Regulatory environment +- Barriers to entry + +**IV. Growth Opportunities** (2-3 pages) +- Organic growth levers (new products, markets, pricing) +- M&A / add-on opportunities +- Operational improvements +- Technology investments +- White space analysis + +**V. Customers & Sales** (3-5 pages) +- Customer overview (number, segments, geography) +- Top customer analysis (anonymized if pre-LOI) +- Customer concentration and retention metrics +- Sales process and go-to-market strategy +- Pipeline and backlog + +**VI. Operations** (2-3 pages) +- Organizational structure +- Key personnel +- Facilities and geographic footprint +- Technology and systems +- Supply chain / vendor relationships + +**VII. Financial Overview** (5-8 pages) +- Historical income statement (3-5 years) +- Revenue analysis — by segment, geography, customer type +- EBITDA bridge and margin analysis +- Balance sheet overview +- Cash flow summary +- Capital expenditure history +- Working capital analysis +- Management forecast / budget (if included) + +**VIII. Appendix** +- Detailed financial statements +- Customer list (anonymized) +- Product catalog +- Management bios + +### Step 3: Drafting Guidelines + +- **Tone**: Professional, factual, compelling but not hyperbolic +- **Narrative**: Tell a story — why this business is attractive, defensible, and positioned for growth +- **Data-driven**: Support every claim with data. "Strong growth" → "Revenue grew at a 15% CAGR from 2021-2024" +- **Visuals**: Charts and graphs for financial trends, market size, competitive positioning +- **Length**: 40-60 pages total — enough detail to inform first-round bids, not so long buyers won't read it +- **Confidentiality**: Include a disclaimer page. Anonymize sensitive customer data unless seller approves + +### Step 4: Output + +- Word document (.docx) with professional formatting +- Separate Excel appendix with detailed financials +- Charts and exhibits embedded in the document + +## Important Notes + +- The CIM is a sales document — lead with strengths, but don't hide material issues (buyers will find them in diligence) +- Investment highlights should address the 3 things every buyer cares about: growth potential, margin profile, and defensibility +- Financial normalization / pro forma adjustments should be clearly labeled and explained +- Work with legal on the confidentiality disclaimer and any regulatory disclosures +- Get management to review for factual accuracy before distribution +- The CIM sets expectations on valuation — make sure the narrative supports the asking price diff --git a/clean-data-xls/SKILL.md b/clean-data-xls/SKILL.md new file mode 100644 index 0000000..82cab2c --- /dev/null +++ b/clean-data-xls/SKILL.md @@ -0,0 +1,50 @@ +--- +name: clean-data-xls +description: Clean up messy spreadsheet data — trim whitespace, fix inconsistent casing, convert numbers-stored-as-text, standardize dates, remove duplicates, and flag mixed-type columns. Use when data is messy, inconsistent, or needs prep before analysis. Triggers on "clean this data", "clean up this sheet", "normalize this data", "fix formatting", "dedupe", "standardize this column", "this data is messy". +--- + +# Clean Data + +Clean messy data in the active sheet or a specified range. + +## Environment + +- **If running inside Excel (Office Add-in / Office JS):** Use Office JS directly (`Excel.run(async (context) => {...})`). Read via `range.values`, write helper-column formulas via `range.formulas = [["=TRIM(A2)"]]`. The in-place vs helper-column decision still applies. +- **If operating on a standalone .xlsx file:** Use Python/openpyxl. + +## Workflow + +### Step 1: Scope + +- If a range is given (e.g. `A1:F200`), use it +- Otherwise use the full used range of the active sheet +- Profile each column: detect its dominant type (text / number / date) and identify outliers + +### Step 2: Detect issues + +| Issue | What to look for | +|---|---| +| Whitespace | leading/trailing spaces, double spaces | +| Casing | inconsistent casing in categorical columns (`usa` / `USA` / `Usa`) | +| Number-as-text | numeric values stored as text; stray `$`, `,`, `%` in number cells | +| Dates | mixed formats in the same column (`3/8/26`, `2026-03-08`, `March 8 2026`) | +| Duplicates | exact-duplicate rows and near-duplicates (case/whitespace differences) | +| Blanks | empty cells in otherwise-populated columns | +| Mixed types | a column that's 98% numbers but has 3 text entries | +| Encoding | mojibake (`é`, `’`), non-printing characters | +| Errors | `#REF!`, `#N/A`, `#VALUE!`, `#DIV/0!` | + +### Step 3: Propose fixes + +Show a summary table before changing anything: + +| Column | Issue | Count | Proposed Fix | +|---|---|---|---| + +### Step 4: Apply + +- **Prefer formulas over hardcoded cleaned values** — where the cleaned output can be expressed as a formula (e.g. `=TRIM(A2)`, `=VALUE(SUBSTITUTE(B2,"$",""))`, `=UPPER(C2)`, `=DATEVALUE(D2)`), write the formula in an adjacent helper column rather than computing the result in Python and overwriting the original. This keeps the transformation transparent and auditable. +- Only overwrite in place with computed values when the user explicitly asks for it, or when no sensible formula equivalent exists (e.g. encoding/mojibake repair) +- For destructive operations (removing duplicates, filling blanks, overwriting originals), confirm with the user first +- After each category of fix (whitespace → casing → number conversion → dates → dedup), show the user a sample of what changed and get confirmation before moving to the next category +- Report a before/after summary of what changed diff --git a/dd-checklist/SKILL.md b/dd-checklist/SKILL.md new file mode 100644 index 0000000..5360f16 --- /dev/null +++ b/dd-checklist/SKILL.md @@ -0,0 +1,117 @@ +--- +name: dd-checklist +description: Generate and track comprehensive due diligence checklists tailored to the target company's sector, deal type, and complexity. Covers all major workstreams with request lists, status tracking, and red flag escalation. Use when kicking off diligence, organizing a data room review, or tracking outstanding items. Triggers on "dd checklist", "due diligence tracker", "diligence request list", "what do we still need", or "data room review". +--- + +# Due Diligence Checklist + +## Workflow + +### Step 1: Scope the Diligence + +Ask the user for: +- **Target company**: Name, sector, business model +- **Deal type**: Platform acquisition, add-on, growth equity, recap, carve-out +- **Deal size / complexity**: Determines depth of diligence +- **Key concerns**: Any known issues to prioritize (customer concentration, regulatory, environmental, etc.) +- **Timeline**: When is LOI / close targeted? + +### Step 2: Generate Workstream Checklists + +Generate a checklist across all major workstreams, tailored to the sector: + +**Financial Due Diligence** +- Quality of earnings (QoE) — revenue and EBITDA adjustments +- Working capital analysis — normalized vs. actual +- Debt and debt-like items +- Capital expenditure (maintenance vs. growth) +- Tax structure and exposure +- Audit history and accounting policies +- Pro forma adjustments (run-rate, synergies) + +**Commercial Due Diligence** +- Market size and growth (TAM/SAM/SOM) +- Competitive positioning and market share +- Customer analysis — concentration, retention, NPS +- Pricing power and contract structure +- Sales pipeline and backlog +- Go-to-market effectiveness + +**Legal Due Diligence** +- Corporate structure and org chart +- Material contracts (customer, supplier, partnership) +- Litigation history and pending claims +- IP portfolio and protection +- Regulatory compliance +- Employment agreements and non-competes + +**Operational Due Diligence** +- Management team assessment +- Organizational structure and key person risk +- IT systems and infrastructure +- Supply chain and vendor dependencies +- Facilities and real estate +- Insurance coverage + +**HR / People Due Diligence** +- Org chart and headcount trends +- Compensation benchmarking +- Benefits and pension obligations +- Key employee retention risk +- Culture assessment +- Union/labor agreements + +**IT / Technology Due Diligence** (for tech-enabled businesses) +- Technology stack and architecture +- Technical debt assessment +- Cybersecurity posture +- Data privacy compliance (GDPR, CCPA, SOC2) +- Product roadmap and R&D spend +- Scalability assessment + +**Environmental / ESG** (where applicable) +- Environmental liabilities +- Regulatory compliance history +- ESG risks and opportunities + +### Step 3: Status Tracking + +For each item, track: + +| Item | Workstream | Priority | Status | Owner | Notes | +|------|-----------|----------|--------|-------|-------| +| QoE report | Financial | P0 | Pending | | | +| Customer interviews | Commercial | P0 | In Progress | | 3 of 10 complete | + +Status options: Not Started → Requested → Received → In Review → Complete → Red Flag + +### Step 4: Red Flag Summary + +Maintain a running list of red flags discovered during diligence: +- What was found +- Which workstream +- Severity (deal-breaker / significant / manageable) +- Mitigant or path to resolution +- Impact on valuation or deal terms + +### Step 5: Output + +- Excel workbook with tabs per workstream (default) +- Summary dashboard: % complete by workstream, outstanding items, red flags +- Weekly status update format for deal team + +## Sector-Specific Additions + +Automatically add relevant items based on sector: +- **Software/SaaS**: ARR quality, cohort analysis, hosting costs, SOC2 +- **Healthcare**: Regulatory approvals, reimbursement risk, payor mix +- **Industrial**: Equipment condition, environmental remediation, safety record +- **Financial services**: Regulatory capital, compliance history, credit quality +- **Consumer**: Brand health, channel mix, seasonality, inventory management + +## Important Notes + +- Prioritize P0 items that are gating to LOI or close +- Flag items where the seller is slow to respond — may indicate issues +- Cross-reference data room contents against the checklist to identify gaps +- Update the checklist as diligence progresses — it's a living document diff --git a/dd-meeting-prep/SKILL.md b/dd-meeting-prep/SKILL.md new file mode 100644 index 0000000..4e5ffb6 --- /dev/null +++ b/dd-meeting-prep/SKILL.md @@ -0,0 +1,103 @@ +--- +name: dd-meeting-prep +description: Prepare for due diligence meetings — management presentations, expert network calls, customer references, and advisor sessions. Generates targeted question lists, benchmarks to reference, and red flags to probe. Use before any diligence meeting or call. Triggers on "prep for management meeting", "diligence call prep", "expert call questions", "customer reference questions", or "meeting prep for [company]". +--- + +# Diligence Meeting Prep + +## Workflow + +### Step 1: Meeting Context + +Ask the user for: +- **Meeting type**: Management presentation, expert call, customer reference, advisor check-in, site visit +- **Attendees**: Who from the target company or third party +- **Topic focus**: Full business overview, or specific workstream (financial, commercial, operational, tech) +- **What you already know**: Prior meetings, CIM, data room findings +- **Key concerns**: Specific issues to probe + +### Step 2: Generate Question List + +Organize questions by priority and topic. Structure depends on meeting type: + +#### Management Presentation +**Business Overview (warm-up)** +- Walk us through the founding story and key milestones +- How do you describe the business to someone unfamiliar with the space? +- What are you most proud of? What would you do differently? + +**Revenue & Growth** +- Walk us through revenue by customer/segment/geography +- What's driving growth? Price vs. volume vs. new customers +- What does the sales cycle look like? How has win rate trended? +- Where do you see the biggest growth opportunities in the next 3-5 years? + +**Competitive Positioning** +- Who do you lose deals to and why? +- What's your moat? How defensible is it? +- How do customers evaluate you vs. alternatives? + +**Operations & Team** +- Walk us through the org chart — who are the key people? +- What roles are you hiring for? What's been hardest to fill? +- What keeps you up at night operationally? + +**Financial Deep-Dive** +- Walk us through the margin bridge — what's changed and why? +- Any one-time or non-recurring items we should understand? +- How do you think about capex — maintenance vs. growth? +- Working capital seasonality? + +**Forward Look** +- Walk us through the budget/plan for next year +- What assumptions are you most/least confident in? +- What would need to go right/wrong to significantly beat/miss plan? + +#### Expert Network Call +- How do you view [company]'s positioning in the market? +- What are the secular trends driving this space? +- Who are the strongest competitors and why? +- What risks should an investor be aware of? +- If you were buying this business, what would you diligence most carefully? + +#### Customer Reference Call +- How did you find [company] and why did you choose them? +- What alternatives did you evaluate? +- What do they do well? Where could they improve? +- How likely are you to renew/expand? What would change that? +- If they raised prices 10-20%, how would you react? + +### Step 3: Benchmarks & Context + +For each key topic, provide relevant benchmarks: +- Industry growth rates and margin profiles +- Comparable company metrics (if comps analysis exists in session) +- Data points from the CIM or data room that warrant follow-up +- Discrepancies between different data sources to clarify + +### Step 4: Red Flags to Probe + +Based on what's known, flag specific areas to dig into: +- Inconsistencies in the CIM or financials +- Customer concentration or churn signals +- Management team gaps or recent departures +- Unusual accounting treatments +- Missing data room items + +### Step 5: Output + +One-page meeting prep doc: +1. **Meeting logistics**: Who, when, where, duration +2. **Objectives**: Top 3 things you need to learn from this meeting +3. **Question list**: Prioritized, grouped by topic (star the must-asks) +4. **Benchmarks**: Key numbers to reference +5. **Red flags**: Specific items to probe +6. **Follow-up items**: What to request after the meeting + +## Important Notes + +- Lead with open-ended questions — let management talk, then follow up on specifics +- Don't lead the witness — ask neutral questions, not "isn't it true that..." +- Take notes on body language and confidence levels, not just answers +- Always end with: "What haven't we asked about that we should?" +- Keep the question list to 15-20 max — you won't get through more in a 60-90 min session diff --git a/deal-screening/SKILL.md b/deal-screening/SKILL.md new file mode 100644 index 0000000..a9bd8da --- /dev/null +++ b/deal-screening/SKILL.md @@ -0,0 +1,60 @@ +--- +name: deal-screening +description: Quickly screen inbound deal flow — CIMs, teasers, and broker materials — against the fund's investment criteria. Extracts key deal metrics, runs a pass/fail framework, and outputs a one-page screening memo. Use when reviewing new deal flow, triaging inbound materials, or deciding whether to take a first call. Triggers on "screen this deal", "review this CIM", "should we look at this", "triage this teaser", or "deal screening". +--- + +# Deal Screening + +## Workflow + +### Step 1: Extract Deal Facts + +From the provided CIM, teaser, or description, extract: + +- **Company**: Name, location, sector/subsector +- **Description**: What they do (1-2 sentences) +- **Financials**: Revenue, EBITDA, margins, growth rate +- **Deal type**: Platform, add-on, recap, minority, carve-out +- **Asking price / valuation**: Multiple, enterprise value if stated +- **Seller motivation**: Why selling now +- **Management**: Rolling or exiting +- **Key customers**: Concentration risk +- **Key risks**: Obvious red flags + +### Step 2: Screen Against Criteria + +Apply the fund's investment criteria (ask user if not known): + +| Criterion | Target | Actual | Pass/Fail | +|-----------|--------|--------|-----------| +| Revenue range | | | | +| EBITDA range | | | | +| EBITDA margin | | | | +| Growth profile | | | | +| Sector fit | | | | +| Geography | | | | +| Deal size / EV | | | | +| Valuation (x EBITDA) | | | | +| Customer concentration | | | | +| Management continuity | | | | + +### Step 3: Quick Assessment + +Provide a 3-part assessment: + +1. **Verdict**: Pass / Further Diligence / Hard Pass +2. **Bull case** (2-3 bullets): Why this could be a good deal +3. **Bear case** (2-3 bullets): Key risks and concerns +4. **Key questions**: What you'd need to answer on a first call + +### Step 4: Output + +One-page screening memo suitable for sharing with partners or an IC quick screen. + +## Important Notes + +- Speed matters — screening should take minutes, not hours +- Be direct about red flags. Don't bury concerns +- If financials seem inconsistent or incomplete, flag it explicitly +- Ask for the fund's criteria upfront if this is the first screening +- Save screening criteria in memory for future deals once confirmed diff --git a/deal-tracker/SKILL.md b/deal-tracker/SKILL.md new file mode 100644 index 0000000..753077b --- /dev/null +++ b/deal-tracker/SKILL.md @@ -0,0 +1,90 @@ +--- +name: deal-tracker +description: Track multiple live deals with milestones, deadlines, action items, and status updates. Maintains a deal pipeline view and surfaces upcoming deadlines and overdue items. Use when managing a book of business, tracking process milestones, or preparing for weekly deal reviews. Triggers on "deal tracker", "deal status", "where are we on", "process update", "deal pipeline", or "weekly deal review". +--- + +# Deal Tracker + +## Workflow + +### Step 1: Deal Setup + +For each deal, capture: +- **Deal name / code name**: Project [Name] +- **Client**: Seller or buyer name +- **Deal type**: Sell-side, buy-side, financing, restructuring +- **Role**: Lead advisor, co-advisor, fairness opinion +- **Deal size**: Expected enterprise value +- **Stage**: Pre-mandate → Engaged → Marketing → IOI → Diligence → Final bids → Signing → Close +- **Team**: MD, VP, Associate, Analyst assigned +- **Key dates**: Engagement date, CIM distribution, IOI deadline, management meetings, final bid deadline, target close + +### Step 2: Milestone Tracking + +Track key milestones per deal: + +| Milestone | Target Date | Actual Date | Status | Notes | +|-----------|------------|-------------|--------|-------| +| Engagement letter signed | | | | | +| CIM / teaser drafted | | | | | +| Buyer list approved | | | | | +| Teaser distributed | | | | | +| NDA execution | | | | | +| CIM distributed | | | | | +| IOI deadline | | | | | +| IOIs received / reviewed | | | | | +| Shortlist selected | | | | | +| Management meetings | | | | | +| Data room opened | | | | | +| Final bid deadline | | | | | +| Bids received / reviewed | | | | | +| Exclusivity granted | | | | | +| Confirmatory diligence | | | | | +| Purchase agreement signed | | | | | +| Regulatory approval | | | | | +| Close | | | | | + +Status: On Track / At Risk / Delayed / Complete + +### Step 3: Action Items + +Maintain a running action item list across all deals: + +| Action | Deal | Owner | Due Date | Priority | Status | +|--------|------|-------|----------|----------|--------| +| | | | | P0/P1/P2 | Open/Done/Blocked | + +### Step 4: Weekly Deal Review + +Generate a summary for weekly team meetings: + +**For each active deal:** +1. One-line status update +2. Key developments this week +3. Upcoming milestones (next 2 weeks) +4. Blockers or risks +5. Action items for next week + +**Pipeline summary:** +- Total active deals by stage +- Deals at risk (missed milestones, stalled processes) +- New mandates / pitches in pipeline +- Expected closings this quarter + +### Step 5: Output + +- Excel workbook with: + - Pipeline overview (all deals, one row each) + - Per-deal milestone tracker tabs + - Action item master list + - Weekly review summary +- Optional: Markdown summary for email/Slack distribution + +## Important Notes + +- Update the tracker weekly at minimum — stale trackers are worse than no tracker +- Flag deals where milestones are slipping — early warning prevents surprises +- Action items without owners and due dates don't get done — be specific +- The pipeline view should show deal stage, size, and likelihood — useful for revenue forecasting +- Keep notes on buyer/investor feedback — patterns in feedback inform strategy adjustments +- Archive closed/dead deals separately — keep the active view clean diff --git a/deck-refresh/SKILL.md b/deck-refresh/SKILL.md new file mode 100644 index 0000000..c24d112 --- /dev/null +++ b/deck-refresh/SKILL.md @@ -0,0 +1,111 @@ +--- +name: deck-refresh +description: Updates a presentation with new numbers — quarterly refreshes, earnings updates, comp rolls, rebased market data. Use whenever the user asks to "update the deck with Q4 numbers", "refresh the comps", "roll this forward", "swap in the new earnings", "change all the $485M to $512M", or any request to swap figures across an existing deck without rebuilding it. +--- + +# Deck Refresh + +Update numbers across the deck. The deck is the source of truth for formatting; you're only changing values. + +## Environment check + +This skill works in both the PowerPoint add-in and chat. Identify which you're in before starting — the edit mechanism differs, the intent doesn't: + +- **Add-in** — the deck is open live; edit text runs, table cells, and chart data directly. +- **Chat** — the deck is an uploaded file; edit it by regenerating the affected slides with the new values and writing the result back. + +Either way: smallest possible change, existing formatting stays intact. + +This is a four-phase process and the third phase is an approval gate. Don't edit until the user has seen the plan. + +## Phase 1 — Get the data + +Use `ask_user_question` to find out how the new numbers are arriving: + +- **Pasted mapping** — user types or pastes "revenue $485M → $512M, EBITDA $120M → $135M." The clearest case. +- **Uploaded Excel** — old/new columns, or a fresh output sheet the user wants pulled from. Read it, confirm which column is which before you trust it. +- **Just the new values** — "Q4 revenue was $512M, margins were 22%." You figure out what each one replaces. Workable, but confirm the mapping before you touch anything — a "$512M" that you map to revenue but the user meant for gross profit is a quiet disaster. + +Also ask about **derived numbers**: if revenue moves, does the user want growth rates and share percentages recalculated, or left alone? Most decks have "+15% YoY" baked in somewhere that's now stale. Whether to touch those is a judgment call the user should make, not you. + +## Phase 2 — Read everything, find everything + +Read every slide. For each old value, find every instance — including the ones that don't look the same: + +| Variant | Example | +|---|---| +| Scale | `$485M`, `$0.485B`, `$485,000,000` | +| Precision | `$485M`, `$485.0M`, `~$485M` | +| Unit style | `$485M`, `$485MM`, `$485 million`, `485M` | +| Embedded | "revenue grew to $485M", "a $485M business", axis labels | + +A deck that says `$485M` on slide 3, `485` on slide 8's chart axis, and `$485.0 million` in a footnote on slide 15 has three instances of the same number. Find-replace misses two of them. You shouldn't. + +**Where numbers hide:** +- Text boxes (obvious) +- Table cells +- Chart data labels and axis labels +- Chart source data — the numbers driving the bars, not just the labels on them +- Footnotes, source lines, small print +- Speaker notes, if the user cares about those + +Build a list: for each old value, every location it appears, the exact text it appears as, and what it'll become. This list is the plan. + +## Phase 3 — Present the plan, get approval + +**This is a destructive operation on a deck someone spent time on.** Show the full change list before editing a single thing. Format it so it's scannable: + +``` +$485M → $512M (Revenue) + Slide 3 — Title box: "Revenue grew to $485M" + Slide 8 — Chart axis label: "485" + Slide 15 — Footnote: "$485.0 million in FY24 revenue" + +$120M → $135M (Adj. EBITDA) + Slide 3 — Table cell + Slide 11 — Body text: "$120M of Adj. EBITDA" + +FLAGGED — possibly derived, not in your mapping: + Slide 3 — "+15% YoY" (growth rate — stale if base year didn't change?) + Slide 7 — "12% market share" (was this computed from $485M / market size?) +``` + +The flagged section matters. You're not just executing a find-replace — you're catching the second-order effects the user would've missed at 11pm. If the mapping says `$485M → $512M` and slide 3 also has `+15% YoY` right next to it, that growth rate is probably wrong now. Flag it; don't silently fix it, don't silently leave it. + +Use `ask_user_question` for the approval: proceed as shown, proceed but skip the flagged items, or let them revise the mapping first. + +## Phase 4 — Execute, preserve, report + +For each change, make the smallest edit that accomplishes it. How that happens depends on your environment: + +- **Add-in** — edit the specific run, cell, or chart series directly in the live deck. +- **Chat** — regenerate the affected slide with the new value in place, preserving every other element exactly as it was, and write it back to the file. + +Either way, the standard is the same: + +- **Text in a shape** — change the value, leave font/size/color/bold state exactly as they were. If `$485M` is 14pt navy bold inside a sentence, `$512M` is 14pt navy bold inside the same sentence. +- **Table cell** — change the cell, leave the table alone. +- **Chart data** — update the underlying series values so the bars/lines actually move. Editing just the label without the data leaves a chart that lies. + +Don't reformat anything you didn't need to touch. The deck's existing style is correct by definition; you're a surgeon, not a renovator. + +After the last edit, report what actually happened: + +``` +Updated 11 values across 8 slides. + +Changed: + [the list from Phase 3, now past-tense] + +Still flagged — did NOT change: + Slide 3 — "+15% YoY" (derived; confirm separately) + Slide 7 — "12% market share" +``` + +Run standard visual verification checks on every edited slide. A number that got longer (`$485M` → `$1,205M`) might now overflow its text box or push a table column width. Catch it before the user does. + +## What you're not doing + +- **Not rebuilding slides** — if a slide's narrative no longer makes sense with the new numbers ("margins compressed" but margins went up), flag it, don't rewrite it. +- **Not recalculating unless asked** — derived numbers are the user's call. Your Phase 1 question covers this. +- **Not touching formatting** — if the deck uses `$MM` and the user's mapping says `$M`, match the deck, not the mapping. Values change; style stays. diff --git a/ib-check-deck/SKILL.md b/ib-check-deck/SKILL.md new file mode 100644 index 0000000..a9a1b59 --- /dev/null +++ b/ib-check-deck/SKILL.md @@ -0,0 +1,78 @@ +--- +name: ib-check-deck +description: Investment banking presentation quality checker. Reviews a pitch deck or client-ready presentation for (1) number consistency across slides, (2) data-narrative alignment, (3) language polish against IB standards, (4) visual and formatting QC. Use whenever the user asks to review, check, QC, proof, or do a final pass on a deck, pitch, or client materials — including requests like "check my numbers", "reconcile figures across slides", "is this client-ready", or "what am I missing before I send this out". +--- + +# IB Deck Checker + +Perform comprehensive QC on the presentation across four dimensions. Read every slide, then report findings. + +## Environment check + +This skill works in both the PowerPoint add-in and chat. Identify which you're in before starting: + +- **Add-in** — read from the live open deck. +- **Chat** — read from the uploaded `.pptx` file. + +This is read-and-report only — no edits — so the workflow is identical in both. + +## Workflow + +### Read the deck + +Pull text from every slide, keeping track of which slide each line came from. You'll need slide-level attribution for every finding ("$500M appears on slides 3 and 8, but slide 15 shows $485M"). A deck with 30 slides is too much to hold in working memory reliably — write the extracted text to a file so the number-checking script can process it. + +The script expects markdown-ish input with slide markers. Format as: + +``` +## Slide 1 +[slide 1 text content] + +## Slide 2 +[slide 2 text content] +``` + +### 1. Number consistency + +Run the extraction script on what you collected: + +```bash +python scripts/extract_numbers.py /tmp/deck_content.md --check +``` + +It normalizes units ($500M vs $500MM vs $500,000,000 → same number), categorizes values (revenue, EBITDA, multiples, margins), and flags when the same metric category shows conflicting values on different slides. This is the part most likely to catch something a human missed on the fifth read-through. + +Beyond what the script flags, verify: +- Calculations are correct (totals sum, percentages add up, growth rates match the endpoints) +- Unit style is consistent — the deck should pick one of $M or $MM and stick with it +- Time periods are aligned — FY vs LTM vs quarterly, explicitly labeled + +### 2. Data-narrative alignment + +Map claims to the data that's supposed to support them. This is where decks go wrong quietly — someone edits the chart on slide 7 and forgets the narrative on slide 4. + +- Trend statements ("declining margins") → does the chart actually go that direction? +- Market position claims ("#1 player") → revenue and share data support it? +- Plausibility — "#1 in a $100B market" with $200M revenue is 0.2% share; that's not #1 + +### 3. Language polish + +IB decks have a register. Scan for anything that breaks it: casual phrasing ("pretty good", "a lot of"), contractions, exclamation points, vague quantifiers without numbers, inconsistent terminology for the same concept. + +See `references/ib-terminology.md` for replacement patterns. + +### 4. Visual and formatting QC + +Run standard visual verification checks on each slide. You're looking for: missing chart source citations, missing axis labels, typography inconsistencies, number formatting drift (1,000 vs 1K within the same deck), date format drift, footnote and disclaimer gaps. + +Visual verification catches overlaps, overflow, and contrast issues that don't show up in text extraction. Don't skip it — a chart with no source citation looks the same as a properly sourced one in the text dump. + +## Output + +Use `references/report-format.md` as the structure. Categorize by severity: + +- **Critical** — number mismatches, factual errors, data contradicting narrative. These block client delivery. +- **Important** — language, missing sources, terminology drift. Should fix. +- **Minor** — font sizes, spacing, date formats. Polish. + +Lead with criticals. If there aren't any, say so explicitly — "no number inconsistencies found" is a finding, not an absence of one. diff --git a/ib-check-deck/references/ib-terminology.md b/ib-check-deck/references/ib-terminology.md new file mode 100644 index 0000000..9d50318 --- /dev/null +++ b/ib-check-deck/references/ib-terminology.md @@ -0,0 +1,49 @@ +# IB Terminology Reference + +## Casual to Professional Replacements + +| Casual/Informal | IB Standard | +|-----------------|-------------| +| "a lot of growth" | "significant growth" or "X% growth" | +| "pretty good margins" | "attractive margins" or "margins of X%" | +| "they bought the company" | "the company was acquired" | +| "big deal" | "transformative transaction" | +| "cheap valuation" | "attractive valuation" or "valuation discount" | +| "expensive" | "premium valuation" | +| "make more money" | "enhance profitability" or "drive margin expansion" | +| "getting bigger" | "pursuing growth" or "expanding operations" | +| "cut costs" | "implement cost optimization" or "drive operational efficiencies" | +| "good fit" | "strategic fit" or "compelling strategic rationale" | +| "help with" | "support" or "facilitate" | +| "a bunch of" | "multiple" or "numerous" | +| "kind of" / "sort of" | [remove or be specific] | +| "really" / "very" | [remove or quantify] | +| "tons of" | "substantial" or quantify | +| "huge" | "significant" or quantify | +| "pretty much" | [remove or be precise] | +| "basically" | [remove or clarify] | + +## Language Patterns to Avoid + +- **Contractions**: Don't → Do not, won't → will not +- **Exclamation points**: Generally inappropriate for IB materials +- **First-person**: "We think..." → "Management believes..." or passive voice +- **Superlatives without evidence**: "best-in-class" requires supporting data +- **Vague quantifiers**: "some", "many", "several" → specific numbers + +## Preferred Phrasing Patterns + +**Growth narratives**: +- "Demonstrated track record of X% revenue CAGR" +- "Consistent margin expansion over [period]" +- "Proven ability to generate organic growth" + +**Market position**: +- "#X player in [specific segment]" +- "Leading provider of [specific offering]" +- "Differentiated positioning through [specific attribute]" + +**Strategic rationale**: +- "Compelling strategic fit driven by..." +- "Attractive value creation opportunity through..." +- "Synergy potential of $Xm from [specific sources]" diff --git a/ib-check-deck/references/report-format.md b/ib-check-deck/references/report-format.md new file mode 100644 index 0000000..4321623 --- /dev/null +++ b/ib-check-deck/references/report-format.md @@ -0,0 +1,67 @@ +# Deck Check Report Format + +## Report Template + +```markdown +# Deck Check Report: [Presentation Name] + +## Summary +- Total issues: X +- Critical: X (number mismatches, factual errors) +- Important: X (narrative-data alignment, language) +- Minor: X (formatting) + +## Critical Issues + +### Number Consistency +1. **[Issue name]** (Slides X, Y) + - Slide X: [value] + - Slide Y: [value] + - Action: [recommendation] + +### Data-Narrative Alignment +1. **[Issue name]** (Slides X, Y) + - Claim: "[quoted text]" + - Data shows: [contradiction] + - Action: [recommendation] + +## Important Issues + +### Language Polish +1. **[Issue type]** (Slide X) + - Current: "[quoted text]" + - Suggested: "[replacement]" + +## Minor Issues + +### Formatting +1. **[Issue type]** (Slide X) + - [Description and fix] + +## Final Checklist +- [ ] Numbers reconciled +- [ ] Narrative matches data +- [ ] Language meets IB standards +- [ ] Charts sourced +- [ ] Formatting consistent +``` + +## Issue Severity Classification + +**Critical** (must fix before client delivery): +- Number mismatches across slides +- Calculation errors +- Factual inaccuracies (names, titles, dates) +- Data contradicting narrative + +**Important** (should fix): +- Casual/informal language +- Vague claims without specificity +- Terminology inconsistency +- Missing chart sources + +**Minor** (polish items): +- Font/color inconsistencies +- Date format variations +- Spacing/alignment issues +- Orphaned text diff --git a/ib-check-deck/scripts/extract_numbers.py b/ib-check-deck/scripts/extract_numbers.py new file mode 100644 index 0000000..e4c490a --- /dev/null +++ b/ib-check-deck/scripts/extract_numbers.py @@ -0,0 +1,305 @@ +#!/usr/bin/env python3 +""" +Extract numerical values from presentation content for consistency checking. + +Usage: + python extract_numbers.py presentation-content.md + python extract_numbers.py presentation-content.md --output numbers.json + +This script parses markdown-formatted presentation content (from markitdown) +and extracts all numerical values with their context and slide references. +""" + +import argparse +import json +import re +import sys +from collections import defaultdict +from dataclasses import dataclass, asdict +from pathlib import Path +from typing import Optional + + +@dataclass +class NumberInstance: + """A numerical value found in the presentation.""" + value: str # Original string representation + normalized: float # Normalized numeric value + unit: str # Detected unit (M, B, K, %, bps, x, etc.) + slide: int # Slide number (0 if unknown) + context: str # Surrounding text for context + line_number: int # Line number in source file + category: str # Detected category (revenue, margin, multiple, etc.) + + +def normalize_number(value_str: str, unit: str) -> float: + """Convert a number string with unit to a normalized float value.""" + # Remove commas and spaces + clean = re.sub(r'[,\s]', '', value_str) + + try: + base_value = float(clean) + except ValueError: + return 0.0 + + # Apply unit multipliers + multipliers = { + 'T': 1e12, + 'B': 1e9, + 'bn': 1e9, + 'billion': 1e9, + 'M': 1e6, + 'mm': 1e6, + 'mn': 1e6, + 'million': 1e6, + 'K': 1e3, + 'k': 1e3, + 'thousand': 1e3, + } + + for unit_key in sorted(multipliers.keys(), key=len, reverse=True): + if unit_key.lower() in unit.lower(): + return base_value * multipliers[unit_key] + + return base_value + + +def detect_category(context: str, unit: str) -> str: + """Detect the category of a number based on context and unit.""" + context_lower = context.lower() + + # Revenue-related + if any(term in context_lower for term in ['revenue', 'sales', 'top line', 'topline']): + return 'revenue' + + # EBITDA-related + if 'ebitda' in context_lower: + if any(term in context_lower for term in ['margin', '%', 'percent']): + return 'ebitda_margin' + return 'ebitda' + + # Margin-related + if any(term in context_lower for term in ['margin', 'profit']): + return 'margin' + + # Growth-related + if any(term in context_lower for term in ['growth', 'cagr', 'yoy', 'y/y']): + return 'growth' + + # Valuation multiples + if any(term in context_lower for term in ['multiple', 'ev/', 'p/e', 'ev/ebitda', 'ev/revenue']): + return 'multiple' + + # Enterprise value / market cap + if any(term in context_lower for term in ['enterprise value', 'ev ', 'market cap']): + return 'valuation' + + # Percentage (generic) + if unit in ['%', 'bps', 'percent']: + return 'percentage' + + # Multiple indicator + if unit == 'x': + return 'multiple' + + return 'other' + + +def extract_numbers(content: str) -> list[NumberInstance]: + """Extract all numbers from presentation content.""" + numbers = [] + current_slide = 0 + + # Pattern for slide markers (from markitdown format) + slide_pattern = re.compile(r'^#+\s*Slide\s*(\d+)|^ + + + + + + +``` + +### Table Row with Cells + +```xml + + + + + + + + + + Grand View Research + + + + + + + + + + + + + + 22.1 + + + + + + + +``` + +### Header Row Styling + +```xml + + + + + + + + + + + + + + Source + + + + + + + + + + + +``` + +--- + +## Arrow Shapes + +### Right Arrow Shape + +```xml + + + + + + + + + + + + + + + + + + + + + + +``` + +### Down Arrow Shape + +```xml + + + + + + + + + + + + + + + + + + + +``` + +### Chevron Shape + +```xml + + + + + + + + + + + + + + + + + + + +``` + +--- + +## Text Boxes + +### Basic Text Box + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + Text content here + + + + +``` + +### Text Box with Bullet Points + +```xml + + + + + + + + + + + + + First bullet point + + + + + + + + + + Second bullet point + + + +``` + +### Text with White Color (for dark backgrounds) + +```xml + + + + + + + White text on colored background + +``` + +--- + +## Shapes with Fill + +### Rectangle with Solid Fill + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Label Text + + + + +``` + +--- + +## Image Insertion + +### Adding Image to Slide + +```xml + + + + + + + + + + + + + + + + + + + + + + + + +``` + +### Adding Image Relationship + +In `ppt/slides/_rels/slideN.xml.rels`: + +```xml +