Data before
first patient

An SDTM-shaped synthetic dataset from the protocol’s own design, with a validation report and full traceability. No patient data.

It says which values
it could not source

The model supplies a verbatim quote for each extracted value. The Antevra engine then locates that quote deterministically in the ingested text. A quote that cannot be located is surfaced as unlocated: never hidden, never snapped to something nearby.

Coverage is stated, shortfall included

The extraction header states how many extracted values are cited and how many are not. It never just says “extraction complete”.

Four surfaces, none privileged

The same engine drives the workspace, a command line, an MCP client and a local console. Only the workspace needs a database.

The model is named

Every executed stage records the model id that ran it. A stage that did not run reports skipped and names none.

Validation is shown whole

A failing report is shown, never suppressed or auto-passed. High findings block the run and drive repair; medium warns; low informs.

A value it had to invent says so, in writing

Where a protocol is silent, the extractor still has to produce a value, and it records that it did, what it defaulted to, why, and that it emitted no citation. That report travels with the design into run_manifest.json.

“population.age_range: NOT STATED in this protocol. The inclusion criteria defer the age criterion to a ‘Country Supplement’ that is not supplied. [18, 85] is a clinical default … No citation is emitted for this field.”

Seven steps, from
the UI or the CLI

Long work runs on a durable Postgres-backed worker with live stage progress: not a spinner, and not a request the browser holds open.

  1. IngestPDF, HTML, Markdown or URL. Hashed on arrival.
  2. HashEvery dataset traces back to one ingested document.
  3. ExtractQueued to the worker. Cached by document hash.
  4. ApproveA person corrects, then approves. The design goes read-only.
  5. ConfigureSubjects, seed, realism profile, optional anomalies.
  6. RunLive stage progress, streamed from the worker.
  7. Read the resultValidation report, SDTM domain browser, traceability chain, assumptions report, and artifacts with content hashes.

When validation fails, the model reads the real report and proposes an adjusted design. That becomes a proposal parked for a person’s approval, because a repair changes the study design and someone has to own that. Rejecting one finalizes the run honestly with validation_passed=false.

Every value traces
back to a sentence

The chain is four links, and it is a first-class artifact rather than a log. When a programr asks why a variable is shaped the way it is, the answer is a citation.

  1. Protocol sentence “Protocol Number: STUDY-A”, a quote with a character offset range into one source revision
  2. Design value study_id = STUDY-A, a field on the typed design with its confidence
  3. CRF field Not collected on a form: derived, assigned or protocol-specified. The chain says so.
  4. SDTM variable DM.STUDYID · assigned · design value

Two provenance axes, always both

Every mapping row states what the variable would be in a real trial, the CDISC origin (Collected, Derived, Assigned or Protocol), and how this tool actually produced the value.

  • design-value
  • population-model
  • clinical-model
  • realism-pass
  • reference-table
  • hash-assigned
  • derived

Either axis alone misleads. RACE is a genuine CRF field that this tool fills by hashing a subject id; the CDISC axis alone would overclaim it.

Two verdicts that never borrow authority

“This is a separate verdict from dataset validation. Neither can speak for the other, and a finding here can never fail a run.”

Traceability coverage is advisory by construction. It can never reach validation_passed. And when a chain cannot be built, the view says so.

Same seed,
same bytes

Design, subject count, seed and resolved realism configuration produce byte-identical output. Committed golden hashes pin the property in the test suite, so a regression breaks the build rather than shipping quietly.

  • The seed is yoursChosen by the user, shown on the run page, and written into run_manifest.json.
  • Named random streamsOne knob moves only its own feature: turn up adverse-event incidence and every other domain stays byte-identical.
  • Content hashesThe JSON is canonical; every other file is a rendering of it.

An SDTM pipeline tested against irreproducible data is not tested. A reproducible input is a fixture that can be committed, diffed and regression-tested.

  • run_manifest.json
  • validation_report.json
  • assumptions_report.md
  • traceability_spec.json
  • mapping_spec.csv
  • annotated CRF
  • CSV + Parquet per domain

Day-one analytics, not day-after-lock

Every run emits Parquet per domain alongside the CSVs, with a dataset manifest describing what actually landed. The dataset drops into a Spark or Databricks environment as it is, so an analysis pipeline can be written and tested alongside site activation rather than after it.

Clean data
proves nothing

A dataset where everyone completes, nothing is missing and the drug arm looks exactly like placebo cannot be used to test anything. The value is in rehearsing against the messy cases before they arrive for real.

  • DM demographics
  • VS vitals
  • LB labs
  • QS questionnaires
  • EG ECG
  • PC pharmacokinetics
  • AE adverse events
  • CM concomitant medications
  • EX exposure
  • DS disposition
  • RS response
  • TU tumor identification
  • TR tumor results

Response data shaped for oncology

RECIST-shaped best overall response weighted by arm, CTCAE-style adverse-event grading, per-cycle exposure with dose modification, NSCLC laboratory panels, and tumor-site, adverse-event and concomitant-medication dictionaries.

Per-cycle dosing matters here more than anywhere: an oncology analysis that cannot see a dose reduction is not one you can dry-run. See Oncology Endpoint Studio.

The profile follows the indication

The extracted design names the therapeutic area, and the generator picks its clinical profile from it. Cardiology and oncology ship today as packaged dictionaries and panels rather than code, so a new area is a data file rather than a release.

  • Dictionary-coded terms rather than invented strings.
  • Referentially and temporally sound: no record in any domain is dated after the subject stopped.
  • A read-only cross-check against the public trial registry record, shown for comparison and never treated as a verdict.

A realism overlay

Five behaviors layered on as overlay passes: item missingness, discontinuation and the DS domain, arm-differential adverse-event incidence and severity, per-cycle exposure with dose modification, and a configurable enrollment window. Bundled as none · standard · heavy, with an integrity gate so realism never produces incoherent records.

Anomaly injection with an answer key

Plant known defects, then see whether detection finds them. The stress-test copy is written separately and never contaminates the primary output. Configured realism is reported, never punished: a run asked for 15% missingness gets a low-severity note, not a failure.

Browse what landed

Row paging runs on DuckDB over the Parquet in place. The dataset manifest describes what the run actually emitted, and the CRF specification shows the empty forms as a coordinator would see them, each field beside its SDTM variable.

What Simulations
is not

Stated here rather than buried, because to this audience an unstated boundary reads as a claim.

  • Not a substitute for real patient dataIt is for building the machinery that will process real data later.
  • Not clinically authenticThe overlay makes data analytically realistic (distributions, missingness, visit adherence), not realistic at the patient level.
  • Not a regulatory validation or conformance toolSDTM shape; no SEND, no define.xml.
  • Not an EDCIt never touches real patient data; every row it emits is synthetic.
Bring one protocol.See its register of facts and assumptions and an analyzable synthetic dataset. Preflight (opens in a new tab)