Raw_* domains and 126 columns with their declared types, extracted from demo-301's own workflows/1_mappings/*.yaml, and the downstream consumer counts read from its 46 metric, reporting and module workflows. The delivery on the right is constructed — demo-301's data re-cut as a CRO drop, with one file (LAB_LIVER_ALL.csv) built to be genuinely hard and then run through the real pipeline. open.gismo has no such screen today.
What to try
- Start with the file selectors, not the columns. Nothing on the right is meaningful until a domain has a file, because nine of the fourteen domains want a
studyid, a subject identifier and a date — so every file matches every domain. Press Assign proposed files and read what happens: the proposer gets seven right, correctly abstains onRaw_STUDY, and is confidently wrong on six — it puts the liver-laboratory file onRaw_DATACHGat 75% name coverage and onRaw_STUDCOMPat 50%. Set those six back to no file, the way a person would. - Now press Accept identical matches. With the seven real files in place it binds 27 — the columns whose delivered name is already the name gsm uses, ignoring case. gsm's findings vocabulary is lower-case SDTM, so an SDTM delivery does well here; its subject and site vocabulary is operational EDC, so the same delivery does badly there. 39 more rows have a candidate the matcher will argue for, and it is printed in the row without being applied. Open one and you see why — identical name, alias list, name contains — beside two real values from your file.
- Open
Raw_LB→subjidand bind it toUSUBJID. Then bindRaw_SUBJ.subjidtoDM.USUBJIDand press Dry run. The Keys panel measures the overlap rather than assuming it, and finds 217 participants whose lab results join to nobody. Both columns exist. Both are character. Both pass every type check open.gismo runs today. - Take the fix, then open Values. Binding
Raw_LB.lbtstnamis not enough: the Hepatic Safety Explorer matches four literal strings and this delivery spells them twelve ways. Map them and watch the reach move. It stops at 548 of 765, and the panel says why — one laboratory delivered no reference range, so the plot has nothing to divide by. - Decline something expensive. Open
Raw_SUBJ.timeonstudyand choose Decline. The bench prints the eight workflows that stop, then writes your reason into the YAML. Declining is a recorded judgement, not a blank. - Open Project files. Everything you just did is a diff against a file that already exists in the project. There is no hidden state anywhere in this design.
Two things this screen refuses to do
It never pre-fills a guess
Identical names bind on request and are marked identical. Everything else stays a proposal until a person clicks it, and the click is recorded in the YAML as # accepted proposal. A data manager who finds one wrong pre-filled row stops trusting the other 125, and re-checking 126 rows by hand is worse than filling them.
It never calls a mapping ready because the boxes are full
The verdict line says Not run until the mapping has executed against the real files. Readiness is an empirical claim about what came out, not a count of what was typed in. Today's og_validate() makes the opposite bargain and gets it wrong in both directions — it fails a project the engine maps perfectly.
How the suggester works, and why it barely matters
Three tests, in order: a case-insensitive identity test; a hand-written alias list of about fifty entries (usubjid → subjid, siteid → invid, anrhi → lbstnrhi); and a containment test for names over three characters. It runs in the page at load, over the same 126 rows you see. Its output is printed on every row it has an opinion about.
The honest caveat. The alias list and the constructed delivery were written by the same person on the same evening, so the hit rate you see here is an upper bound on a real one rather than a measurement of one. That is survivable precisely because this direction does not depend on it: a suggestion that is wrong costs one glance, because nothing was applied. A direction that pre-fills has to earn the number honestly before it can ship.
safetyGraphics can do better than this because safetyCharts ships meta_* tables with a standard_adam and standard_sdtm column per field, which is what lets its detectStandard() pre-fill a mapping screen. gsm.mapping has no equivalent, so any suggester built here starts from nothing and improves only as studies accumulate. That is a real asset to build, and it is on the cost list — but it is an accelerator for this direction, not a precondition.
Contract, types and consumer counts generated 2026-08-27 from demo-301/workflows/; the delivery is constructed and labelled as such. Nothing is fetched at view time. Continue to the hard case, executed or back to the direction.