How a maintainer reviews PRs and prepares a release, and how a future part-time
technical maintainer can be onboarded safely. Roles are defined in
MAINTAINERS.md.
Merge rights expand with demonstrated trust, never all at once. The founder retains final release approval at every stage.
| Stage | What they can do |
|---|---|
| Month 1 | Triage and comment only — label issues, request changes, review PRs. No merge. |
| Months 2–3 | Merge docs-only PRs and simple CI/docs fixes. |
| After trust is established | Merge non-medical PRs (refactors, tests, packaging, CI). Prepare release drafts. |
| Always | Final release approval stays with the founder. Anything touching clinical/research scope or a medical claim needs Clinical-Lead sign-off. |
- CI is green (
.github/workflows/validate.yml). - The PR states its type (skill / detector / docs / CI / release) and whether it changes a medical/research claim (if yes → founder review).
- Catalog consistency: if a skill / checklist / journal profile / detector was
added or removed,
metadata/catalog_counts.jsonand the generated catalogs were updated andpython3 scripts/validate_catalog_consistency.pypasses. - No PHI, private paths, manuscript IDs, or unsupported medical claims
(see
CONTRIBUTING.mdandSECURITY.md). - New deterministic scripts ship a challenge/regression test wired into CI.
A release is cut from main by pushing a version tag; release.yml builds the
ZIPs (with an injected, verified provenance.json), attests their build provenance,
verifies they are consumable by the self-updater, creates the GitHub Release, and
Zenodo archives it.
One-time setup: in repo Settings → Environments, create a release environment
and add yourself as a required reviewer. The release job then pauses for your approval
before publishing. (The workflow names the environment unconditionally; without the setting
it simply does not gate.)
- Decide the version honestly (see "Versioning" below).
- Sync versions in one commit:
CHANGELOG.md— move[Unreleased]to[x.y.z]with today's date.CITATION.cff—version+date-released.package.json—version(npm).README.md— "What's New" entry.
- Regenerate the distribution manifest + catalogs:
python3 scripts/gen_distribution_manifest.py— refreshesdistribution_manifest.json(version, fromCITATION.cff) + thedistribution_files.jsoninventory. Runcheck_version_consistency.pyto confirm CITATION == package.json == manifest.- If skill/detector counts changed:
gen_skills_catalog_json.py,gen_detectors_catalog_json.py,gen_marketplace_json.py(then--checkeach) andvalidate_catalog_consistency.py.
- Tag
vX.Y.Zand push →release.ymlruns. It gates on the version-consistency check (tag must equal the manifest version), pauses forrelease-environment approval, attests the ZIPs, verifies each is updater-consumable, publishes the GitHub Release, and then publishes to npm (idempotent, with npm provenance — needs theNPM_TOKENrepo secret; skips if that version is already on npm). Approve the run, then confirm the GitHub Release, npm (npm view medsci-skills version), and the Zenodo archive.- One-time: add an
NPM_TOKENrepo secret — a granular/automation npm token scoped tomedsci-skillswith publish rights and 2FA bypass enabled (a 2FAauth-and-writesaccount otherwise demands an OTP the CI cannot provide). Without the secret the npm step is skipped and you publish manually (npm publish --otp=<code>).
- One-time: add an
- Sync downstream surfaces that live outside this repo's CI: the homepage
skills.jsoncounts and any hero-skill mirrors (sync_hero_skill.py). - Record evidence — refresh
IMPACT.md(run the metrics snapshot before the release commit so the bot commit is in place) and log any new citations / named use.
A compromised-release revocation procedure is in SECURITY.md
("Release integrity & revocation").
Semantic versioning, read honestly:
- Patch (x.y.Z) — critical install / CI / broken-workflow fixes.
- Minor (x.Y.z) — new skills, detectors, checklists, or docs; additive, backward-compatible changes (the common case here).
- Major (X.y.z) — a structural or breaking change: an install-layout change, a skill removal/merge/rename, or an output-path change. A major bump is reserved for a real break, not for a large additive release — version inflation reads as a credibility tell to an academic audience.
Release notes distinguish: Added / Changed / Fixed / Deprecated / Validation-Evidence / Breaking changes / Documentation.