Case 763

The books balanced and the difference went to suspense

the_books_balanced_and_the_difference_went_to_suspense.eml - The daily reconciliation between the processor's settlement file and the internal ledger has balanced to the cent every day for four years. What balancing consists of is computed below.

ok: true — round-trip fixpoint reached (python1 == python2)updated 2026-09-09

EML

eml
# Self-authored for the EML case corpus (no external origin). The daily
# reconciliation between the processor's settlement file and the internal ledger
# has balanced to the cent every day for four years. What balancing consists of
# is computed below.
#
# The control is genuine. The reconciliation is run by a team that does not
# report to the one that books the transactions; two people sign every day; the
# match is to the cent rather than to a tolerance; and a day that does not
# balance stops the close rather than being carried forward.
#
# A line that cannot be matched is posted to a suspense account, and suspense is
# a ledger account like any other. Debits equal credits afterwards because the
# posting is what makes them equal.

214000 => settlement_lines_a_day
213400 => lines_matched_automatically
308 => lines_matched_by_hand
292 => lines_posted_to_suspense
1461 => days_balanced_in_four_years
0 => days_that_did_not_balance
2 => signatures_a_day
21 => working_days_a_month
900 => suspense_lines_cleared_a_month
148000 => suspense_lines_open
121000 => suspense_lines_older_than_ninety_days
0 => reports_that_carry_the_suspense_balance

settlement_lines_a_day - lines_matched_automatically => lines_not_matched_automatically
lines_not_matched_automatically - lines_matched_by_hand => lines_left_for_suspense
lines_posted_to_suspense * working_days_a_month => suspense_lines_arriving_a_month
suspense_lines_arriving_a_month - suspense_lines_cleared_a_month => suspense_lines_added_a_month
suspense_lines_open - suspense_lines_older_than_ninety_days => suspense_lines_under_ninety_days
int(lines_matched_automatically * 10000 / settlement_lines_a_day) => auto_matched_per_myriad
int(lines_posted_to_suspense * 10000 / settlement_lines_a_day) => posted_to_suspense_per_myriad
int(suspense_lines_older_than_ninety_days * 10000 / suspense_lines_open) => aged_share_per_myriad

"settlement lines a day          : " + str(settlement_lines_a_day) ^0
"  matched automatically         : " + str(lines_matched_automatically) ^0
"  matched by hand               : " + str(lines_matched_by_hand) ^0
"  posted to suspense            : " + str(lines_posted_to_suspense) ^0
"  left for suspense, by subtraction : " + str(lines_left_for_suspense) ^0
"  auto-matched                  : " + str(auto_matched_per_myriad) + " per ten thousand" ^0
"  to suspense                   : " + str(posted_to_suspense_per_myriad) + " per ten thousand" ^0
"" ^0
"days balanced in four years     : " + str(days_balanced_in_four_years) ^0
"days that did not balance       : " + str(days_that_did_not_balance) ^0
"signatures a day                : " + str(signatures_a_day) ^0
"" ^0
"suspense lines arriving a month : " + str(suspense_lines_arriving_a_month) ^0
"  cleared a month               : " + str(suspense_lines_cleared_a_month) ^0
"  added a month                 : " + str(suspense_lines_added_a_month) ^0
"suspense lines open             : " + str(suspense_lines_open) ^0
"  older than ninety days        : " + str(suspense_lines_older_than_ninety_days) ^0
"  under ninety days             : " + str(suspense_lines_under_ninety_days) ^0
"  aged share                    : " + str(aged_share_per_myriad) + " per ten thousand" ^0
"reports carrying the balance    : " + str(reports_that_carry_the_suspense_balance) ^0
"" ^0

# ---- what the reconciliation verified ----

"the daily reconciliation" ^0
"  who runs it : a team that does not report to the one" ^0
"    that books the transactions" ^0
"  signatures : " + str(signatures_a_day) + ", every day" ^0
"  tolerance : none; the match is to the cent" ^0
"  a day that does not balance : stops the close rather" ^0
"    than being carried forward" ^0
"  days balanced : " + str(days_balanced_in_four_years) + " of " + str(days_balanced_in_four_years) ^0
"  verdict : BALANCED" ^0
"" ^0
"  giving it to an independent team is the part almost" ^0
"  nobody does, and it is why the " + str(days_that_did_not_balance) + " is worth reading" ^0
"" ^0

