Limitations
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
- Provide a real
data/official/{history,open}.csv(schema in
run-deploy-instructions.md) and re-run node verify.mjs.
- 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.
- Re-run the Proof Layer generator with the real evidence preserved.