Finance and controllership
The close that runs itself.
Our agents close your books every night of the month. By month-end the close has run thirty times. Your controllers review the exceptions and sign.
Today
The close still runs on overtime.
- Your team waits on subledgers, bank feeds and review notes that come back at ten at night.
- The rules live in spreadsheets and in the heads of senior accountants. Each departure takes some of them away.
Every night
-
Night 1 · 23:40
Nine agents run the full close on the month so far.
-
Night 1 · 02:10
Accounts inside tolerance certify themselves. Large movements get a memo from their source rows.
-
Night 9 · 06:00
A bank line matches nothing. Its evidence pack is on your desk three weeks before month-end.
-
Night 14 · 04:30
Ines prepares an accrual and your controller approves it. The journal records the preparer and the approver.
-
Night 21 · 03:15
Carl matches both entities and hands the elimination to Ines. Carl never posts.
-
Nights 22 to 30
Each run starts where the last ended. The binder grows every night.
-
Close day · 08:00
The accounts are certified and the binder is built. Your controllers sign.
The nine lanes
Each agent carries a working name your team can change. The name is also its identity in Gate and the preparer on everything it produces.
-
01 Mara · reconcile
Account certification
Matches every subledger to its general ledger account under tolerance rules held in code. Exceptions arrive as evidence packs: the unmatched rows, the cause it traced and the proposed fix.
-
02 Theo · flux
Variance memo
Pulls the drivers for every account past its flux threshold and drafts the memo in your house format, citing the transactions behind the movement.
-
03 Ines · post
Posted journal
Drafts accruals, recurring journals and reversals. Runs the cutoff checks and posts through the sanctioned path. Write access is granted per journal class.
-
04 Carl · intercompany
Matched elimination
Matches balances across entities, drafts the follow-up requests for missing confirmations and hands every matched elimination to Ines. Carl has no posting right at all.
-
05 Sofia · fixed assets
Depreciation run
Runs depreciation on the asset calendar and drafts capitalisation and retirement journals. Impairment indicators go to your controller with the evidence attached.
-
06 Dane · revenue
Deferred revenue schedule
Checks cutoff between shipping and billing, keeps the deferred revenue schedules and drafts revenue journals from contract terms held in code.
-
07 Priya · tax
Provision workpaper
Builds the provision workpapers and deferred tax schedules and drafts the provision journals. Each judgment goes to your tax controller with its support attached.
-
08 June · binder
Audit binder
Ties every figure to its source, drafts the footnote rollforwards and disclosure tables from the same ledger rows and assembles the binder while the close runs.
-
09 Ravi · review
Miss log
Checks every posted journal and every memo against the rules, not a sample. A wrong entry is reversed through the posting path, and the miss becomes a change to the close code before the next night.
Controls
The agent that prepares a journal can never approve it.
Each agent works under its own identity in your systems, never a staff login.
- Revoke a grant mid-close and the next request is denied.
- The access log shows any altered record and goes into the binder as evidence.
Gate policy
Segregation of duties is written as policy in Gate and enforced on every request. Approval stays a control your controllers keep. The other lanes keep moving while a journal waits for its approver.
// Gate policy (Cedar)
forbid (principal, action == Action::"approve", resource is Journal)
when { resource.preparer == principal };
permit (principal in Agents::"posting", action == Action::"post", resource is Journal)
when { resource.class in principal.granted_classes
&& resource.approver != resource.preparer };
Audit
Your auditor reruns it and gets the same answer.
June builds the binder as the close runs, every figure tied to its ledger row. Certifications are code with tests.
Binder contents
- Tick and tie support for every figure, linked to the source rows.
- Footnote rollforwards and disclosure tables drafted from the same ledger rows, never retyped.
- Every flux memo with the transactions it cites.
- Every journal with its preparer, its approver and the rule it passed.
- The Gate log for the period and Ravi's miss log.
Learning
A correction ships the same night.
A controller's correction becomes Operating Code with a test. Once the test passes, every agent runs with it.
# Controller, 14 March: FX revaluation is never a flux driver.def drivers(account, period): rows = movements(account, period) if account.revalued: rows = [r for r in rows if r.source != "fx_reval"] return rank_by_amount(rows) def test_fx_reval_is_never_a_driver(): memo = draft_memo(revalued_account(), "2026-03") assert "fx_reval" not in memo.sources test passedreleased 23:58nine lanes updated
Architecture
-
Operating Code
Tolerances, cutoffs and posting rules run as tested code.
- close/reconcile
- close/flux
- close/post
- close/intercompany
- close/assets
- close/revenue
- close/tax
- close/binder
- close/review
-
Gate
Agents read and draft. They post only where your controllers grant it.
-
Your infrastructure
Ledger data stays in your network. Or we run it for you on Marbell Cloud.
-
Fleet
The coordinator re-plans at 06:00 and when a blocked item clears. A restart never posts twice.
For your engineers
- Operating Code rewrites the instructions, rules, plans and memory an agent is usually assembled from as code. Rules become if statements, plans become loops, memory becomes variables and records, and checks become tests. It grew out of the recursive self-improvement harness our own persistent agents run on.
- The close/ package has a module per lane. Types make states explicit: an elimination is Proposed, Matched or Posted. Preconditions stop the work early: no certification while a subledger is unposted, no period close with intercompany open.
- Comparisons run in document currency. No journal can bypass the posting path. Reserve movements and impairment calls go to your controller with the evidence attached. Estimated accrual rates stay marked provisional, with their owner, until they are confirmed.
- A test fails the build if any agent instruction lives outside the code, so the close cannot drift into notes and prompts.
- Every task carries a key built from its account, period and step, so a restarted agent finds its own finished work and never certifies or posts twice. The supervisor retries a failed job twice from its checkpoint. After that the coordinator takes it, and within the hour it reaches your on-call accountant.
- The critical path is explicit. Subledgers post before accounts reconcile, flux runs before consolidation, and review closes the period.
- Tolerances, materiality and cutoff windows are values your controllers set. Every change ships as a versioned release with its test, so any night can be rerun on the code it used.
Systems
Spreadsheets are outputs for your team. The fleet never takes a figure from them.
- SAP S/4HANA
- Oracle Fusion
- NetSuite
- Dynamics 365
- Bank feeds
- Consolidation
All systems
- Treasury feeds
- Fixed asset and revenue subledgers
- Tax provision workpapers
- Snowflake and PostgreSQL
- SharePoint and network shares
- Your close task tracker
- A homegrown general ledger
Payables joins next on the same queue, then automated testing of your internal controls over financial reporting.
Start with last month's close.
We run two account reconciliations and a flux package from last month. The pilot is paid to hit a number your controller picks: cycle time, accounts certified without a touch, flux memos right first time or hours returned.
Describe your close