Regixo docs
🔧 For the engineer·Step 4 of 7 — Classify & correct·see the whole journey ↗
Data catalog · engineer

Classify & correct

The classifier reads column names and types, so it gets most flags right and some wrong. This page shows how to fix a mis-classified column — mark a missed one, clear a false positive — and make the fix stick across every future scan. A correction is a mechanical fact you are allowed to set; it never touches a legal call.

Optional — but this is the one that matters most Correcting a flag is not required: your draft record exists without it. But of the four things you can add on top of a scan, this is the one that changes that record most — its categories of personal data are built from these flags, so a wrong flag is a wrong record. (A description and a glossary term change nothing in it; a data flow changes one field.) What each one changes →

Correct one flag all the way through (the worked example)

Before the detail, do one correction end to end. A telemetry table’s ip column is flagged as personal, but it holds server addresses — here is that fix through all four steps:

StepFor app-db/public/logs.ip
1 · FindOn the Map, logs.ip shows ● IP address by field name. You know these are infrastructure IPs, not people.
2 · DecideWalk it: not health or criminal; does it point to a living person? No — it’s a machine address. → the right call is not.
3 · Correctregixo classify set app-db/public/logs.ip not — or open the column’s Correct control on the Map, pick Not personal data, Save.
4 · Checkregixo classify list shows logs.ip → not; the row now reads corrected by you; a re-scan never wipes it.

Every correction is that same four-step loop. The rest of the page is each step in full.

Step 1 · Find a wrong flag

Two things go wrong, and both have the same fix:

The classifier shows its reasoning on every flag (the matched rule and its confidence — see Read the map), so a wrong call is easy to spot. You correct it one of two ways: from your project — say it to your coding agent, or run the command yourself — or in the Map. Both write the same correction.

Why some flags are wrong at all: the classifier only ever saw names and types — a bland name hides, a suggestive one false-flags — and its recall is benchmarked only in English, German, French and Dutch. So non-English schemas and oddly-named columns are exactly where your eyes matter most. The language coverage →

Step 2 · Decide if it’s really wrong — is this personal data?

Before you touch a flag, decide what the column actually is. Regixo’s four calls all answer one question — does this column point to a living person? Ask these in order and stop at the first yes; the answer is the call you set:

Ask, in order…Set it to…Examples
1. Is it about a person’s health, ethnicity, religion, politics, biometrics, sex life, or trade-union membership?special (Art. 9)diagnosis, blood_type, a status that holds a health state
2. Is it about criminal convictions or offences?criminal (Art. 10)conviction_date, offence_code
3. Does it identify or describe a person — directly, or once joined to another table?personalemail, full_name, national_id, a customer_id that links to a person
4. Is it purely about a machine, company or transaction, with no link to a person?notserver_ip, currency, product_sku, an account status that means “active/canceled”

The trap is the join: an id that looks anonymous on its own is personal if it can be traced back to a person through another table. When you can’t decide, treat it as personal — a defensible map errs toward including a person’s data, not hiding it. This is a call about the column’s content, a mechanical fact you may set; it is never a legal judgement (those stay the compliance team’s — see the rule at the foot of this page).

Step 3 · Correct it — from your project

Review every flag in one pass

Don't hunt through the map column by column. Hand the whole catalog to your coding agent and let it do the first pass:

say

“Review the personal-data flags in my Regixo catalog and correct the ones that are wrong.”

No single command does this. Regixo has no classify all — your agent reads each column’s name and type and runs regixo classify set once per wrong flag. Each correction stands on its own.

Hand it the playbook first. Regixo's own classifier is built so that it can only read column names and types — it has no way to reach the values. Your agent does. That limit holds because the playbook states it, not because your agent will infer it: run regixo classify --skill and give your agent the output. It carries the two lines it must never cross, the exact commands, and the column-id format.

A good pass does three things:

Nothing it does is hidden or final: regixo classify list shows every correction that landed, and regixo classify clear reverts any of them.

Fix a single column

Once you know which flag is wrong — spotted on the map, or reported back by your agent — one command sets or clears a column's personal-data classification:

say

“Correct the personal-data flag on that column in Regixo — the scanner got it wrong.”

