Every rule Pinnacle 21 Community reported on, keyed by its Pinnacle 21 identifier and carrying the Publisher (FDA) identifier, the canonical message and description, the category, the severity and the fix class p21bridge uses to classify a finding by rule id instead of by message text.

p21_rules

Format

A tibble with 537 rows and 9 columns:

rule_id

Pinnacle 21 identifier, e.g. "SD0002". Unique.

publisher_id

Publisher identifier, i.e. the FDA rule id, e.g. "FDAC036".

message

Canonical rule message.

description

Canonical rule description.

category

Pinnacle 21 category: Consistency, Cross-reference, Format, Limit, Metadata, Presence, Structure or Terminology.

severity

"Error" (423), "Warning" (113) or "Notice" (1).

sources

Which harvested report(s) the rule was seen in.

fix_class

The suggest_fix() class this rule maps to: one of human_judgement (406), missing_ts_param (35), variable_name_format (25), key_not_unique (11), ts_val_format (9), duplicate_ts_record (8), drop_variable (7), ct_codelist (5), missing_variable (5), required_value_null (5), code_decode_pair (4), label_mismatch (3), datetime_component (2), define_missing_entry (2), iso8601_date (2), domain_value, non_ascii, referential_integrity, split_length, studyid_mismatch, type_mismatch, variable_length or variable_order (1 each).

rule_class

Namespace of the rule id, from rule_class().

Source

Pinnacle 21 Community validator reports in https://github.com/phuse-org/phuse-scripts (MIT licence): the CDISCPILOT01 SDTM report of 2017-09-29 and the PHUSE Test Data Factory v1.0 SDTM and ADaM reports.

Details

Harvested from the Rules sheet of the Pinnacle 21 Community validator reports distributed in phuse-org/phuse-scripts (MIT licence), by data-raw/make-rule-catalogue.R. Re-run that script against newer reports when Pinnacle 21 updates its rule set.

fix_class is derived once, at build time, from the canonical rule text - not from the message text of any one report. It is deliberately conservative: 131 of the 537 rules name a mechanic suggest_fix() can recompute from the data, and the other 406 carry "human_judgement". Of those 406, 387 are undecidable in principle (the remedy is in the protocol, the CRF or a clinician's head) and 19 need data the package does not ship (MedDRA, WHODrug, the SDTM IG's own type list). The 48 that 0.0.1.9000 listed as reachable with more handlers now have them, so that count is 0; the split is counted by data-raw/make-rule-catalogue.R on every rebuild. A finding whose rule maps to "human_judgement", or whose rule id is not in this catalogue at all, falls through to the message-text matching p21bridge has always used, so a rule missing from the catalogue is never worse off than before.

Examples

p21_rules[p21_rules$rule_id == "SD0064", c("severity", "category", "message")]
#> # A tibble: 1 × 3
#>   severity category        message                            
#>   <chr>    <chr>           <chr>                              
#> 1 Error    Cross-reference Subject is not present in DM domain
table(p21_rules$severity)
#> 
#>   Error  Notice Warning 
#>     423       1     113 
table(p21_rules$fix_class)
#> 
#>      code_decode_pair           ct_codelist    datetime_component 
#>                     4                     5                     2 
#>  define_missing_entry          domain_value         drop_variable 
#>                     2                     1                     7 
#>   duplicate_ts_record       human_judgement          iso8601_date 
#>                     8                   406                     2 
#>        key_not_unique        label_mismatch      missing_ts_param 
#>                    11                     3                    35 
#>      missing_variable             non_ascii referential_integrity 
#>                     5                     1                     1 
#>   required_value_null          split_length      studyid_mismatch 
#>                     5                     1                     1 
#>         ts_val_format         type_mismatch       variable_length 
#>                     9                     1                     1 
#>  variable_name_format        variable_order 
#>                    25                     1