Fpa capture correction
The FP&A toolbelt for AI coding agents. Claude Code or Codex does the thinking; openfpa gives it a tested finance kernel, durable company memory, and a Karpathy inspired research loop that improves forecasts against your actuals. By Guiderail and Jeff Brines.
npx -y skills add JeffBrines/openfpa --skill fpa-capture-correctionAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 5 stars5 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Use when a human reviewing a forecast catches something off ("December always spikes", "you're double-counting deferred revenue", "that Q3 number was a one-time contract") - captures it as a durable, typed correction in the company's memory so future forecasts are grounded by it.
SKILL.md
3.4 KB, as published. Nobody here has run it
Capture a Correction (Operate)
Overview
A human reviewing a forecast is the highest-signal feedback there is - they catch
structural errors and domain knowledge the backtest can't see, and catch them now.
This skill turns that into durable memory: a typed correction in .fpa/corrections/
that grounds every future forecast.
Core principle: the human is the authority; capture, confirm interpretation once, then it persists. Everything is plain markdown the user owns.
The three correction types
- parametric - a concrete driver fix ("December runs ~2× a normal month"). Becomes
an
override(a config path + value) applied to every future forecast viapyfpa.apply_corrections. - structural - a methodology fix ("you're double-counting deferred revenue"). A pre-ratified structural proposal (the human authored it) - route it to fpa-learn-business to generate the skill/model change; do NOT wait for backtest misses.
- context - a one-time-item note ("that Q3 spike was a one-off contract"). Annotates so fpa-cfo-judgment's one-time screen keeps the backtest from "learning" a one-off.
Workflow
- Classify the correction (parametric / structural / context).
- Identify the target - the driver path (e.g.
channels[*].seasonality[11],working_capital.dio_days), line, or profile area. For parametric, draft the concreteoverride: {path, value}. - Write the correction with
pyfpa.save_correction. Setslugto a<date>-<short-name>string (e.g.2026-06-08-december-seasonality) -save_correctionuses the whole slug as the filename (.fpa/corrections/<slug>.md), so keep the date in it. Include frontmatter (type,target,status,date,override) and a markdown body (**Was off:** … **Correction:** … **Why:** [[…]]), linking to the assumption/profile it corrects with[[wikilinks]]. - Confirm interpretation. Echo back the concrete change ("I'll set December
seasonality to 2.0 on all channels - right?"). Only on confirmation set
status: applied. - Keep
.fpa/MEMORY.mdcurrent - the vault index (see below).
Applying corrections
When building any forecast, pyfpa.apply_corrections(cfg, load_corrections(".fpa/corrections"))
folds the applied parametric corrections into the config. The per-client loop refines from
there - corrections are seeds, not mandates.
The .fpa/ vault (MEMORY.md index)
Keep a .fpa/MEMORY.md that orients a human, Obsidian, or Claude:
business-profile.md- what we know about the business.corrections/- human corrections (this skill).forecasts/*.snapshot.yaml,scorecard.md- forecast snapshots + backtest track record.learnings.md- accepted model changes. All plain markdown - open it in Obsidian if you like, but never required.
Guardrails
- Confirm interpretation before
applied. Reversible viastatus(open/applied/superseded). - The backtest monitors applied corrections and may flag a stale one - it never reverts; the human decides.
Next
Correction captured → fpa-monthly-close / fpa-board-briefing (re-run grounded by it).