Close, controls & consolidation
Domain in domain/periods-and-close.md, domain/controls-and-audit.md, domain/multi-entity-and-fx.md.
See also: #70 CloseChecklist and #69 TrialBalance in statements. Conceptually they belong to this family.
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), not a sentence. "Closed 4 Oct 2026 by A. Rivera, Controller" gets read once and then costs a line forever. The auditor who needs it presses the face and gets the name, role and timestamp. It's an 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 weighted by check, not counted: ten trivial checks and one bank rec isn't 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. The content hash is stored and displayed, because 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 how to investigate it.
144. MaterialityPolicy#
Trivial floor, absolute threshold, relative threshold, per-account overrides. Both thresholds must be exceeded for a variance to flag. Despite the name, this is a flux threshold (which variances get an explanation in the close), not a materiality judgment, which is also qualitative and set by no fixed number (accounting model §9). 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 look different, not only labeled differently. 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. They're the most common reason a consolidation 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. Shown as its own equity line, never buried. It's the arithmetic result 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 rather than a flag someone can set. 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.