Framework
CPA operating framework
Version 1. Adopted 2026-09-23 from the hand-off plan. This file is the baseline. Later agents update it in place.
How another agent updates this system
Edit the files in cpa/content/ and ship them through the test lane. Do not start a second register, scorecard, or calendar.
| Artifact | File | Endpoint |
|---|---|---|
| Scorecard | cpa/content/scorecard.json | /scorecard and /api/os/scorecard |
| Framework | cpa/content/framework.md | /framework and /api/os/framework |
| Tax-position register | cpa/content/tax-position-register.csv | /register and /api/os/register |
| Deadline calendar | cpa/content/deadline-calendar.csv | /calendar and /api/os/calendar |
| Categorization rules | cpa/content/categorization-rules.csv | /rules and /api/os/rules |
| Hand-off | cpa/content/handoff.md | /handoff and /api/os/handoff |
| Checklists | cpa/content/checklists/*.md | /checklists/<id> |
| Machine manifest | — | /api/os/manifest |
GET /api/os/manifest returns the version, the sha256 of each file, and this update rule. Read it before writing.
Live database overrides are optional and used only after cpa.operating_documents exists. Until then the files above are the source of truth. A signed-in owner can PUT /api/os/docs/<id> once that table is applied. If the table is missing, the response says schema_pending and names the file to edit.
Goal
Produce audit-defensible, CPA-ready tax-position packages on a quarterly or monthly cadence. Keep separation of duties, human review gates, and strict data isolation.
This system prepares organizer packages. It is not tax advice, not a filing, and not an election.
Roles
- User / bookkeeper. Exports source data, supplies business-purpose statements, and approves final dispositions.
- Agent layer. Analyzes uploaded files, flags candidates, builds evidence packets, maintains the register, and generates hand-off packages. Never writes to live books.
- CPA. Final technical review, risk acceptance, and filing authority.
Controls that do not bend
- All agent output is draft-only.
- No automated posting, reconciliation, or write-back to QuickBooks or the budgeting app.
- Every candidate carries an explicit missing-substantiation list and a risk label.
- A human checkpoint is required before any position is marked Ready for CPA.
- Mixed-use expenses (vehicle, phone, home office, meals, travel), anything above the materiality line the CPA sets, and every gray-area item stay in Needs Facts until the user confirms the facts.
- QuickBooks access is read-only. The connect flow may request a token. The product calls read queries only.
- Money in the books schema stays integer cents. This framework does not invent EINs, rates, or tax figures.
Sign-in
cpa.nodedough.com and nodedough.com share one sign-in. The session cookie is stored on the parent site .nodedough.com. Signing in on either host signs in the other. Signing out clears the shared cookie.
A person who signed in before this cookie existed must open either site once so the existing session is copied into the shared cookie.
Source export
Use the same columns every time:
Date, Transaction Type, Num, Name, Memo/Description, Account, Split, Amount, Class/Location, and any custom fields.
Name the file YYYY-MM-DD_GL_YTD.csv. Put a one-line note at the top naming the period and any known mapping rules. Lines that start with # are notes, not rows.
Tax-position register
Use this header, in this order:
Position ID,Category,Description,Source Docs / Rows,Business Purpose,Authority / Code Cite,Risk Label,Missing Substantiation,$ Impact (range),Status,CPA Disposition,Notes
Status values, in order: Candidate, Needs Facts, Ready for CPA, Accepted, Rejected, Deferred.
Risk labels: candidate, low-risk, high-risk.
Keep one register. Update rows. Do not re-ask a settled CPA disposition.
Categorization
The user owns categorization-rules.csv. An agent applies a confirmed rule before flagging an exception. Keyword hits on /savings are candidates only. They never become Ready for CPA by themselves.
Bookkeeping rules stored on an entity are a separate, human-confirmed list. Applying them is a button in the books screen, not a background job.
NodeDough and QuickBooks
- Budget facts typed into nodedough.com can be read here after the database connection is configured. Reading them does not post them into the books.
- Confirmed CPA positions and open items are available to the budgeting app at
/api/bridge/summaryfor a signed-in user. - QuickBooks Online connect, once credentials exist, pulls posted accounts and transactions. It does not push.
Hand-off package
Every time work moves to another agent, include:
- Latest tax-position register
- Source files used
- Deadline calendar
- Mapping rules in force
- Open Needs Facts list
- Prior CPA dispositions
- The explicit next action
End every completed package with Residual risk and open items.
Law-update grounding
Before a non-routine position that depends on a 2026 rule, state conformity, or a new credit, name the public source and the date it was read. Prefer primary sources: statute, IRS, or the state tax agency.
First actions still open
See /handoff. As of version 1 there is no client general ledger in this repository, the register has headers only, and QuickBooks is not connected.