Skip to content

CAP-ACC-REC-018Assess reconciliation work before period close

Markdown

CAP-ACC-REC-018

Assess reconciliation work before period close

Markdown
  • DocumentDraft
  • Product intentConfirmed
  • ImplementationObserved

KindCapabilityProduct areaAccountingModuleReconciliationRevision2

Read atservices-accounting f47cb263react-console baf6dae3

The Formal Contract

The narrative above explains; the sections below are authoritative — the rules, scenarios and tests this document binds.

Outcomes
Close assessment identifies missing and unfinished reconciliation work.Transit alone remains advisory.Each financial concern has one principal finding.
Surfaces
consoleapi
Intent sources
services-accounting:docs/milestones/plans/ACCT-M8-plan.md#D10 (§1: month-end close reads reconciliation’s readiness and refuses to close over overdue or unexplained money)services-accounting:docs/reconciliation/architecture.md#15.2 Structured finding (one finding per problem, Andrew, 2026-10-16)services-accounting:docs/milestones/plans/ACCT-M8-plan.md#D10 (§4: the architecture §6 invariants hold; INV-17)services-accounting:docs/milestones/plans/ACCT-M8-plan.md#D6 (architecture §3.4 U11: Close Readiness, one close)

Controls

22 controls apply, from the corpus control catalogue.

TC-IAM-001 TC-IAM-002 TC-IAM-004 TC-IAM-005 TC-IAM-006 TC-AZ-001 TC-AZ-002 TC-AZ-003 TC-AZ-004 TC-AZ-006 TC-TEN-001 TC-TEN-002 TC-TEN-003 TC-DAT-001 TC-LOG-002 TC-LOG-003 TC-LOG-004 TC-LOG-005 TC-PI-001 TC-PI-002 TC-PI-003 TC-PI-005

Permissions

KeyChecked atScope
accounting.reconciliation-batches.readapitenant
accounting.reconciliation-batches.readconsoletenant

Business Rules

15 rules, 14 to be proved before approval. A rule's product intent is derived from its origin: 15 confirmed by a product decision, the rest inheriting this capability's confirmed.

