RevRec brainstorm · Direction alignment · DA · Recog / close / mod
ADR 0005 — Recognition, close, modification & credit defaults
Date: 2026-07-30
Status: Accepted
Deciders: RevRec Next design session (grill lock)
Context
Open product forks blocked a coherent engine: calendar grain, cancel, CN overflow, locked-period corrections, prospective vs cumulative mods. Enterprise Zuora-class scope needs explicit defaults; policies remain configurable.
Decision
Recognition calendar
- Schedule grain: store daily schedule lines (or equivalent day-weighted lines) as the precise model.
- Recognize API:
recognize(period)aggregates open lines whoseperiodfalls in the accounting period (monthly fiscal periods by default). - Proration policies (30/360, true days, inclusive start/end) are named config — not hardcoded branches.
Rationale: daily precision supports mid-period amendments and smoke true30/360 themes without locking UI to daily close.
Period state machine
OPEN → RECOGNIZING → RECOGNIZED → POSTING → POSTED → SOFT_CLOSED → HARD_LOCKED
- Soft close: block new recognition into period; allow controlled reopen.
- Hard lock: mutations require PPA / next-period catch-up policy — never silent rewrite.
- RevRec period close precedes AC close for revenue/tax event types (see ADR 0006 / AC PRD).
Modifications
- Amendments are first-class (
amend_contract) with explicit treatment: - Default: prospective reallocation of remaining distinct PO consideration (ASC 606-10-25-13(a)).
- Supported: cumulative catch-up when remaining goods/services are not distinct (ASC 606-10-25-13(b)).
- Supported: account as separate contract when distinct + standalone price (ASC 606-10-25-12).
- Policy ids:
mod.prospective,mod.cumulative,mod.separate_contract.
Termination (term.cancel)
- Default: prospectively zero remaining open schedule (release obligation); do not auto-recognize remaining into P&L unless policy
term.cancel.recognize_remainingis set. - Termination fees / penalties are separate TP/PO or billing events when present in source.
Credit notes
- Map
reason_code→ policy id. - Default
cn.refund_unrecog: reduce unrecognized/deferred/remaining schedule first. - Overflow (CN > unrecognized):
cn.overflow.reverse_recog— reverse recognized revenue to the extent needed (explicit, auditable), not silent AR-only unlesscn.ar_only.
Locked-period facts
- Default: book as prior-period adjustment in the next open period with full audit (
ppa.*), unless reopen is explicitly performed.
Contract asset / unbilled
- First-class balances: when recognition precedes billing, record contract asset / unbilled receivable (ASC 606-10-45); when billing precedes recognition, contract liability / deferred.
Consequences
Engine scenarios S01–S05+ and smoke quarry themes (modification, credit-note, ppa, deferred-revenue, recognition-plan) map to these named policies. Merchants can override via config; defaults are enterprise-sane.