Review ask

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.

  1. 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.
  2. Inputs: Do they look like data collected in a real trial, and do they include the situations you would expect to meet in one?
  3. 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

Lifecycle: draftEditUnder review
What this benchmark means
README.md

Goal: 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_missing on AGE: held, every age is present.
  • range on AGE: 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.
  • unique on USUBJID: 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 review
1 source file

input/dm.csv

Edit
3 rows
input/dm.csv
STUDYIDUSUBJIDAGE
STUDY0130
STUDY01214
STUDY0145

Expected output

Under review
8 expected rows

expected/adsl-checks.csv

Edit
4 rows
expected/adsl-checks.csv
REPORT_VERSIONARTIFACTSPEC_PATHVERIFICATION_IDCHECKTARGETREQUIREMENTSEVERITYOUTCOMECONDITIONEVALUATED_COUNTFAILURE_COUNTDETAILS
1.0adsl.csvcolumns.AGE.verifications[0].not_missing—not_missingAGEREQ-0375errorheld—30{}
1.0adsl.csvcolumns.AGE.verifications[1].range—rangeAGEREQ-0377warningviolatedrange_failed31{"column":"AGE"}
1.0adsl.csvverifications[0].unique—unique—REQ-0381errorheld—30{}
1.0adsl.csvverifications[1].row_count—row_count—REQ-0385errorheld—10{}

expected/adsl-warnings.csv

Edit
1 row
expected/adsl-warnings.csv
LOG_VERSIONARTIFACTSEVERITYCONDITIONREQUIREMENTSPEC_PATHVERIFICATION_IDFAILURE_COUNTOFFENDING_KEYSDETAILS
1.0adsl.csvwarningrange_failedREQ-0377columns.AGE.verifications[1].range—1[{"USUBJID":"S-2"}]{"column":"AGE"}

expected/adsl.csv

Edit
3 rows
expected/adsl.csv
USUBJIDAGE
30
214
45
Shaded columns are derived— = missing value

Comments and assessment materials

Comments

Signed in with GitHub; saved in repository Discussions

Mapping spec

Generated from the benchmark YAML; do not edit by hand

Dataset NameVariable NameVariable LabelTypeCodelist/Controlled TermsCoreComputational MethodOrigin
ADSLUSUBJIDUnique Subject IdentifiercharacterCopy value from DM.USUBJID.Predecessor
ADSLAGEAgenumericCopy value from DM.AGE.Predecessor
VersionDateAuthorDescriptionReviewerSign-off
1.32026-09-29yamaa docs buildShow study codelist names, external dictionaries, and ISO 8601 formats in variable rows; list the document's codelist values and metadata
1.22026-09-29yamaa docs buildClassify ADaM copies from a declared input as Predecessor and recodes as Derived, and SDTM recodes of locally derived columns as Derived
1.12026-09-29yamaa docs buildResolve lookups into the donor record they select, and give every derivation shape a plain-language rule instead of its raw YAML
1.0yamaa docs buildInitial generation from spec.yaml

yamaa code

Runs the yamaa specification; its result must match the expected output

run.R

Edit
4 lines
library(yamaa)adsl <- yamaa_domain("spec.yaml")$outputadsl

run.py

Edit
4 lines
import yamaaadsl = yamaa.yamaa_domain("spec.yaml").outputadsl