Show the commandHide the commandShow the sentenceHide the sentence
run
$ regixo classify set <columnId> <personal|special|criminal|not>

The four calls map onto the mechanical flag Regixo carries for the column:

personal
Ordinary personal data — the column holds it, no special article applies.
special
Special category under Art. 9 (health, ethnicity, religion, biometric, sexual orientation, trade-union…). Flags it and its own count.
criminal
Criminal-offence data under Art. 10 — a separate class from Art. 9.
not
Not personal data — clears the flag (suppresses a false positive).

Clear a false positive on that infrastructure IP:

say

“Regixo flagged our logs.ip column as personal data, but it holds infrastructure IPs. Correct it.”

Show the commandHide the commandShow the sentenceHide the sentence
run
$ regixo classify set app-db/public/logs.ip not
then

The flag flips, and the correction is stored outside the scan snapshot — so regixo watch re-derives Regixo's own flags from scratch and then layers yours back on top. A re-scan never wipes it. It flows straight into your RoPA draft.

Check it worked: on the Map the column loses its personal-data tag and its row now reads corrected by you; the dataset it belongs to gains a ✓ corrected chip in the rail. Your full override list is one sentence away — it is the next block.

Show what it prints in the terminalHide the terminal outputShow what your agent reportsHide what your agent reports
example output
Corrected app-db/public/logs.ip → not. It flows into your RoPA draft and survives a re-scan. Undo: regixo classify clear app-db/public/logs.ip

Mark a column the name hid — a health status the classifier read as ordinary:

say

“Our patients.status column holds health data. Flag it as special-category in Regixo.”

Show the commandHide the commandShow the sentenceHide the sentence
run
$ regixo classify set app-db/public/patients.status special

Undo a correction and hand the call back to the classifier:

say

“Undo the personal-data correction I made on that column in Regixo.”

Show the commandHide the commandShow the sentenceHide the sentence
run
$ regixo classify clear app-db/public/logs.ip

List every correction you've made — this shows only the columns a human has overridden, which is the set worth auditing:

say

“Show me which personal-data flags I have corrected in Regixo.”

Show the commandHide the commandShow the sentenceHide the sentence
run
$ regixo classify list
then

Only the columns someone overrode — never Regixo’s own calls. That is deliberate: it is the set worth auditing, because it is where someone disagreed with the scanner. Each row records who.

Check it worked: a correction you asked for and cannot find here did not land. Ask again, naming the column id exactly as the Map shows it.

Show what it prints in the terminalHide the terminal outputShow what your agent reportsHide what your agent reports
example output
Your PII corrections (these survive a re-scan):
  app-db/public/logs.ip → not  (ip)
  app-db/public/patients.status → special  (status)

Add --json to any of these for machine-readable output. Every command is non-interactive — a missing or unknown column id is a coded CLASSIFY_INPUT_INVALID error, never a prompt.

How do I find a column's id?

A column id is source/schema/table.column — the last dot separates the column from its dataset (e.g. dataset app-db/public/logs, column ip). Two ways to get one: search for it — regixo search ip lists matching columns with their ids — or open the Map (regixo open) and read it off the column row.

Step 3 · Correct it — in the portal

The same correction, from the Map instead of the terminal — use whichever fits the moment; both write the identical fix. Start on the Map. The rail on the left is one fold per source; the filters above it carry live counts — Personal data, Art. 9, Art. 10 — so the columns worth checking are a click away. Open the source, pick the dataset.

what you’ll see — the Map rail: the five filters with their live counts, and a source fold opened

Every column in the pane carries a Correct control. Open it and you get a "This column is" select with the same four calls — Personal data / Special category · Art. 9 / Criminal offence · Art. 10 / Not personal data — and Save. Picking one writes the identical correction regixo classify writes, and the fine print says it plainly: a mechanical fix, never a legal judgement. It overrides Regixo's detection, survives every re-scan, and is logged in What changed. Once a column is corrected, its row says corrected by you and a second button appears — Revert to Regixo's call — which hands the flag back to the classifier. Use whichever surface fits the moment: the Map when you're reading the estate, your project when you're scripting, working headless, or handing the job to your agent.

what you’ll see — the Map, with a dataset open: the columns table on stripe / stripe / payment_method, and the Correct control open on two of them
Regixo data catalog · free & local