IdRuleKindEnforced atProvenance
01must prove
Confirmed
Readiness selects a unit and a year-period pair, or derives the period from the supplied day or workspace-local today, rejecting incomplete pairs and absent unit periods.
origin: services-accounting:docs/milestones/plans/ACCT-M8-plan.md#D10 (plan approved 2026-10-22 10:40 ET; §2 scope); the readiness contract for close
validationapitest
services-accounting:modules/reconciliation/tests/e2e/batch-lifecycle.e2e.spec.js#refuses a fiscal year without a period number with 400; services-accounting:modules/reconciliation/tests/e2e/batch-lifecycle.e2e.spec.js#answers 200 with the blockers, warnings, clearing lines and period of tenant A’s October; services-accounting:modules/reconciliation/tests/e2e/batch-lifecycle.e2e.spec.js#answers the period containing asOf when no period is named; services-accounting:modules/reconciliation/tests/e2e/batch-lifecycle.e2e.spec.js#answers 404 for a unit with no such period; services-accounting:modules/reconciliation/tests/e2e/batch-lifecycle.e2e.spec.js#refuses a principal without accounting.reconciliation-batches.read with 403
02must prove
Confirmed
Each live in-period payout outside a finalized reconciliation produces a blocker carrying its open reconciliation, difference and unbalanced-payout exception when present.
origin: services-accounting:docs/reconciliation/architecture.md#15.2 Structured finding (one finding per problem, Andrew, 2026-10-16)
calculationservicetest
services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports C1 for each live payout of the period not in a finalized batch, carrying its unbalanced-payout exception; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports one C1 for the payout whose open batch does not balance, carrying the batch and its difference; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports C2 only for the unbalanced open batch dated before the period, the batch with its difference
03must prove
Confirmed
An older open reconciliation with nonzero difference blocks separately when all its payout dates precede the period.
origin: services-accounting:docs/reconciliation/architecture.md#15.2 Structured finding (one finding per problem, Andrew, 2026-10-16)
calculationservicetest
services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports C2 only for the unbalanced open batch dated before the period, the batch with its difference; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports C1 for each live payout of the period not in a finalized batch, carrying its unbalanced-payout exception; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports one C1 for the payout whose open batch does not balance, carrying the batch and its difference
04must prove
Confirmed
Unclaimed money beyond grace at the earlier of period end and preview day blocks unless its overdue exception is accepted, linking its open exception when present.
origin: services-accounting:docs/milestones/plans/ACCT-M8-plan.md#D10 (§1: refuses to close over overdue money)
calculationservicetest
05must prove
Confirmed
An open or investigating period-anchored blocker not already carried by another finding gets its own finding, including blocker-severity duplicate exceptions.
origin: services-accounting:docs/reconciliation/architecture.md#15.2 Structured finding (one finding per problem, Andrew, 2026-10-16)
calculationservicetest
services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports C4 for the open blocker exception anchored in the period that no other finding carries; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports a possible-duplicate exception of blocker severity once, as C4 and not as W5; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports C5 for the reversal awaiting its second approval; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports C6 for the finalize batch posting has not posted, and not for the request it posted; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports C7 for the September effect posted in October, not reviewed; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports C8 for the open batch whose totals disagree with its rows; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports the blockers in the checks’ order and nothing else; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#still reports it once the batch posting that held it was reversed; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports it no more once an unreversed batch posting holds its reconciliation entry
06must prove
Confirmed
Pending reversal approvals, in-period unposted requests, unreviewed late effects from an earlier closed period and inconsistent reconciliation totals each block readiness.
calculationservicetest
services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports C6 for the finalize batch posting has not posted, and not for the request it posted; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports C4 for the open blocker exception anchored in the period that no other finding carries; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports a possible-duplicate exception of blocker severity once, as C4 and not as W5; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports C5 for the reversal awaiting its second approval; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports C7 for the September effect posted in October, not reviewed; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports C8 for the open batch whose totals disagree with its rows; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports the blockers in the checks’ order and nothing else; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#still reports it once the batch posting that held it was reversed; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports it no more once an unreversed batch posting holds its reconciliation entry
07must prove
Confirmed
The clearing check compares posted balance through the state day with transit, overdue and open-reconciliation money per merchant and blocks on a difference.
origin: services-accounting:docs/milestones/plans/ACCT-M8-plan.md#D7 (with D2: the clearing account)
calculationservicetest
services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports C9 for the clearing account whose posted balance differs from its outstanding items; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#counts the entries dated up to the state date: debits less credits of the merchant account’s clearing account; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#counts none dated after the state date; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#answers the clearing line, overdue items (the accepted one too) apart from those in transit and in open reconciliation; services-accounting:modules/reconciliation/tests/e2e/reconciliation-scenario.e2e.spec.js#step 10: counts the gift in transit on 2026-10-13 and overdue on 2026-10-16 on the clearing line, with C9 blocking on the ledger holding none of it
08must prove
Confirmed
Transit, late arrivals, finalized but bank-unverified payouts, later-period drafts holding current-period items and possible duplicates are warnings; transit itself cannot prevent close.
origin: services-accounting:docs/milestones/plans/ACCT-M8-plan.md#D10 (§4: the architecture §6 invariants hold; INV-17)
policyservicetest
09must prove
Confirmed
Readiness represents a problem once with one principal record and related records, suppressing duplicate exception findings and ordering by check then record.
origin: services-accounting:docs/reconciliation/architecture.md#15.2 Structured finding (one finding per problem, Andrew, 2026-10-16)
policyservicetest
services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports no finding of its own for an exception another finding carries; services-accounting:modules/reconciliation/tests/unit/rules/readiness.spec.js#reports blockers in the checks’ order, then by entity id; services-accounting:modules/reconciliation/tests/unit/rules/readiness.spec.js#lists every check with its code and severity, in report order; services-accounting:modules/reconciliation/tests/e2e/reconciliation-scenario.e2e.spec.js#step 10: reports the gift and its overdue exception as that one finding, no exception-unresolved beside it
10must prove
Confirmed
Clearing summaries count unresolved items occurring by the state day once as open-held, overdue including accepted cases, or transit including pending, held and late cases.
origin: services-accounting:docs/milestones/plans/ACCT-M8-plan.md#D10 (plan approved 2026-10-22 10:40 ET; §2 scope)
calculationservicetest
services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#answers the clearing line, overdue items (the accepted one too) apart from those in transit and in open reconciliation; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#reports C9 for the clearing account whose posted balance differs from its outstanding items; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#counts the entries dated up to the state date: debits less credits of the merchant account’s clearing account; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period.integration.spec.js#counts none dated after the state date; services-accounting:modules/reconciliation/tests/e2e/reconciliation-scenario.e2e.spec.js#step 10: counts the gift in transit on 2026-10-13 and overdue on 2026-10-16 on the clearing line, with C9 blocking on the ledger holding none of it
11must prove
Confirmed
Period-local occurrence assigns items to six currency buckets, at most one per item, with processor-matched status unavailable until imports exist.
origin: services-accounting:docs/milestones/plans/ACCT-M8-plan.md#D8 (processor import out of this milestone)
calculationservicetest
services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period-close-fields.integration.spec.js#answers the six buckets in order, each with its count and signed amount, matched to processor unavailable; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period-close-fields.integration.spec.js#counts each item of the period in one bucket at most: the buckets and the two excluded make the thirteen in scope; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period-close-fields.integration.spec.js#counts the item of 23:00 Eastern on October 31 and neither the item of September 30 nor that of November 1; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period-close-fields.integration.spec.js#answers the warning and the blocker accepted in the period, by when they were accepted, whole; services-accounting:modules/reconciliation/tests/integration/services/close-readiness/assess-period-close-fields.integration.spec.js#answers the first 500 accepted exceptions by when they were accepted, and says there were more; services-accounting:modules/reconciliation/tests/unit/rules/payment-states.spec.js#marks only matched to processor unavailable, with its reason
12must prove
Confirmed
The accepted list uses exceptions’ period anchors rather than acceptance dates, orders by acceptance time and returns at most five hundred with a truncation flag and applicable approval identities.
origin: services-accounting:docs/reconciliation/architecture.md#13.2 Workflow (Andrew's Decision 2, 2026-10-16)
policyserviceobserved
13must prove
Confirmed
Assessment requires its caller’s transaction; Month-End Close assesses after its period lock and refuses remaining blockers.
origin: services-accounting:docs/reconciliation/brief.md#Period close (Andrew’s product brief, 2026-10-15): enforced in the service, not the UI
invariantservicetest
14must prove
Confirmed
Reconciliation read permission is required for readiness access.
permissionapitest
services-accounting:modules/reconciliation/tests/e2e/batch-lifecycle.e2e.spec.js#refuses a principal without accounting.reconciliation-batches.read with 403; services-accounting:modules/reconciliation/tests/e2e/batch-lifecycle.e2e.spec.js#answers 200 with the blockers, warnings, clearing lines and period of tenant A’s October; services-accounting:modules/reconciliation/tests/e2e/batch-lifecycle.e2e.spec.js#answers the period containing asOf when no period is named; services-accounting:modules/reconciliation/tests/e2e/batch-lifecycle.e2e.spec.js#refuses a fiscal year without a period number with 400; services-accounting:modules/reconciliation/tests/e2e/batch-lifecycle.e2e.spec.js#answers 404 for a unit with no such period
15
Confirmed
The console offers unit, period and date selection and linked readiness findings, without a close command.
policyconsoleobserved

Scenarios

IdGivenWhenThenProvenance
01The overdue gift has an active exception in October.Assess that month.One linked financial finding includes the exception without a duplicate exception finding.test
services-accounting:modules/reconciliation/tests/e2e/reconciliation-scenario.e2e.spec.js#step 10: reports the gift and its overdue exception as that one finding, no exception-unresolved beside it
02The gift has reached its expected day but not grace expiry.Preview readiness for that day.Transit produces advisory information rather than an overdue blocker.test
services-accounting:modules/reconciliation/tests/e2e/reconciliation-scenario.e2e.spec.js#step 10: warns of funds in transit for the gift on 2026-10-13, and never blocks on them

Edge Cases

IdGivenWhenThenProvenance
03Financial work has cleared all blockers and posting has completed the requests.Reassess October.No reconciliation blocker remains.test
services-accounting:modules/reconciliation/tests/e2e/reconciliation-scenario.e2e.spec.js#step 12: shows October 2026 with no blockers once batch posting posted them

The Markdown files under specs/ in rhythmsoftware/rhythm-v2-docs are the canonical source of truth. This reader is a generated, read-only projection of them.