Skip to content

v1.1.0

Latest

Choose a tag to compare

@lauramaxwell lauramaxwell released this 17 Jul 19:18
d19925e

workr 1.1.0

Highlights

  • Improved project orchestration with phase-level configuration files,
    project/phase load-save hooks, optional continue-on-error behavior, and
    clearer diagnostics for missing paths, empty phases, and workflow failures.

  • Added workflow discovery helpers and made workflow loading more predictable,
    including active/inactive filtering, priority ordering, exact-name matching,
    and support for the singular inst/workflow directory.

  • Added reusable load/save hook registration plus built-in GitHub Actions
    artifact providers for saving and restoring workflow data between runs.

  • Hardened GitHub, manifest, snapshot, and CI automation, including expanded
    mocked coverage for GitHub-backed workflows.

  • Updated examples, documentation, pkgdown configuration, and tests for the new
    workflow loading, hook, artifact, and project orchestration behavior.

  • Fixed schema-enforced timestamp parsing in RunQuery() when inputs mix Date
    and POSIXct-like values.

What's Changed

New Contributors

Full Changelog: v1.0.0...v1.1.0

{qcthat} Reports

Milestone

✅ A qcthat issue test matrix with 1 milestone, 17 issues, and 96 tests
└─█─Milestone: v1.1.0 (17 issues, 96 tests)
  ├─☑️─Issue 72: Add FilterWorkflows() generic with ... filtering interface
  │ ├─✅─FilterWorkflows.character filters single-value meta field (#72)
  │ ├─✅─FilterWorkflows.character filters list-valued meta field (#72)
  │ ├─✅─FilterWorkflows.character supports multiple allowed values (#72)
  │ ├─✅─FilterWorkflows.character is case-insensitive (#72)
  │ ├─✅─FilterWorkflows.character returns empty list for no match (#72)
  │ ├─✅─FilterWorkflows.character excludes workflows missing the field (#72)
  │ ├─✅─FilterWorkflows.character excludes workflows with NULL field value (#72)
  │ ├─✅─FilterWorkflows.logical filters by TRUE (#72)
  │ ├─✅─FilterWorkflows.logical filters by FALSE (#72)
  │ ├─✅─FilterWorkflows.logical field lookup is case-insensitive (#72)
  │ ├─✅─FilterWorkflows.default errors on unsupported value type (#72)
  │ ├─✅─FilterWorkflows.numeric filters by single value (#72)
  │ ├─✅─FilterWorkflows.numeric filters by multiple values (#72)
  │ ├─✅─FilterWorkflows errors on unnamed ... argument (#72)
  │ ├─✅─FilterWorkflows.logical excludes workflows with non-coercible Active value (#72)
  │ ├─✅─FilterWorkflows.integer dispatches to numeric method (#72)
  │ ├─✅─.keep_workflows warns and uses first key when meta has duplicate case-variant keys (#72)
  │ ├─✅─MakeWorkflowList filters via ... character value (#72)
  │ ├─✅─MakeWorkflowList filters via ... logical value (#72)
  │ ├─✅─MakeWorkflowList applies multiple ... filters with AND logic (#72)
  │ └─✅─MakeWorkflowList warns when ... filters leave empty list (#72)
  ├─☑️─Issue 59: Implement `gsm.datasim` load provider
  │ ├─✅─gsm.datasim provider adapts standard single-snapshot data and aliases (#59)
  │ ├─✅─gsm.datasim provider tolerates standard config API drift (#59)
  │ ├─✅─gsm.datasim provider uses latest longitudinal snapshot by default (#59)
  │ ├─✅─gsm.datasim provider validates profile and study_type early (#59)
  │ ├─✅─gsm.datasim provider handles edge-case scalar config values (#59)
  │ ├─✅─gsm.datasim provider requires custom config for custom profile (#59)
  │ └─✅─built-in providers are registered together (#59, #60, #61)
  ├─☑️─Issue 58: Formalize `LoadData` / `SaveData` hook contract
  │ ├─✅─RunWorkflow invokes environment-backed lConfig$LoadData (#58)
  │ ├─✅─RunWorkflow accepts lConfig without data hooks (#58)
  │ ├─✅─RunWorkflow resolves registered load providers (#58)
  │ ├─✅─RunWorkflow resolves registered save providers (#58)
  │ ├─✅─RunWorkflow errors on unknown registered load provider (#58)
  │ ├─✅─RunWorkflow errors on invalid LoadData formals (#58)
  │ ├─✅─RunWorkflow errors on invalid SaveData formals (#58)
  │ └─✅─register_load_provider validates provider signatures (#58)
  ├─☑️─Feature 53: Filter MakeWorkflowList() to active-only
  │ ├─✅─.workflow_path resolves package path (#53)
  │ ├─✅─.workflow_path errors on missing directory (#53)
  │ ├─✅─.discover_yaml_files returns named character vector (#53)
  │ ├─✅─ListWorkflows returns named character vector of yaml paths (#53)
  │ ├─✅─ListWorkflows resolves strPackage (#53)
  │ ├─✅─ListWorkflows errors on invalid strPath (#53)
  │ ├─✅─ListWorkflows bRecursive = FALSE only returns top-level files (#53)
  │ ├─✅─ListWorkflowNames returns AsIs character vector without .yaml (#53)
  │ ├─✅─ListWorkflowNames includes all workflows regardless of Active (#53)
  │ ├─✅─ListWorkflowNames resolves strPackage (#53)
  │ ├─✅─MakeWorkflowList bActiveOnly = TRUE (default) excludes inactive workflows (#53)
  │ ├─✅─MakeWorkflowList bActiveOnly = FALSE includes all workflows (#53)
  │ ├─✅─MakeWorkflowList strNames = NULL with bActiveOnly = FALSE includes all workflows (#53)
  │ ├─✅─.filter_yaml_files NULL strNames returns all (#53)
  │ ├─✅─.filter_yaml_files exact match works (#53)
  │ └─✅─.filter_yaml_files partial match works (#53)
  ├─☑️─Issue 46: [workr] Workflow filename collisions silently overwrite
  │ ├─✅─pull_workflows does not register missing files as collisions (#46)
  │ ├─✅─pull_workflows warns on destination collisions by default (#46)
  │ ├─✅─pull_workflows warns on nested destination collisions in directories (#46)
  │ └─✅─pull_workflows warns and skips file-vs-directory structural collisions (#46)
  ├─☑️─Issue 45: [workr] Snapshot silently skips packages that use inst/workflows (plural)
  │ ├─✅─pull_workflows skips packages with no workflow directory (#45)
  │ └─✅─pull_workflows warns when only inst/workflows exists (#45)
  ├─☑️─Issue 43: [workr] Add testthat coverage for pull_workflows and resolve_package
  │ ├─✅─resolve_package resolves explicit refs via mocked gh api (#43)
  │ ├─✅─resolve_package uses date-based fallback when ref is not provided (#43)
  │ ├─✅─resolve_package errors on malformed gh commit lookup response (#43)
  │ ├─✅─resolve_ref_by_date falls back to default branch when latest release is missing (#43)
  │ ├─✅─gh_list_contents parses directory entries from mocked gh api (#43)
  │ ├─✅─pkgManifest writes manifest outputs with mocked GitHub resolution (#43)
  │ ├─✅─pull_workflows dispatches file and directory entries (#43)
  │ ├─✅─pull_workflow_file skips write when content lookup is Not Found (#43)
  │ └─✅─pull_workflow_file writes decoded file when content is available (#43)
  ├─📥─Issue 23: Improve RunProject data handoff and per-folder configuration
  │ └─(no tests)
  ├─📥─Issue 13: RunStep: dplyr::filter fails because do.call passes named ... arguments
  │ └─(no tests)
  ├─☑️─Issue 67: `RunProject` regression tests + docs
  │ ├─✅─github_artifact load provider ignores GITHUB_RUN_ID and honors latest_success in CI (#67)
  │ ├─✅─github_artifact save provider stamps manifest run_id from GITHUB_RUN_ID (#67)
  │ ├─✅─RunProject without phase configs preserves flat carry-forward behavior (#67)
  │ ├─✅─RunProject supports a four-phase configured project scenario (#67)
  │ ├─✅─RunProject retains fail-fast behavior by default (#67)
  │ ├─✅─RunWorkflow allows LoadData-only and SaveData-only configs (#67)
  │ ├─✅─RunWorkflow fails when spec-declared input is absent (#67)
  │ ├─✅─RunWorkflows retains fail-fast behavior by default (#67)
  │ └─✅─RunWorkflows continue-on-error records failures and runs later workflows (#67)
  ├─☑️─Issue 66: Output shaping + optional transform
  │ ├─✅─RunProject wraps and transforms phase output (#66)
  │ └─✅─RunProject transform failures identify the transform reference (#66)
  ├─☑️─Issue 65: Phase input assembly rules
  │ └─✅─RunProject assembles phase input from config rules (#65)
  ├─☑️─Issue 64: Per-phase `_config.yaml` schema + validator
  │ ├─✅─RunProject validates per-phase _config.yaml schema (#64)
  │ └─✅─RunProject rejects empty or whitespace-only output config strings (#64)
  ├─☑️─Issue 63: Stabilize `RunProject` baseline
  │ ├─✅─RunProject discovers phases in alphabetical order by default (#63)
  │ ├─✅─RunProject runs strPhases in caller order, not sorted (#63)
  │ ├─✅─RunProject errors when strPath is not a directory (#63)
  │ └─✅─RunProject warns on empty phase folder and proceeds (#63)
  ├─☑️─Issue 62: Hook hardening: end-to-end testing, authentication, and documentation
  │ ├─✅─github_artifact load provider reports required Actions scope on auth failures (#62)
  │ └─✅─hook providers round-trip data across runs (#62)
  ├─☑️─Issue 61: GitHub Actions artifact load provider
  │ ├─✅─github_artifact load provider restores data for an explicit run-id (#61)
  │ ├─✅─github_artifact load provider resolves latest_success policy (#61)
  │ ├─✅─github_artifact load provider errors with run-id and policy on missing artifact (#61)
  │ ├─✅─github_artifact load provider warns and returns partial lData when payloads are missing (#61)
  │ ├─✅─github_artifact load provider rejects payload paths outside bundle (#61)
  │ ├─✅─github_artifact load provider restores NULL payload values (#61)
  │ ├─✅─gh_actions_download_artifact_bundle clears stale extracted contents (#61)
  │ └─✅─built-in providers are registered together (#59, #60, #61)
  └─☑️─Issue 60: GitHub Actions artifact save provider
    ├─✅─github_artifact save provider writes manifest and payload pair (#60)
    ├─✅─github_artifact save provider clears stale bundle contents (#60)
    └─✅─built-in providers are registered together (#59, #60, #61)
# Issue state: 📥 = open, ☑️ = closed (completed), ⛔ = closed (won't fix)
# Test disposition: ✅ = passed, ❌ = failed, 🚫 = skipped
✅ All tests passed

⭕ 2 issues lack tests

🙈 3 issues with label "qcthat-nocov" were ignored


Completed Issues

⚠️ A qcthat issue test matrix with 2 milestones, 20 issues, and 179 tests
├─█─Milestone: v1.0.0 (3 issues, 76 tests)
│ ├─☑️─Issue 26: Improve unit test coverage for v1.0 release
│ │ ├─✅─MakeWorkflowList loads YAML and RunStep executes workflow correctly (#26)
│ │ ├─✅─Complex workflow: multi-step loaded from YAML and executed end-to-end (#26)
│ │ ├─✅─Workflow from YAML loads and executes with meta reference (#26)
│ │ ├─✅─loadExample returns input data when initData.R is missing (#9, #26)
│ │ ├─✅─loadExample loads initData.R and merges with lData (#9, #26)
│ │ ├─✅─loadExample validates initData return type (#9, #26)
│ │ ├─✅─loadExample does not create duplicate names on repeated calls (#9, #26)
│ │ ├─✅─MakeWorkflowList output is a named list with expected structure (#26)
│ │ ├─✅─MakeWorkflowList returns metadata as expected (#26)
│ │ ├─✅─MakeWorkflowList errors on invalid strPath (#26)
│ │ ├─✅─MakeWorkflowList errors on invalid strPackage (#26)
│ │ ├─✅─MakeWorkflowList filters by strNames (#26)
│ │ ├─✅─MakeWorkflowList bExact filters exactly (#26)
│ │ ├─✅─MakeWorkflowList names list elements by meta$ID (#26)
│ │ ├─✅─MakeWorkflowList sorts by Priority (#26)
│ │ ├─✅─MakeWorkflowList sets default Priority to 0 (#26)
│ │ ├─✅─MakeWorkflowList loads from package (#26)
│ │ ├─✅─MakeWorkflowList warns when ID does not match filename (#26)
│ │ ├─✅─MakeWorkflowList emits fatal message when meta is missing (#26)
│ │ ├─✅─MakeWorkflowList emits fatal message when steps is missing (#26)
│ │ ├─✅─MakeWorkflowList emits fatal message when meta$Type is missing (#26)
│ │ ├─✅─MakeWorkflowList emits fatal message when meta$ID is missing (#26)
│ │ ├─✅─MakeWorkflowList bRecursive finds nested workflows (#26)
│ │ ├─✅─RunProject runs all phases in sorted order (#26)
│ │ ├─✅─RunProject passes data between phases (#26)
│ │ ├─✅─RunProject respects strPhases subset and order (#26)
│ │ ├─✅─RunProject errors on missing strPath (#26)
│ │ ├─✅─RunProject errors on missing requested phases (#26)
│ │ ├─✅─RunProject errors on empty project directory (#26)
│ │ ├─✅─RunProject bReturnResult and bKeepInputData pass through (#26)
│ │ ├─✅─RunQuery returns correct result (#26)
│ │ ├─✅─RunQuery handles empty df (#26)
│ │ ├─✅─RunQuery handles invalid input (#26)
│ │ ├─✅─RunQuery checks if strQuery contains 'FROM df' (#26)
│ │ ├─✅─RunQuery applies schema appropriately (#26)
│ │ ├─✅─RunQuery applies incomplete schema appropriately (#26)
│ │ ├─✅─RunQuery parses invalid date/times correctly (#26)
│ │ ├─✅─RunQuery requires lColumnMapping when bUseSchema is TRUE (#26)
│ │ ├─✅─RunStep handles lMeta and lData parameters correctly (#26)
│ │ ├─✅─RunStep handles parameters referencing elements within lMeta and lData (#26)
│ │ ├─✅─RunStep passes direct value parameters correctly (#26)
│ │ ├─✅─RunStep passes direct value vector parameters correctly (#26)
│ │ ├─✅─RunStep handles multiple parameters and function invocation correctly (#26)
│ │ ├─✅─RunStep will run a function from a namespace (#26)
│ │ ├─✅─RunStep will run a function without a namespace (#26)
│ │ ├─✅─RunStep will run a function with no parameters (#26)
│ │ ├─✅─RunStep recognizes rlang::expr() string parameters (#26)
│ │ ├─✅─RunStep recognizes expr() shorthand parameters (#26)
│ │ ├─✅─RunStep recognizes rlang::exprs() parameters (#26)
│ │ ├─✅─RunStep recognizes exprs() shorthand parameters (#26)
│ │ ├─✅─RunStep passes lSpec parameter correctly (#26)
│ │ ├─✅─RunWorkflow returns final step result by default (#26)
│ │ ├─✅─RunWorkflow returns full workflow object when bReturnResult = FALSE (#26)
│ │ ├─✅─RunWorkflow bKeepInputData = FALSE removes input data from lData (#26)
│ │ ├─✅─RunWorkflow bKeepInputData = TRUE preserves input data in lData (#26)
│ │ ├─✅─RunWorkflow multi-step preserves intermediate results in lData (#26)
│ │ ├─✅─RunWorkflow invokes lConfig$LoadData (#26)
│ │ ├─✅─RunWorkflow invokes lConfig$SaveData on bReturnResult = TRUE (#26)
│ │ ├─✅─RunWorkflow validates spec when present (#26)
│ │ ├─✅─RunWorkflow runs without spec (#26)
│ │ ├─✅─RunWorkflow runs with YAML files (#26)
│ │ ├─✅─RunWorkflows returns named list (#26)
│ │ ├─✅─RunWorkflows passes prior workflow results as data to later workflows (#26)
│ │ ├─✅─RunWorkflows custom strResultNames (#26)
│ │ ├─✅─RunWorkflows passes lConfig through to RunWorkflow (#26)
│ │ └─✅─RunWorkflows handles empty workflow list (#26)
│ ├─☑️─Issue 25: Differentiate package manifests from execution snapshots
│ │ ├─✅─pkgManifest function exists (#25)
│ │ ├─✅─pkgManifest has correct parameters (#25)
│ │ ├─✅─pkgSnapshot function name is deprecated/removed (#25)
│ │ └─✅─pkgListFromManifest references correct function (#25)
│ └─☑️─Issue 19: Remove Legacy /site Explorer From workr
│   ├─✅─site/ directory does not exist (#19)
│   ├─✅─site-build.yaml workflow does not exist (#19)
│   ├─✅─site-deploy.yaml workflow does not exist (#19)
│   ├─✅─pkgdown-all.yaml has no Node/explorer steps (#19)
│   ├─✅─_pkgdown.yml has no explorer navbar entry (#19)
│   └─⚠️─.gitignore has no site/node_modules/ entry (#19)
├─█─Milestone: v1.1.0 (15 issues, 96 tests)
│ ├─☑️─Issue 72: Add FilterWorkflows() generic with ... filtering interface
│ │ ├─✅─FilterWorkflows.character filters single-value meta field (#72)
│ │ ├─✅─FilterWorkflows.character filters list-valued meta field (#72)
│ │ ├─✅─FilterWorkflows.character supports multiple allowed values (#72)
│ │ ├─✅─FilterWorkflows.character is case-insensitive (#72)
│ │ ├─✅─FilterWorkflows.character returns empty list for no match (#72)
│ │ ├─✅─FilterWorkflows.character excludes workflows missing the field (#72)
│ │ ├─✅─FilterWorkflows.character excludes workflows with NULL field value (#72)
│ │ ├─✅─FilterWorkflows.logical filters by TRUE (#72)
│ │ ├─✅─FilterWorkflows.logical filters by FALSE (#72)
│ │ ├─✅─FilterWorkflows.logical field lookup is case-insensitive (#72)
│ │ ├─✅─FilterWorkflows.default errors on unsupported value type (#72)
│ │ ├─✅─FilterWorkflows.numeric filters by single value (#72)
│ │ ├─✅─FilterWorkflows.numeric filters by multiple values (#72)
│ │ ├─✅─FilterWorkflows errors on unnamed ... argument (#72)
│ │ ├─✅─FilterWorkflows.logical excludes workflows with non-coercible Active value (#72)
│ │ ├─✅─FilterWorkflows.integer dispatches to numeric method (#72)
│ │ ├─✅─.keep_workflows warns and uses first key when meta has duplicate case-variant keys (#72)
│ │ ├─✅─MakeWorkflowList filters via ... character value (#72)
│ │ ├─✅─MakeWorkflowList filters via ... logical value (#72)
│ │ ├─✅─MakeWorkflowList applies multiple ... filters with AND logic (#72)
│ │ └─✅─MakeWorkflowList warns when ... filters leave empty list (#72)
│ ├─☑️─Issue 59: Implement `gsm.datasim` load provider
│ │ ├─✅─gsm.datasim provider adapts standard single-snapshot data and aliases (#59)
│ │ ├─✅─gsm.datasim provider tolerates standard config API drift (#59)
│ │ ├─✅─gsm.datasim provider uses latest longitudinal snapshot by default (#59)
│ │ ├─✅─gsm.datasim provider validates profile and study_type early (#59)
│ │ ├─✅─gsm.datasim provider handles edge-case scalar config values (#59)
│ │ ├─✅─gsm.datasim provider requires custom config for custom profile (#59)
│ │ └─✅─built-in providers are registered together (#59, #60, #61)
│ ├─☑️─Issue 58: Formalize `LoadData` / `SaveData` hook contract
│ │ ├─✅─RunWorkflow invokes environment-backed lConfig$LoadData (#58)
│ │ ├─✅─RunWorkflow accepts lConfig without data hooks (#58)
│ │ ├─✅─RunWorkflow resolves registered load providers (#58)
│ │ ├─✅─RunWorkflow resolves registered save providers (#58)
│ │ ├─✅─RunWorkflow errors on unknown registered load provider (#58)
│ │ ├─✅─RunWorkflow errors on invalid LoadData formals (#58)
│ │ ├─✅─RunWorkflow errors on invalid SaveData formals (#58)
│ │ └─✅─register_load_provider validates provider signatures (#58)
│ ├─☑️─Feature 53: Filter MakeWorkflowList() to active-only
│ │ ├─✅─.workflow_path resolves package path (#53)
│ │ ├─✅─.workflow_path errors on missing directory (#53)
│ │ ├─✅─.discover_yaml_files returns named character vector (#53)
│ │ ├─✅─ListWorkflows returns named character vector of yaml paths (#53)
│ │ ├─✅─ListWorkflows resolves strPackage (#53)
│ │ ├─✅─ListWorkflows errors on invalid strPath (#53)
│ │ ├─✅─ListWorkflows bRecursive = FALSE only returns top-level files (#53)
│ │ ├─✅─ListWorkflowNames returns AsIs character vector without .yaml (#53)
│ │ ├─✅─ListWorkflowNames includes all workflows regardless of Active (#53)
│ │ ├─✅─ListWorkflowNames resolves strPackage (#53)
│ │ ├─✅─MakeWorkflowList bActiveOnly = TRUE (default) excludes inactive workflows (#53)
│ │ ├─✅─MakeWorkflowList bActiveOnly = FALSE includes all workflows (#53)
│ │ ├─✅─MakeWorkflowList strNames = NULL with bActiveOnly = FALSE includes all workflows (#53)
│ │ ├─✅─.filter_yaml_files NULL strNames returns all (#53)
│ │ ├─✅─.filter_yaml_files exact match works (#53)
│ │ └─✅─.filter_yaml_files partial match works (#53)
│ ├─☑️─Issue 46: [workr] Workflow filename collisions silently overwrite
│ │ ├─✅─pull_workflows does not register missing files as collisions (#46)
│ │ ├─✅─pull_workflows warns on destination collisions by default (#46)
│ │ ├─✅─pull_workflows warns on nested destination collisions in directories (#46)
│ │ └─✅─pull_workflows warns and skips file-vs-directory structural collisions (#46)
│ ├─☑️─Issue 45: [workr] Snapshot silently skips packages that use inst/workflows (plural)
│ │ ├─✅─pull_workflows skips packages with no workflow directory (#45)
│ │ └─✅─pull_workflows warns when only inst/workflows exists (#45)
│ ├─☑️─Issue 43: [workr] Add testthat coverage for pull_workflows and resolve_package
│ │ ├─✅─resolve_package resolves explicit refs via mocked gh api (#43)
│ │ ├─✅─resolve_package uses date-based fallback when ref is not provided (#43)
│ │ ├─✅─resolve_package errors on malformed gh commit lookup response (#43)
│ │ ├─✅─resolve_ref_by_date falls back to default branch when latest release is missing (#43)
│ │ ├─✅─gh_list_contents parses directory entries from mocked gh api (#43)
│ │ ├─✅─pkgManifest writes manifest outputs with mocked GitHub resolution (#43)
│ │ ├─✅─pull_workflows dispatches file and directory entries (#43)
│ │ ├─✅─pull_workflow_file skips write when content lookup is Not Found (#43)
│ │ └─✅─pull_workflow_file writes decoded file when content is available (#43)
│ ├─☑️─Issue 67: `RunProject` regression tests + docs
│ │ ├─✅─github_artifact load provider ignores GITHUB_RUN_ID and honors latest_success in CI (#67)
│ │ ├─✅─github_artifact save provider stamps manifest run_id from GITHUB_RUN_ID (#67)
│ │ ├─✅─RunProject without phase configs preserves flat carry-forward behavior (#67)
│ │ ├─✅─RunProject supports a four-phase configured project scenario (#67)
│ │ ├─✅─RunProject retains fail-fast behavior by default (#67)
│ │ ├─✅─RunWorkflow allows LoadData-only and SaveData-only configs (#67)
│ │ ├─✅─RunWorkflow fails when spec-declared input is absent (#67)
│ │ ├─✅─RunWorkflows retains fail-fast behavior by default (#67)
│ │ └─✅─RunWorkflows continue-on-error records failures and runs later workflows (#67)
│ ├─☑️─Issue 66: Output shaping + optional transform
│ │ ├─✅─RunProject wraps and transforms phase output (#66)
│ │ └─✅─RunProject transform failures identify the transform reference (#66)
│ ├─☑️─Issue 65: Phase input assembly rules
│ │ └─✅─RunProject assembles phase input from config rules (#65)
│ ├─☑️─Issue 64: Per-phase `_config.yaml` schema + validator
│ │ ├─✅─RunProject validates per-phase _config.yaml schema (#64)
│ │ └─✅─RunProject rejects empty or whitespace-only output config strings (#64)
│ ├─☑️─Issue 63: Stabilize `RunProject` baseline
│ │ ├─✅─RunProject discovers phases in alphabetical order by default (#63)
│ │ ├─✅─RunProject runs strPhases in caller order, not sorted (#63)
│ │ ├─✅─RunProject errors when strPath is not a directory (#63)
│ │ └─✅─RunProject warns on empty phase folder and proceeds (#63)
│ ├─☑️─Issue 62: Hook hardening: end-to-end testing, authentication, and documentation
│ │ ├─✅─github_artifact load provider reports required Actions scope on auth failures (#62)
│ │ └─✅─hook providers round-trip data across runs (#62)
│ ├─☑️─Issue 61: GitHub Actions artifact load provider
│ │ ├─✅─github_artifact load provider restores data for an explicit run-id (#61)
│ │ ├─✅─github_artifact load provider resolves latest_success policy (#61)
│ │ ├─✅─github_artifact load provider errors with run-id and policy on missing artifact (#61)
│ │ ├─✅─github_artifact load provider warns and returns partial lData when payloads are missing (#61)
│ │ ├─✅─github_artifact load provider rejects payload paths outside bundle (#61)
│ │ ├─✅─github_artifact load provider restores NULL payload values (#61)
│ │ ├─✅─gh_actions_download_artifact_bundle clears stale extracted contents (#61)
│ │ └─✅─built-in providers are registered together (#59, #60, #61)
│ └─☑️─Issue 60: GitHub Actions artifact save provider
│   ├─✅─github_artifact save provider writes manifest and payload pair (#60)
│   ├─✅─github_artifact save provider clears stale bundle contents (#60)
│   └─✅─built-in providers are registered together (#59, #60, #61)
└─█─Milestone: <none> (2 issues, 11 tests)
  ├─☑️─Issue 34: Finalize inst/workflows and demo Shiny app for shinyapps.io deployment
  │ ├─✅─03_AEKRI directory does not exist (#34)
  │ ├─✅─03_KRI initData.R does not reference gsm.core::lSource (#34)
  │ ├─✅─03_KRI initData.R does not reference PD domain (#34)
  │ ├─✅─03_KRI initData.R does not reference clindata package (#34)
  │ ├─✅─03_KRI initData.R returns Raw_SUBJ and Raw_AE (#34)
  │ ├─🚫─03_KRI RunWorkflows completes without error using initData (#34)
  │ └─✅─README contains link to hosted shinyapps.io demo (#34)
  └─☑️─Feature 9: Create Test data to initialize workflows
    ├─✅─loadExample returns input data when initData.R is missing (#9, #26)
    ├─✅─loadExample loads initData.R and merges with lData (#9, #26)
    ├─✅─loadExample validates initData return type (#9, #26)
    └─✅─loadExample does not create duplicate names on repeated calls (#9, #26)
# Issue state: 📥 = open, ☑️ = closed (completed), ⛔ = closed (won't fix)
# Test disposition: ✅ = passed, ❌ = failed, 🚫 = skipped
⚠️ 1 test generated warnings

🟢 All issues have at least one test

🙈 10 issues with label "qcthat-nocov" were ignored


This report was generated by this GitHub Actions job.

Reports generated: 2026-07-17 19:21:12 UTC

Session Info ─ Session info ───────────────────────────────────────────────────────────────

setting value

version R version 4.6.1 (2026-06-24)

os Ubuntu 24.04.4 LTS

system x86_64, linux-gnu

ui X11

language (EN)

collate C.UTF-8

ctype C.UTF-8

tz UTC

date 2026-07-17

pandoc 3.8.3 @ /opt/hostedtoolcache/pandoc/3.8.3/x64/pandoc

quarto 1.9.38 @ /usr/local/bin/quarto

─ Packages ───────────────────────────────────────────────────────────────────

package * version date (UTC) lib source

arrow 25.0.0 2026-07-16 [1] RSPM

askpass 1.2.1 2024-10-04 [1] RSPM

assertthat 0.2.1 2019-03-21 [1] RSPM

astgrepr 0.1.1 2025-06-07 [1] RSPM

backports 1.5.1 2026-04-03 [1] RSPM

base * 4.6.1 2026-06-24 [3] local

base64enc 0.1-6 2026-02-02 [1] RSPM

bit 4.6.0 2025-03-06 [1] RSPM

bit64 4.8.2 2026-05-19 [1] RSPM

blob 1.3.0 2026-01-14 [1] RSPM

boot 1.3-32 2025-08-29 [3] CRAN (R 4.6.1)

brio 1.1.5 2024-04-24 [1] RSPM

bslib 0.11.0 2026-05-16 [1] RSPM

cachem 1.1.0 2024-05-16 [1] RSPM

callr 3.8.0 2026-06-05 [1] RSPM

checkmate 2.3.4 2026-02-03 [1] RSPM

class 7.3-23 2025-01-01 [3] CRAN (R 4.6.1)

cli 3.6.6 2026-04-09 [1] RSPM

clipr 0.8.1 2026-05-25 [1] RSPM

cluster 2.1.8.2 2026-02-05 [3] CRAN (R 4.6.1)

codetools 0.2-20 2024-03-31 [3] CRAN (R 4.6.1)

commonmark 2.0.0 2025-07-07 [1] RSPM

compiler 4.6.1 2026-06-24 [3] local

covr 3.6.5 2025-11-09 [1] RSPM

crayon 1.5.3 2024-06-20 [1] RSPM

credentials 2.0.3 2025-09-12 [1] RSPM

curl 7.1.0 2026-04-22 [1] RSPM

datasets * 4.6.1 2026-06-24 [3] local

DBI 1.3.0 2026-02-25 [1] RSPM

dbplyr 2.6.0 2026-06-17 [1] RSPM

desc 1.4.3 2023-12-10 [1] RSPM

diffobj 0.3.6 2025-04-21 [1] RSPM

digest 0.6.39 2025-11-19 [1] RSPM

dplyr 1.2.1 2026-04-03 [1] RSPM

duckdb 1.5.4.3 2026-07-10 [1] RSPM

emoji 16.0.0 2024-10-28 [1] RSPM

evaluate 1.0.5 2025-08-27 [1] RSPM

fastmap 1.2.0 2024-05-15 [1] RSPM

fontawesome 0.5.3 2024-11-16 [1] RSPM

foreign 0.8-91 2026-01-29 [3] CRAN (R 4.6.1)

fs 2.1.0 2026-04-18 [1] RSPM

generics 0.1.4 2025-05-09 [1] RSPM

gert 2.3.1 2026-01-11 [1] RSPM

gh 1.6.0.9000 2026-07-17 [1] Github (r-lib/gh@e5e7f37)

git2r 0.36.2 2025-03-29 [1] RSPM

gitcreds 0.1.2 2022-09-08 [1] RSPM

glue 1.8.1 2026-04-17 [1] RSPM

graphics * 4.6.1 2026-06-24 [3] local

grDevices * 4.6.1 2026-06-24 [3] local

grid 4.6.1 2026-06-24 [3] local

gsm.datasim 2.0.0 2026-07-17 [1] Github (Gilead-BioStats/gsm.datasim@2efb710)

highr 0.12 2026-03-06 [1] RSPM

htmltools 0.5.9 2025-12-04 [1] RSPM

httpuv 1.6.17 2026-03-18 [1] RSPM

httr 1.4.8 2026-02-13 [1] RSPM

httr2 1.3.0 2026-07-13 [1] RSPM

ini 0.3.1 2018-05-20 [1] RSPM

jquerylib 0.1.4 2021-04-26 [1] RSPM

jsonlite 2.0.0 2025-03-27 [1] RSPM

KernSmooth 2.23-26 2025-01-01 [3] CRAN (R 4.6.1)

knitr 1.51 2025-12-20 [1] RSPM

later 1.4.8 2026-03-05 [1] RSPM

lattice 0.22-9 2026-02-09 [3] CRAN (R 4.6.1)

lifecycle 1.0.5 2026-01-08 [1] RSPM

logger 0.4.2 2026-05-10 [1] RSPM

lubridate 1.9.5 2026-02-04 [1] RSPM

magrittr 2.0.5 2026-04-04 [1] RSPM

MASS 7.3-65 2025-02-28 [3] CRAN (R 4.6.1)

Matrix 1.7-5 2026-03-21 [3] CRAN (R 4.6.1)

memoise 2.0.1 2021-11-26 [1] RSPM

methods * 4.6.1 2026-06-24 [3] local

mgcv 1.9-4 2025-11-07 [3] CRAN (R 4.6.1)

mime 0.13 2025-03-17 [1] RSPM

nlme 3.1-169 2026-03-27 [3] CRAN (R 4.6.1)

nnet 7.3-20 2025-01-01 [3] CRAN (R 4.6.1)

openssl 2.4.2 2026-06-09 [1] RSPM

otel 0.2.0 2025-08-29 [1] RSPM

pak 0.10.0 2026-06-07 [1] RSPM (R 4.6.0)

parallel 4.6.1 2026-06-24 [3] local

pillar 1.11.1 2025-09-17 [1] RSPM

pkgbuild 1.4.8 2025-05-26 [1] RSPM

pkgconfig 2.0.3 2019-09-22 [1] RSPM

pkgload 1.5.3 2026-06-15 [1] RSPM

praise 1.0.0 2015-08-11 [1] RSPM

prettyunits 1.2.0 2023-09-24 [1] RSPM

processx 3.9.0 2026-04-22 [1] RSPM

promises 1.5.0 2025-11-01 [1] RSPM

ps 1.9.3 2026-04-20 [1] RSPM

purrr 1.2.2 2026-04-10 [1] RSPM

qcthat 1.1.3 2026-07-17 [1] Github (Gilead-Public/qcthat@e627805)

R6 2.6.1 2025-02-15 [1] RSPM

rappdirs 0.3.4 2026-01-17 [1] RSPM

rcmdcheck 1.4.0 2021-09-27 [1] any (@1.4.0)

Rcpp 1.1.2 2026-07-05 [1] RSPM

remotes 2.5.0 2024-03-17 [1] RSPM (R 4.6.0)

rex 1.2.2 2026-03-28 [1] RSPM

rlang 1.3.0 2026-07-05 [1] RSPM

rmarkdown 2.31 2026-03-26 [1] RSPM

rpart 4.1.27 2026-03-27 [3] CRAN (R 4.6.1)

rprojroot 2.1.1 2025-08-26 [1] RSPM

rrapply 1.2.8 2025-11-25 [1] RSPM

rstudioapi 0.19.0 2026-06-11 [1] RSPM

sass 0.4.10 2025-04-11 [1] RSPM

sessioninfo 1.2.4 2026-06-04 [1] any (@1.2.4)

shiny 1.14.0 2026-06-21 [1] RSPM

sourcetools 0.1.7-2 2026-03-28 [1] RSPM

spatial 7.3-18 2025-01-01 [3] CRAN (R 4.6.1)

splines 4.6.1 2026-06-24 [3] local

stats * 4.6.1 2026-06-24 [3] local

stats4 4.6.1 2026-06-24 [3] local

stringi 1.8.7 2025-03-27 [1] RSPM

stringr 1.6.0 2025-11-04 [1] RSPM

survival 3.8-6 2026-01-16 [3] CRAN (R 4.6.1)

sys 3.4.3 2024-10-04 [1] RSPM

tcltk 4.6.1 2026-06-24 [3] local

testthat 3.3.2 2026-01-11 [1] RSPM

tibble 3.3.1 2026-01-11 [1] RSPM

tictoc 1.2.1 2024-03-18 [1] RSPM

tidyr 1.3.2 2025-12-19 [1] RSPM

tidyselect 1.2.1 2024-03-11 [1] RSPM

timechange 0.4.0 2026-01-29 [1] RSPM

tinytex 0.60 2026-06-16 [1] RSPM

tools 4.6.1 2026-06-24 [3] local

usethis 3.2.1 2025-09-06 [1] RSPM

utf8 1.2.6 2025-06-08 [1] RSPM

utils * 4.6.1 2026-06-24 [3] local

vctrs 0.7.3 2026-04-11 [1] RSPM

waldo 0.6.2 2025-07-11 [1] RSPM

whisker 0.4.1 2022-12-05 [1] RSPM

withr 3.0.3 2026-06-19 [1] RSPM

workr 1.1.0 2026-07-17 [1] local

xfun 0.60 2026-07-09 [1] RSPM

xopen 1.0.1 2024-04-25 [1] RSPM

xtable 1.8-8 2026-02-22 [1] RSPM

yaml 2.3.12 2025-12-10 [1] RSPM

zip 3.0.1 2026-07-13 [1] RSPM

[1] /home/runner/work/_temp/Library

[2] /opt/R/4.6.1/lib/R/site-library

[3] /opt/R/4.6.1/lib/R/library

  • ── Packages attached to the search path.

──────────────────────────────────────────────────────────────────────────────