Data map

63 datasets · 170 personal-data columns

re-scan · stays local
Show

stripe / stripe / payment_method

● 10 personal✓ corrected
ColumnTypePersonal data
billing_address_countrystripe-field optional● Address by field name
Correct
A mechanical fix, never a legal judgement. It overrides Regixo’s detection, survives every re-scan, and is logged in What changed.
billing_namestripe-field optional● Personal data corrected by you
Correct
A mechanical fix, never a legal judgement. It overrides Regixo’s detection, survives every re-scan, and is logged in What changed.
idstripe-field optionalnot personal
Correct
A mechanical fix, never a legal judgement. It overrides Regixo’s detection, survives every re-scan, and is logged in What changed.
✦ A connected assistant

A different surface. An assistant registered against the read-only regixo mcp server can read a column's flag (get_dataset) but not change it — that server has no write tool at all. To have an agent correct a flag, ask your coding agent, which runs regixo classify set in this project, exactly as above. A flag is a mechanical fact, so an agent may set it; the legal calls stay a human's (Hard Rule #4). See Use an AI agent.

Step 4 · Check the correction stuck

Confirm it in two moves. First, regixo classify list (Step 3, above) shows every correction that landed — if a fix you asked for isn’t there, it didn’t take; run it again with the exact column id. Second, on the Map the corrected column’s row reads corrected by you and its dataset gains a ✓ corrected chip. Then it holds — a re-scan never wipes it, and here is why.

A correction is stored outside the scan snapshot. When regixo watch re-scans a source, the classifier re-derives its own flags from scratch — but your corrections are layered back on top afterwards, so a re-scan never wipes them. The correction then re-flows everywhere the flag is read: the Map, the RoPA draft, the personal-data counts, and the agent surface.

One column, kept regixo classify pins one column by id. It carries who set it (from REGIXO_SIGNER_EMAIL when set) and holds through every future scan until you clear it. For a rule that should apply across the whole estate by name, use regixo.yml instead.
A correction changes the flag, not the law Setting or clearing the personal-data flag is a mechanical fact a human may correct. It never touches purpose, lawful basis, retention or transfers — those are legal judgments only a person on your compliance team confirms and signs (Hard Rule #4). Regixo suggests and sanity-checks; it never self-confirms a legal field, and classify has no way to.
“Can I just exclude this table from the record?” There’s no hide-from-RoPA switch, and that’s deliberate — a record is only defensible if it reflects the estate. What you shape instead is the flags: a telemetry table whose ip is infrastructure gets corrected to not personal and drops out of the personal-data picture; a table that genuinely logs people stays in, and lands as a logging activity named for what it is. Correcting flags is how you get the record right — not by hiding tables. (Don’t want the GDPR/DORA surfaces at all? That’s catalog-only mode, on Install & first run.)

Branch · a pattern across your estate — tune the classifier in regixo.yml

When a correction isn't about one column but a naming pattern across your estate, encode it once in regixo.yml under pii. Two knobs, applied at scan time to every column by name:

regixo.yml
version: 1
pii:
  extraPatterns:                 # extra regex, tested against the column name (case-insensitive)
    - "member_ref$"              # our internal person key — flag anything ending member_ref
    - "^crm_.*_id$"
  allowList:                     # exact column names to suppress entirely (case-insensitive)
    - country                    # a plain country column — not personal on its own
    - server_ip
pii.extraPatterns
Regex patterns matched against the column name. A hit adds a personal-data flag (confidence 0.7). A malformed pattern is ignored, never an error. These only add ordinary personal flags — they can't set Art. 9 or Art. 10; use classify … special|criminal for that.
pii.allowList
Exact column names (case-insensitive) to suppress before any rule runs. Use it to silence a recurring false positive across the estate — a column named country everywhere, say.

Rule of thumb: a pattern for many columns, classify for one. regixo.yml holds only names and non-secret config, so commit it freely — and a teammate's clone gets the same classification on their own scan.

How you know the correction stuck

When no flag on your list still looks wrong, the map is right. Making it richer — with the context a scan can’t infer — is the next step.

REGIXO — documentation · a correction sets a mechanical flag, never a legal field · Command reference