Fake Rows Need Real Checks
A synthetic table can look completely plausible and still be worthless. It can match the column means and quietly ruin the category balance, or preserve the categories and leak entire rows, or worst of all, break the exact label relationship that made the table valuable in the first place.
tabflowmini fits a compact transport model over continuous columns, samples categorical marginals separately, regenerates the churn label from the synthetic features, and then actually checks all of that instead of declaring victory after one histogram looks close enough.
Small Flow, No Neural Net Hiding Anywhere
The generator is inspired by flow matching, but implemented as a readable Gaussian transport instead of a hidden neural net. That keeps the repo dependency-free and makes every assumption something you can actually see.
The benchmark reports KS distance for continuous columns, plan distribution gap, churn rate gap, and rounded duplicate rate. This is a small audit harness, not a magic anonymizer, and it will tell you exactly which number to worry about.
The Number
Mean KS distance is 0.056 across continuous columns. Plan gap is 0.040. Churn gap, the number the whole exercise exists to protect, is 0.026. Duplicate rate is 0.000, meaning zero rows leaked straight out of the training set.
3 tests pass locally and on GitHub Actions across Python 3.9, 3.11, and 3.13, with metrics written to `artifacts/metrics.json` every run.