Recon Desk

The browser matches the two extracts and buckets every row; the model only says why each break is there.

Back to SkillSafe

Recon Desk measures what two extracts you paste do and do not agree on. It is not a sign-off, it does not post journals, and it cannot see anything outside the text you give it — a break it cannot explain is reported as unclassified rather than guessed at.

How it works

Nothing to hand? Load the , a normal month with a rate difference, a line booked the wrong way round, a short fill and a late posting. Or the , where two breaks of four hundred thousand cancel each other and the whole residual turns out to be one line of six and a half thousand. Or the , where the GL disagrees with its own stated total and one break cannot be classified at all. to watch the export refuse itself. All three replay a saved run for free.

1. Both extracts are read, not assumed

Comma, tab, semicolon, pipe and markdown tables all parse. Column roles are matched by header name one column at a time, so a classifier can never assign a role because some other column matched. Parenthesised values are negative, currency symbols and thousands separators are stripped, and a magnitude suffix counts only when it is welded to the digits. Dates are resolved by an extract-wide vote on day-first versus month-first rather than guessed row by row.

2. The key is chosen by measurement

Every workable combination of identifier, account, dates and currency is scored on how much of both extracts it actually aligns and on how many rows keep a unique key. The winner is used and the runners-up are printed, so you can see what a different grain would have done rather than take the alignment on trust.

3. Every row lands in exactly one bucket

Matched, amount break, quantity break, timing break, account mapping break, GL only, subledger only — and the partition is asserted, not assumed. Both sides' rows are counted back out of the buckets, and a row that was counted twice or lost anywhere in the pipeline is reported as an integrity finding rather than quietly absorbed.

4. The one-sided residual is worked

A posting answered by two or three lines on the other side is found by bounded subset-sum, searched in progressively wider neighbourhoods so a split is never asserted across unrelated instruments when a tighter explanation exists. Equal and opposite lines are sign flips, exact factors of a hundred or a thousand are unit-of-measure errors, and a counterpart a few days away with the same amount is a cut-off difference. Each row is consumed at most once.

5. The decisive break is found by simulation

Not by ranking. A break counts only if resolving it alone brings the net residual inside materiality. Where a plus four hundred thousand and a minus four hundred thousand cancel, the entire residual can be a single small line, and no sort by magnitude ever puts that line on top. Where no single break does it, pairs are searched; where no pair does it either, the report says so instead of nominating something.

6. The pass may only pick a cause the numbers permit

Before the model runs, the engine decides per break which of the six causes the evidence supports and records why in its own words. FX is the clearest: it is admissible only where the local amounts agree and the base amounts do not, so a discrepancy in both, or two sides that are equal and opposite, rules it out. Afterwards the same measurement checks the reply: exactly one cause per break, counted rather than sampled; any cause that was not on the admissible list reported as an invention by id; any note that merely restates the delta flagged as a restatement; and every figure traced back to something measured, at the precision it was written to.

Questions people ask before they paste anything in

How does it decide which columns to align the two extracts on?

By measuring, not by assuming. Every workable combination of identifier, account, dates and currency is scored on how much of both extracts it actually aligns and on how many rows it leaves with a unique key, and the winner is used. The scoreboard of the alternatives is printed beside it, so if the key it chose is not the one your firm reconciles on, you can see what the runner-up would have done.

What happens to rows that only appear on one side?

They are worked, not just listed. One posting answered by two or three on the other side is found by a bounded subset-sum search inside progressively wider neighbourhoods — same instrument first, then same account — so a split is never asserted across unrelated instruments when a tighter explanation exists. Equal and opposite lines are identified as sign flips, exact factors of a hundred or a thousand as unit-of-measure errors, and a counterpart a few days away with the same amount as a cut-off difference. Each row is consumed at most once, so the partition survives every pass.

What stops the AI pass blaming a break on the wrong thing?

The engine decides, before the pass runs, which of the six causes the evidence can support for each break, and the pass may only choose from that list. The clearest case is FX: a rate difference is only possible when the local amounts agree and the base amounts do not, so if the locals differ too — or if the two sides are equal and opposite, which no rate can produce — FX is struck off however plausible it reads. Afterwards the same measurement is used to check the reply: a cause that was not on the list is reported as an invention, by break id. The grounds for each admissible cause, and for each one ruled out, are shown under “Why” in the break table before you spend anything.

Is an unclassified break a failure?

No, it is the honest answer, and one of the bundled examples exists to show it. Where nothing in the two extracts supports any of the six causes, the only permitted answer is that the cause is not determinable from what was supplied. A report with one unclassified row and three well-grounded ones is worth more to a resolver than four plausible sentences.

Why is the decisive break sometimes one of the smallest?

Because breaks offset. A break counts as decisive only if resolving it alone brings the net residual inside materiality, and that is a different question from which break is biggest. When a plus four hundred thousand and a minus four hundred thousand cancel each other exactly, the entire residual can be a single six-thousand line — and no sort by magnitude ever puts that line on top. The engine simulates each resolution instead of ranking.

Do I have to sign in?

No. The parsing, the key selection, the matching, the bucketing, the residual passes, the integrity checks, the decisive-break simulation, the whole break report, the CSVs, the measurement JSON, the run-to-run comparison and every check run in this tab with no account and nothing charged. Only the cause sentences are metered, and the three bundled examples replay a saved run for free. The run button says so where it stands: signed out it offers to sign you in rather than simply refusing.

Why can the download be refused?

Because in a reconciliation the thing that must never silently change is which breaks were found and what bucket each one was in. Before any export the rendered report is read back, the break ids are collected, and the download is blocked if a break has been lost, listed twice, moved out of the bucket it was measured into, or if a delta no longer matches the measurement. A warning would be cheaper and would also be ignored.

What does a run cost, and what if my balance is low?

A worst-case amount is reserved and only what the run uses is charged. The run button is disabled before you submit if the balance cannot cover the model's minimum, and the meter beside it names the shortfall and links straight to the top-up page. A reply cut short by a low balance says so rather than presenting itself as a complete break report.

I ran this last month. Can I see what changed?

Yes, and it costs nothing. Past reconciliations are kept on your account, and each one that still carries its extracts offers “Compare with what is on screen”: the stored extracts are re-measured in this tab and the two break sets are joined, so you get the breaks that resolved, the ones that are new, the ones that moved bucket or delta, and the movement in the residual and the matched percentage. A reconciliation saved while you were signed out is kept and uploaded when you sign in, not overwritten.

Method derived from @anthropics/gl-recon (anthropics/financial-services-plugins, Apache-2.0). Recon Desk is a derived work, not a republication of that skill. The account mapping break bucket is this app's own documented extension to the skill's bucket table.