An arrow pointing up is not an answer
Every A/B tool eventually shows you two numbers and a green arrow. The arrow is the easy part. The hard part is everything it hides: is the sample big enough, do the confidence intervals overlap, did the winning variant quietly break something else?
Lift is built so that a decision can be defended a month later. The result screen states a verdict in one line, then shows the work behind it: the Wilson interval, the p-value, the probability of beating control, how much data the test still needs and what happened to the metrics that were never supposed to move.
What is inside
Deterministic buckets
SHA-256 of «salt:flag:user» into 10,000 buckets. The same person gets the same variant on every request and every server, with no session, no lookup table and no database round trip.
Rules that explain themselves
Conditions on any attribute, joined by AND inside a rule, evaluated top to bottom between rules. The answer carries the variant, the reason and the index of the rule that fired, so «why does this person see the old button» takes one form field.
Statistics without packages
Wilson intervals, a two-proportion z-test, a Beta-posterior probability to beat control and sample size estimation, written by hand and checked against textbook values, including Moro's inverse normal.
Guardrail metrics
Metrics that may not get worse even when the primary one grows. A background job writes a significant regression into the audit log by itself, and the screen shows it in red next to the verdict: more orders, but refunds grew faster.
Idempotent rollup
A person counts once per day per variant, and the job rewrites the day instead of adding to it. Late events simply correct the numbers on the next run; the screens read only the rollup and stay instant.
SDK API
Two endpoints: fetch configuration, post events in batches of up to 500. A key belongs to an environment, configuration is cached for ten minutes and dropped the moment a flag is saved.