0003. Mirror upstream Bioconductor policy rather than fork it
- Status: Accepted
- Date: 2026-09-03
- Deciders: @lwaldron, @ybaeus, with review input from @LiNk-NY on #24
Context and Problem Statement
The bioc-pkg-dev skill (#24) summarizes contributions.bioconductor.org - 33 chapters maintained upstream in Bioconductor/pkgrevdocs - into 21 files under skills/bioc-pkg-dev/knowledge/. Upstream moves twice a year with the release cycle and is edited in between. A summary that has silently drifted is worse than none, because the skill’s output is a submit-or-not verdict.
Review of #24 exposed the harder half. Upstream is not always self-consistent: r-code forbade . in function names and one bullet later required it for internal helpers; reviewer eligibility differed between the volunteer and expectations chapters. Fixing those in the skill would have been the obvious move and the wrong one. The same review also produced a plausible but incorrect correction - an automated reviewer flagged Bioconductor/BiocContributions as a typo, and @LiNk-NY confirmed the original was right.
Decision
Treat skills/bioc-pkg-dev/knowledge/ as a mirror of upstream policy, not a second source of it.
-
Mirror faithfully. Each file is a derived summary citing its chapters in a
Source:footer. Where skill and upstream disagree, upstream wins. -
Fix errors upstream, then sync down. A contradiction found while writing or using the skill becomes a
pkgrevdocspull request; the skill changes only once that lands. Precedent, both from the #24 review and both merged: pkgrevdocs#181 (.in function names) and pkgrevdocs#182 (reviewer eligibility). -
Keep a machine-checkable sync baseline in
knowledge/SOURCES.md: dated pins for every tracked upstream (pkgrevdocscommit SHA,BiocContributionsissue-template blob,BiocCheckandbiocthisversions, the Bioconductor release/devel/R triple), a map from each upstream.Rmdto its rendered slug and knowledge file, and the endpoints that make drift detectable. Refreshes are then scoped: compare live upstream to the pins, re-derive only the mapped files. The slug column is required because the names differ (package-maintainence.Rmdrenders topackage-maintenance.html) - drift arrives as.Rmdnames, citations are by slug. -
Mark, source and date anything not from upstream prose. Two kinds: facts read from tool source (BiocCheck’s 80% runnable-example threshold in
checkExportsAreDocumented(), observedbiocthisbehavior), which expire on their own schedule; and deliberate local additions. Exactly one exists -knowledge/development/ai-policy.mdrecommends theCo-authored-by:trailer, added at @lwaldron’s request in #24, where upstream gives onlyAssisted-by:andCode copied from:. It elaborates rather than contradicts, but per decision 2 it belongs upstream; until then it is the one tracked deviation and must survive re-syncs deliberately. -
Non-summary behavior lives in its own skill; existing skills are invoked, not restated.
build-check-bioccheckwas split out and is called for the gate step, following the composition patternanalyze-r-packageset withcreate-package-instructions;metadata-files.mdlikewise points NEWS authoring atupdate-r-news. The gate becomes reusable, andknowledge/stays summary-only. -
Where upstream names a vendor, keep the vendor name. Upstream cites GitHub Actions and
biocthisshipsuse_bioc_github_action(). Automated review called this an Agent Neutrality violation; @lwaldron granted an explicit exception in #24. Neutrality governs agent platforms, not the CI vendors upstream itself names - neutralizing the wording would make the summary say something upstream does not.
Alternatives Considered
- Correct upstream errors in the summaries. Rejected: silent divergence, no record of what changed or why, a conflict at every sync, and no way for a reader to separate policy from opinion. The incorrect
BiocContributions“fix” in #24 shows how convincing such an edit can look. - Track deviations with inline markup, or hold them in a re-applied patch file. Both raised in #24, both rejected as machinery bought before it is needed; a patch file also rots faster than the text it patches, breaking on rewordings that changed no policy.
- Link upstream instead of summarizing. Rejected: agents need the rules in context at decision time, and the gate must be stated as thresholds, not fetched per invocation.
- Trim
knowledge/to a core subset, as offered in #23. Rejected once mirroring was chosen: the file count follows the chapter map, and collapsing files breaks the mapping scoped refreshes depend on. - Keep build/check inside
bioc-pkg-dev. Rejected: it is useful beyond submission prep, and would plant permanent non-mirrored content inside a mirrored tree.
Consequences
- Fixing a policy error is slower and gated on upstream review. Accepted: both #24 upstream pull requests merged.
SOURCES.mdmust not go stale. Unadvanced pins make drift detection report “no change” and be silently wrong; updating them is part of a refresh, not follow-up.- First drift already caught: as of 2026-09-03 the
pkgrevdocspin is two commits behinddevel- the #181 and #182 merges - soknowledge/development/r-code.mdandknowledge/reviewer.mdstill carry the pre-fix wording this repository asked upstream to change. Bumping the pin and re-deriving those two files is the immediate follow-up. - Sync pull requests stay reviewable: a pin bump plus only the mapped files. Anything else in the diff is a deviation and needs justifying.
- A deliberate deviation now needs an ADR amending this one, not a quiet edit.
build-check-bioccheckmust stay independently invocable.- The boundary is enforced by convention and review only - no CI check compares a knowledge file to the chapter it cites, so a stale pin stays invisible until someone looks.