Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when building or formatting a financial model spreadsheet: enforces the blue/black/green/red font-by-role color code, parentheses-for-negatives and dash-for-zero number formats, 0.0% percentages, 0.0x multiples, and text-formatted years — which cheaper models do not apply by default.
.claude/skills/financial-model-formatting/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 100% | 1 |
| Model | Lift | Δ tokens | Δ turns | Cases | Verified |
|---|---|---|---|---|---|
| gemini-3.6-flashbest | +23% | +67% | 0% | 22 | 54d ago |
| gemini-3.5-flash | pending re-run | — | |||
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | — | — |
| case-12 | ✗→✓ | ▲ Improved | — | — |
| case-13 | ✗→✓ | ▲ Improved | — | — |
| case-20 | ✗→✓ | ▲ Improved | — | — |
| case-09 | ✗→✓ | ▲ Improved | — | — |
When you produce or edit a financial-model spreadsheet (openpyxl/xlsxwriter code, a cell-by-cell layout, or a description of the formatting), apply the investment-banking modeling house style: cells are font-colored by their ROLE, numbers use the fixed finance format codes, assumptions live in referenced cells, and hardcodes carry a source tag. Use this whenever the deliverable is a model (DCF, LBO, three-statement, comps, budget, schedule, cap table) — not for a one-off data dump.
Color the FONT of every value cell by what kind of value it holds. This is the single most load-bearing rule; never leave every cell the default black.
| Cell role | Font color | Hex | RGB | |---|---|---|---| | Hardcoded input / assumption (a number a user changes for scenarios) | Blue | 0000FF | 0,0,255 | | Formula or calculation | Black | 000000 | 0,0,0 | | Link to a cell on ANOTHER sheet in the SAME workbook | Green | 008000 | 0,128,0 | | Link to a cell in a DIFFERENT (external) workbook file | Red | FF0000 | 255,0,0 |
In addition, fill (background) key assumptions a reviewer must revisit with yellow (FFFF00). Yellow is a fill, not a font color; it stacks on top of the blue font.
Apply these exact Excel number-format strings. The defaults a general model reaches for (two decimals, leading-minus negatives, "0" for zero) are wrong here.
$#,##0 — whole units, no cents. State the unit in the columnheader instead of in the cells, e.g. a header reading Revenue ($mm).
$#,##0;($#,##0);- for currency, or #,##0;(#,##0);- for plain counts.
(1,250), never a leading-minus -1,250.0.0% — exactly one decimal place.0.0x — one decimal and a literaltrailing x, e.g. 8.5x.
2024, never the General/number formatthat renders a thousands separator (2,024).
Every driver (growth rate, margin, tax rate, multiple) gets its OWN labeled cell, and formulas REFERENCE that cell. Never bake a driver into a formula as a literal.
=B5*(1+$B$6) where $B$6 holds the growth assumption.=B5*1.08.=SUM(...), =AVERAGE(...),=C9/C8), never a value you computed yourself and pasted as a literal.
Each hardcoded input carries a brief cell note recording where the number came from — the source system or document, the date, and the specific reference it was taken from.
No #REF!, #DIV/0!, #VALUE!, #N/A, or #NAME? may survive in the delivered file. Guard division denominators and check references before delivering.
A monthly SaaS build hardcodes starting ARR and a churn rate, computes net ARR, and pulls headcount from an Operating sheet.
BEFORE (base default — everything plain black):
pythonws["B2"] = 1200000 # starting ARR (input) ws["B3"] = 0.03 # monthly churn (input) ws["B4"] = "=B2*(1-B3)" # net ARR (formula) ws["B5"] = "=Operating!C10" # headcount, same workbook other sheet # no font colors set -> all black
AFTER (conforming — font color by role):
pythonws["B2"].font = Font(color="0000FF") # input -> blue ws["B3"].font = Font(color="0000FF") # input -> blue ws["B4"].font = Font(color="000000") # formula -> black ws["B5"].font = Font(color="008000") # intra-workbook link -> green
If B5 instead pulled from a separate file, its font would be red (FF0000).
A manufacturing margin line shows revenue, a loss period, a zero, a margin, and a trading multiple.
BEFORE (base default):
Revenue: $4,200,000.00
EBIT: -$85,000.00
Backlog: 0
Margin: 0.182
EV/EBITDA: 9.4
Year: 2,025AFTER (conforming format codes):
Revenue ($): 4,200,000 -> number_format "$#,##0"
EBIT ($): (85,000) -> "$#,##0;($#,##0);-"
Backlog ($): - -> "$#,##0;($#,##0);-"
Margin: 18.2% -> "0.0%"
EV/EBITDA: 9.4x -> "0.0x"
Year: 2025 (text) -> stored as text, no separatorBEFORE: ws["C5"] = "=C4*1.08" (8% growth baked in) AFTER: ws["C2"] = 0.08 (blue input, labeled "Growth") and ws["C5"] = "=C4*(1+$C$2)"
BEFORE: a bare 42.5 typed into the WACC cell. AFTER: 42.5 with a note Source: Company 10-K, FY2024, Page 45, Revenue Note, [SEC EDGAR URL].
color scheme or number formats, match it exactly; do not impose this house style on top of an established one.
a blue input cell, the calculation that uses it is a separate black formula cell.
not need a source tag, but still gets blue font as an input.
the 0.0x rule, not 0.0%, when labeled as a multiple/ratio "times" figure.
0000FF) and leave formulas black (000000).(1,250) and zeros as -.0.9.4x and percentages as 18.2%.9.4 or 9.4% or 940%.=B5*(1+$B$6)).=B5*1.08).Revenue ($mm)).links, red is strictly external-file links.
$4,200,000.00) instead of whole-dollar $#,##0.0 instead of a dash for zero values.2,025).$#,##0; units in headers, not cells(x), zeros -0.0%, multiples 0.0xSource: ... tags| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-03 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +23 percentage points is the difference between those two pass rates over the 22 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.5-flash | verified | 7/9/2026 | +50% |
Other measured skills in the registry, with their headline benchmark lift.