# ---- why the identity always holds ----

"what balancing means here" ^0
"  the claim : debits equal credits" ^0
"  what happens to a line that will not match : it is" ^0
"    posted to suspense" ^0
"  is suspense a ledger account : yes, like any other" ^0
"  so after the posting : debits equal credits" ^0
"  what could make them differ : a line left unposted," ^0
"    which the close does not permit" ^0
"" ^0
"  the residual has somewhere to go, and the place it goes" ^0
"  is inside the sum being checked" ^0
"" ^0

# ---- what is in suspense ----

"the suspense account" ^0
"  lines open : " + str(suspense_lines_open) ^0
"  older than ninety days : " + str(suspense_lines_older_than_ninety_days) + ", or " + str(aged_share_per_myriad) + " per ten" ^0
"    thousand of the account" ^0
"  arriving a month : " + str(suspense_lines_arriving_a_month) ^0
"  cleared a month : " + str(suspense_lines_cleared_a_month) ^0
"  so added a month : " + str(suspense_lines_added_a_month) ^0
"  reports on which the balance appears : " + str(reports_that_carry_the_suspense_balance) ^0
"" ^0
"  the number that is free to move is the one the daily" ^0
"  report does not carry" ^0
"" ^0

# ---- null control ----

# The same reconciliation, with the suspense balance and its ageing printed on
# the same page as the word balanced.
1461 => nc_days_balanced
148000 => nc_suspense_lines_shown_on_the_report
121000 => nc_aged_lines_shown_on_the_report

"null control - print suspense beside the balance" ^0
"  days balanced : " + str(nc_days_balanced) + ", unchanged" ^0
"  suspense lines shown : " + str(nc_suspense_lines_shown_on_the_report) ^0
"  of those, aged past ninety days : " + str(nc_aged_lines_shown_on_the_report) ^0
"  the reconciliation did not weaken; the account that" ^0
"  absorbs the residual stopped being off the page" ^0
"" ^0

# ---- the rule ----

"what a ledger that balances guarantees" ^0
"  debits equal credits : exactly, to the cent, " + str(days_balanced_in_four_years) + " days," ^0
"    " + str(signatures_a_day) + " signatures, an independent team" ^0
"  every transaction was understood : not addressed; a" ^0
"    line nobody could explain becomes a balanced entry" ^0
"    by being posted to suspense" ^0
"" ^0
"an identity that a posting restores is restored by the" ^0
"posting; what it cost is the size and the age of the" ^0
"account that took the difference, and the daily report" ^0
"does not carry either" ^0
"" ^0

"An independent team signs the reconciliation twice a day, matching to the cent" ^0
"with no tolerance, and " + str(days_balanced_in_four_years) + " days have balanced with " + str(days_that_did_not_balance) + " exceptions. Unmatched" ^0
"lines are posted to suspense, which is inside the sum, so " + str(suspense_lines_arriving_a_month) + " arrive and " + str(suspense_lines_cleared_a_month) ^0
"clear each month - " + str(suspense_lines_open) + " open, " + str(aged_share_per_myriad) + " per ten thousand of them past ninety days -" ^0
"across " + str(reports_that_carry_the_suspense_balance) + " reports that say so." ^0

Python (deterministic transpilation)

