Clone-and-run reference implementation · version 4.4.3 · Apache-2.0

Ten agencies.
One answer. Every answer opens.

CordovaOS is a synthetic nation: ten government institutions, 1,460 Governed Data Records, and zero lines of integration code between them. Run it on your own machine, trace a contagion across four agencies in one question, ask which people eight agencies hold records for and get 250 of them across 1,308 records in a quarter of a second, then click any value and see the record it came from, the component that made the join, and the published model that governs both.

Nothing to sign up for and nothing hosted. After the first pull the whole stack runs with no outbound network. The timings you see are the triple store answering, not a recording.

github.com/Axius-SDC/CordovaOS SDC4 Reference Model sdcvalidator on PyPI 10 domains 1,460 records 7 cross-domain questions 0 lines of ETL

Two ways in

Built to be shown to the person who signs, and read by the person who runs it

If you sign for platforms

Fifteen minutes, no background assumed

Open the console and read the front page: ten domains, 1,460 records, seven of them stating an absence instead of inventing a value. Step through the Contagion in seven beats. On any beat, switch from the table to the graph and watch the trace cross from a clinic to a port to a police record to a campus. Click a node. The record opens, and beside it the model that governed it, read from the published schema rather than from the record.

The question to ask at the end is the one your current stack cannot answer: show me why this answer is admissible. Here, every number has a route back to a validated record.

What to look at, and what to ask

If you build data or graph systems

Everything you would want to inspect is in the repo

The ten published data models and the ten generated applications are committed exactly as SDCStudio produced them, under sdcstudio_downloads/, before anything the demo adds around them. Each record is validated against its XSD 1.1 schema, stored once, and projected into GraphDB as its own named graph with RDF-star reifiers for every field. The seven SPARQL queries are plain files you can read, edit and rerun in the explorer or straight in GraphDB Workbench.

There is no mapping table. A cross-agency join is a component two records share: the same National ID component composed by eight of the ten models, the same Business Registry Number by four, the same address. Since 4.4.0 the ten models are themselves composed from the published component libraries by identifier slot, the patient and encounter from FHIR, the incident, arrest and vessel from NIEM, the person and address from Default, provenance and audit from ProvGov, with Cordova adding only what only Cordova defines. Since 4.4.2 every quantity in every model carries a unit its schema enumerates, so a value in the wrong unit fails validation instead of passing as a string. The graph view draws exactly that and names the component on every edge.

For the people who run it

See it

The trace as a graph, and the record behind any node

localhost:18000/demo/narrative/ — beat 7, graph
The full contagion trace drawn as a graph: fifty-two education records around the city they share, nine law-enforcement and health records around Porto Sereno, one person joined by National ID, every edge labeled with the component that joins them
Beat 7, the full contact trace. Records are nodes, colored by agency. Every identifier two records share is drawn as a node between them, and every edge is labeled with the component it sits in. The graph is derived from the query result, never stored: nothing in the triple store links two records, and the picture shows you what does.
localhost:18000/console/ — one record, three projections
The console showing one Civil Registry record as a table, with a Governed By panel naming the component, its reference model type, its constraint, and what happens when the value is absent
One Governed Data Record as table, XML and graph, from one validated instance. The Governed By panel is read from the published data model, not from the record: the component, its Reference Model type, its constraint, and what an absence is permitted to look like. It is the same file any counterparty validates against.

Run it

Three commands, one machine

You need Docker or Podman with the compose plugin, about 6 GB of free RAM, and Python 3.12 on the host for data generation. The first run pulls the container images; after that the stack runs disconnected.

Generation takes seconds. Loading is the cost: every instance is validated against its XSD 1.1 schema, written to PostgreSQL and projected into GraphDB as its own named graph. Expect about thirty minutes on a laptop for the demo dataset, and hours for the full 25,000-resident nation with make demo-full.

The dataset is deterministic. Same records, same identifiers, same values and the same relationships on every machine, so a colleague who runs it tomorrow sees exactly what you saw today.

git clone https://github.com/Axius-SDC/CordovaOS.git cd CordovaOS git checkout v4.4.3 make demo

Every release also publishes the web image to GitHub's container registry. make pull fetches it instead of building locally.

Then open

http://localhost:18000/console/  the record console. Start here.

http://localhost:18000/demo/  the dashboard, the Contagion, and the query explorer.

A correct run shows these numbers on the console front page:

Records loaded1,460
Named graphs in GraphDB1,460
Domains10
Records stating an absence7

What is inside

Six things, and every one of them is checkable

Ten generated applications

One Reference Model, ten domains, no glue

Civil Registry, Vital Statistics, Healthcare, Education, Employment, Business Registry, Property, Tax and Revenue, Law Enforcement, Maritime Port Authority. Each was modeled in SDCStudio and generated into one Django project. They interoperate because they share the SDC4 Reference Model, not because anyone wrote an adapter.

Governance-composed records

Provenance and Audit bound to every record

Alongside its data, every instance carries who, what, where and when it came from, and a structural Audit record, bound to the data at the source. Not reconstructed later from a pipeline log that may or may not still exist.

Absence, stated

Seven records refuse to invent a value

Where a required value is missing they carry an ISO 21090 null flavor naming the reason, ASKU, asked but not known, instead of a zero or a 1900-01-01 that would parse downstream as real. They are counted on the front page, linked from it, and carry an i-ev- identifier so the fact survives outside the document.

The console

One record, three projections

Table, XML and graph, rendered from one validated instance. Beside them, Governed By: the component, its Reference Model type, its constraint, and what happens when the value is absent, read from the published schema. A resource view in a triple store shows what a node asserts; this shows what it was permitted to assert.

The Contagion

Seven beats, four agencies, one graph

Patient zero presents at a clinic. The narrative pulls his civic footprint, his employer's network, the households at risk, the vessel that docked, the quarantine response and the campus contacts, one saved query per beat. Every beat has a table and a graph, and every node in the graph opens the record.

Seven saved questions

The SPARQL is shown, never hidden

The queries are files in sparql/. The explorer runs them and shows them. There is no natural-language-to-query illusion in the demo: a saved, governed question with a known query behind it, and GraphDB Workbench one click away for anyone who wants the engineer's tools.

Why it is not a dashboard

Three things a prettier front end on a pile of feeds cannot give you

1

Click any value and get its lineage

Because provenance is bound to the instance, not stitched together afterward.

2

The same question returns the same answer

Deterministically validated records and a deterministic dataset. Run it twice, on two machines, and compare.

3

The answer crosses agencies with its meaning intact

And the graph shows you exactly where it crossed, and on which component.

Cordova is synthetic. Your data is not.

The demo proves the machinery on a nation we invented. The 30-Day Audit runs the same question against yours. And if the demo earned fifteen minutes of your time, a star on the repository tells the next engineer it is worth theirs.

Found something wrong, or something missing? Open an issue. The repo is Apache-2.0 and the models are in it, unmodified.