NodeDough CPA

Draft only. Organizer output for a CPA — not tax advice, not a filing, and not a write to the books or to QuickBooks.

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.

ArtifactFileEndpoint
Scorecardcpa/content/scorecard.json/scorecard and /api/os/scorecard
Frameworkcpa/content/framework.md/framework and /api/os/framework
Tax-position registercpa/content/tax-position-register.csv/register and /api/os/register
Deadline calendarcpa/content/deadline-calendar.csv/calendar and /api/os/calendar
Categorization rulescpa/content/categorization-rules.csv/rules and /api/os/rules
Hand-offcpa/content/handoff.md/handoff and /api/os/handoff
Checklistscpa/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

Controls that do not bend

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

Hand-off package

Every time work moves to another agent, include:

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.