A suggested disposition is an advisory rule, not a decision. Columns matching no rule show nothing rather than a guess.
Click a column heading for its distinct values, then a value to filter.
You are looking at the adjudicated SDTM specification for one therapeutic area, beside the raw data it came from and the programs that produce it. Your job is not to approve it. Your job is to disagree with it in writing, on the specific row you disagree with, so the disagreement is still there when someone rebuilds next week.
1. Why this exists
Mapping a study to SDTM is mostly argument: which raw column feeds AESEV, whether a blank is a real absence or a collection gap, whether a derivation is defensible to someone who was not in the room. That argument normally lives in email and spreadsheets and evaporates. The next person inherits the answer and none of the reasoning.
So this tool stores the argument, not the conclusion. Every remark, suggested change and accept/decline is appended to a ledger and never edited or deleted. Four reviewers can work one domain at once with no locking and no merge conflicts, because nobody overwrites anybody — replaying a variable's events in order replays the whole discussion.
The disagreement is the valuable part. A store that resolved conflicts by picking a winner would throw away exactly what we are collecting.
2. Getting in
These specifications are not public. Paste the access key issued to you into the gate. It is kept in this browser only; sign out clears it.
The key is also your name. Identity is resolved on the server from the key alone — you can prove who you are, you can never assert it in a request. The ledger enforces this itself rather than trusting the caller, because its value depends on every row being attributable.
There are no roles. Every issued key can do everything: comment, propose, resolve anyone's proposal including its own, lock, unlock, rebuild the plan and rewrite the shared rule base. There is no separation of duties and no admin override. Treat that as a professional convention to respect, not a control the system enforces.
Do not share a key. Two people behind one key produce a ledger that says one person said everything.
3. The screen
| Top bar | Therapeutic-area picker, totals, Specs .xlsx / Raw .xlsx, the provenance string (pack id, git commit, build time — it turns amber if the tree was dirty), and who you are signed in as. |
|---|---|
| Left rail | Domains in this TA. Badges show N! open proposals and N● comments, so you can see where the argument already is. |
| Right rail | Who is here (live presence, expires after 30 seconds) and Activity (recent events). Hidden entirely on screens narrower than 1100px — if you cannot see it, that is your window width, not a fault. |
| Yellow banner | The scope disclaimer for what you are looking at. Read it once per tab; section 9 explains why it is not decoration. |
4. How to review
- Specification — read the adjudicated rows; tick only open proposals to see what is contested.
- Coverage — switch to unmapped only. Unmapped is the honest state for a column no rule matched; the question is whether it should have matched one.
- Raw data — look at real values. Click a column heading for distinct values, then a value to filter. Most genuine findings start here.
- SDTM output — what the program produced. Check both arms.
- Terminology, Compliance — CT findings and rule results.
- Leave remarks as you go, anchored to the row in front of you. A remark written later against "the AE domain" is much harder to act on.
5. Comment, propose, resolve
Click any Specification or Coverage row to open its thread.
| Comment | An observation or question. Changes nothing. Can be threaded as a reply. Available on spec variables, raw columns, compliance rules and program lines. |
|---|---|
| Proposal | A concrete suggested change — a different source, raw column or rule, with your reasoning. It does not edit the spec. It sits beside the adjudicated row and stays open until resolved. Only available on Specification rows, and it must change something. |
| Resolution | accept or decline on someone's proposal. Appended and attributed. One resolution per proposal, ever — a second attempt is refused, and there is no reopen. |
Why edits are proposals: an editable spec means the last person to touch a row wins and the earlier reasoning is gone. A proposal keeps both positions and a name against each.
A comment on a program line records a digest of the program text you wrote it against. If the program is regenerated your remark is shown as written against an earlier version rather than silently re-pointed at whatever code now sits on that line. When you see that label, re-read the code before acting.
Nothing is deletable. There is no delete path at all. A remark posted in error is corrected by posting a correction.
6. Every tab
Specification
One row per SDTM variable: source (RAW / DERIVED / CONSTANT), the raw reference an annotated CRF would carry, the derivation rule, and confidence. Filter by text, source or confidence. A ⚠ also mentions … hint means the rule names a column next to a negation, so it may not actually use it — left out of the coverage count until a human settles it. This is the only tab that offers the proposal form.
Coverage
Every raw column, MAPPED or UNMAPPED, what consumes it, and an advisory suggested disposition. A column matching no rule shows nothing rather than a guess. Blank means "we do not know", never "nothing to see". Derived domains own no raw file and say so.
Raw data
The source dataset, 100 rows per page, searchable across all columns. Click a column heading for its distinct values with counts, click a value to filter. Value lists are capped at 200 distinct values; when capped, the true total is shown — a truncated list that read as complete would be its own kind of lie.
SDTM output
The dataset the program actually produced, with an arm switch between R and Python. Read both: two implementations agreeing is weak evidence of correctness, disagreeing is strong evidence of a defect — and the arms currently disagree in every domain measured. If a program produced nothing, the tab says so and shows the failure and console output; that is a result worth reading, not a missing page.
Terminology
Whether each value appears in its codelist. Findings split into amber near misses (case-only differences) and red violations. Watch the "checkable" count: a variable with no applicable codelist is not checked, which is not the same as valid. Clicking a row opens the same thread as that variable's Specification row.
Knowledge
The rule base behind automated mapping, per domain: coverage, resolved counts, contested columns, and what still needs a human decision. The percentage means "raw columns a decided human rule maps with zero model calls" — and only accepted proposals move it. This is where your adjudications stop being one-off.
Fold decisions into rules rebuilds that rule base from accepted decisions. See section 10 before clicking it.
Compliance
Six scopes: This domain, All domains, CDISC CORE, Silent blanks, Therapeutic areas, Mapping plan. Every rule states both what it checks and what it does not check.
- CDISC CORE is the authoritative external engine. If it has never run you get a button, not an empty table — an empty table would look like a clean result. Its pass rate is over evaluated rules only; rules that could not evaluate are neither passes nor failures.
- Silent blanks is the one to open when a dataset looks clean. A Permissible variable is allowed to be empty, so a mapping that silently drops an entire column still passes everything else.
- Therapeutic areas — the registry banner says it was authored, not fetched. Believe the banner.
- Mapping plan — deterministic placement over the SDTM IG with no language model consulted, plus required variables with no source and a review queue of columns no rule could place. That queue is the deliverable.
"Not run" is not "pass." It is counted and displayed separately on every scope.
R · SAS · Python
The generated programs, with a clickable line-number gutter — click a line to comment on it. SAS is always marked GENERATED, NEVER EXECUTED: the only check applied is that it looks like a SAS program. Treat it as a deliverable to run in your own validated environment, not as tested code.
Mapper view
The deterministic mapping plan as chips or an interactive graph, with a triage strip and the full change history. This is the only place a mapping can actually be changed — section 7.
Study graph
Domain nodes with raw and expected column counts, joined by cross-domain dependency edges: subject referential integrity from DM, --DY derivations from RFSTDTC, EPOCH from SE windows, visit mapping from SV. Useful for seeing why one defect propagates.
This tab always shows the synthetic study SYNTH-001. It ignores the therapeutic-area picker — pick Cardiology and you still see SYNTH-001.
7. Mapper: changing a mapping
Select a variable to see its source, what decided it (a rule id, or a named human), the logic, full history, and its IG definition.
- Rewire, Swap with…, and dragging an edge away to disconnect all stage a change only. Nothing is saved until you type a reason and click Record decision. Drag away and navigate off and you have changed nothing.
- A reason is mandatory. The ledger records why a mapping changed, not only that it did — a save without one is rejected.
- AI-propose (Pending tab) suggests mappings for residual columns at a chosen depth. It writes nothing, handles at most 15 columns per run, and Use this only pre-fills the form — a human still records the decision. Model names are deliberately not shown; you choose a depth, not a vendor.
- Locks: only the holder can unlock. There is no admin override, so a lock left by someone who has gone is stranded. If you lock something and then reload the page, your own lock will look like someone else's — the browser forgets which are yours. The Unlock button still works; click it.
A mapper decision is keyed to the domain's column shape, not to this study. Recording one can affect every study sharing that shape. A RAW mapping is skipped where the other study lacks that column, but DERIVED and NOT_COLLECTED decisions apply everywhere.
Two separate ledgers. Comments made in the Mapper do not appear in the Activity feed or on Specification threads, and vice versa. If you want the wider team to see a remark, leave it on the Specification row.
8. Taking data out
| Specs / Raw .xlsx | Top bar — this therapeutic area. |
|---|---|
| Mapping plan | Compliance → Mapping plan: workbook (.xlsx) and markdown. |
| Full specification | Mapper view — includes recorded human decisions, built fresh per request. |
| MASTER (all TAs) | Every therapeutic area in one workbook. Not linked from any screen — …/api/ta/mapper/master (add ?fmt=json for JSON). |
Exports regenerate from current state, so they are never stale — and equally, the copy you saved last week is a snapshot, not the live position.
9. What this tool does not tell you
Read this before quoting any number from this tool in a meeting.
- Structure, not values. A program that ran and produced rows establishes only that it executed and emitted a dataset of that shape. Conformance here checks structure against the SDTM IG. It never checks whether the right value was chosen.
- No value oracle. These therapeutic areas have nothing to compare values against, so nothing on screen can show a value is correct. Only a human reading the raw data can.
- Our rules are ours. The inline conformance rules were written for this tool. They do not correspond to Pinnacle 21 or CDISC CORE rule ids. Passing all of them is much weaker than passing CORE.
- Pinnacle 21 was not run. It is commercial and not installed. Absence of Pinnacle findings is absence of evidence.
- An empty cell is not a pass. Across Coverage, Terminology and Compliance, blank means unexamined or unmatched.
- Deterministic ≠ correct. "No language model was consulted" is a provenance claim about how a mapping was placed, not a claim that it is right.
- Triage numbers do not add up, deliberately. The +N human decisions figure is reported separately from the plan-file totals; do not sum them. The ~N min human estimate is two minutes per column, a flat constant, not a measurement.
10. Handle with care
These are unconfirmed, single-click, wide-reaching actions.
| Fold decisions into rules | Rewrites the shared rule base used by every therapeutic area, not just this one. No confirmation dialog. |
|---|---|
| Rebuild plan | Overwrites the plan file every other reviewer is reading, mid-session. Your recorded decisions survive — they live in the ledger — but pending lists and triage numbers shift under other people's feet. |
| Run CDISC CORE now | About a minute of server work and writes an evidence file. Only one run at a time. |
| Accept / decline | One-shot. No reopen. |
| Any comment | Permanent. No edit, no delete. |
Found something this page gets wrong, or a capability it fails to explain? That is worth a comment — anchor it to the domain you were reviewing.