Skip to content

Prepare safetyGraphics 2.2.0 for resubmission to CRAN (hold until safetyCharts is accepted) - #729

Draft
jwildfire wants to merge 5 commits into
SafetyGraphics:devfrom
jwildfire:remove-tendril
Draft

Prepare safetyGraphics 2.2.0 for resubmission to CRAN (hold until safetyCharts is accepted)#729
jwildfire wants to merge 5 commits into
SafetyGraphics:devfrom
jwildfire:remove-tendril

Conversation

@jwildfire

Copy link
Copy Markdown
Contributor

Draft on purpose. Do not merge or submit this until safetyCharts has been accepted to CRAN — not merely submitted. Two placeholders in cran-comments.md (<VERSION> and <DATE>) cannot be filled in until that day, and the file carries an HTML comment saying so.

Why

safetyGraphics was archived from CRAN on 2026-03-25. It has never used Tendril directly — it was archived because it imports safetyCharts, which did. CRAN traces that indirectly by policy.

So there is no Tendril removal to do here. The work in this branch is everything else the resubmission needs.

What changed

  • Version to 2.2.0. The last version on CRAN was 2.1.1, so it had to increase. This release also carries the work that accumulated between 2.1.1 and the archival, which is described in NEWS.md.
  • Return values documented on every exported function, which R CMD check --as-cran requires and which was the largest single source of check output.
  • profileTab()'s load-on-demand behaviour restored.
  • Two false statements corrected in the NEWS entry, and one in cran-comments.md that asserted something not yet true.

The order matters, and getting it wrong costs a second archival

The companion pull request is SafetyGraphics/safetyCharts#158. It goes first and alone.

A CRAN team member has stated in public that dependents of a package still missing from the archive are archived automatically. Submitting safetyGraphics while safetyCharts is only in review would therefore archive safetyGraphics a second time, in the middle of un-archiving it. Acceptance, not submission, is the gate.

What is not established

CRAN documents no un-archive procedure at all. Whether the archival reason is required in the comment box, whether there is a separate review queue, whether there is a waiting period, and how long review takes are all unverified and are not asserted anywhere in this branch.

Context: requirement jwildfire/obot.roadmap#281 and the decision page.


This PR was drafted by Claude Code using Opus 5 and reviewed by @jwildfire

safetyGraphics was archived from CRAN on 2026-03-25 for requiring the
archived package Tendril, via its dependency on safetyCharts. safetyCharts
0.5.0 drops Tendril, but safetyGraphics does not simply follow: the tree has
27 unreleased commits sitting under the same version number CRAN archived,
and R CMD check --as-cran refuses it outright.

- Bump 2.1.1 -> 2.2.0. CRAN reports "Insufficient package version
  (submitted: 2.1.1, existing: 2.1.1)" otherwise; the incoming check requires
  a version strictly greater than the highest one in the CRAN archive.
- Drop safetyProfile from Suggests. It has never been on CRAN — no package
  page, no archive entry — so the check fails with "Package suggested but not
  available". The patient profile tab is unchanged for anyone who has
  safetyProfile loaded; it now resolves through getExportedValue() behind the
  same isNamespaceLoaded() guard the other optional packages use.
- Declare cli in Imports. cli::cli_alert_info() was called by the profile tab
  without cli appearing anywhere in DESCRIPTION, which is a check WARNING.
- Document the config argument of homeTab(), safetyGraphicsServer() and
  safetyGraphicsUI(), which was a check WARNING.
- Fix the getChartStatus() example, which was a check ERROR: it called map(),
  distinct(), filter() and others unqualified, none of which safetyGraphics
  exports.
- Regenerate NAMESPACE. The checked-in copy had drifted from the roxygen
  comments, importing set_names from purrr rather than rlang.
- Drop LazyData: true; there is no data/ directory.
- Update nine redirected URLs in the Technical FAQ vignette.
- Ignore R/_disable_autoload.R at build time; a leading underscore is not a
  valid R file name and R CMD build was excluding it with a warning.
- Raise the safetyCharts floor to >= 0.5.0, the version that drops Tendril.
- Replace cran-comments.md, which claimed "no ERRORs, WARNINGs or NOTEs" on
  R 4.1.0 and rhub environments that no longer exist.
- NEWS.md entry for 2.2.0.

Worker: W0084
Audited both packages' Rd files for missing \value against the last
CRAN-accepted tarball of each. safetyCharts now has none at all, against two
in the accepted 0.3.0. safetyGraphics had 33, of which exactly one --
chartsNavUI -- was added since the accepted 2.1.1. That one is fixed, so this
release adds no new gap; the other 32 have CRAN precedent and are left for a
separate pass rather than folded into a resubmission.

Worker: W0084
Found by an adversarial audit of this branch.

- "Stray print() calls removed from the app" was false. The prints removed by
  9f90959 had been introduced after the 2.1.1 CRAN release, so relative to what
  CRAN shipped nothing changed; print(charts) at R/mod_settingsCharts.R:53 is
  byte-identical to 2.1.1 and is still there. The line is removed rather than
  the print, because removing it is a behaviour change with CRAN precedent
  against it being a defect.
- The undeclared cli::cli_alert_info() call is in safetyGraphicsServer(), not
  in the profile tab module. Corrected.

Worker: W0084
…ts.md

asserting something that is not yet true

Both found by an adversarial audit of this branch.

- profileTab() had gained an isNamespaceLoaded() guard it never had. The
  original called safetyProfile::profile_server() unconditionally, and `::`
  loads an installed namespace on demand — so with safetyProfile installed but
  not yet loaded, the original started the module and the guarded version
  returned NULL silently. Guard removed. getExportedValue() was verified to
  match `::` exactly: it loads an installed-but-unloaded namespace and errors
  when the package is absent. profileTabUI() keeps its guard, which it always
  had.
- profileTabUI()'s change is a bug fix, not a no-op, and is now documented as
  one: the original called profile_ui() unqualified, so a loaded-but-unattached
  safetyProfile produced "could not find function".
- cran-comments.md stated "'safetyCharts' has been updated to remove 'Tendril'
  and is back on CRAN". It is not; it is still archived and has not been
  submitted. That is the same defect this branch removed from the previous
  cran-comments.md. Replaced with a blocking HTML comment and fill-in-the-date
  placeholders so it cannot be pasted into the submission form before it is
  true.
- Tenth redirected URL in the Technical FAQ vignette, missed on the first pass:
  shiny.rstudio.com/tutorial/written-tutorial/lesson7 now resolves to
  shiny.posit.co/r/getstarted/shiny-basics/lesson7. NEWS count corrected, and
  the d-wise link described accurately as an Internet Archive substitute rather
  than a redirect.

Worker: W0084
Missing \value is the most common CRAN ask on a new submission, and an
archived package is reviewed as one. An audit against the last CRAN-accepted
tarball found 32 exported functions with no \value section -- essentially the
whole Shiny module layer, plus safetyGraphicsApp(), safetyGraphicsInit(),
makeChartParams(), makeChartSummary() and generateMappingList(). All are now
documented, from each function's actual terminal expression rather than from
its name: UI functions state the UI object they build, module servers that
exist for their side effects say so plainly, and the two that return reactives
say which reactive.

Also pre-empts the reviewer question about safetyProfile in cran-comments.md:
it is a GitHub-only package declared in no DESCRIPTION field, and the comment
now explains why and invites CRAN to say if they want it handled differently.

Worker: W0084
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant