You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Credibility pass addressing external review feedback. Every claim in the
repo now matches shipping code.
Docs truth-alignment:
- '14 templates' -> '12 templates' in README, SKILL, plugin.json,
marketplace.json, ib-deck command (the demo full_deck.py still produces
14 slides because section_divider is reused 3 times; this is now noted
explicitly)
- Removed speculative cross_audit claims from README (moved to roadmap)
- Removed bundled xlsxwriter / edgartools claims (kept only as troubleshooting
guidance and roadmap items, since neither is implemented in v0.1.0)
- Reframed /ib-extract as a 'guided workflow for structuring financials'
rather than an automated SEC EDGAR pipeline
- Reframed /ib-deck as an orchestration workflow rather than an autonomous
command
- Toned down 'their plugin is structurally broken' rhetoric; now describes
the renderer-first architecture as 'an alternative worth considering'
- Added explicit 'What this plugin does NOT do (yet)' section and a
versioned roadmap
Missing referenced files created:
- skills/ib-deck-engine/reference/examples/stacked_bar_table.json
- skills/ib-deck-engine/reference/examples/trading_comps.json
- skills/ib-deck-engine/reference/examples/dual_chart.json
- skills/ib-deck-engine/reference/examples/sensitivity.json
- skills/ib-deck-engine/reference/style-guide.md
- skills/ib-deck-engine/reference/architecture.md
Determinism tests added:
- tests/normalize.py - PPTX content hashing that strips volatile ZIP
metadata (creation timestamps, last-modified fields) before hashing.
Only the parts of the output that affect appearance go into the hash.
- tests/test_determinism.py - 13 tests:
* 12 per-template determinism tests (each template rendered twice,
normalized content hashes compared)
* 1 stability test (render_financial_summary rendered 10 times, all 10
content hashes must be identical)
- pytest.ini - test runner config
- .github/workflows/tests.yml - run tests on push + PR
All 13 tests pass locally.
The architectural claim 'fixed input, repeated renders, identical output'
is now backed by code, not narrative.
**Why this exists:** Other AI slide tools ask the LLM to write spatial code (`Inches(2.5), Pt(11)`). That's why their output has misaligned tables, disproportional bar charts, and reference label collisions. This plugin separates content reasoning (LLM's strength) from spatial rendering (deterministic code's strength). Right-alignment is guaranteed by the template, not hoped for.
5
+
> A Claude Code plugin with a 12-template investment banking slide library built on a renderer-first architecture: the LLM fills structured JSON specs and a deterministic Python renderer handles every pixel.
6
+
7
+
**The core idea:** separate content reasoning (LLM's strength) from spatial rendering (deterministic code's strength). The LLM never writes `Inches()`, `Pt()`, or EMU values. It picks a template and passes data. The renderer guarantees right-alignment, proportional chart bars, and collision-free label placement by construction.
8
+
9
+
This plugin is an alternative architecture worth considering alongside [`anthropics/financial-services-plugins`](https://github.com/anthropics/financial-services-plugins). Different tradeoffs, smaller scope, tighter guarantees on the things it does cover.
10
+
11
+
## Status
12
+
13
+
**Version 0.1.0 — early prototype.** What's shipped today is the 12-template rendering library and slash-command workflows that guide Claude through filling the JSON specs. It's installable and runnable. Extraction, full model building, and cross-model auditing are workflow guides (not automated pipelines) in this version — see [Roadmap](#roadmap) for what's coming.
6
14
7
15
## Installation
8
16
@@ -25,10 +33,12 @@ claude plugin list | grep ib-deck
25
33
26
34
## Available commands
27
35
36
+
Each command loads the `ib-deck-engine` skill, which walks Claude through picking the right template, filling a JSON spec from your data, and calling the renderer. The commands are workflow guides — not autonomous pipelines.
37
+
28
38
| Command | Purpose |
29
39
|---------|---------|
30
-
|`/ib-deck [TICKER]`|Build a complete 14-slide IB pitch deck for a public company|
31
-
|`/ib-extract [TICKER]`|Pull a 10-K from SEC EDGAR into a structured JSON master file|
40
+
|`/ib-deck [TICKER]`|Walk through building a complete IB pitch deck (orchestrates multiple templates)|
41
+
|`/ib-extract [TICKER]`|Guided workflow: extract 10-K data into the master JSON schema the templates expect|
32
42
|`/ib-financial [COMPANY]`| Build a single financial summary table slide |
33
43
|`/ib-football [COMPANY]`| Build a football field valuation summary slide |
34
44
|`/ib-comps [TARGET]`| Build a trading comparables peer multiples table |
@@ -37,72 +47,32 @@ claude plugin list | grep ib-deck
37
47
38
48
## Quick start
39
49
40
-
```bash
41
-
# In Claude Code, after installing the plugin:
42
-
/ib-deck ADUS
43
-
```
44
-
45
-
Claude will:
46
-
1. Pull Addus HomeCare's most recent 10-K from SEC EDGAR via `edgartools`
47
-
2. Extract financials into a structured JSON master file
48
-
3. Fill JSON specs for 14 slide templates
49
-
4. Render a pixel-perfect PPTX using the IBRenderer
50
-
5. Save to `ADUS_pitch_deck.pptx`
51
-
52
-
The entire pipeline takes one prompt.
53
-
54
-
## What this plugin solves that the existing financial-services-plugins doesn't
55
-
56
-
I built this after analyzing the source code of `anthropics/financial-services-plugins`. Here are the specific gaps it fills:
50
+
After installing the plugin and restarting Claude Code:
57
51
58
-
### 1. Cross-model desync ✗ → ✓
59
-
The existing plugins build DCF and LBO independently. There's nothing guaranteeing both use the same revenue, EBITDA, share count, or tax rate. In a Medpace case study, the DCF used 15% effective tax and the LBO used 21% statutory with no documentation.
60
-
61
-
**This plugin's fix:**`/ib-extract` produces a single master JSON. Every downstream model and slide references it. A `cross_audit` function verifies consistency across DCF, LBO, and slides.
62
-
63
-
### 2. openpyxl corruption ✗ → ✓
64
-
The existing DCF skill (line 21) defaults to openpyxl for standalone xlsx generation. This produces files that trigger Excel's "We found a problem" recovery dialog.
65
-
66
-
**This plugin's fix:** Uses `xlsxwriter` by default for new file creation. openpyxl is only for reading existing files.
67
-
68
-
### 3. Spatial execution ceiling ✗ → ✓
69
-
The existing skills tell the LLM to write `python-pptx` code directly. The LLM has to remember `Inches(2.5), Pt(11)` for every cell. Failures: right-alignment inconsistent, bar heights not proportional, reference labels overlapping titles.
70
-
71
-
**This plugin's fix:** The LLM never writes spatial code. It picks a template (`render_financial_summary`) and fills a JSON spec. The IBRenderer guarantees:
72
-
- Right-alignment on all numeric columns
73
-
- Proportional bar heights (`value / max_value × chart_height`)
74
-
- Tables are real PowerPoint table objects (not text with tabs)
75
-
- Reference labels never overlap (collision detection built-in)
76
-
- Source text dynamically positioned below content
77
-
78
-
### 4. Generic titles ✗ → ✓
79
-
The existing plugins don't enforce action titles. You get "Financial Summary" instead of "Consistent Revenue Growth With Expanding EBITDA Margin Expansion".
80
-
81
-
**This plugin's fix:** SKILL.md explicitly requires action titles on every slide and gives examples.
82
-
83
-
### 5. No template library ✗ → ✓
84
-
The existing plugins make Claude generate slides from scratch each time. No reusable patterns.
52
+
```
53
+
/ib-financial ADUS
54
+
```
85
55
86
-
**This plugin's fix:** 14 pre-built templates for the most common IB slide types, each with a documented JSON schema.
56
+
Claude will load the skill, ask for the historical financials (or pull them from a JSON you provide), fill out the `render_financial_summary` JSON spec, and call the renderer. The output is a single PPTX slide with right-aligned numerics, bold subtotals, italic gray % rows, and a navy section header — rendered by deterministic Python code, not by the model guessing coordinates.
87
57
88
-
## The 14 templates
58
+
## The 12 templates
89
59
90
60
| # | Template | Pattern | Reference |
91
61
|---|----------|---------|-----------|
92
-
| 1 |`render_cover`| Cover with confidential mark + bank badge | GS board pres format |
93
-
| 2 |`render_section_divider`| Full navy bg with section title | GS / Moelis style |
62
+
| 1 |`render_cover`| Cover with confidential mark + bank badge | GS board presentation format |
63
+
| 2 |`render_section_divider`| Full navy background with section title | GS / Moelis style |
94
64
| 3 |`render_toc`| Numbered agenda with light blue bands | GS agenda slides |
- 1 stability test (`render_financial_summary` rendered 10 times, all 10 content hashes identical)
131
+
132
+
The tests use a [normalized PPTX hash](tests/normalize.py) that strips volatile ZIP metadata (creation timestamps, last-modified fields) before hashing, so only the parts of the output that affect appearance are compared.
133
+
134
+
This is the evidence trail for the "fixed input, repeated renders, identical output" claim. If any of those tests fail, the architecture's core promise is broken.
135
+
136
+
## What this architecture optimizes for
137
+
138
+
**Repeatability.** Same input → same output. The renderer doesn't depend on what the LLM felt like typing in any particular run.
149
139
150
-
The standalone Python library (without the plugin packaging) is at:
151
-
**https://github.com/gorajing/ib-deck-engine**
140
+
**Evaluability.** "Did the LLM pick the right template and fill the right data?" is a simpler test than "did the LLM write correct python-pptx code for this specific slide?"
141
+
142
+
**Maintainability.** New templates are code, not prompts. They can be reviewed, versioned, and tested.
143
+
144
+
**Lower failure surface.** Every pixel decision the LLM doesn't make is a pixel decision that can't be wrong.
145
+
146
+
## What this plugin does not do (yet)
147
+
148
+
Being honest about the scope of v0.1.0:
149
+
150
+
-**No end-to-end SEC EDGAR extraction.**`/ib-extract` is a guided workflow that instructs Claude on the target JSON schema. A fully automated extraction command is on the roadmap.
151
+
-**No Excel model generation.** The companion standalone repo includes DCF and LBO `xlsx` build scripts for the ADUS case study, but they're not wired into the plugin as commands yet.
152
+
-**No cross-model audit command.** A programmatic 20-check audit exists in the companion repo for the ADUS case study. Making it a `/ib-audit` slash command is on the roadmap.
153
+
-**No Office JS / in-PowerPoint support.** The renderer is python-pptx. It produces `.pptx` files from outside PowerPoint. An Office JS port would be needed for Cowork / in-PowerPoint use.
154
+
-**Only 12 templates.** Real IB decks use ~25-30 patterns. See the [roadmap](#roadmap) for what's coming next.
155
+
156
+
## Roadmap
157
+
158
+
v0.2.0 goals:
159
+
- Expand template library to 20+ (add precedent transactions, multi-chart dashboard, share price chart, debt schedule, value creation bridge, process timeline, buyer universe grid)
160
+
- Automated `/ib-extract` that calls `edgartools` and produces the master JSON
161
+
- Automated `/ib-dcf-model` and `/ib-lbo-model` using xlsxwriter
162
+
-`/ib-audit` cross-model consistency check
163
+
164
+
v0.3.0 goals:
165
+
- Bank style variants (Moelis, Evercore, McKinsey presets)
166
+
- MCP server wrapper so the renderer works in Claude Desktop and Cowork
167
+
- Determinism test expansion to every template
168
+
- GitHub Pages gallery
169
+
170
+
## Companion repo
152
171
153
-
It includes a complete worked example for Addus HomeCare Corp (ADUS) — DCF model, LBO model, master JSON, and rendered 14-slide deck.
172
+
The standalone Python library (without the plugin packaging) and the complete ADUS case study artifacts live at **[gorajing/ib-deck-engine](https://github.com/gorajing/ib-deck-engine)**. That repo includes the DCF model (401 formulas), LBO model (244 formulas), master JSON extraction example, and a 14-slide rendered ADUS deck.
154
173
155
174
## Disclaimer
156
175
157
-
This is a learning case study and template library. Models are simplified. Numbers in the example case study are illustrative. Always verify financial data against primary sources before relying on it for investment decisions.
176
+
This is a learning project and early prototype. Models in the companion case study are simplified. Example numbers are illustrative. Always verify financial data against primary sources before relying on it for any investment decision.
- One-off extraction script using `edgartools` (not bundled with this plugin in
36
+
v0.1.0 — see the companion repo at github.com/gorajing/ib-deck-engine for a
37
+
reference extraction)
23
38
24
-
For public US companies, use `edgartools` to pull the most recent 10-K:
25
-
- Revenue, COGS, gross profit, operating income, EBITDA, net income (3 years)
26
-
- Balance sheet (cash, AR, debt, equity)
27
-
- Cash flow statement (CFO, CapEx, financing)
28
-
- Segment revenue if available
29
-
- Diluted share count
30
-
- Save as `{ticker}_master.json` — single source of truth
39
+
The JSON should include: 3 years of historical IS/BS/CF, segment revenue if
40
+
available, debt detail, and diluted share count.
31
41
32
-
### Step 3: Build the 14-slide deck
42
+
### Step 3: Build the deck
33
43
34
44
Use the IBRenderer templates in this order:
35
45
@@ -50,23 +60,24 @@ Use the IBRenderer templates in this order:
50
60
51
61
### Step 4: Verify and deliver
52
62
53
-
- Confirm 14 slides generated
54
-
-Verify source text on each content slide
63
+
- Confirm slide count
64
+
-Spot-check source text on each content slide
55
65
- Save as `{ticker}_pitch_deck.pptx`
56
66
- Report the file path to the user
57
67
58
68
## Critical rules
59
69
60
70
-**Action titles only** — never "Financial Summary," always "Consistent Revenue Growth With Expanding Margins"
61
71
-**Every number sourced** — trace each value to a source file or note "Estimated"
62
-
-**Cross-model consistency** — DCF and LBO must use the same revenue, EBITDA, share count
63
-
-**Right-alignment automatic** — handled by templates, don't override
72
+
-**Cross-model consistency** — DCF and LBO should use the same revenue, EBITDA, share count. Document any intentional differences (e.g., LBO using statutory vs effective tax rate).
73
+
-**Right-alignment is handled by the templates** — don't override it in the JSON spec
64
74
65
75
## Example: ADUS
66
76
67
77
```
68
78
/ib-deck ADUS
69
79
```
70
80
71
-
Builds a complete 14-slide pitch book for Addus HomeCare Corp using SEC EDGAR data.
72
-
See `skills/ib-deck-engine/reference/examples/full_deck.py` for the full worked example.
81
+
Walks through building a pitch book for Addus HomeCare Corp. A complete worked
82
+
example (including the ADUS master JSON and the generated PPTX) lives at the
0 commit comments