A scan captures structure. It can't know what a table is for, that data flows
from Stripe into your users table, or what your team means by "MRR". You add that context — as
descriptions, asserted lineage and a glossary — and share it as one committable file. Everything on
this page lives beside the catalog, so it survives every re-scan.
The one rule that makes this safe
Descriptions, lineage, glossary terms and classifications are all stored outside the scan
snapshot. regixo watch re-derives the map from your sources, then layers your
context back on top — so a re-scan refreshes the schema without ever clobbering the work you added.
Describe — context a scanner can't infer
Descriptions are drafted locally and deterministically — composed from metadata only
(humanised names, the personal-data kinds present, lineage neighbours). No row values are read, and
nothing is sent to a cloud model. A draft is always marked suggested so it's
never mistaken for a confirmed fact.
There is one job here — get everything described — and the quickest route runs in two steps:
Regixo drafts every description in one command, then your agent rewrites the ones that
matter in your own words. These are not two competing ways to do the same thing; step 2 improves
what step 1 wrote. The order is load-bearing — step 1 overwrites anything step 2 produced, so run
it first (the warning below says why). You can skip step 1 and let your agent write all of them,
but it will spend a call per description where one command already wrote them all.
Step 1 — draft the whole catalog in one command
One run drafts a description for every dataset and every column you have mapped — you never go
one at a time. This is Regixo's own draft: composed from the metadata already in your catalog,
deterministic, and it calls no model. It needs no agent, and it is the fastest way to get from nothing
to complete coverage.
say
“Have Regixo draft descriptions for every dataset and column in my catalog from the scan — no model, just the metadata.”
Show the commandHide the commandShow the sentenceHide the sentence
run
$ regixo describe draft --all
example output
Drafted 24 suggested description(s). Review: regixo describe list
The count is descriptions, not datasets — one dataset with four columns is five of them. Each
lands suggested, and stays that way until a person confirms it.
The sweep overwrites drafts — including your agent's
It skips only what a human wrote or confirmed, and says so when it does
(kept 1 human/confirmed). Everything else it rewrites, with no flag and no prompt: its own
earlier draft, and any description your AI agent suggested — those are
suggested/model, not human. So sweep first, improve after; and
regixo describe confirm the ones worth keeping before you ever sweep again.
A draft is a restatement of metadata: it can say a table looks like it holds email addresses,
and that it feeds orders. It cannot say why the table exists — no scanner can. That
is what step 2 is for.
Step 2 — have your agent rewrite them in your words
Step 1 leaves you complete but generic: "The iban column (text) — financial (card/IBAN), flagged
by its field name." True, and nobody's idea of a description. Your coding agent works from the same
names and types, but writes plain English — so hand it the catalog it just filled:
say
“Draft descriptions for my datasets in Regixo. Mark them as your suggestions — I’ll confirm them.”
↪No single command does this. Your agent reads the schema, writes each line itself, and runs regixo describe set <id> "…" --model once per dataset. Each lands suggested · AI-drafted — visibly not a human's, and never confirmed. Confirming is a separate command, and the playbook tells your agent not to run it: that act is yours.
Give it the playbook first — regixo describe --skill prints it. It holds the agent to
names and types (it must never read your data to describe it), and it forbids
describe confirm: an agent may propose a description, never sign one off.
Describe one dataset
To fill a single gap. Re-drafting the same dataset yields the same text — the generator is
deterministic — so to improve a thin one, write it yourself or ask your agent:
say
“Draft a description for the dataset app-db/public/orders in Regixo — mark it as your suggestion.”
Show the commandHide the commandShow the sentenceHide the sentence
run
$ regixo describe draft app-db/public/orders
then
A description composed from metadata only — humanised names, the personal-data kinds
present, lineage neighbours. No row values are read, and nothing is sent to a cloud model.
It lands marked suggested.
Check it worked — then do your half: read it on the Map. It says suggested, and it
will keep saying that until you confirm it. Confirming is a person's act, so it
carries no sentence and your agent will not run it.
Show what it prints in the terminalHide the terminal outputShow what your agent reportsHide what your agent reports
example output
Drafted 5 suggested description(s). Review: regixo describe list
Prefer your own words? Write one directly (it's saved as suggested, sourced to a
human), then confirm it when you're happy — a confirmation is your sign-off:
run
$ regixo describe set app-db/public/orders "Completed and pending customer orders; one row per order."$ regixo describe confirm app-db/public/orders
✋This one’s yours. Confirming is your sign-off, not your agent’s.
Set REGIXO_SIGNER_EMAIL first and the confirmation carries your name. Without
it, Regixo records that a human confirmed — but not which one.
List datasets with their current description, status and source. Each row also shows a
#N shortcut you can use in place of the full id:
say
“Show me the descriptions in my Regixo catalog, and which datasets still have none.”
Show the commandHide the commandShow the sentenceHide the sentence
run
$ regixo describe list
then
Every dataset with its current description, its status and where it came from.
Check it worked: the status column is the whole point. suggested is a
proposal; confirmed means a person signed off. Your agent's work is never
confirmed — if it claims otherwise, look again.
Show what it prints in the terminalHide the terminal outputShow what your agent reportsHide what your agent reports
example output
Datasets — draft a description with `regixo describe draft <id>` (or the #N shown here):
#1 app-db/public/orders
confirmed/human: Completed and pending customer orders; one row per order.
#2 app-db/public/users
suggested/heuristic: Users. Holds email, name, IP address. Feeds Billing & payments.
#3 app-db/public/logs
(no description yet)
The full set is list · draft · set · confirm · clear. When several sources describe a
dataset, Regixo shows the most trustworthy: confirmed human > suggested human > dbt doc
> suggested heuristic > none. A re-draft never overwrites a human or confirmed description
unless you pass --force; --all drafts every dataset at once.
No model, by design
The generator is deterministic — the same metadata always yields the same draft, so it's testable
and leaks nothing. A model-backed path is not built; if one is ever added it will warn you before
anything leaves your machine, and carry no "AI" framing.
Where this work happens
All of it lands on the Map, and the Map tells you where the gaps are: the rail's
Undescribed filter carries a live count (16, here), and every dataset with no description wears
an ✎ undescribed tag in its source fold.
what you’ll see — the Map rail with the Undescribed filter on: its live count, and the ✎ undescribed tag on every dataset that has no description
Not described yet — say what this dataset is for, in one line, so your team and any agent reading the catalog know what it is.
A description you type is yours. A drafted one is built from the table and column names on this machine — nothing leaves it.
say
“Draft a description for the dataset “bigquery/regixo_test/customers” in Regixo — mark it as your suggestion.”
Show the commandHide the commandShow the sentenceHide the sentence
run
▤ In the dashboard
On a dataset, the same actions are the Description box: type one and press Save, or press
Draft one for me to have Regixo compose it from the metadata. Once there is a description the
buttons change with its state — Re-draft from metadata and Confirm while it is still
only a suggestion, Clear to drop it. A confirmed one shows ✓ confirmed with who wrote
it and when; a draft from your agent shows suggested · AI-drafted, so the two can never be
mistaken for each other. The box says it plainly: A description you type is yours. A drafted one
is built from the table and column names on this machine — nothing leaves it.
Lineage — assert a flow no scanner can see
Regixo derives lineage automatically where the database exposes it — dbt model graphs, and
Postgres/Redshift view→table edges. What it can't infer is a cross-system flow: Stripe
customers landing in your users table, an export feeding a warehouse. You assert those once, and they
survive every re-scan.
Have your agent map the flows across the repo
Look at what you already have first. Regixo derives flows on every scan wherever a source
exposes them — your dbt manifest's ref() graph, and Postgres/Redshift view→table
dependencies. regixo lineage list shows them. You may have a graph already and not know
it.
For everything else, don't hunt pair by pair. Your coding agent is sitting in the code Regixo
never reads — the ETL script, the Airflow DAG, the Stripe webhook, the nightly export. That is where
the missing flows are, so hand it the job:
say
“Map the data flows between my datasets in Regixo by reading this project’s code — record only a flow you can point at in it.”
↪No single command does this. Your agent runs regixo lineage add once per flow, and the playbook makes it give you the file and line behind each one — so you can open the file and check it. Hand it the playbook first: regixo lineage --skill.
Why a guessed flow is worse than a missing one
A cross-system flow out of a processing activity is suggested as a recipient in your GDPR record
(Art. 30(1)(c)) — it puts the destination system's name into a legal document a person will sign. So the
playbook forbids the shortcut: a foreign key is not a flow, and neither is a column with a
matching name. orders.user_id → users.id is a reference, not data moving. The playbook tells
your agent to record only what it can cite, and to list what it couldn't prove instead of
guessing — check the citations it hands back. A missing flow is a gap you can fill; an invented
one is a company named in a record that never received a row.
Record a single flow
When you already know the one Regixo missed:
say
“Record the flow from our Stripe customers into our users table in Regixo.”
Show the commandHide the commandShow the sentenceHide the sentence
One flow recorded, tagged as your assertion — not something Regixo inferred. It
survives every re-scan, which is the point: a Stripe-into-your-database hop is invisible to any
scanner.
Check it worked: open either dataset and the new chip is in its river, captioned
asserted by you — not via dbt, not via the warehouse. Both endpoints must
already be datasets in the map — if one isn't, the command fails loudly rather than inventing
it, so a silent success means it really landed.
Show what it prints in the terminalHide the terminal outputShow what your agent reportsHide what your agent reports
example output
Asserted stripe/stripe/customer → app-db/public/users. See: regixo lineage list --origin=user
Both endpoints must be datasets already in the map. Asserting the same flow twice is a no-op — the
command is idempotent. List edges, optionally filtered by where they came from:
say
“Show me the data flows I asserted myself in Regixo.”
Show the commandHide the commandShow the sentenceHide the sentence
run
$ regixo lineage list --origin=user
then
The flows you asserted, as opposed to the ones Regixo derived from dbt or from the
warehouse's own view graph.
Check it worked: the flow you just asked for is in this list. If it isn't, one of the two
dataset ids didn't resolve — ask your agent to search for the right ones first.
Show what it prints in the terminalHide the terminal outputShow what your agent reportsHide what your agent reports
example output
Lineage edges (origin: user) — assert one with `regixo lineage add <from> <to>`:
[user] stripe/stripe/customer → app-db/public/users
--origin= takes user (your assertions), dbt,
warehouse (the auto-derived kinds), or all for everything. To remove an
assertion, read its edge id from regixo lineage list --json and pass it to
remove — only your own user edges are removable, since the auto-derived ones
are regenerated on the next scan:
say
“Remove the data flow I asserted by mistake from my Regixo catalog.”
Show the commandHide the commandShow the sentenceHide the sentence
run
$ regixo lineage remove <edgeId>
What a re-scan touchesregixo watch regenerates only the auto-derived edges (dbt and
warehouse). Your asserted (user) edges are left alone — assert a flow once
and it stays.
What the flows look like
On the dataset, the flows draw as a vertical river — Comes from above, the dataset on
the trunk, Feeds into below, arrows pointing the way the data moves. Every chip reads
name · source (so customers · app-db and customers · mysql-db are
two different tables, plainly), and under each one a caption says who claims the flow:
asserted by you, via dbt, via the warehouse. A dashed chip is an endpoint Regixo
hasn't scanned. It is dataset-level only — Regixo never implies which column went where.
what you’ll see — the Map, with a dataset open: the lineage river on hubspot / script / contacts, and the Assert a flow control under it
Arrows point the way data moves — down the page, into contacts and out of it. Flows inside your warehouse (including your dbt models) are found by the connector on each scan; flows between systems you assert yourself. Dataset-level only — Regixo never implies column-level flow. dashed = an endpoint Regixo hasn’t scanned; its caption says who claims the flow.
▤ In the dashboard
Under the river is an Assert a flow control: pick the direction (out of this
dataset / into this dataset), name the other dataset — the field suggests every scanned
id — and press Assert. It joins two datasets Regixo has scanned, and a typo fails by
name, never a silent save. Beside it, the standing dataset-level marker: an assertion
says data moves between two datasets and nothing finer. Each edge you asserted carries a
remove; the auto-derived ones are left to the scanner.
Glossary — business terms mapped to datasets
The glossary is a flat term → definition → linked-datasets map, served as context to both
humans and AI agents.
Two things fill it: Regixo seeds what the scan can see, and your agent proposes the terms only your
business knows. Neither overwrites a term you already have, so run them in any order, as often as
you like.
Step 1 — let Regixo seed what it can see
One command, whole catalog. It seeds candidates from what the scan already knows — personal-data
flags, DORA scope, recurring dataset-name tokens — each marked suggested and attributed to
regixo:
say
“Seed starter glossary terms in Regixo from what the scan already knows — I’ll confirm the right ones.”
Show the commandHide the commandShow the sentenceHide the sentence
run
$ regixo glossary suggest
example output
✓ 1 term suggested — marked “suggested” until you confirm it:
Personal data
↳ review & confirm: regixo glossary confirm <term> (or edit it at /ui/glossary)
Expect a short list. A scan can only ever offer generic terms — it has no idea what your
company means by anything. On the four-source catalog above it seeded exactly one: Personal data.
It is a floor, not a glossary. Step 2 is where the real vocabulary comes from.
Step 2 — have your agent propose the terms a scan can't know
A scan can see that a column looks like personal data. It cannot know that MRR is your north-star
metric, or what your company means by an active customer. Your coding agent is already in the
repo, with the code and the names your team actually uses — so that is the job to give it. Ask for the
whole vocabulary in one request; there is no bulk command, so it writes the terms one at a time:
say
“Propose glossary terms for my Regixo catalog as suggestions — I’ll confirm the ones that are right.”
↪No single command does this. Your agent runs regixo glossary set <term> "…" --suggest once per term. Each lands suggested, attributed to agent — never confirmed. Confirming is a separate command, and the playbook tells your agent not to run it: that act is yours. Hand it the playbook first: regixo glossary --skill.
Nothing it proposes is binding, and nothing you already wrote is at risk: a --suggest
term never overwrites an existing one. Review the list, keep what's right, and confirm those.
Work on a single term
Define one yourself — a human-typed term is saved confirmed — and link the datasets it
names:
run
$ regixo glossary set MRR"Monthly recurring revenue — the normalised monthly subscription total." --datasets=stripe/stripe/subscription
✋This one’s yours. Confirming is your sign-off, not your agent’s.
Or have your agent propose just one. With --suggest the term lands
suggested, attributed to agent:
say
“Add MRR to the Regixo glossary as a suggestion, linked to the datasets it applies to.”
Show the commandHide the commandShow the sentenceHide the sentence
run
$ regixo glossary set MRR"Monthly recurring revenue — the normalised monthly subscription total." --datasets=stripe/stripe/subscription --suggest
A suggestion is a candidate, not a fact — a human promotes it with confirm:
run
$ regixo glossary confirm MRR
✋This one’s yours. Confirming is your sign-off, not your agent’s.
say
“Show me our Regixo glossary — the terms, and which are still only suggestions.”
Show the commandHide the commandShow the sentenceHide the sentence
run
$ regixo glossary list
then
Your team's shared vocabulary — each term, its definition, the datasets it is linked to, and
whether it is still only a suggestion.
Check it worked: a term your agent proposed reads suggested — check & confirm.
Promoting it is yours, and it records who did it.
Show what it prints in the terminalHide the terminal outputShow what your agent reportsHide what your agent reports
example output
Glossary — define a term with `regixo glossary set <term> <definition>`:
MRR — Monthly recurring revenue — the normalised monthly subscription total. [stripe/stripe/subscription]
Active subscriber · suggested — check & confirm — A subscription in a paying state.
↳ confirm a suggestion: regixo glossary confirm <term>
The full set is list · set · suggest · confirm · remove. Terms are
searchable and are exposed to agents — see Use an AI agent. You can
also add and edit them in the browser at /ui/glossary.
The Glossary page reads as a dictionary: a search box, an A–Z strip (a letter nobody has
used yet is greyed out), then the terms grouped under their initial. Each card carries the term, its
state (✓ confirmed, or suggested until a person promotes it), its definition, and the
datasets it appears in — as source-qualified chips (fintech-loans /
borrowers), so a table called customers in two systems is never two things wearing
one name. A dot on a chip marks a dataset with a column that looks personal; a term with no links says
no datasets linked rather than showing an empty row.
what you’ll see — the Glossary: the A–Z strip, and two term cards under their letter
GDPR roles. A controller decides why and how personal data is used; a processor only acts on instructions from the controller. Each source on your map is tagged with its role.
Appears inno datasets linkedset by you · 7 Jul
▤ In the dashboard
The Glossary composer does the same work: + Add term opens it — a name, a
definition, and a dataset picker grouped into one fold per source (with a filter, and a tray
of the ones you have ticked, each chip source-qualified). Edit reopens a term; a suggested
one carries a Confirm you can press in place. An empty glossary offers a shortcut —
+ Add all three as suggested — to seed three starter terms you then check. A tour:
the free portal tour.
✦ A connected assistant
A different surface. An assistant registered against the read-only
regixo mcp server reads the descriptions and lineage you add
(get_dataset, get_lineage) and the glossary
(get_glossary), so the context you write here becomes answers. It writes nothing.
To have an agent draft descriptions, terms or flows, ask your coding agent — it runs the
commands above, and its work lands as suggested for you to confirm.
See Use an AI agent.
Share it with the team
Two commands. Pick by who you're sending it to:
regixo catalog
For a teammate who runs Regixo. Sends them the notes — your
descriptions, terms, corrections and answers — as a committable JSON file. Their own scan rebuilds the
map; your notes layer on top.
regixo share
For your compliance team, and anyone else who doesn't run
Regixo — a manager, an auditor, someone with no database access at all. Regixo runs on your
machine, so there is no portal for them to log into: this one HTML file is how they see your estate.
It opens as a briefing — what looks like personal data, where it lives, what Regixo could not
see — with the whole map underneath as evidence. No install, no server. It carries your table and
column names, so read it before you send it.
Teammates who run Regixo — regixo catalog
Everything above — descriptions, glossary terms, classifications, RoPA answers, DORA cells,
asserted lineage — travels as one committable JSON file. It carries no scanned schema, no
secrets and no row values, so each machine regenerates the map itself from its own scan and layers
the shared context on top.
say
“Export my Regixo catalog notes so I can commit them for the team.”
Show the commandHide the commandShow the sentenceHide the sentence
run
$ regixo catalog export
then
One committable JSON file holding the descriptions, terms, corrections, asserted lineage
and legal answers your team has built. It carries no scanned schema, no secrets and no row
values — each machine regenerates the map from its own scan.
Check it worked: open regixo-catalog.json and look. If you find a connection
string or a table's contents in there, something is very wrong — it is designed to be safe to
commit.
Show what it prints in the terminalHide the terminal outputShow what your agent reportsHide what your agent reports
example output
✓ team catalog written → ./regixo-catalog.json
your team's descriptions, terms, corrections and legal answers — no scanned schema, no secrets, no row values
descriptions 5 · glossary terms 3 · classifications 2 · RoPA answers 6 · DORA cells 0 · lineage edges 1
↳ commit it next to regixo.yml — teammates run `regixo catalog import regixo-catalog.json` after their first scan.
Pass --out <path> to write it elsewhere; the default is
regixo-catalog.json. A teammate imports it after their own scan. Import is
merge-only — nothing local is ever deleted, and a confirmed answer is never downgraded.
Preview first with --dry-run:
say
“Show me what importing a teammate’s regixo-catalog.json would change, without writing anything.”
Show the commandHide the commandShow the sentenceHide the sentence
Nothing is written. A dry run tells you exactly what a real import would change, so a
teammate's file never surprises you.
Check it worked: import is merge-only — nothing local is deleted, and a confirmed
answer is never downgraded by an incoming suggestion. The preview says so line by line; read it
before you let your agent apply it for real.
Show what it prints in the terminalHide the terminal outputShow what your agent reportsHide what your agent reports
“Merge my teammate’s regixo-catalog.json into my Regixo catalog.”
Show the commandHide the commandShow the sentenceHide the sentence
run
$ regixo catalog import regixo-catalog.json
Merge, never overwrite
On conflict, the newer edit wins — and a row you've confirmed is kept over an incoming
suggested one, never silently downgraded. A confirmation is a human decision (Hard
Rule #4); the merge transports it, it never invents one.
Anyone who doesn't run Regixo — regixo share
Your compliance team, your manager, an auditor: people who don't run Regixo, and who may have no
access to the databases at all. The notes file needs a Regixo catalog to import into, so it gives them
nothing on its own. Send them the map — as one HTML file they open in a browser:
say
“Use Regixo to write my data map to a single HTML file I can send to my compliance team.”
Show the commandHide the commandShow the sentenceHide the sentence
run
$ regixo share
then
One file — a briefing, with the whole map underneath it as evidence. It opens with what
looks like personal data and where it lives, which systems hold it, where data moves between them,
what Regixo could not see, and the legal calls only a person can make. Every system, table and
column from your last scan sits below that. There is nothing to install, no server to run, and it
reaches nothing when opened: not the internet, not your databases.
Check it worked: open the file yourself — and read it, because you are
about to send it. It is a document, not a copy of your screen: nothing in it can be saved,
signed or sent, and it is a snapshot of your last scan, not a live view. It says so at the top.
Show what it prints in the terminalHide the terminal outputShow what your agent reportsHide what your agent reports
example output
✓ written → ./regixo-map.html
4 tables · 4 systems · metadata only (names, types, and any descriptions your team wrote) — never the values inside your data
it opens as a briefing for your compliance team: what looks like personal data, where it lives,
what Regixo could NOT see, and the four calls only a person can make.
The full map is underneath it, as evidence.
one self-contained file: no install, no server, and it reaches nothing on the internet when opened
↳ read it first — it carries your table and column names, which are themselves confidential.
Then send it however your team already shares — Slack, email, Drive, the repo. They just open it in a browser.
Or make it from the portal — same file, one click
You don't have to reach for the terminal. The Data map (regixo open →
the map) carries a Send this map to your compliance
team card: Make the file downloads it through your browser, and See what they'll get
opens the real briefing in a new tab so you can read it before you send it. It is the same document,
byte for byte — the only difference is where it lands (your downloads folder, rather than
./regixo-map.html next to your project).
Once you've made one, the card also tells you whether your map has changed since — so you can
see at a glance whether the copy your team is holding still matches. Regixo knows a file was
made; it cannot know whether you sent it, and it never claims to.
Read it before you send it — a table name leaks on its ownregixo share writes your whole map into a file you hand to someone else, so it is the one to
read before you send. It holds metadata only — table and column names, types, owners, and any
descriptions your team wrote — and never the values inside your data. But metadata is not
harmless, and a description is free text: a table called patients_oncology tells a
story before anyone opens it, and a description reading “accounts flagged after the Q3 incident”
tells a bigger one. Treat the file as confidential, and send it the way your team already sends
confidential things.
Pass --out <path> to write it elsewhere; the default is regixo-map.html.
--title "Acme Ltd" sets the heading (it defaults to your controller name from
regixo.yml) — worth setting when the file is going outside your team.