# LIMITATIONS — Cash Recovery Engine

Authoritative list of everything simulated, modelled, projected, skipped, or
otherwise short of a live production result. Each item is a `DISCLOSED_SEAM`
unless noted.

## 1. No real receivables ledger (`DISCLOSED_SEAM`)
All reported metrics are measured on a synthetic AR world (`src/synth.mjs`),
not on any company's receivables. No company-specific recovery figure is
produced or claimed. This is the reason the status is `PROOF_INCOMPLETE`, not
`CERTIFIED`.

## 2. Uplift identifiability (`DISCLOSED_SEAM`)
The engine's core quantity — per-invoice treatment uplift (pay-if-worked minus
self-cure) — is directly measurable here only because the synthetic world
exposes **both** potential outcomes (y0 and y1) for every invoice. In reality
you observe only one outcome per invoice (the fundamental problem of causal
inference). On real data, uplift is therefore an **estimate** from an
observational T-learner, and its quality must be validated by a holdout or A/B
test, not read off as ground truth.

## 3. Modelled collector effort and timing (`SIMULATED`)
`effort_hours` and `days_to_pay` are modelled parameters (functions of amount,
dispute status, and customer history), not timed observations from a real
collections team. On real data, supply measured effort or accept these as
priors.

## 4. "Cash accelerated" and "DSO reduction" are projections (`PROJECTION`)
The headline projections in `reports/executive-summary.md` and the web tool are
expected values computed from the model's uplift estimates over the ledger. They
are not realized, audited cash movements. Realized cash requires running the
queue and measuring outcomes.

## 5. Observational confounding (`DISCLOSED_SEAM`)
The synthetic history assigns "worked" with a mild bias toward older invoices
(realistic, lightly confounded). The T-learner adjusts for observed features but
cannot adjust for unobserved confounders. Real histories may be more strongly
confounded (collectors already prioritize); a randomized holdout removes this.

## 6. Decision-support only (scope)
The engine recommends *where to spend collector time*. It does not move money,
post to a ledger, send communications, or integrate with an ERP/AR system. Those
are out of scope and not claimed.

## 7. Not deployed, not load/security-tested (scope)
No deployment, authentication, multi-tenant isolation, monitoring, or
performance-at-scale testing was run or is claimed. The web tool is a static,
client-side demonstration.

## 8. Benchmark realism (`DISCLOSED_SEAM`)
The synthetic world is behaviourally motivated but is a model of receivables, not
a sample of them. Effect sizes (AUC, skill, lift) are properties of this world
and will differ on real data — possibly materially.

## How to close the major seams
1. Provide a real `data/official/{history,open}.csv` (schema in
   `run-deploy-instructions.md`) and re-run `node verify.mjs`.
2. Run a holdout/A-B test: work the engine's queue for one cohort, business-as-
   usual for another, and compare realized cash and DSO.
3. Re-run the Proof Layer generator with the real evidence preserved.
