Findings

Generated by scripts/check_findings.py from the pinned inputs. Do not edit by hand. Statements are in authored/findings.ttl; this report adds what each test observed.

Ready to raise (4)

The published artefacts contradict themselves, or leave undefined something they rely on. The pinned files alone show it, and the ask is to make the artefacts consistent.

Finding Evidence tier Holds Why this standing
Abstract-class attributes carry a subclass's C-code Model-stated yes Two published artefacts, dataStructure.yml and USDM_CT.xlsx, give different C-codes for the same attributes.
Extension classes carry no definitions Model-stated yes Two classes in the published model have no definitions in any published artefact.
Population-level summary: term and definition disagree Authored yes One USDM_CT.xlsx row carries two meanings: the preferred term is the ICH E9(R1) attribute, the definition a narrative synopsis.
Procedure type is an uncoded classification Definition-stated yes USDM_CT.xlsx treats the same definition pattern as coded in one place and as a free string in another.

For discussion (17)

Depends on a modelling choice CDISC may have made on purpose, or on content of the published example files.

Finding Evidence tier Holds Why this standing
Biomedical concept property datatypes are uncontrolled names Example-observed yes Rests on the published example files, which are not mature study definitions.
Biomedical concept references are relative API paths Example-observed yes Rests on the published example files, which are not mature study definitions.
Code systems are named by free strings Example-observed yes Identifying code systems by strings is a modelling choice; the examples show its effect.
Schedule conditions are strings, not Condition instances Model-stated yes Holding schedule conditions as strings may be a deliberate choice; the ask would be a modelling change.
Objectives, endpoints and criteria have no link to document sections Model-stated yes The model may leave the link between design elements and document sections out of scope on purpose.
Section references are used only for amendment changes Model-stated yes Limiting section references to amendment changes may be deliberate.
Eligibility identifier identifies only together with the category Example-observed yes Rests on the published example files, which are not mature study definitions.
No link between Endpoint and what it requires Model-stated yes The model may leave endpoint dependencies out of scope on purpose.
Intercurrent event strategy: fixed set, specified as text Authored yes The gap to ICH E9(R1) is plain, but asking for a value list is a modelling request.
NarrativeContent holds its text by reference Model-stated yes Holding the text in a separate referenced item may be deliberate, for reuse across sections.
Narrative refers to model instances by markup in text Example-observed yes Rests on the published example files, which are not mature study definitions.
Syntax-template parameters resolve through markup Example-observed yes Rests on the published example files, which are not mature study definitions.
Amendment number: definition says numerals, an example uses a letter Example-observed yes Rests on the published example files, which are not mature study definitions.
Syntax-template parameters are rarely used Example-observed yes Rests on the published example files, which are not mature study definitions.
Template parameters are matched by name inside text Example-observed yes Rests on the published example files, which are not mature study definitions.
Timing values follow ISO 8601 by convention only Example-observed yes Rests on the published example files, which are not mature study definitions.
Timing labels are typed, not generated from the value Example-observed yes Rests on the published example files, which are not mature study definitions.

Abstract-class attributes carry a subclass's C-code

abstract-class-attribute-ccodes · Model-stated · Ready to raise

For attributes declared on abstract classes, dataStructure.yml carries the C-code, preferred term and definition of one concrete subclass, not the abstract class's own entry in USDM_CT.xlsx. usdm-rdf renders the YAML, so its skos:exactMatch on these properties points to the subclass concept. Example: SyntaxTemplate.text carries C207478 Characteristic Text; USDM_CT.xlsx lists C207578 Syntax Template Text for SyntaxTemplate.text.

Observed: 27 of 388 C-coded attributes in dataStructure.yml differ from USDM_CT.xlsx. All differences are on abstract classes (Identifier 1, PopulationDefinition 9, ScheduledInstance 3, StudyDesign 9, SyntaxTemplate 5); 27 C-coded attributes are declared on abstract classes in total. usdm-rdf skos:exactMatch follows the YAML code for all 27.

Extension classes carry no definitions

extension-attributes-undefined · Model-stated · Ready to raise

ExtensionAttribute and ExtensionClass have no rows in USDM_CT.xlsx and no definitions in usdm-rdf. No published example uses them.

Observed: USDM_CT.xlsx rows for these classes: 0. usdm-rdf properties: 17, with skos:definition: 0. Instances in the published examples: 0.

Population-level summary: term and definition disagree

population-summary-term-vs-definition · Authored · Ready to raise

Estimand.populationSummary has the preferred term "Population-Level Summary", the ICH E9(R1) estimand attribute. Its definition, "A synopsis of the clinical endpoint of interest within the analysis target study population", describes a narrative synopsis. The attribute is left unclassified in the overlay until the two are reconciled.

Observed: C188853 Population-Level Summary: A synopsis of the clinical endpoint of interest within the analysis target study population. Has Value List N.

Procedure type is an uncoded classification

procedure-type-uncoded · Definition-stated · Ready to raise

Procedure.procedureType and Endpoint.level share the definition pattern "A characterization or classification of ...". Endpoint.level has a value list; Procedure.procedureType has none and is a string.

Observed: Procedure.procedureType (C188848): Has Value List N. Endpoint.level (C188826): Has Value List Y (C188726).

Biomedical concept property datatypes are uncontrolled names

bc-property-datatype-names · Example-observed · For discussion

BiomedicalConceptProperty.datatype has no value list. The published examples use a small set of datatype names, including both 'text' and 'string', with nothing in the model to say whether they differ.

Observed: 638 BiomedicalConceptProperty instances, 420 with empty datatype. Names used: text 93, float 69, integer 26, datetime 20, string 8, decimal 2. USDM_CT.xlsx Has Value List: N.

Biomedical concept references are relative API paths

bc-reference-library-paths · Example-observed · For discussion

In the published examples, every BiomedicalConcept.reference is a relative CDISC Library API path, most into SDTM dataset specializations and some into biomedical concept packages. Resolving one needs a base URL and access to the Library.

Observed: 116 BiomedicalConcept instances, 46 distinct references: 43 of the form /mdr/specializations/sdtm/packages//datasetspecializations/, 3 of the form /mdr/bc/packages//biomedicalconcepts/.

Code systems are named by free strings

code-system-free-strings · Example-observed · For discussion

Code.codeSystem and Code.codeSystemVersion are free strings. In the published examples the code system is given in mixed forms, a URL for CDISC terminology and names for the others, and versions in several formats. A coded value is identified by strings, not by an IRI.

Observed: 2631 Code instances. codeSystem / codeSystemVersion pairs: 'http://www.cdisc.org' / '2024-09-27' 2534; 'ISO 3166 1 alpha3' / '2020-08' 42; 'SPONSOR' / '12' 25; 'SNOMED' / 'January 31, 2018' 20; 'ISO' / '1' 7; 'ICD-10-CM' / '1' 1; 'FDA' / '' 1; 'HL7' / '' 1.

Schedule conditions are strings, not Condition instances

condition-not-referenced · Model-stated · For discussion

ConditionAssignment.condition and ScheduleTimeline.entryCondition have range xsd:string. The model has a Condition class, but neither attribute references it.

Observed: ASK returned true, expected true.

Objectives, endpoints and criteria have no link to document sections

design-elements-not-linked-to-document · Model-stated · For discussion

No property connects Objective, Endpoint, EligibilityCriterion or EligibilityCriterionItem to the document structure (StudyDefinitionDocument, StudyDefinitionDocumentVersion, NarrativeContent, NarrativeContentItem, DocumentContentReference), in either direction.

Observed: ASK returned false, expected false.

Section references are used only for amendment changes

document-content-reference-amendments-only · Model-stated · For discussion

DocumentContentReference, the class that points at a document section by number and title, is the range of one property only: StudyChange.changedSections.

Observed: ASK returned false, expected false.

Eligibility identifier identifies only together with the category

eligibility-identifier-needs-category · Example-observed · For discussion

In some published examples, EligibilityCriterion.identifier restarts per category (inclusion and exclusion each start at 1) and is not repeated within a category. The identifier alone does not identify a criterion; the identifier with the category does.

Observed: Alexion_NCT04573309_Wilsons.json InterventionalStudyDesign_1: 31 criteria, 12 identifiers repeated, 0 repeated within a category; CDISC_Pilot_Study.json InterventionalStudyDesign_1: 31 criteria, 0 identifiers repeated, 0 repeated within a category; EliLilly_NCT03421379_Diabetes.json InterventionalStudyDesign_1: 36 criteria, 0 identifiers repeated, 0 repeated within a category; devices.json InterventionalStudyDesign_1: 4 criteria, 0 identifiers repeated, 0 repeated within a category; observational.json ObservationalStudyDesign_1: 5 criteria, 2 identifiers repeated, 0 repeated within a category.

No link between Endpoint and what it requires

endpoint-activity-gap · Model-stated · For discussion

No property connects Endpoint, or its superclass SyntaxTemplate, to Activity, Procedure, ScheduledActivityInstance or the biomedical concept classes, in either direction. The model does not carry which activities or biomedical concepts an endpoint depends on.

Observed: ASK returned false, expected false.

Intercurrent event strategy: fixed set, specified as text

intercurrent-event-strategy-textual · Authored · For discussion

IntercurrentEvent.strategy is defined as a textual description and has no value list. ICH E9(R1), section A.3.2, names five strategies: treatment policy, hypothetical, composite variable, while on treatment, principal stratum. The overlay classifies the attribute as classification as text; read by its definition alone it would be prose.

