As a clinical trial statistician or programmer, challenge anything in this benchmark: describe a problem in Comments, or propose a fix with the Edit button on any source file.
- Task: Would a real study need this derivation, specified this way? Does it follow CDISC ADaM: variable names, controlled terms, record structure? Flag any rule that is ambiguous or that a sponsor would handle differently.
- Inputs: Do they look like data collected in a real trial, and do they include the situations you would expect to meet in one?
- Expected output: Would independent QC programming reproduce every value from these inputs and rules?
The other tabs beside Comments are background for assessment, not under review.
Summary
README.mdGoal: record every check a run evaluates, held or violated: one row per check, in the order the run evaluated it.
Input: subject-level records with an AGE each; one age (214) falls
outside the expected 18-to-100 range.
Checks:
not_missingonAGE: held, every age is present.rangeonAGE: violated by the age outside 18-to-100; it is a warning, so the run still succeeds and the warning log carries the offending subject.uniqueonUSUBJID: held, no subject repeats.row_count: held, the run produced at least one row.
The check log records REPORT_VERSION, ARTIFACT, SPEC_PATH,
VERIFICATION_ID, CHECK, TARGET, REQUIREMENT, SEVERITY,
OUTCOME, CONDITION, EVALUATED_COUNT, FAILURE_COUNT, and
DETAILS. EVALUATED_COUNT counts what the check examines: rows for a
row-by-row check, distinct subjects for unique, and the whole dataset
as one unit for row_count. A held check leaves CONDITION empty,
reports zero failures, and has empty details ({}).
The warning log records LOG_VERSION, ARTIFACT, SEVERITY,
CONDITION, REQUIREMENT, SPEC_PATH, VERIFICATION_ID,
FAILURE_COUNT, OFFENDING_KEYS, and DETAILS, so the offending
subject can be investigated without stopping the run.
Note: the warning log says what broke and for whom; the check log
says what was checked and what happened. The two join on SPEC_PATH,
and only the warning log lists the offending subjects.
Inputs
Under review1 source fileinput/dm.csv
Edit3 rows| STUDYID | USUBJID | AGE |
|---|---|---|
| STUDY01 | 30 | |
| STUDY01 | 214 | |
| STUDY01 | 45 |
Expected output
Under review8 expected rowsexpected/adsl-checks.csv
Edit4 rows| REPORT_VERSION | ARTIFACT | SPEC_PATH | VERIFICATION_ID | CHECK | TARGET | REQUIREMENT | SEVERITY | OUTCOME | CONDITION | EVALUATED_COUNT | FAILURE_COUNT | DETAILS |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1.0 | adsl.csv | columns.AGE.verifications[0].not_missing | — | not_missing | AGE | REQ-0375 | error | held | — | 3 | 0 | {} |
| 1.0 | adsl.csv | columns.AGE.verifications[1].range | — | range | AGE | REQ-0377 | warning | violated | range_failed | 3 | 1 | {"column":"AGE"} |
| 1.0 | adsl.csv | verifications[0].unique | — | unique | — | REQ-0381 | error | held | — | 3 | 0 | {} |
| 1.0 | adsl.csv | verifications[1].row_count | — | row_count | — | REQ-0385 | error | held | — | 1 | 0 | {} |
expected/adsl-warnings.csv
Edit1 row| LOG_VERSION | ARTIFACT | SEVERITY | CONDITION | REQUIREMENT | SPEC_PATH | VERIFICATION_ID | FAILURE_COUNT | OFFENDING_KEYS | DETAILS |
|---|---|---|---|---|---|---|---|---|---|
| 1.0 | adsl.csv | warning | range_failed | REQ-0377 | columns.AGE.verifications[1].range | — | 1 | [{"USUBJID":"S-2"}] | {"column":"AGE"} |
expected/adsl.csv
Edit3 rows| USUBJID | AGE |
|---|---|
| 30 | |
| 214 | |
| 45 |
Comments and assessment materials
| Dataset Name | Variable Name | Variable Label | Type | Codelist/Controlled Terms | Core | Computational Method | Origin |
|---|---|---|---|---|---|---|---|
| ADSL | USUBJID | Unique Subject Identifier | character | Copy value from DM.USUBJID. | Predecessor | ||
| ADSL | AGE | Age | numeric | Copy value from DM.AGE. | Predecessor |
| Version | Date | Author | Description | Reviewer | Sign-off |
|---|---|---|---|---|---|
| 1.3 | 2026-09-29 | yamaa docs build | Show study codelist names, external dictionaries, and ISO 8601 formats in variable rows; list the document's codelist values and metadata | ||
| 1.2 | 2026-09-29 | yamaa docs build | Classify ADaM copies from a declared input as Predecessor and recodes as Derived, and SDTM recodes of locally derived columns as Derived | ||
| 1.1 | 2026-09-29 | yamaa docs build | Resolve lookups into the donor record they select, and give every derivation shape a plain-language rule instead of its raw YAML | ||
| 1.0 | yamaa docs build | Initial generation from spec.yaml |
yamaa
Comments
Signed in with GitHub; saved in repository Discussions