Tanvir Ahmed

Enterprise agency · A hands-on build

I asked my personal agent
to build an accounting agent.
The enterprise still
needed me.

Muse worked through the Databricks browser. Codex built an independent client. The useful result was an ecosystem of agents, governed data, and human decisions.

October 5, 202615-minute read + interactive explorationsVerified build record
2AI builders, with different jobs
8source files → governed tables
2independent application paths
1human directing throughout

Start with the close

Four open tasks are a better beginning than a grand promise.

“What is still open on the close checklist?” It is a small question with institutional weight. A controller needs the right period, the right tasks, the right owners, and the right statuses. A blocked subledger is an exception someone must resolve. It is not a sentence an assistant should improvise.

Month-end close brings together ledger completeness, reconciliations, reporting definitions, review, and sign-off. An assistant can surface evidence and help a team investigate. The authority to post a journal, resolve a reconciliation, or certify the close belongs to a different control process. My experiment began on the read side of that boundary.

I had sample finance files in a Databricks workspace and a personal agent, Muse, with computer use. I asked it to build the Databricks side: load the data, make the finance logic explicit, configure Genie, expose narrow tools, and bring up an application. Later, Codex built a separate client outside Databricks. I directed both builds and reviewed the results.

The question grew from “Can an agent build this?” into an operating question: how should personal agents, enterprise platforms, external reasoning systems, and humans work together when the answer has to survive scrutiny?

The first useful output was a named exception with a source, an owner, and a period.

Synthetic controls · December 2011

11 of 15 complete

Four tasks still open. Three reconciliations outstanding.

Subledger close Carol · In ProgressMgmt review Alice · Not StartedFinal TB Carol · In ProgressSubledgers Bob · Blocked

These workflow records are synthetic demo controls. The period is deliberately visible; they are not company close history.

A builder with computer use

Muse operated the platform. I directed the work.

The runbook records a build through the Databricks browser: a Unity Catalog schema and volume, uploads, notebook execution, managed Delta tables, curated views, control tables, SQL functions, a Genie space, and eventually a deployed Databricks App. Muse used the platform surfaces a person would use. That made the work visible at each step: files could be listed, tables counted, function outputs inspected, and errors opened.

Computer use expanded what my personal agent could do without requiring me to hand-build a bespoke adapter for every setup screen. It also inherited the friction of real interfaces and real permissions. The custom serving path encountered signature validation, a stopped SQL warehouse, and serverless authentication problems. The initial runbook honestly left that endpoint unverified.

The app story moved forward separately. The October 4 update records month-end-close-app running, with Close Status, Outstanding Reconciliations, Variance Review, and Ask the Assistant returning data. That later evidence supersedes the earlier “app not built” entry; it does not retroactively prove the custom serving endpoint.

I supplied direction, chose the scope, controlled credentials, and decided what counted as success. The agents performed substantial implementation and diagnostic work. That division is the point: useful delegation can increase capacity while keeping consequential judgments with an accountable person.

Explore the build record

From files to a reusable capability

Recorded journey
01

Land and inspect the eight files

Three CSV files and five Excel workbooks became eight managed Delta tables. Counts and source shapes were inspected before moving on.

Human decision: Accept the sample-data boundary and require verified counts.

Stages summarize the private runbook and this repository’s build. Select a stage; these controls do not run agents or contact Databricks.

Runbook evidence: the Databricks App reached Running. A deployment status is one check; the business panels and assistant answers needed separate validation.

Enterprise translation · Delegated engineering

The same work needs an enterprise envelope.

The direction is already public. Meta’s September 28 enterprise announcement names the Muse agent, Meta Business Agent, Muse API, and Muse Code among the technologies it plans to bring to businesses and developers. That makes this experiment relevant to an approaching operating model: an employee delegates platform configuration and application development to an agent that can work across existing enterprise tools.

The demonstrated capability is concrete. Muse can operate a browser, inspect configuration, run notebook code, read errors, and work toward a deployed application. The enterprise version would assign it a platform-building task with a specific workspace, data classification, time budget, and change boundary. Its access would come from an approved identity and session, with credentials brokered by the organization rather than copied into a prompt.

