From 30e14f5116bfbd2061aacae8bbb275f868c69e46 Mon Sep 17 00:00:00 2001 From: Gavin Medley <7018964+medley56@users.noreply.github.com> Date: Sun, 13 Sep 2026 05:30:59 +0000 Subject: [PATCH 1/3] Add Zenodo concept DOI and date-released to CITATION.cff CITATION.cff declared no persistent identifier, so GitHub's "Cite this repository" widget and cffconvert produced citations carrying only the repository URL. Add the Zenodo CONCEPT DOI (10.5281/zenodo.7735001) via an identifiers: block rather than a top-level doi: with a version DOI. A version DOI only exists on Zenodo after a release is archived, which happens after the tag is pushed -- and the tag push comes after the point in the release process where CITATION.cff is hand-edited (step 3 of the release checklist). That ordering means a version DOI could never be filled in accurately at the time the file is edited, so it would routinely ship pointing at the PREVIOUS release: worse than no DOI at all. The concept DOI is version-agnostic, always resolves to the newest release, and needs no maintenance. Also add date-released so the generated BibTeX/APA citations carry a year, which is not derivable from anything else in the file. The value is quoted because the CFF 1.2.0 schema types date-released as a string; unquoted, YAML would parse it as a date and fail strict validation. Widen the existing release-checklist step that already hand-edits CITATION.cff to cover the new field so it does not go stale. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 5 +++++ CITATION.cff | 5 +++++ docs/source/developers.md | 3 ++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7eb1b56..842606ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 non-CCSDS definitions must pass `root_container_name` (the default is `CCSDSPacket`), and shows how a custom generator is passed to `create_dataset`. The Examples page links to the new script. [#190](https://github.com/lasp/space_packet_parser/issues/190) +- Add the Zenodo concept DOI (`10.5281/zenodo.7735001`) and `date-released` to `CITATION.cff`, so + GitHub's "Cite this repository" widget, `cffconvert`, and the BibTeX/APA exports they drive emit a + persistent identifier and a release year instead of only the repository URL. The concept DOI is + version-agnostic and always resolves to the latest release. + [#280](https://github.com/lasp/space_packet_parser/issues/280) ### Fixed diff --git a/CITATION.cff b/CITATION.cff index 6eb72543..23697d6d 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -3,6 +3,7 @@ message: "If you use this software, please cite it as below." title: 'space_packet_parser' type: software version: '6.2.0' +date-released: "2026-09-13" license: BSD-3-Clause abstract: The Space Packet Parser Python library is a generalized, configurable packet decoding library for CCSDS telemetry packets based on the XTCE standard for packet structure definitions. It supports complex and polymorphic @@ -31,3 +32,7 @@ contact: orcid: "https://orcid.org/0000-0002-3520-9715" repository-code: "https://github.com/lasp/space_packet_parser" url: "https://space-packet-parser.readthedocs.io" +identifiers: +- type: doi + value: 10.5281/zenodo.7735001 + description: Concept DOI resolving to the latest release of space_packet_parser diff --git a/docs/source/developers.md b/docs/source/developers.md index 20deb983..2a8fbb95 100644 --- a/docs/source/developers.md +++ b/docs/source/developers.md @@ -75,7 +75,8 @@ That is, 2. Bump the version of the package to the version you are about to release by manually editing the `version` field in the `[project]` section of `pyproject.toml`. -3. Update the version identifier in `CITATION.cff` and `meta.yaml`. +3. Update the version identifier in `CITATION.cff` and `meta.yaml`, and set `date-released` in + `CITATION.cff` to the release date (`YYYY-MM-DD`, quoted). 4. Update `CHANGELOG.md` to ensure the release notes for the version to be published is at the top and revisit `README.md` to keep it up to date. From fd647fa8729ab4daa1ea4102ace23f8710cf133a Mon Sep 17 00:00:00 2001 From: Gavin Medley <7018964+medley56@users.noreply.github.com> Date: Sun, 13 Sep 2026 05:32:32 +0000 Subject: [PATCH 2/3] Drop the cffconvert claim from the CHANGELOG entry cffconvert cannot read CITATION.cff at all: the file has pre-existing CFF 1.2.0 violations (root-level 'description' and 'maintainers' are not valid CFF keys, 'orcid' needs a full URI, and 'message' is missing) that are unrelated to this change and are left for a follow-up. Claiming the BibTeX/APA exports now carry the DOI would be true only after that fix. GitHub's widget is more lenient and does read the DOI today. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 842606ba..20016cf3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,11 +16,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 non-CCSDS definitions must pass `root_container_name` (the default is `CCSDSPacket`), and shows how a custom generator is passed to `create_dataset`. The Examples page links to the new script. [#190](https://github.com/lasp/space_packet_parser/issues/190) -- Add the Zenodo concept DOI (`10.5281/zenodo.7735001`) and `date-released` to `CITATION.cff`, so - GitHub's "Cite this repository" widget, `cffconvert`, and the BibTeX/APA exports they drive emit a - persistent identifier and a release year instead of only the repository URL. The concept DOI is - version-agnostic and always resolves to the latest release. - [#280](https://github.com/lasp/space_packet_parser/issues/280) +- Add the Zenodo concept DOI (`10.5281/zenodo.7735001`) and `date-released` to `CITATION.cff`, so the + citation metadata carries a persistent identifier and a release year rather than only the + repository URL. GitHub's "Cite this repository" widget reads both. The concept DOI is + version-agnostic and always resolves to the latest release, so it needs no maintenance at release + time. [#280](https://github.com/lasp/space_packet_parser/issues/280) ### Fixed From 5dbc3c1d5a6ada3d526cb05855f0f1d892ed39f4 Mon Sep 17 00:00:00 2001 From: Gavin Medley <7018964+medley56@users.noreply.github.com> Date: Thu, 17 Sep 2026 00:06:47 +0000 Subject: [PATCH 3/3] docs(cut-a-release): keep CITATION.cff date-released current - Set date-released in Step 4 alongside the three version bumps, using the actual tag date rather than branch-creation date - Note that check_metadata.py only cross-checks version fields, not date-released, so a stale value goes uncaught - Add a pre-tag check in Step 7 to catch drift if the release branch sat open for days between Step 4 and tagging Co-Authored-By: Claude Sonnet 5 --- .claude/skills/cut-a-release/SKILL.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/.claude/skills/cut-a-release/SKILL.md b/.claude/skills/cut-a-release/SKILL.md index 8082f11f..ce8a450d 100644 --- a/.claude/skills/cut-a-release/SKILL.md +++ b/.claude/skills/cut-a-release/SKILL.md @@ -66,7 +66,7 @@ git checkout -b release/X.Y For a patch release on an existing line, check out the existing `release/X.Y` instead of creating one. -## Step 4 — Bump the version in all three metadata files +## Step 4 — Bump the version in all three metadata files, and refresh `date-released` The version is duplicated in three places and they must match exactly: @@ -77,10 +77,18 @@ The version is duplicated in three places and they must match exactly: | `meta.yaml` | `version` under `package` | There is no `__version__` in the package source — the version is read from package metadata, so -these three files are the whole job. +these three files are most of the job. + +Also set `CITATION.cff`'s `date-released` to the actual release date (`YYYY-MM-DD`, **quoted** — an +unquoted value parses as a YAML date rather than a string and fails CFF validation), i.e. the date +Step 7 will push the tag, not the date the release branch was created. If the branch sits open for a +few days before tagging, come back and correct it just before tagging rather than leaving the +branch-creation date. This field is easy to forget because it lives right next to the fields in the +table above but isn't one of the three cross-checked versions below — nothing catches it going stale. `scripts/check_metadata.py` runs as an `always_run` pre-commit hook and verifies that the name, -description, and version all agree across the three files. It is your safety net here, but run it +description, and version all agree across the three files — it does **not** check `date-released`, +so it will not catch a stale or missing one. It is your safety net for the version fields; run it deliberately rather than discovering a mismatch at commit time: ```bash @@ -138,6 +146,10 @@ If `main` moves while the PR is open, rebase the release branch onto it and reso Only once the maintainer is satisfied with the branch. The tag must be annotated **and signed**. +Before tagging, check `CITATION.cff`'s `date-released` still matches today — the release branch may +have sat open for days since Step 4 set it. If it's stale, fix it, commit, and re-run +`pre-commit run --all-files` before tagging. + ```bash git checkout release/X.Y && git pull git tag -s X.Y.Z -m "Version X.Y.Z"