--- title: "Consistent research workflows" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Consistent research workflows} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} resource_files: - figures/logo.svg - figures/logo-dark.svg --- The strict profile fixes the project structure in deterministic templates. The research declaration chooses domain, data origin and study design independently. The same eleven stages remain visible in every project: protocol, import, validation, cleaning, descriptive analysis, primary analysis, diagnostics, sensitivity analysis, exploration, report and reproducibility. An inapplicable stage requires a reason. A stage name does not prescribe a statistical method. ```{r profile} library(reflowR) profile <- reflow_profile("clinical", "secondary", "observational", seed = 104L) profile[c("domain", "data_origin", "design", "scheme", "primary_color", "badge")] ``` The palette follows the CTTIR v5 families: clinical projects use `clinical` (vermillion) and basic research uses `brand` (blue). Methods, simulation and software use `methods`; evidence synthesis uses `evidence`. Other domains use `platform`. Primary or secondary data are shown as a separate text badge, so colour is not the sole indicator of the project category. Declarations recorded with the earlier palette keep their scheme, colour and stylesheet and still validate. Declare access, jurisdiction and the intended legal basis explicitly. These are recorded statements, not a determination that a project is authorized. Unknown values prevent execution readiness. ```{r declaration, eval=FALSE} profile <- reflow_profile("basic", "primary", "simulation", seed = 104L, data_access = "synthetic", jurisdiction = "Germany", legal_basis = "Generated teaching data without personal records") lock <- jsonlite::read_json("reviewed-environment/renv.lock") scaffold <- reflow_scaffold(profile, "Example study", "Research group", lock) project <- reflow_init_strict("example-study", profile, "Example study", "Research group", lock, git = TRUE) ``` Initialization writes a new directory and, when requested, initializes an empty Git repository. It does not install dependencies, commit, render or publish. Provision the exact locked R and package versions in a reviewed external R library before execution. This profile does not generate a project-local renv activation script or library. The root lock declares the required environment; stage execution checks installed versions and GitHub revision pins. Preserve `scaffold$declaration` outside the project. The project cannot approve its own profile, palette, control files or changed code. Pass externally reviewed SHA-256 hashes for the declared stage files to validation: ```{r validation, eval=FALSE} reflow_validate_strict("example-study", scaffold$declaration) reviewed <- c( "analysis/05_descriptive.Rmd" = "", "code/stages/05_descriptive.R" = "" ) reflow_validate_strict("example-study", scaffold$declaration, reviewed) ``` `valid` means the structure and supplied hashes agree. `execution_ready` also requires declarations and reviewed implementations for every applicable stage. `completed` additionally requires externally retained receipt hashes and matching current code, input and output hashes. Rendering an empty scaffold does not complete an analysis. Receipts record the seed, session and stage outputs; unchanged unrelated artifacts do not count as this stage's outputs. Render reviewed pages explicitly with `workflowr::wflow_build()`. Each build uses workflowr's fresh R session. Display computed objects explicitly in an Rmd chunk, for example with `knitr::kable(summary)`, after sourcing the calculation helper. Keep raw inputs read-only. Child publications share the root Git repository, dependency lock and site; nested execution roots and unknown code entrypoints fail validation. Static validation is not a security sandbox, a scientific review or legal approval. Execute reviewed code only within the group's separately controlled runtime. The existing `reflow_init()` and preset interfaces remain available for existing projects; adopting the strict profile is an explicit new-project path. ## A fixed cttiR composition `strict-cttir-v1` is a separate, opt-in profile. The default `strict-v1` declaration and scaffold stay unchanged. The composed profile adds exactly `cttir-study.json`, `cttir-recipe.json` and `cttir-runtime.json`. Each applicable stage calls the fixed installed export `cttiR::study_stage(stage = "", directory = ".")`. The study writer verifies the bound analysis receipt and presents its recorded results. Rendering is not an instruction to recompute the scientific analysis. ```{r cttir-composition, eval=FALSE} profile <- reflow_profile("clinical", "secondary", "observational", profile_version = "strict-cttir-v1", data_access = "synthetic", jurisdiction = "Germany", legal_basis = "Generated test observations") composition <- list( schema_version = 1L, study = reviewed_study, recipe = reviewed_recipe, runtime = list(package = "cttiR", version = lock$Packages$cttiR$Version, writer = "study_stage", files = installed_cttir_file_hashes) ) scaffold <- reflow_scaffold(profile, "Clinical example", "Research group", lock, composition = composition) project <- reflow_init_strict("clinical-example", profile, "Clinical example", "Research group", lock, composition = composition) reflow_validate_strict(project$directory, scaffold$declaration, execution_receipts = external_stage_receipt_hashes) ``` `installed_cttir_file_hashes` is a named list of lowercase SHA-256 strings covering every regular file in the reviewed installed cttiR package, including `DESCRIPTION`, `NAMESPACE`, lazy-load databases and package resources. File names are relative to that package directory. Empty or partial inventories, symlinks, unlisted files, changed bytes, a different package version or a missing explicit `study_stage` export block execution readiness. A clean external R library and session remain required. No package code is loaded by static inventory checking. The composition itself must be retained in the trusted external declaration. Both scientific objects contain bounded plain JSON values; cttiR, rather than reflowR's structural validator, validates their study and recipe semantics. All composed stage and control files are immutable: `reviewed_files` overrides are refused. Changing a study requires a new reviewed declaration and compilation, not a hash waiver for an edited control. No arbitrary extra file list is accepted. The compiled runtime helper also embeds the expected study, recipe, runtime, profile and lock hashes. These identities are checked before writer preflight and again after rendering; replacing a runtime digest map cannot approve changed installed code. Canonical stage files can be structurally execution-ready when the installed runtime matches and access declarations are complete. They are not completed until current externally pinned execution receipts bind their control, raw input and output hashes. Scientific acceptance, the upstream analysis receipt and its derived-data lineage remain cttiR's responsibility. These checks do not create an OS sandbox or replace methodological review.