I would start it in a development workspace using synthetic or approved test data. A task might be: create an accounting data product, configure a curated Genie space, implement the required read functions, and prepare an app. Muse could do the setup through computer use, and use approved SDK, CLI, or infrastructure interfaces where those give more reproducible results. Screens are useful for discovery and diagnosis; configuration-as-code and versioned source are better artifacts for repeatable release.

The handoff is a reviewable change package: notebook and app source, resource configuration, required grants, control-query results, test evidence, and a rollback plan. A finance owner reviews the definitions. A platform owner reviews access, compute, and deployment. CI verifies the artifacts before an approved release identity promotes them. The build agent should not be able to grant itself production access or approve its own permission changes.

This also keeps two principals separate. Muse’s delegated build identity may configure a development resource; the deployed accounting app receives its own runtime identity and read grants. Revoking the builder should not disable the app, and a compromised app should not inherit the builder’s configuration privileges. For a browser-based enterprise session, scope, session expiry, destination controls, and retained activity evidence all need explicit design.

Meta describes Muse’s dedicated computer and user control in its personal-agent announcement. The release gates, enterprise identity controls, and separation of duties above are my proposed deployment pattern. This demo does not verify that those controls are available in a particular Muse enterprise product today.

01 · Delegate

Bound the build

Named workspace, approved data, scoped identity, time and cost budget.

02 · Produce

Keep artifacts

Code, configuration, grants, tests, evidence, and rollback instructions.

03 · Review

Separate judgment

Finance definitions, access changes, and production release have accountable reviewers.

04 · Operate

Change identity

The application runs under its own authority; the builder’s session can expire.

Domain definitions carry the weight

A governed table still needs a finance definition.

The two transaction tables contained 110,485 and 40,059 rows: 150,544 rows across the pair. I do not treat that sum as 150,544 distinct transactions; the build record does not establish that the samples are disjoint. Reference tables supplied chart of accounts, statement mapping, calendar, organization, departments, and scenarios.

Above that layer, the build made three finance views explicit: trial balance, actual-versus-budget P&L, and top variances. It also added the close checklist and reconciliation controls. These definitions made the questions executable and inspectable before natural language entered the picture.

The source data forced decisions. Budget coverage was sparse, so the useful variance story became month-over-month actual movement. That is a change in business meaning: an actual-versus-budget exception and a change from a prior month answer different questions. Calling both “variance” without explaining the basis would give the assistant an easy way to sound precise while misleading the reader.

Other details were smaller but equally revealing. Line Item became Line_Item to satisfy table naming constraints. Signage was treated as a numeric multiplier. “Profiit Before Tax” and “Ammortisation” remained source labels rather than silently corrected claims. A model could help notice these details; a finance owner still has to approve their interpretation.

Completeness

Trial balance

A view is useful only with agreed sign conventions, period filters, and account mapping. This demo does not establish full ledger or consolidation correctness.

Workflow

Open ≠ approved

The checklist function returns non-complete tasks. Reconciliation status is a control record, not proof that supporting evidence was reviewed.

Movement

Variance needs a basis

The displayed percentage expresses change relative to the prior amount. Sparse budgets prevent a broad budget-performance claim.

The model can explain a definition. It cannot be the person who approves that definition.

Platform choice · Governance travels with the capability

Why I built the accounting agent on Databricks.

The useful combination was the data platform and the agent platform around it. I could start with files, make managed Delta tables, express accounting logic in views, attach permissions in Unity Catalog, and give Genie approved sources. The accounting application and the external client could then reuse those assets. Each new experience did not need a new copy of the ledger and a second set of finance calculations.

Unity Catalog supplies the access boundary. Catalog and schema permissions, table reads, and function execution are evaluated for the identity making the request. In a properly configured enterprise, row filters and column masks can further restrict what that identity sees. A finance team’s application can therefore reuse a governed data product while retaining a distinct grant from another department’s application. The permission incident in this build showed why that distinction matters in practice.

Computation stays close to the finance data. SQL views and functions express deterministic calculations where the tables live; Genie translates broader questions over curated sources into analytical work. The external app receives bounded results for a question rather than loading the entire ledger into an LLM context. Data that does leave the platform still needs classification, retention, and model-provider policy; a governed query does not make its returned records free to redistribute.

The same capability has several consumption paths. Databricks Apps gives a native application surface. SQL connectors and the Statement Execution API serve structured application queries. Genie serves natural-language analytics, and managed MCP exposes supported capabilities to agent clients. The UI, programming language, and model vendor can change while the approved finance definitions remain shared.

