Enum & Status-Value Drift Sweep
You declared a set of allowed values. Then two years happened. Paste a distinct-value query and find out what that column actually contains now.
One row saying “In Progress” among forty thousand is a typo. Four thousand rows saying it is a second status that half your systems write and none of your code branches on. Same spelling difference, completely different problem — and the row count is the only thing that tells them apart.
instant download · .xlsx · yours to keep
The problem
Nobody adds a value on purpose.
IN SET
Exactly what you declared. Nothing to do.
VARIANT
Normalises to something you declared, but is not it. Case, spacing, an underscore where a hyphen should be.
OUT OF SET
Matches nothing, however you squint at it. Someone shipped a new state and told the database before they told you.
A field is SET CLOSED, VARIANTS PRESENT, or SET BROKEN. The sweep takes the worst field: SETS HOLD, DRIFT FOUND, or SETS BROKEN.
The idea worth the $49
Volume tells a typo from a fork.
Most drift tools stop at spelling: here are the values that do not match, go and fix them. That list is usually enormous and mostly harmless, which is why nobody works through it.
The interesting question is not whether a variant exists. It is how many rows are sitting on it. Below a threshold it is a typo somebody made once. Above it, that variant is a value your systems write regularly and your code does not branch on — which means somewhere a report is undercounting and a workflow is silently skipping rows. At or above 5% of a field’s rows, the field reads SET BROKEN even with zero out-of-set values. The threshold is a cell on the Dashboard; move it if your tolerance differs.
Try it
Two identical fields, one number apart.
ticket.status and order.status hold the same 76,088 rows across the same five distinct values. Move how many of them sit on the variant.
Both fields below hold 76,088 rows across the same five distinct values. Move how many of order.status’s rows sit on the variant:
Sweep verdict
SETS BROKEN
1 closed · 2 with variants · 2 broken, of 5 fields. 1% of 220,936 rows sit off the declared set — context only, it decides nothing. Fix first: invoice.state.
ticket.statusbranch-driving
VARIANTS PRESENT
76,088 rows · 5 distinct values · 0% on variants
open
12,400 · IN SET
in_progress
8,100 · IN SET
resolved
15,200 · IN SET
closed
40,300 · IN SET
In Progress → in_progress
88 · VARIANT
order.statusbranch-driving
VARIANTS PRESENT
76,088 rows · 5 distinct values · 0% on variants
open
12,400 · IN SET
in_progress
8,100 · IN SET
resolved
15,200 · IN SET
closed
40,300 · IN SET
In Progress → in_progress
88 · VARIANT
invoice.statebranch-driving
SET BROKEN
25,560 rows · 5 distinct values · 0% on variants
draft
900 · IN SET
sent
4,200 · IN SET
paid
18,700 · IN SET
void
310 · IN SET
partially_paid
1,450 · OUT OF SET
lead.source_channeldisplay only
SET BROKEN
10,900 rows · 4 distinct values · 8% on variants — the gate overrides the values, which alone read VARIANTS PRESENT
organic
5,000 · IN SET
paid
3,000 · IN SET
Referral → referral
900 · VARIANT
2,000 · IN SET
subscription.planbranch-driving
SET CLOSED
32,300 rows · 3 distinct values · 0% on variants
free
22,000 · IN SET
pro
9,100 · IN SET
enterprise
1,200 · IN SET
Same arithmetic as the shipped workbook. It grades the values you paste in, never people, and queries nothing.
This is the live engine. Every field you have, not two. Your allowed sets, your row counts, your threshold. One .xlsx, no account, yours to keep.
Get the kit — $49The worked example
What the shipped sweep says.
ENUM & STATUS-VALUE DRIFT SWEEP
==========================================================================
ticket.status (branch-driving) VARIANTS PRESENT
76,088 rows across 5 distinct values; 0% of rows on variants
open 12,400 IN SET
in_progress 8,100 IN SET
resolved 15,200 IN SET
closed 40,300 IN SET
In Progress 88 VARIANT -> in_progress
fix first: In Progress
order.status (branch-driving) SET BROKEN
76,088 rows across 5 distinct values; 9% of rows on variants
open 12,400 IN SET
in_progress 8,100 IN SET
resolved 15,200 IN SET
closed 33,900 IN SET
In Progress 6,488 VARIANT -> in_progress
[GATE] variants carry enough rows to be a second value in production, not a typo
values alone read VARIANTS PRESENT; the volume overrides it
fix first: In Progress
invoice.state (branch-driving) SET BROKEN
25,560 rows across 5 distinct values; 0% of rows on variants
draft 900 IN SET
sent 4,200 IN SET
paid 18,700 IN SET
void 310 IN SET
partially_paid 1,450 OUT OF SET
fix first: partially_paid
lead.source_channel (display only) SET BROKEN
10,900 rows across 4 distinct values; 8% of rows on variants
organic 5,000 IN SET
paid 3,000 IN SET
Referral 900 VARIANT -> referral
email 2,000 IN SET
[GATE] variants carry enough rows to be a second value in production, not a typo
values alone read VARIANTS PRESENT; the volume overrides it
fix first: Referral
subscription.plan (branch-driving) SET CLOSED
32,300 rows across 3 distinct values; 0% of rows on variants
free 22,000 IN SET
pro 9,100 IN SET
enterprise 1,200 IN SET
--------------------------------------------------------------------------
SWEEP VERDICT: SETS BROKEN
1 closed / 1 with variants / 3 broken (of 5 fields)
4% of 220,936 rows sit off the declared set -- context only, it decides nothing
gate fired on 2 field(s) (>= 5% of rows on variants)
fix first: order.status -- In Progress
Grades the values you paste in. Not legal or compliance advice.The .xlsx reproduces every verdict above exactly — the parity check behind this kit asserts 371 of them, cell by cell, with zero error values. Three things to notice. The twin pair differs only in how 76,088 rows split. invoice.state is SET BROKEN from a genuinely new value with no variants at all, so the volume gate gets no credit there. And 4% of all rows sit off-set across the whole sweep, which reads SETS BROKEN — the share is context, not the verdict.
Honest limits
What it will not do.
- It does not connect to your database. You run the distinct-value query and paste the result; it grades what you paste.
- It cannot tell you which of two values is the right one. It tells you a variant carries 6,488 rows; deciding whether to migrate them or widen the set is your call.
- It does not check whether your declared set is a good set. A closed set with the wrong values in it reads as closed.
- A field that reads SET CLOSED today can drift tomorrow. This grades values that already exist, so there is no evaluation date anywhere and two runs a quarter apart compare directly.
Deterministic and offline. It grades fields, never people, and is a working aid rather than legal or compliance advice.
Pairs with
Where this sits.
CSV / Data-Export Schema & Quality Gate
$69
Whether the file parses and lines up at all. This looks inside one column and asks what it actually contains.
Multi-Source Data Reconciliation Engine
$89
When three systems disagree about a record. Drifted status sets are one of the reasons they do.
Document Field Validator
$79
Enforces field rules as records arrive. This audits the values that got in before the rules existed.
Common Questions
Answers, caveat after.
A distinct-value query per field: every value the column actually contains, with a row count for each. Plus the set you declared, repeated on each row of that field. One row per observed value. It never connects to your database — you run the query, it grades the result.
Anything that normalises to something you declared. Four steps: underscores and hyphens become spaces, tabs and newlines become spaces, everything lowercases, then the edges are trimmed and runs of spaces collapse to one. So 'In Progress', 'in-progress' and ' IN PROGRESS ' are all variants of in_progress. Every step is switchable if your team genuinely treats OPEN and open as different values.
Because it is the only thing that separates a typo from a fork. One row spelled 'In Progress' among forty thousand is somebody's slip. Six thousand rows spelled that way is a value your systems write regularly and your code does not branch on, which means a report is undercounting and a workflow is skipping rows. At or above 5% of a field's rows, the field reads SET BROKEN even with no out-of-set values at all. The threshold is a cell you can change.
No — and it works the other way more often than people expect. The shipped example has only 4% of its rows sitting off the declared set and still reads SETS BROKEN, because three of its five fields are broken. The share is printed for context and never decides anything; the sweep takes the worst field.
A schema check asks whether the file parses and the columns line up. A duplicate finder asks whether two records are the same thing. This looks inside one column and asks what values it actually contains versus what you said it would — which is a question neither of the others is shaped to answer.
Which of two values is the right one. It will tell you a variant carries 6,488 rows; whether to migrate those rows or widen the declared set is a judgement call it does not make. It also cannot tell you your declared set is a good set — a closed set with the wrong values in it still reads as closed. It grades fields, never people, and is a working aid rather than legal or compliance advice.
Get it
Find out what that column really holds.
- Every field you care about, in one sweep.
- A gate that separates typos from second values by row count.
- Editable threshold, editable sets, no account, no upload.
Sold by RedHub AI LLC · Secured by Stripe · redhub.ai