Scope

Generated mechanically: the dataset inventory, the validation-findings table, the programs-submitted list, and the assembly of the SDRG/ADRG document.

Left to a human, deliberately: every narrative section, and every sponsor explanation of a finding. Findings with no explanation are only flagged (needs_explanation = TRUE) – never filled in, guessed or auto-worded.

Breaking

  • section_findings() now takes the Pinnacle 21 report column schema – Dataset, Variable, Rule ID, Message, Records affected, Severity – instead of the previous ad-hoc finding/severity/count columns, and returns those columns in snake_case (rule_id, message, records_affected, …). Column names are matched case- and separator-insensitively; a missing required column is an error naming it. The shape is a data contract, not a package dependency: anything that emits those columns works, and no validator package is imported.
  • explanations is now keyed by rule ID first and message text second (a data frame needs explanation plus Rule ID or Message).
  • section_datasets() gains a key_source column, so every existing consumer sees one extra column.

New

  • section_datasets() gains a metadata argument: declared key variables are taken from a metacore object (via its ds_vars table) or any data frame with dataset, variable and key_seq columns, in key_seq order. The name-pattern heuristic remains the fallback when a dataset has no declared keys, and key_source records "declared" or "heuristic" for every row.
  • Bundled fixtures are now real data: dataset_keys.csv holds the declared keys from the CDISCPILOT01 ADaM define.xml, and findings.csv holds findings from a real Pinnacle 21 run against the CDISCPILOT01 SDTM data.

Limits (disclosed, not fixed)

  • Key variables without metadata are a name guess. STUDYID, USUBJID, DOMAIN, SUBJID, PARAMCD, VISITNUM, VISIT, AVISIT, anything ending SEQ/ID, else the first two variables. It can miss a real key and invent one; key_source == "heuristic" marks every such row.
  • Declared keys are reproduced as declared, including a key variable that is absent from the data frame – the package does not reconcile the two.
  • Program descriptions are the header comment, not the code. Leading comment block (#, *, /* */) within the first 60 lines, collapsed and truncated at 300 characters. A header below a licence banner or an options/library block gives NA; a stale header is reported verbatim; inputs, outputs and macros are never inspected. No parser was written on purpose – a wrong parse is worse than an honest NA. Now documented in ?section_programs, the README and the vignette rather than only in a source comment.
  • render_guide() needs rmarkdown (a Suggests) and pandoc; without rmarkdown it stops with The package "rmarkdown" is required to render a guide file. before writing anything. Nothing else in the package needs it.
  • No define.xml is read and no validator is run – both are other packages’ jobs.
  • Initial release.
  • guide_spec() / new_guide() / validate_guide(): the guide object holding study-level metadata and an ordered list of sections.
  • section_datasets(): dataset inventory from a named list of data frames or a metadata table.
  • section_findings(): validation-findings table, flagging findings with no sponsor explanation.
  • section_programs(): inventory of a programs directory, with each program’s leading comment block as its description.
  • add_section() / add_narrative(): attach generated sections and hand-written narrative to a guide.
  • render_guide(): render an sdrg/adrg guide to HTML or Markdown via rmarkdown, from the section skeletons shipped in inst/templates.
  • print.reviewerguider_guide(): shows a guide’s sections and which are still empty.