Observed: C188857 Intercurrent Event Strategy: A textual description of the planned strategy to manage and/or mitigate intercurrent events. Has Value List N.

NarrativeContent holds its text by reference

narrative-content-text-by-reference · Model-stated · For discussion

NarrativeContent is defined as "The container that holds an instance of unstructured text and which may include objects such as tables, figures, and images." The class has no text attribute. Its text is a NarrativeContentItem, which NarrativeContent references (contentItemId, relationship type Ref, 0..1) and which StudyVersion composes (narrativeContentItems). The section and its text are separate instances, linked by reference.

Observed: ASK returned true, expected true.

Narrative refers to model instances by markup in text

narrative-references-by-markup · Example-observed · For discussion

In the published examples, NarrativeContentItem.text refers to model instances by usdm:ref elements inside the XHTML string, each naming a class (klass), an instance (id) and one attribute. The reference runs from the section to one attribute value. dataStructure.yml does not mention the convention.

Observed: Alexion_NCT04573309_Wilsons.json: 467 usdm:ref in 105 narrative items, 17 classes; CDISC_Pilot_Study.json: 350 usdm:ref in 85 narrative items, 14 classes; EliLilly_NCT03421379_Diabetes.json: 234 usdm:ref in 112 narrative items, 16 classes; devices.json: 41 usdm:ref in 133 narrative items, 14 classes; observational.json: 26 usdm:ref in 6 narrative items, 11 classes. dataStructure.yml mentions usdm:ref: no.

Syntax-template parameters resolve through markup

parameter-reference-by-markup · Example-observed · For discussion

In the published examples, ParameterMap.reference holds usdm:ref markup, the same convention as narrative text. A syntax-template parameter resolves to a model value through markup in a string, not through a model reference.

Observed: usdm:ref markup in 14 of 15 ParameterMap.reference values. Other values: observational.json tag value_key = 1234.0.

Amendment number: definition says numerals, an example uses a letter

study-amendment-number-not-numerals · Example-observed · For discussion

StudyAmendment.number is defined as "A string of numerals that uniquely identifies a protocol amendment." A published example uses a letter.

Observed: 11 StudyAmendment.number values; not all digits: EliLilly_NCT03421379_Diabetes.json 'A'.

Syntax-template parameters are rarely used

syntax-template-parameters-rarely-used · Example-observed · For discussion

In the published examples, most syntax-template instances (Objective, Endpoint, EligibilityCriterionItem, IntercurrentEvent, Condition, Characteristic) have no dictionary, so their text carries no parameters the model can see.

Observed: Syntax-template instances with a dictionary: 13 of 245. Per example: Alexion_NCT04573309_Wilsons.json: 1 of 87; CDISC_Pilot_Study.json: 4 of 51; EliLilly_NCT03421379_Diabetes.json: 0 of 73; devices.json: 3 of 17; observational.json: 5 of 17.

Template parameters are matched by name inside text

template-tags-by-markup · Example-observed · For discussion

Syntax-template text marks parameters with usdm:tag elements that name a ParameterMap.tag. The stored tag is a bare name; the angle brackets that the NCI definition of ParameterMap.tag describes appear only in the template text. Resolution is by name inside a string, so a tag can lack a matching ParameterMap, and the published examples include such a case.

Observed: 16 usdm:tag elements in 13 texts; stored tags containing angle brackets: 0. Unresolved: observational.json EligibilityCriterionItem_2 'max_agexxx'.

Timing values follow ISO 8601 by convention only

timing-iso8601-convention · Example-observed · For discussion

In the published examples, every non-empty Timing.value, windowLower and windowUpper is an ISO 8601 duration. Neither dataStructure.yml nor USDM_CT.xlsx names a syntax for them; the range is xsd:string.

Observed: ISO 8601 durations among non-empty values: value 153 of 153; windowLower 30 of 30; windowUpper 30 of 30. '8601' in dataStructure.yml: no; in USDM_CT.xlsx definitions: no.

Timing labels are typed, not generated from the value

timing-labels-restate-values · Example-observed · For discussion

Timing.valueLabel restates Timing.value in free text. In the published examples the same value carries differently spelled labels, so the label is not generated from the value.

Observed: 76 distinct Timing.value values; 8 carry more than one valueLabel: P14D: '14 Days', '14 days'; P1D: '1 Day', '1 Days'; P2D: '2 Days', '2 days'; P2W: '2 Weeks', '2 weeks'; PT0M: '0 min', '0 mins', '0 minutes'; PT15M: '15 min', '15 mins'; PT30M: '30 min', '30 mins', '30 minutes'; PT5M: '5 min', '5 mins'.