The platform makes the engineering inspectable. Source tables, query results, grants, app status, and failures have concrete places to inspect. An enterprise can add lineage, query history, and audit records to its evidence process. Correlating them into a complete accounting decision trail still requires engineering; the local demo’s runbook and tests are a smaller evidence layer.

That combination makes Databricks one of my strong choices for governed accounting agents. The decision still depends on existing data gravity, cloud and region, identity requirements, cost, latency, and operating skills. Managed MCP remains a preview capability in the documentation we used; enterprise adoption needs a supported-interface and change-management decision, not an assumption that a demo connection is a production contract.

Govern

One access boundary

Different applications use different identities against shared catalog policies.

Compute

Reusable finance logic

Views and functions keep period filters, mappings, and calculation basis explicit.

Reason

Curated analytics

Genie operates over approved sources; an external model can interpret intent.

Serve

Many experiences

Native apps, external apps, BI, and agent clients can consume governed capabilities.

Separate capabilities, connected responsibilities

The enterprise lives across the boundaries.

The blueprint below puts the platform choice into an operating structure. The center is the governed accounting capability; the left is the engineering work that creates it, and the right is the set of applications allowed to consume it. Human review crosses all three. Proposed enterprise release controls are drawn separately from the runtime path demonstrated here.

The two builds had different jobs. Muse constructed the platform-side capability through computer use. Codex wrote the external application. At runtime, Azure OpenAI classifies broader requests, the Python backend validates and executes calls, and Databricks serves governed results. Genie supplies the broader finance answer; the external model does not add another layer of financial synthesis.

There is cooperation at build time and at runtime, but no shared autonomous swarm behind the scenes. The human coordinates the builders. The runtime client uses explicit tool contracts. The backend owns execution, and Databricks evaluates access under the caller’s identity. Those distinctions keep “multi-agent” meaningful.

Enterprise architecture · Build, govern, consume

One accounting capability. Many applications.

Enterprise architecture diagram with build, Databricks and application boundaries
Whole system

Inspect a path or a component. Solid components describe demonstrated building blocks; dashed components describe the proposed enterprise delivery and identity controls. SQL connectivity is an enterprise option, not a fallback implemented by this client.

Demonstrated building block Proposed enterprise control Exact results Broader reasoningDownload vector diagram ↓

Interactive responsibility map

Who owns the next decision?

Select a component

Build time

↓ browser operations↑ independent client implementation

Runtime · external path

↔ intent and standalone question↓ backend executes allowed calls
Selected responsibility

Human direction and review

I owned the scope, credentials, acceptance criteria, and consequential decisions. Neither builder could decide what finance correctness meant.

Authority Define and approve the work.Boundary This demo has no automated journal posting or close approval.

MCP carries the runtime tool calls. It does not merge agent identities, establish finance semantics, or supply approval authority. The diagram shows responsibilities; it is not a transcript of simultaneous agent execution.

Inspect the external runtime contract

Known full-list requests call three allowlisted UC functions directly. Checklist and reconciliations use period="2011-12"; top variances takes no arguments. Narrower filters and broader finance questions use Azure’s versionless /openai/v1 Responses interface to produce one typed routing decision and a standalone question.

The backend discovers tools from both exact endpoints, checks input schemas, and uses fresh streamable HTTP sessions. Genie queries may require sequential polling. The call budget is four actual MCP calls; there is no silent SQL or alternate-server fallback.

UC payloads are decoded and validated before deterministic table formatting. Numeric decimals display with two places. Genie’s completed text attachments are shown directly. The Azure key is read only from the launching shell; the PAT stays in backend environment inputs. The local app is not a publicly authenticated service.

The moment the ecosystem became useful

The app was running. Genie could not read its tables.

The most revealing incident arrived after deployment. The app’s Ask tab failed with a “Tables missing” permission error. The app service principal had catalog and schema access and function execution grants, but it lacked row-read access to the eight source tables configured for Genie.

Muse took the failure back into the Databricks Genie surface and opened the failed request. The platform exposed the missing access requirement: SELECT on the data assets, alongside USE CATALOG and USE SCHEMA. The runbook records eight table-specific SELECT grants, after which that permission failure was resolved.

