Skip to content

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.

The 24 components specified here.

Built against this document

The surfaces that implement what this argues — running, computing, or shaped by it.

Told when this spec changes

The docs are the contract the components are built against. When one changes, the component changes with it — and the copy in your repo does not. One email when that happens.

One address, no list rental, unsubscribe in one click.

Works in your QuickBooks Online or Xero file

Get your books closed every month

Lopifi is building AI bookkeeping that keeps your books closed on US GAAP as transactions happen, with a CPA review every quarter, for $200 a month. We’re not open yet.

$200/month when we open. No card now.