Bob Finance v2 — Prototype Architecture

How the agent stays on rails

A multi-agent system that proposes, builds, and explains financial models — wrapped around a deterministic engine. The agent decides what to do; the engine decides what the numbers are. Object structure is fixed; content is anything. One platform serves SaaS, manufacturing, services — only the catalog content changes.

Probabilistic
LLM lives here.
Reasoning, plans, prose.
Can be wrong — and it's gated.
Deterministic
Pure functions.
Same inputs → same outputs.
Numbers don't move unless data does.
User
FP&A Analyst — chat, sheets, drawers, scenarios
UI Surface React + Vite
Chat Panel New Model · Component Picker Headcount Planner Income Statement Balance Sheet Workspace Assumption Drawer Metric Drawer Author Surface Library — Global / Local Scenario Picker · Compare Provenance Panel
Agent Layer Anthropic SDK · Claude
Planner
Reads the ask, drafts a plan, hands off — never mutates directly.
Builder
Executes the approved plan via typed mutation tools.
Analyst
Queries the model, explains drivers, cites cells.
Plan-first gate No mutation runs without an approved PlanCard. Builder is sandboxed by the user's signature.
Tool Layer typed · narrow · audited
query analytical compute output mutation addModel addDimension bindInput addAssumption addMetric getMetricValue explainCell handoff proposePlan
Engine — Deterministic Compute pure functions
State · Zustand store
Session Models Scenarios Active plan approval
Compute · HyperFormula
buildComputed() cross-component topo sort scenario overrides as deltas
DimensionsWHO / WHAT
InputsBOUND DATA
AssumptionsFP&A LEVERS
MetricsFORMULAS
ScenariosBRANCHES
Catalogs — Object Layer canonical schemas · global by default
ASSUMPTION_CATALOG METRIC_CATALOG COMPONENT_CATALOG Headcount Income Statement Balance Sheet Workspace (blank) P&L roll-ups Workforce KPIs ARR / NRR / Pipeline
Actuals Layer — System of Records versioned · monthly snapshots
Income Statement (frozen) Balance Sheet (frozen) Headcount roster (history-aware) Period close lock
Connected Data Sources read-only · Hibob-native
Hibob HRIS NetSuite GL Salesforce CRM Excel uploads
Object vs content
Objects (metric, assumption, dataset, component) are fixed and few. Content (names, numbers, business meaning) is infinite. One platform, any vertical.
Plan-first
User signs off on the plan before any object is created. One approval gates many actions.
Cash Flow is a report, not a model
IS and Balance Sheet come from your GL. Cash Flow is auto-derived from their deltas in the reporting layer — never modeled by hand.
Global / local scope
Assumptions are global underneath. UI surfaces local-vs-global; editing a global prompts ripple impact across every model that uses it.
Audit trail
Every cell traces upward — formula → assumption → input → source — through the Provenance Panel.
Scenarios as deltas
Branches store overrides, not full copies. Compare is a recompute, not a duplicate model. Actuals never branch.
bob-finance/v2 · post-Efi alignment architecture · May 6 2026