This is a concrete multi-platform diagnostic loop. My personal agent was operating the enterprise app, a platform-native agent surface supplied evidence about the failure, and the human-directed build applied the targeted correction. It did not require one vendor’s agent to own the whole ecosystem.

A second error remained. The app parser did not recognize MessageStatus.COMPLETED and misclassified a finished response. Fixing access made completion possible; fixing status handling made that completion visible. One green infrastructure status would have missed both layers.

Replay the failure

Two failures. Two different owners.

Illustrative reconstruction
01 / 05
Permission denied

The app reaches a data boundary

The Ask tab is live, but the application principal cannot read every source configured for Genie. A running app is not proof of an authorized data path.

App → GenieTables missing · PERMISSION_DENIED

This replays the diagnostic chain described in the runbook. It is not a live chat recording or an executable permission editor.

The useful failure: Genie identified missing access to its configured sources. The diagnostic evidence made a targeted fix possible.
A second agent added value by exposing a boundary the first agent could not reason away.

Reuse the capability from outside

I wanted the second application to earn its answer.

Once the Databricks App worked, I wanted a separate client to exercise the same finance capabilities. Codex built AI-Staff-Accountant: a small Streamlit application with a shared Python backend and a command-line test harness. It connects directly to the managed Genie and Unity Catalog function endpoints, rather than scraping the first app’s answer.

The simplest design won. The three exact finance questions do not need a general agent loop. They go straight to the appropriate function, and the backend formats the returned records. Azure classifies paraphrases and broader questions, rewrites follow-ups using local history, and lets the backend invoke Genie. That division reduces both cost and opportunities for unsupported synthesis.

This is multi-vendor reasoning grounded in enterprise capabilities, with a precise qualification: Azure interprets intent; Databricks functions return exact data; Genie supplies broader analytical text. We do not ask the external model to reinvent the accounting result. More model participation is not automatically more assurance.

The external PAT and the Databricks App service principal are different authority paths. Identical endpoints or answers do not imply identical permissions. The current client is a local demonstration with a PAT owned by the operator. Enterprise adoption would need managed workload or delegated user identity, not a published service sharing my token.

Any application can be a client. Every client needs a grant.

A React portal, a Python service, a BI tool, an ERP extension, or an agent runtime can consume Databricks through a supported interface. Its backend authenticates, requests a permitted operation, and receives the result under that identity’s policies. The front end does not need a workspace token, and placing a model between the user and the backend does not widen the grant.

Choose the connection for the task. A structured reporting app uses parameterized SQL against approved views through a connector or Statement Execution API. An agent calling a named finance function uses a managed MCP client. A natural-language experience uses a curated Genie capability. A Databricks App can use its dedicated application principal or configured user authorization. These are explicit architectural choices; the accounting client in this repository deliberately implements only its two fixed MCP endpoints.

For a shared background job, a scoped service principal with OAuth machine-to-machine authentication supplies application authority. For a user-specific experience, supported OAuth user/delegation flows preserve the user’s access; Databricks Apps documents on-behalf-of-user authorization and scopes for that purpose. A service-principal request sees the service principal’s grant, so it cannot claim to enforce a narrower user policy unless the application has designed and verified that boundary.

Choose the interface and the identity separately
ConsumerUseful interfaceAuthority and result
Finance portal or BISQL connector / Statement Execution APIApproved views, parameterized queries, warehouse access, and caller-specific data grants
External accounting agentManaged MCP functionsNamed read capabilities, validated schemas, EXECUTE and required source permissions
Natural-language applicationCurated Genie capabilityApproved sources, caller access, completed analytics and source review
Databricks-hosted appSDK, SQL, or supported service APIDedicated app principal or configured on-behalf-of-user authorization and scopes

An identity needs both the relevant API/resource access and the required data grants. Returned data and application caches remain subject to enterprise handling policy. All paths need bounded queries, visible errors, and traceable results.

Trace a request

Different questions carry different obligations.

“What is still open on the close checklist?”

  1. Python routesFull checklist request · 2011-12
  2. UC function runsFour non-complete tasks
  3. Backend validatesActual rows · deterministic formatting
  4. Human reviewsOwner, status and provenance visible

No LLM call is needed for this exact request. Returned statuses describe the synthetic control records.

The part that must survive review

Agreement is evidence. A discrepancy is evidence too.

