bookspec/spec holds the first edition: the model and the five laws (00-model.md) and one file per area, each B-rule a section with its status, a MUST/MAY statement, sources pinned either to a vendored source with a verbatim quotation or to an exact external paragraph, its symbolic form, its examples and its applicability. B-39, B-40, B-43 and B-45 are reserved sections (allocated, not yet stated in rules.md); B-44 is stated in rules.md and now carries its bookspec id and CONVENTION status. Eight new examples show the laws that had none, each figure worked by hand: an unbalanced entry is refused (Pacioli ch. 36, Pub. 583), a negative or zero line is refused, a fraction of a cent is refused (ISO 4217), a child account takes its parent's type, the trial balance and the accounting equation on one small book (cash 6550.25 = loan 2000 + capital 5000 + (sales 750.50 - rent 1200.25)), a reversal leaves the original standing and a second reversal is refused, a close sweeps revenue and expenses into Retained Earnings (3999) and the closed quarter takes no late entry, and cents add exactly. The refusal vocabulary gains unbalanced, negative_amount, zero_amount, too_few_lines, finer_than_minor_unit, parent_type_mismatch, already_reversed and period_closed; a refused entry may carry a non-positive amount. The checker's spec.rs fails the build on a rule without its section, a statement without MUST/SHOULD/MAY, a pin that is not verbatim in its vendored source, examples that differ from the catalogue, or more than 60 pages. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HS8WZziDnyxunC23MUxrLp
5.3 KiB
bookspec, first edition: definitions and the model
bookspec is a specification of double-entry bookkeeping that stands apart
from any program. Each rule is stated normatively, sourced to an authority
(or marked as a convention or a choice), written symbolically, and shown
by concrete examples (bookspec/examples/*.toml) that any engine can be
run against (bookspec/runner). wanderbooks is the first engine checked;
the GnuCash oracle is the second (bookspec/gnucash).
Reading the rules
The words MUST, MUST NOT and MAY are RFC 2119's. A rule has
- an identifier,
BS-<area>-<n>, stable and never reused; the table from the wanderbooks catalogue'sB-1toB-45isrules-index.md; - a status:
AUTHORITY(a source states it),CONVENTION(common practice no authority states; the best reference is given), orCHOICE(a person decided; the specification names the options and an engine declares which it picks,Claims::choices); - a statement (what MUST hold), its sources (each pinned exactly: a vendored source with a verbatim quotation the build checks, or an external reference to a paragraph, never a paraphrase of memory), its symbolic form, its examples (ids of the TOML files) and its applicability (which entities, bases and jurisdictions).
A rule with no example is stated and not claimable: an engine can only
claim a rule an example demonstrates (covered_rules). The first edition
says plainly which rules those are (rules-index.md, "—").
Sources are US GAAP (the FASB Codification: cited, never copied, and read only in the Foundation's own view or a publisher that reproduces it) and US federal tax (the Internal Revenue Code, Treasury Regulations, IRS publications and form instructions, which are public domain), then older or general authorities (Pacioli, OpenStax, ISO 4217). The large firms' guides are never a source.
The model
- Currency and money. A ledger has one base currency. An amount is an exact decimal, a whole number of the currency's smallest unit (ISO 4217 minor units). Arithmetic on amounts is exact; it never uses binary floating point, and it rounds only where a rule says so, and then by the rounding mode the rule names.
- Account. A code, a name and one of five types: asset, liability, equity, revenue, expense. An account may have a parent of its own type; an account may be a header (it groups, and takes no posting). Assets and expenses have a normal balance on the debit side; liabilities, equity and revenue on the credit side.
- Line.
(account, side, amount):sideis debit or credit,amount > 0. Its signed value is+amountfor a debit and-amountfor a credit. - Entry. A dated, described list of at least two lines. An entry is posted or not; the ledger holds the posted ones. A reversal of an entry is a new entry with the same accounts and amounts and the sides flipped, linked to it.
- Ledger. The sequence of posted entries, written only forward. The balance of an account through a day is the sum of its lines' signed values dated on or before the day; shown on its normal side it is that sum, negated for a credit-normal account.
- Period and close. A period is a range of days. Closing it posts an entry that brings every revenue and expense account's balance through the period's last day to zero against equity.
- Document. An invoice or a bill: a receivable or payable the ledger carries as lines tagged with the document; control accounts equal the documents behind them.
The five laws
Every other rule serves these, and each is a theorem in bookspec/lean
(Bookspec.law_*), true of every state the ledger can reach by any
sequence of its commands:
- Debits equal credits.
sum over all posted lines of signed value = 0(law_debits_equal_credits; BS-entry-1). - The accounting equation.
A = L + E + (R - X), with each term the sum of the balances of that type's accounts on their normal side (law_accounting_equation; BS-statement-2). - The trial balance balances. The debit balances sum to the credit
balances (
law_trial_balance; BS-statement-1). - Net income articulates to equity. Closing a period credits equity
with exactly
R - Xthrough its last day (law_net_income_articulates; BS-period-1). - The cash flow articulates to cash. The three sections of the
statement of cash flows sum to the change in the cash accounts'
balances (
law_cash_flow_is_change_in_cash; BS-statement-3).
Money in the proofs is Int, a count of the smallest unit; every law is
a law of addition, and any finite set of exact decimals scales to
integers without loss.
How an example is checked
An example is a TOML file: a setup, a sequence of events, and
expectations asked of the books, with every expected figure worked by
hand from the rule and its sources (bookspec/README.md has the shape).
Two checks stand behind each: conformance (the runner drives an
engine through it and compares the engine's answers with the expected
figures) and derivation (the checker computes the expected figures
from the rule's symbolic form, independent of any engine, and fails the
specification's own build when the example's figure disagrees; see
bookspec/checker/src/derive.rs).