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