The updated runbook reports that the Databricks App and the independent external client returned matching checklist, reconciliation, and variance results. The external screenshots support the important reuse story: a second application reaches the governed capabilities through its own connection path.

Our current automated check makes a narrower distinction. Checklist and reconciliations match the build spec. The variance function returns four rows, but their labels differ from the spec’s expected rows. The runbook’s external variance screenshot shows the same line items we observed live. That is agreement between observed paths and a disagreement with the written expectation.

The correct response is to keep the acceptance failure. Changing the display to invent the expected rows would destroy the point of grounded reasoning. Revising the expectation without a finance owner’s review would hide the question of which business definition was intended.

Even perfect cross-application agreement would not independently validate accounting semantics: both consumers can share the same underlying view and therefore the same defect. The second path tests interoperability and consistency. Control SQL, source inspection, and domain review still have separate jobs.

Inspect the discrepancy

What exactly did “passed” mean?

Expectation unresolved

Department label: Research and Development. These synthetic records were returned by the function during live testing.

Observed top variances · display rounded to two decimals
Line itemLatestPriorMovementMovement %
Standard Cost of Sales1,317,268.261,200,737.16116,531.109.70
Variances170,938.12115,563.5655,374.5647.92
Returns and Adjustments107,256.22149,747.97−42,491.75−28.38
Less Discounts33,867.5538,965.59−5,098.04−13.08

No currency is assumed because the returned records do not specify one. Formatting changes presentation; raw records remain unchanged.

Runbook evidence: the platform app answered the known checklist question. The independent client returned the same four task/owner/status combinations.
What the current evidence establishes
  • Both exact managed MCP endpoints initialized, with all three required UC functions discovered.
  • Checklist and reconciliation identities match the spec; variance identities do not.
  • Azure’s v1 classifier routed a broader close question to Genie. A filtered follow-up returned the blocked Subledgers task.
  • An unsupported forecast returned exactly “The data does not cover that.” with no MCP call.
  • The offline suite has 36 passing tests. Those tests verify client behavior; they do not replace live platform or finance checks.

The credential scanner passed. That is one review aid, not a claim that any file or screenshot is safe without inspection. Public assets here are selected screenshots reviewed separately from the private runbook.

From one close demo to enterprise practice

Keep the ecosystem open. Keep authority explicit.

The architectural opportunity is broader than finance chat. Enterprises already have business platforms, identity, policy, data products, and human review. Personal agents can help build and operate those systems. Platform agents can expose domain context. External agents can serve different users and reasoning needs. The integration should preserve the ownership of each responsibility.

For a controller, that means calculation definitions, cutoff, reconciliation completeness, preparer/reviewer roles, and escalation remain explicit. For a platform owner, it means a permission change must be reviewed for its purpose and breadth. For an AI engineer, it means routing, schema validation, timeouts, unsupported answers, and provenance are normal software contracts rather than promises in a prompt.

My human involvement here was active supervision, not a production approval system. The app contains no journal-posting or close-signoff path, no enforced segregation of duties, and no immutable approval ledger. The next enterprise version would have to make those controls executable before it gained write authority.

“Enterprise grade” is therefore the design direction: governed data, bounded capabilities, visible errors, separate identities, and reviewable evidence. This Free Edition experiment demonstrates parts of that pattern. It does not establish production reliability, compliance, financial correctness, or autonomous close.

What should travel across the ecosystem
ResponsibilityOwner in this buildEnterprise obligation
Business meaningHuman + explicit finance viewsApproved definitions, source lineage, period and sign conventions
Data authorityDatabricks permissionsSeparate user/workload identities, least privilege, reviewed grants
ReasoningAzure intent classification + Genie analyticsBounded context, evaluation, provider/data-placement policy
ExecutionPython backend + governed toolsValidated actions, budgets, failure handling, durable outcomes
Consequential decisionHuman operatorController approval, segregation of duties, exact approved payload
EvidenceRunbook + live checks + testsVersioned control results, correlated audit trail, replayable review
An agent can carry the work forward. It should not silently acquire the enterprise’s authority along the way.

Evidence screenshot

Selected runbook evidence · click Close or press Escape to return

Enterprise accounting agent · architecture blueprint

Expanded enterprise accounting agent architecture

Vector diagram · scroll to inspect · Download SVG · press Escape to return