python
settlement_lines_a_day = 214000
lines_matched_automatically = 213400
lines_matched_by_hand = 308
lines_posted_to_suspense = 292
days_balanced_in_four_years = 1461
days_that_did_not_balance = 0
signatures_a_day = 2
working_days_a_month = 21
suspense_lines_cleared_a_month = 900
suspense_lines_open = 148000
suspense_lines_older_than_ninety_days = 121000
reports_that_carry_the_suspense_balance = 0
lines_not_matched_automatically = settlement_lines_a_day - lines_matched_automatically
lines_left_for_suspense = lines_not_matched_automatically - lines_matched_by_hand
suspense_lines_arriving_a_month = lines_posted_to_suspense * working_days_a_month
suspense_lines_added_a_month = suspense_lines_arriving_a_month - suspense_lines_cleared_a_month
suspense_lines_under_ninety_days = suspense_lines_open - suspense_lines_older_than_ninety_days
auto_matched_per_myriad = int(lines_matched_automatically * 10000 / settlement_lines_a_day)
posted_to_suspense_per_myriad = int(lines_posted_to_suspense * 10000 / settlement_lines_a_day)
aged_share_per_myriad = int(suspense_lines_older_than_ninety_days * 10000 / suspense_lines_open)
print("settlement lines a day          : " + str(settlement_lines_a_day))
print("  matched automatically         : " + str(lines_matched_automatically))
print("  matched by hand               : " + str(lines_matched_by_hand))
print("  posted to suspense            : " + str(lines_posted_to_suspense))
print("  left for suspense, by subtraction : " + str(lines_left_for_suspense))
print("  auto-matched                  : " + str(auto_matched_per_myriad) + " per ten thousand")
print("  to suspense                   : " + str(posted_to_suspense_per_myriad) + " per ten thousand")
print("")
print("days balanced in four years     : " + str(days_balanced_in_four_years))
print("days that did not balance       : " + str(days_that_did_not_balance))
print("signatures a day                : " + str(signatures_a_day))
print("")
print("suspense lines arriving a month : " + str(suspense_lines_arriving_a_month))
print("  cleared a month               : " + str(suspense_lines_cleared_a_month))
print("  added a month                 : " + str(suspense_lines_added_a_month))
print("suspense lines open             : " + str(suspense_lines_open))
print("  older than ninety days        : " + str(suspense_lines_older_than_ninety_days))
print("  under ninety days             : " + str(suspense_lines_under_ninety_days))
print("  aged share                    : " + str(aged_share_per_myriad) + " per ten thousand")
print("reports carrying the balance    : " + str(reports_that_carry_the_suspense_balance))
print("")
print("the daily reconciliation")
print("  who runs it : a team that does not report to the one")
print("    that books the transactions")
print("  signatures : " + str(signatures_a_day) + ", every day")
print("  tolerance : none; the match is to the cent")
print("  a day that does not balance : stops the close rather")
print("    than being carried forward")
print("  days balanced : " + str(days_balanced_in_four_years) + " of " + str(days_balanced_in_four_years))
print("  verdict : BALANCED")
print("")
print("  giving it to an independent team is the part almost")
print("  nobody does, and it is why the " + str(days_that_did_not_balance) + " is worth reading")
print("")
print("what balancing means here")
print("  the claim : debits equal credits")
print("  what happens to a line that will not match : it is")
print("    posted to suspense")
print("  is suspense a ledger account : yes, like any other")
print("  so after the posting : debits equal credits")
print("  what could make them differ : a line left unposted,")
print("    which the close does not permit")
print("")
print("  the residual has somewhere to go, and the place it goes")
print("  is inside the sum being checked")
print("")
print("the suspense account")
print("  lines open : " + str(suspense_lines_open))
print("  older than ninety days : " + str(suspense_lines_older_than_ninety_days) + ", or " + str(aged_share_per_myriad) + " per ten")
print("    thousand of the account")
print("  arriving a month : " + str(suspense_lines_arriving_a_month))
print("  cleared a month : " + str(suspense_lines_cleared_a_month))
print("  so added a month : " + str(suspense_lines_added_a_month))
print("  reports on which the balance appears : " + str(reports_that_carry_the_suspense_balance))
print("")
print("  the number that is free to move is the one the daily")
print("  report does not carry")
print("")
nc_days_balanced = 1461
nc_suspense_lines_shown_on_the_report = 148000
nc_aged_lines_shown_on_the_report = 121000
print("null control - print suspense beside the balance")
print("  days balanced : " + str(nc_days_balanced) + ", unchanged")
print("  suspense lines shown : " + str(nc_suspense_lines_shown_on_the_report))
print("  of those, aged past ninety days : " + str(nc_aged_lines_shown_on_the_report))
print("  the reconciliation did not weaken; the account that")
print("  absorbs the residual stopped being off the page")
print("")
print("what a ledger that balances guarantees")
print("  debits equal credits : exactly, to the cent, " + str(days_balanced_in_four_years) + " days,")
print("    " + str(signatures_a_day) + " signatures, an independent team")
print("  every transaction was understood : not addressed; a")
print("    line nobody could explain becomes a balanced entry")
print("    by being posted to suspense")
print("")
print("an identity that a posting restores is restored by the")
print("posting; what it cost is the size and the age of the")
print("account that took the difference, and the daily report")
print("does not carry either")
print("")
print("An independent team signs the reconciliation twice a day, matching to the cent")
print("with no tolerance, and " + str(days_balanced_in_four_years) + " days have balanced with " + str(days_that_did_not_balance) + " exceptions. Unmatched")
print("lines are posted to suspense, which is inside the sum, so " + str(suspense_lines_arriving_a_month) + " arrive and " + str(suspense_lines_cleared_a_month))
print("clear each month - " + str(suspense_lines_open) + " open, " + str(aged_share_per_myriad) + " per ten thousand of them past ninety days -")
print("across " + str(reports_that_carry_the_suspense_balance) + " reports that say so.")

