The rating system cannot see this and never will — a dumped frame produces a perfectly ordinary rating update. Neither can outcome analysis: losing and throwing look identical in the result. What can see it is the shot log, which exists only because the engine is deterministic and every shot is recorded. This is the payoff for that work.
Why this is the compliance question, not just a fairness one. A platform that lets one person move value between two accounts they control, for a 5% fee, has built a remittance rail. That is the shape counsel and FINTRAC will recognise long before anyone calls it cheating, and "we did not know" is not a position. Detection here is not about protecting the game. It is about being able to answer the question when it is asked.
For every shot, reconstruct what the player could have attempted — each of their own balls, each pocket, the ghost position, the cut angle, whether the path is clear — and compare it with what they actually played. Aiming nowhere near your own ball is not bad play, it is not playing.
A careful dumper defeats layer one entirely: they aim at real pots and miss narrowly, which is what a weak honest player looks like. What they cannot hide is being sharp against everyone except their partner. This compares a player to themselves, not to a population.
Neither layer above should act alone. A frame is evidence; a pattern with one counterparty and a one-way flow of LTC is a case.
| Layer | Catches | Misses |
|---|---|---|
| 01 · shot intent | Crude dumping. Aimless shots, ignored pots, feeble rolls, no contact | Anyone who aims at a real pot and misses by ten degrees |
| 02 · self-consistency | The careful dumper, by their own baseline. Needs six or more rated frames | A player who is genuinely inconsistent. Tilt and fatigue are real |
| 03 · value flow | The pattern that makes it worth doing at all — repetition and direction | A single large dump between two accounts that never meet again |
Flag, hold, review — never auto-seize. All three layers together produce a suspicion, not a finding. The correct action is to hold settlement on the flagged pair and have a human look, and to say so in the terms before anyone deposits. Seizing a non-custodial user’s stake on a statistical signal is the single fastest way to turn a false positive into a reputation you cannot repair — and on a non-custodial platform you mostly cannot seize it anyway, which is a feature.
What none of this touches. Two people genuinely playing, where one is simply much better and the stakes are high, is not collusion — that is what the rating bands are for. A bot playing on someone’s behalf scores as excellent on every layer here, because it is trying to win. And nothing here detects account sharing. Each is a separate problem, and calling this file anti-cheat would be overclaiming.
| Engine | The physics, rules and match loop on this page are the identical source injected from the match build. Analysis that ran on a second implementation would prove nothing about the first |
| Pot line | For each of a shooter’s balls and each pocket: ghost at two radii back along the ball-to-pocket line, required cue direction, cut angle. Discarded if the cut exceeds 75° or the path is blocked |
| Aim error | Angular distance between the played direction and the nearest feasible pot line. Clamped at 60° so one wild shot cannot carry a frame |
| Where it runs | Off the settlement path entirely. Analysis is a batch job over stored logs — it must never be able to delay or block a frame from finishing |
| Thresholds | 0.45 on layer one and z > 2 on layer two are starting points chosen against simulated play. Re-fit them on real traffic before they gate anything |