Last amended: 2026-07-30 Audience: product, accounting, developer
ADR 0015: Accounting Posting Foundation
Context
BooksPlus financial periods now provide durable period identity, status, and posting-date eligibility. The next accounting foundation is the central posting path that all workflows must use when they create ledger effects.
The canonical accounting model requires posting to enforce balanced entries, valid accounts, effective dates, period status, source references, attribution, and auditability. Close, imports, screens, and future feature workflows must prepare posting requests rather than writing ledger effects directly.
Decision
BooksPlus will implement the first accounting posting foundation around posted journal entries, active accounts, and one central posting service.
The first implementation slice is intentionally narrow:
- journal entries are created as posted records through the central posting path;
- draft journal entry workflow is deferred;
- posted journal entries receive company-scoped human-visible journal entry numbers;
- manual routine posting does not require an idempotency key;
- source references are required but may initially be opaque
source_typeandsource_idvalues; - full Source Documents persistence and evidence storage are deferred to the Source Documents implementation;
- routine posting requires an open financial period;
- routine posting blocks planned, soft-closed, and hard-closed periods;
- soft-closed period correction and close-adjustment posting modes are deferred;
- posting uses the protected action name
journal_entry.post; - posting is a consequential action and must emit an attributable audit event.
Account Values
The initial account taxonomy uses these stable values:
- account types:
asset,liability,equity,income,expense; - normal balances:
debit,credit; - account statuses:
active,inactive,retired.
Routine posting requires active accounts. Historical journal lines preserve their original account references even if an account is later inactive or retired.
Journal Entry Values
The initial journal entry lifecycle has one persisted status:
posted
Drafts, reversals, adjustments, and close adjustments are later workflows. They must still use the central posting path or a central accounting correction path when implemented.
Money Precision
The initial persisted accounting amount precision is decimal precision 19, scale 4, with a three-letter ISO 4217 currency code stored with each amount.
Posting validation must not balance debits and credits across different currencies unless a later multi-currency policy explicitly defines that behavior.
Step 11 correction extension
The Accounting Correction Contract extends central Accounting with persisted
posting modes reversal and adjustment while retaining status posted.
- Reversal and adjustment use their dedicated protected actions rather than
journal_entry.post. - They still use central Accounting for balance, currency, period, account, source, numbering, attribution, idempotency, and ledger mutation.
- Full reversal derives its lines from one immutable posted target and may use the target's exact historical inactive or retired accounts.
- Adjustment supplies new balanced lines and requires current active direct-posting accounts.
- Correction posting is allowed in open and reopened periods and may use its protected mode in a soft-closed period. A hard-closed period must be separately reopened before accepting a new correction entry.
- Correction staging and review use a distinct Accounting workflow rather than Summary Accounting.
Consequences
Positive consequences:
- Posting behavior has one enforcement point before close, imports, and feature workflows depend on it.
- Close can later coordinate ledger work without owning ledger mutation.
- The first implementation can validate period status and account status without designing every future journal workflow.
- Source references can be preserved immediately while full source-document evidence behavior remains owned by Source Documents.
Negative consequences:
- Users cannot save draft journal entries in the first posting slice.
- Manual posting idempotency is not solved beyond database identity, journal entry numbering, and normal transactional behavior.
- Soft-close adjustments require a later authorization and posting-mode design.
Related truth pages
../../contracts/account.contract.md../../contracts/journal-entry.contract.md../../contracts/money.contract.md../../contracts/kernel.contract.md../../accounting/posting-and-reversal.md../../accounting/journal-entries.md../../accounting/accounts.md../../contracts/accounting-correction.contract.md