stdout (executed)

text
settlement lines a day          : 214000
  matched automatically         : 213400
  matched by hand               : 308
  posted to suspense            : 292
  left for suspense, by subtraction : 292
  auto-matched                  : 9971 per ten thousand
  to suspense                   : 13 per ten thousand

days balanced in four years     : 1461
days that did not balance       : 0
signatures a day                : 2

suspense lines arriving a month : 6132
  cleared a month               : 900
  added a month                 : 5232
suspense lines open             : 148000
  older than ninety days        : 121000
  under ninety days             : 27000
  aged share                    : 8175 per ten thousand
reports carrying the balance    : 0

the daily reconciliation
  who runs it : a team that does not report to the one
    that books the transactions
  signatures : 2, every day
  tolerance : none; the match is to the cent
  a day that does not balance : stops the close rather
    than being carried forward
  days balanced : 1461 of 1461
  verdict : BALANCED

  giving it to an independent team is the part almost
  nobody does, and it is why the 0 is worth reading

what balancing means here
  the claim : debits equal credits
  what happens to a line that will not match : it is
    posted to suspense
  is suspense a ledger account : yes, like any other
  so after the posting : debits equal credits
  what could make them differ : a line left unposted,
    which the close does not permit

  the residual has somewhere to go, and the place it goes
  is inside the sum being checked

the suspense account
  lines open : 148000
  older than ninety days : 121000, or 8175 per ten
    thousand of the account
  arriving a month : 6132
  cleared a month : 900
  so added a month : 5232
  reports on which the balance appears : 0

  the number that is free to move is the one the daily
  report does not carry

null control - print suspense beside the balance
  days balanced : 1461, unchanged
  suspense lines shown : 148000
  of those, aged past ninety days : 121000
  the reconciliation did not weaken; the account that
  absorbs the residual stopped being off the page

what a ledger that balances guarantees
  debits equal credits : exactly, to the cent, 1461 days,
    2 signatures, an independent team
  every transaction was understood : not addressed; a
    line nobody could explain becomes a balanced entry
    by being posted to suspense

an identity that a posting restores is restored by the
posting; what it cost is the size and the age of the
account that took the difference, and the daily report
does not carry either

An independent team signs the reconciliation twice a day, matching to the cent
with no tolerance, and 1461 days have balanced with 0 exceptions. Unmatched
lines are posted to suspense, which is inside the sum, so 6132 arrive and 900
clear each month - 148000 open, 8175 per ten thousand of them past ninety days -
across 0 reports that say so.

Trace event types

eml:run:starteml:assigneml:outputeml:run:done