openfpa — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited openfpa (Plugin) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
openfpa is an agent-native FP&A workbench. It gives an AI coding agent a tested finance kernel, an operating contract, durable company memory, and a research loop for building the FP&A system that fits one company.
If Codex or Claude Code is the reasoning engine, openfpa is the FP&A toolbelt it straps on. The agent still thinks, asks questions, writes code, and makes judgments. openfpa gives it the finance-specific tools, memory, checks, and working method required to do that work well.
It is not a fixed FP&A application. It is not a catalog of prebuilt connectors. It is not a universal financial model.
The intended workflow is:
and reports.
The company workspace is the product. The Python package is the stable kernel inside it. The human points the agent toward the relevant data and business context. The agent uses the toolbelt to learn the company, ask the right questions, build the right FP&A system, and improve it as actual outcomes arrive.
Traditional FP&A software asks a company to configure itself inside a fixed application. openfpa takes the opposite approach. It gives an AI enough finance structure, memory, and guardrails to learn the business and build what that CFO or FP&A team actually needs.
A generic AI can write a forecast from scratch, but each run tends to produce a new pile of code with no shared accounting logic, durable context, test history, or promotion process. openfpa adds:
capital, debt, tax, cash flow, reconciliation, and reporting primitives live in pyfpa.
AGENTS.md, CLAUDE.md, and the skills inskills/ define how the agent should inspect evidence, ask questions, make changes, and validate its work.
forecasts, experiments, decisions, and model history live in .fpa/.
held-out actuals and accounting checks. Weak challengers are retained as failed research. Promotion requires human approval.
where it can be reviewed, tested, and changed.
The goal is not deterministic software that produces the same template for every company. The goal is a dependable process that helps the AI produce a better company-specific result over time.
For broad company work, the agent starts by inspecting local evidence. It does not begin with a long generic questionnaire.
It records what it can establish, including sources and confidence, then asks only unresolved questions in short rounds. Typical questions cover:
The first durable outputs are:
.fpa/intake.md;.fpa/business-profile.md;.fpa/decisions/initial-model-architecture.md.The agent waits for approval before generating a model or accessing an external system. Narrow requests do not force a full company interview.
openfpa does not aim to maintain a conventional connector marketplace. The AI should help the user reach the data that already exists, then build the smallest reliable ingestion path for that company.
The agent should first ask where the relevant evidence lives:
It should then choose an access path:
Generated connector code belongs in connectors/generated/. It should include:
The small functions in pyfpa.io.adapters are fixture-backed examples, not live QuickBooks, NetSuite, or Shopify integrations. Credentials stay with the host tool or environment and are never committed.
company/
|-- .fpa/
| |-- MEMORY.md
| |-- intake.md
| |-- business-profile.md
| |-- sources/
| |-- mappings/
| |-- corrections/
| |-- forecasts/
| |-- experiments/
| |-- decisions/
| |-- models/
| `-- research/
|-- connectors/generated/
|-- models/generated/
|-- skills/generated/
`-- agents/generated/Canonical memory remains readable Markdown and YAML. A rebuildable local index supports task-specific retrieval, but the index is not the source of truth.
Memory and learning are different:
humans corrected or approved.
evidence from accepted and rejected experiments.
See docs/agent-native-workspace.md for the workspace and mutation contract.
The iteration model is inspired by Karpathy's AutoResearch: define an objective, run bounded experiments, keep measurable improvements, and preserve failed attempts so they are not repeated without new evidence.
For FP&A, the objective is not simple in-sample reconciliation. A candidate should improve forecast performance on held-out actuals while passing hard checks such as:
The AI may generate, evaluate, and discard challengers after the initial architecture is approved. A promotion-eligible challenger is presented to the human with its metrics, tradeoffs, complexity cost, and evidence. The active champion changes only after explicit approval.
The openfpa command is a machine-oriented control surface for Codex, Claude Code, and other capable coding agents. It emits JSON, performs deterministic workspace operations, and leaves reasoning and conversation to the host agent.
The command set is:
openfpa init
openfpa inspect-data
openfpa status
openfpa source-profile
openfpa source-register
openfpa source-list
openfpa mapping-register
openfpa mapping-list
openfpa reconcile-source
openfpa connector-scaffold
openfpa connector-list
openfpa connector-validate
openfpa intake-next
openfpa intake-record
openfpa doctor
openfpa entrypoint-list
openfpa entrypoint-register
openfpa correction-record
openfpa correction-list
openfpa scorecard-render
openfpa experiment-list
openfpa context-pack
openfpa onboarding-render
openfpa model-exportIn a source checkout without the openfpa console script installed, every command also works as python3 -m pyfpa.cli <command>.
The CLI can:
The AI should still decide what questions matter, what data path to use, what model fits the business, and what experiment to run next.
All commands return a versioned JSON envelope. Exit code 0 means success, 1 means the requested operation or a diagnostic check failed, and 2 means the command arguments were invalid.
intake-record writes one sourced fact to .fpa/intake.md. Generated company workflows are published in .fpa/models/entrypoints.yaml with entrypoint-register. The registry lets an agent discover the tested command, working directory, inputs, and outputs. Registration does not execute the command.
openfpa source-register . \
--source-id monthly-pl \
--kind local_file \
--location data/monthly-pl.csv \
--entity "Acme Inc." \
--currency USD \
--period 2026-05 \
--extraction-method "Controller export from the accounting system"
openfpa mapping-register . \
--source-id monthly-pl \
--source-value "Product Revenue" \
--target income_statement.product_revenue
openfpa reconcile-source . \
--source-id monthly-pl \
--account-column Account \
--amount-column Amount
openfpa connector-scaffold . \
--name accounting-pl \
--source-id monthly-pl \
--description "Pull and normalize the monthly P&L" \
--auth-method host_environment \
--fixture fixtures/redacted-monthly-pl.csv
openfpa connector-validate . --name accounting-pl
openfpa intake-record . \
--key business_model \
--answer "Commercial coffee roasting" \
--source-type user
openfpa entrypoint-register . \
--name forecast \
--kind forecast \
--description "Run the approved monthly forecast" \
--command-json '["python3", "models/generated/run_forecast.py"]' \
--input data/actuals.csv \
--output output/forecast.xlsxconnector-scaffold creates:
connectors/generated/accounting-pl/
|-- connector.yaml
|-- connector.py
|-- run.py
|-- README.md
`-- fixtures/source.csvThe scaffold requires a registered source, complete mappings, and a redacted CSV fixture with no duplicate or unmapped accounts. It stores golden mapped totals in connector.yaml. connector-validate runs fixture mode only, normalizes the output to Account,Amount, and reconciles it against those totals. It does not contact a live system.
The generated extract_live() function intentionally fails until the agent implements host-authenticated access. After the live path has its own fixture-backed tests and safe failure behavior, register the recurring command with entrypoint-register --kind connector.
Clone the repository and install it into a Python 3.11 or newer environment:
git clone https://github.com/JeffBrines/openfpa
cd openfpa
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -e ".[dev]"Then open the repository in Codex or Claude Code and ask:
Help me onboard this company into openfpa.
The financial files are in ./company-data.
Inspect them first, then ask me only what you cannot determine.The repository instructions tell the agent to initialize .fpa/, inspect local evidence, conduct the intake, and stop for architecture approval.
examples/ridgeline/ is a synthetic product-company example with a monthly forecast, a 13-week cash forecast, and reporting output.
python3 examples/ridgeline/run_demo.pyThe example shows an inventory build creating a near-term liquidity gap before seasonal collections arrive.
examples/foxfactory/ applies the workflow to public, source-traced SEC data for Fox Factory Holding Corp.
python3 examples/foxfactory/run_foxf.pyThe example has four distinct phases:
mechanics using reported drivers. This validates arithmetic, not forecast skill.
recovery challenger and proposes a better revenue-recovery and slow-margin challenger.
reported Q1 FY2026 result.
shows the tradeoff between free cash flow and leverage.
The full proof runs in CI across Python 3.11, 3.12, and 3.13. See examples/foxfactory/README.md for the methodology and limitations.
The importable package is pyfpa. The distribution name is openfpa.
import pyfpa
config = pyfpa.load_config("examples/ridgeline/config.yaml")
monthly = pyfpa.cashflow_from_config(config)
cash_config = pyfpa.load_cash13_config("examples/ridgeline/cash13.yaml")
weekly = pyfpa.cash13_forecast(cash_config)
runway = pyfpa.runway_summary(weekly)
print(pyfpa.to_briefing_md(monthly, title="My Company", runway=runway))The base kernel includes:
forecast_to_excel, and a live-formula model workbook via model_to_excel (named assumption cells, real formulas, verified against the engine in CI);
EntityConfig is a useful starting model, not a required ontology. A company with cohorts, projects, contracts, fleets, stores, or complex inventory may need a different generated model.
The model_to_excel function compiles an EntityConfig into a two-sheet workbook: an Assumptions sheet of named, editable driver cells and a Model sheet where every P&L and cash-flow line is a real formula referencing those names. The verify_workbook function evaluates the workbook with a Python formula engine and compares every line and month to cashflow_from_config, so the workbook is verified against the engine before it is used. For cadences or layouts the kernel does not cover, compose pyfpa.excel.toolkit in a company-specific exporter and verify it the same way.
The repository includes skills for:
The skills are repo-native instructions for capable coding agents. The .claude-plugin/ manifest also supports Claude plugin installation, but the underlying workflow is not intended to be Claude-only.
| Component | Status |
|---|---|
| Finance kernel and reporting | Built |
| 13-week cash model | Built |
| Agent onboarding contract | Built |
Durable .fpa workspace | Built |
| Active memory retrieval | Built |
| Champion and challenger research records | Built |
| Human-gated model promotion | Built |
| Generated workflow registry | Built |
| Generated connector contracts and fixture validation | Built |
| Synthetic Ridgeline example | Built |
| Public-data Fox Factory example | Built |
| Fixture-backed adapter examples | Built |
| Live company-specific connectors | Generated per company |
| Cross-company portfolio learning | Experimental |
| Machine-oriented agent CLI | Built |
contracts stay dependable. Company-specific models and connectors can change.
unmapped data should fail visibly.
evidence, holdout result, and passing checks.
approval, and champion promotion require explicit approval.
decision and clears the objective.
readable without a proprietary service.
python3 -m pip install -e ".[dev]"
python3 -m pytest -qUseful contributions include stronger finance primitives, source-ingestion recipes, industry-specific skills, reconciliation checks, research objectives, and additional public-company proofs. Never commit real client data or credentials.
See CONTRIBUTING.md for the development workflow.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.