Close, controls & consolidation
Domain in domain/02-periods-and-close.md, domain/08-controls-and-audit.md, domain/09-multi-entity-and-fx.md.
See also: #70 CloseChecklist and #69 TrialBalance in statements — they belong to this family conceptually.
The close
138. PeriodStatus
The state banner on every period-scoped surface. Three things, always: the state, the provenance, and the next action.
The provenance is a signed-off avatar — initials or a photo, with a tick — and not a sentence. "Closed 4 Oct 2026 by A. Rivera, Controller" is read once and then costs a line forever; the auditor who needs it presses the face and gets the name, the role and the timestamp. InfoTip, so it opens under a thumb.
🔒 September 2026 · Closed 4 Oct 2026 by A. Rivera
Entries dated in this period will post to October and be flagged
for cutoff review. [Request reopen]
A lock icon alone is a dead end. Reopening states its blast radius first: "Reopening September will mark 4 published statements as superseded."
139. CutoffWarning
Inline at the date field, never a toast. States the consequence and both legitimate remedies: "This is dated 29 Sep, in a closed period. It will post to October. If it belongs in September, request a reopen, or record it in October as an out-of-period adjustment."
140. CloseStatus
The seven-section pipeline with gating: cutoff → cash → subledgers → schedules → adjusting entries → BS tie-out → review. Downstream sections show as blocked with the blocker named and owned. Progress is by weighted check, not count — ten trivial checks and one bank rec is not 91% done.
Controls
141. AuditTrail
A timeline on every financial object, not a hidden admin log. Field-level diffs ("Amount changed from $1,240.00 to $1,420.00"), server UTC timestamps with the zone displayed, actor with role, and onBehalfOf rendered explicitly so delegated and support access is visibly distinct.
Append-only. Filters narrow the view and say so: "Showing 12 of 148 events."
142. EvidencePanel
Documents rendered inline, never download-only. Content hash stored and displayed — a document that changed after attachment is a finding. Evidence is unlinked, never deleted, and the unlink is audited. Required on bills, expenses, adjusting entries, and reconciliations.
143. IntegrityCheckPanel
The eleven continuous assertions — entry balance, accounting equation, subledger ties, schedule ties, roll-forward continuity, cash tie, retained earnings, intercompany, numbering, period integrity, orphans.
A failing check becomes the primary state of its surface, not a badge in a corner. The screen's main content becomes the failure, the difference, and the investigation path.
144. MaterialityPolicy
Trivial floor, absolute threshold, relative threshold, per-account overrides. Both thresholds must be exceeded for a variance to flag. The threshold in force is displayed on every surface that flags variances, so a reviewer knows what they're not seeing.
145. ApprovalPolicyEditor
Thresholds by amount, role, and dimension. requireSeparateApprover is displayed as fixed, not as a toggle. Delegations require an expiry — permanent delegation is a control failure.
146. RoleMatrix
The seven roles against the actions. Renders the two structural separations explicitly: Controller ≠ Treasurer, and Admin cannot transact.
147. SubsequentEventLog
Events after period end, before issuance, typed as adjusting or non-adjusting with the treatment decision recorded. The same event handled the wrong way is a misstatement in one direction or an omitted disclosure in the other.
148. RestatementBanner
Marks a restated comparative wherever it appears, with the reason. A prior-year column that quietly changed between two reports destroys trust faster than the original error.
149. AuditorMode
Read-only enforced server-side, scoped to a period and entity set with the scope immutable during the session. Auditor activity is itself audited and visible to the client.
150. SamplingTool
Select N transactions by a stated method — random, monetary-unit, judgmental — with the seed recorded so the selection is reproducible.
151. EvidenceBundle
For any selection: entries, source documents, approvals, and audit trails exported as one package with a manifest. The alternative is emailing spreadsheets.
Consolidation & FX
152. EntitySelector
Explicit scope, never inferred from a default. Standalone and consolidated are visually distinct, not just differently labeled — the consolidated view carries a persistent scope chip. Entity switching is a full context change: nothing animates, every cached figure invalidates.
153. ConsolidationView
Entity columns + elimination column + group total. Non-controlling interest on both statements. Flags subsidiaries with mismatched fiscal year-ends rather than silently summing them.
154. IntercompanyMatrix
Entity × entity balances. Every cell must have an equal and opposite counterpart; non-zero cells are the exception queue — the most common cause of a consolidation that doesn't tie. Break types are named, not shown as a bare difference: timing, FX, or one-sided.
155. EliminationEntry
source: "elimination", consolidation-level only. Never appears in standalone statements, and the UI makes that boundary visible.
156. NciPanel
Non-controlling interest as an equity component and as a net income allocation. Omitting it overstates the parent's share.
157. TranslationSummary
Closing, average, and historical rates used, with sources and the averaging methodology stated. A translated number without its rate is unverifiable.
158. CtaRollForward
Opening CTA → movement → closing. Displayed as its own equity line, never buried — it's the arithmetic consequence of the translation method, and hiding it makes the balance sheet look inexplicable.
159. FxRevaluation
Period-end revaluation preview and posting. Only monetary items — derived from account classification, not a trustable flag. Reverses at the start of the next period.
160. FxGainLossPanel
Realized and unrealized as separate lines, never combined. Unrealized reverses; realized doesn't. One number destroys the reader's ability to tell what happened.
161. RateTable
By pair, date, and type — spot, closing, average, historical, budget. Rate type is not optional; the same pair on the same date has different closing and average rates. Manual overrides require a reason and an approver and are visibly distinguished. A missing rate is a blocking error, never a silent 1.0.