This guide explains what to do when DataCite publishes a new schema release such as 4.8.
It is written for someone who is new to:
- Git
- GitHub
- branches
- pull requests
- GitHub Actions
- this repository
The goal is simple:
- detect whether DataCite published a new release
- generate a review plan
- approve only the safe changes
- let automation create and update the repo files
- review the output
- merge to
main
If you follow this guide, you should be able to manage a new release without someone walking you through it live.
These are the folders you need to know:
vocab/: controlled vocabulary schemes and term files such asresourceTypeGeneral,relationType, andnameTypeproperty/: one JSON-LD file per DataCite propertyclass/: one JSON-LD file per class or object structurecontext/: JSON-LD key mappings, especiallycontext/fullcontext.jsonldmanifest/: version inventories and release summariesdist/: generated full distribution files for each released versionreports/: review plans and apply reports created during the release process
Think of it this way:
vocab/,property/,class/,context/, andmanifest/release-matrix-*.jsonare the main source filesmanifest/datacite-*.json,dist/, and the generatedindex.htmlfiles are outputs
There are now two separate GitHub Actions workflows for release import:
Detect DataCite ReleaseApply DataCite Release Plan
Do not confuse them.
This workflow:
- checks https://schema.datacite.org/versions.html
- finds the next official DataCite
4.xversion after the latest version already in this repo - reads official docs and XSD files
- writes a machine-readable plan file
- writes a human-readable Markdown review report
- commits both plan files back to the branch by default
- uploads both as an artifact too
This workflow does not change schema source files, but it does create or refresh plan files in reports/.
This workflow:
- reads an approved plan file that already exists in the branch
- runs only the modules you allow
- writes any new source files
- updates the release matrix
- runs the snapshot generator to rebuild outputs
- optionally commits the generated files back to the branch
This workflow does change repo files.
main: the official branchbranch: your safe working copy of the repoworkflow: a GitHub Actionartifact: a downloadable zip file produced by a workflowplan: the JSON file that lists detected release changes and whether each should be appliedmodule: one family of automation, such as controlled vocabularies or simple properties
Use this sequence whenever there is a new DataCite release.
- Create a branch from
main. - Run
Detect DataCite Releaseon that branch. - Open the generated plan file on that branch under
reports/. - Review the JSON plan and change statuses from
proposedtoapply,skip, ormanual. - Commit the approved JSON plan to your branch.
- Run
Apply DataCite Release Planon that branch. - Review the bot commit and workflow artifact.
- Open a pull request into
main. - Merge after review.
- Let the normal deploy workflow publish what was merged to
main.
This is the safest path for beginners.
Open:
Look at the newest 4.x version listed there.
Examples:
- if the newest version on the page is
4.7and this repo already has4.7, there is nothing new to import - if the newest version on the page is
4.8and this repo only has4.7, you need to prepare a4.8upgrade
Important:
- the automation only supports sequential upgrades
- if the repo is on
4.7and DataCite has4.9, you must import4.8first
In GitHub:
- open the repo
- switch to the
mainbranch - create a new branch
Use a branch name like:
upgrade-4.8release-4.8datacite-4.8-import
Do not work directly on main.
In GitHub:
- click
Actions - click
Detect DataCite Release - click
Run workflow - choose your branch in the branch dropdown
Inputs:
version: leave blank to auto-detect the next releaserelease_date: leave blank to use the official date fromversions.htmlcommit_plan_files: leave this astrueso the plan files are written back to the branch automatically
When to fill them manually:
- use
versionif you are rebuilding or testing a specific release - use
release_dateonly if you know the official date and need to override it
When the workflow finishes:
- open the workflow run
- read the summary
- open your branch on GitHub
- open the committed files under
reports/
reports/release-import-plan-4.8.jsonreports/release-import-plan-4.8.md
The Markdown file is the easiest one to read first, but the JSON file is the one you edit.
The JSON plan contains top-level metadata:
localLatestVersionofficialLatestVersiontargetVersionreleaseDatesourcesgeneratedAt
It also contains changes, which is the important list.
Each change has:
idkindmodulesectionstatusconfidencesummaryevidenceinputstargetsnotes
proposed: the detector believes this change is supported and safe enough for review, but it will not run until you approve itapply: you approved this item and want the apply workflow to run itskip: you intentionally do not want to run this itemmanual: this item is ambiguous or unsupported and should not be applied automatically
Important rule:
- nothing should start as
apply - you must review and decide
- edit the JSON file only; the Markdown file is generated for review
These examples show how the JSON plan should look when you approve or reject items.
This is the most common case.
Before:
{
"id": "controlled-list-values-added:resourceTypeGeneral:4.8",
"kind": "controlled-list-values-added",
"module": "controlled-list",
"section": "resourceTypeGeneral",
"status": "proposed",
"confidence": "high",
"summary": "Add resourceTypeGeneral terms: ExampleType",
"evidence": [
"https://schema.datacite.org/versions.html"
],
"inputs": {
"descriptorId": "resourceTypeGeneral"
},
"targets": [
"vocab/resourceTypeGeneral/resourceTypeGeneral.jsonld",
"vocab/resourceTypeGeneral/ExampleType.jsonld"
],
"notes": []
}After:
{
"id": "controlled-list-values-added:resourceTypeGeneral:4.8",
"kind": "controlled-list-values-added",
"module": "controlled-list",
"section": "resourceTypeGeneral",
"status": "apply",
"confidence": "high",
"summary": "Add resourceTypeGeneral terms: ExampleType",
"evidence": [
"https://schema.datacite.org/versions.html"
],
"inputs": {
"descriptorId": "resourceTypeGeneral"
},
"targets": [
"vocab/resourceTypeGeneral/resourceTypeGeneral.jsonld",
"vocab/resourceTypeGeneral/ExampleType.jsonld"
],
"notes": []
}The only required change there is:
"status": "apply"
Use this when you reviewed a change and do not want automation to run it.
{
"id": "simple-property-added:exampleProperty:4.8",
"kind": "simple-property-added",
"module": "simple-property",
"section": "exampleProperty",
"status": "skip",
"confidence": "high",
"summary": "Add simple property exampleProperty",
"evidence": [],
"inputs": {},
"targets": [],
"notes": [
"Skipped intentionally pending manual design review."
]
}Use this when the detector found something real, but it is not safe to automate yet.
{
"id": "xsd-element-added:complexThing:4.8",
"kind": "xsd-element-added",
"module": "complex-structure",
"section": "complexThing",
"status": "manual",
"confidence": "low",
"summary": "Review unsupported added schema element complexThing",
"evidence": [],
"inputs": {},
"targets": [],
"notes": [
"No matching blueprint exists yet."
]
}Rename items need more than a status change.
{
"id": "controlled-list-rename-candidate:relationType:4.8",
"kind": "controlled-list-rename-candidate",
"module": "rename",
"section": "relationType",
"status": "apply",
"confidence": "low",
"summary": "Review rename candidates in relationType",
"evidence": [],
"inputs": {
"descriptorId": "relationType",
"replacement": "OldValue",
"renameTo": "NewValue",
"orderedTerms": [
"IsCitedBy",
"Cites",
"NewValue"
],
"newTermDetails": {
"prefLabel": "NewValue",
"definition": "Official DataCite definition here.",
"scopeNote": "Optional usage note.",
"example": [
"<relatedIdentifier relationType=\"NewValue\">10.1234/example</relatedIdentifier>"
]
},
"preserveHistoricalFile": true,
"dropReplacedFromScheme": true
},
"targets": [],
"notes": [
"Approved rename after manual review."
]
}Removal items also need explicit instructions.
{
"id": "controlled-list-values-removed:descriptionType:4.8",
"kind": "controlled-list-values-removed",
"module": "removal",
"section": "descriptionType",
"status": "apply",
"confidence": "medium",
"summary": "Review removed descriptionType terms: DeprecatedValue",
"evidence": [],
"inputs": {
"descriptorId": "descriptionType",
"removedValues": [
"DeprecatedValue"
],
"preserveHistoricalFile": true,
"dropRemovedFromScheme": true
},
"targets": [],
"notes": [
"Approved removal from the new current version only."
]
}For non-vocabulary removals where you want the current context cleaned up too:
{
"id": "element-removed:oldProperty:4.8",
"kind": "xsd-element-removed",
"module": "removal",
"section": "oldProperty",
"status": "apply",
"confidence": "medium",
"summary": "Review removed schema element oldProperty",
"evidence": [],
"inputs": {
"propertyName": "oldProperty",
"preserveHistoricalFile": true,
"dropFromCurrentContext": true,
"contextKeys": [
"oldProperty"
]
},
"targets": [],
"notes": [
"Remove from the current context only after review."
]
}These are the module families used by the apply workflow:
controlled-list: new vocabulary terms and scheme updatessimple-property: one new property file plus optional context and release-matrix updatesproperty-group: grouped property additions under an existing areacomplex-structure: larger structures such asRelatedItemorFundingReferencerename: rename or replacement cases that need explicit instructionsremoval: removed values or fields that need explicit instructions
These are good candidates for automatic application:
- new controlled vocabulary terms in existing appendix-backed lists
- new simple properties
- some grouped property additions
- some known larger structures if they match an existing blueprint
These are not safe to auto-apply without review:
- removals
- renames
- deprecated terms
- complex structural changes the repo has never seen before
- anything that appears in the plan as
manual
This is the main improvement in the new flow.
The detect workflow now commits the plan files back to the branch by default.
That means you can stay in GitHub and edit:
reports/release-import-plan-<version>.json
You do not need to download an artifact, edit it locally, and upload it again.
Open reports/release-import-plan-<version>.json.
For each change:
- leave it as
manualif it needs human work - change
statustoapplyif you want automation to run it - change
statustoskipif you do not want it applied
Examples:
- if DataCite added a new
resourceTypeGeneralvalue and the plan shows acontrolled-listitem with the correct term names, that is a goodapplycandidate - if the plan shows a removal or rename and does not have explicit replacement instructions yet, leave it as
manual
rename and removal items are intentionally strict.
They only run if the plan includes explicit instructions such as:
renameToreplacementorderedTermsnewTermDetailspreserveHistoricalFiledropRemovedFromSchemedropFromCurrentContextcontextKeys
If those fields are missing, the module will refuse to run.
After you edit the plan, commit:
reports/release-import-plan-<version>.json
You do not need to hand-edit the Markdown file.
The apply workflow refreshes reports/release-import-plan-<version>.md from the JSON plan before it finishes.
In GitHub:
- open
Actions - click
Apply DataCite Release Plan - click
Run workflow - choose the same branch
Fill the inputs like this:
plan_path:reports/release-import-plan-4.8.jsonset_current:trueif this new version should become the new current versioncommit_generated_files: usuallytrue
Module checkboxes:
- turn on only the module families you want to allow in this run
- if your plan only contains controlled-list and simple-property changes, you can leave the others off
Safe default:
apply_controlled_lists:trueapply_simple_properties:trueapply_property_groups: only if you reviewed those itemsapply_complex_structures: only if you reviewed those itemsapply_renames: usuallyfalseunless you explicitly completed the rename instructionsapply_removals: usuallyfalseunless you explicitly completed the removal instructions
If approved items exist, the workflow will:
- read the plan from your branch
- apply only
status: applyitems - create or update source files
- write or refresh
manifest/release-matrix-<from>-<to>.json - run
scripts/release-snapshot.js - regenerate versioned
manifest/anddist/outputs - regenerate section index pages and the root
index.html - write
reports/release-apply-<version>.md - commit generated files back to the branch if
commit_generated_filesistrue - upload an artifact of the results
- refresh
reports/release-import-plan-<version>.mdfrom the JSON plan
Review these areas carefully:
- new files in
vocab/,property/, orclass/ context/fullcontext.jsonldmanifest/release-matrix-<from>-<to>.jsonmanifest/datacite-<version>.jsonmanifest/datacite-current.jsondist/datacite-<version>.jsonlddist/datacite-<version>.ttldist/datacite-<version>.rdfindex.htmlmanifest/index.html
Read the apply report too:
reports/release-apply-<version>.md
Some releases will not be fully automatable.
If anything is still manual, you have two choices:
- make the required source-file edits yourself and commit them
- update the plan with more explicit instructions and rerun the apply workflow
Do not force ambiguous items through automation just to finish quickly.
When the branch looks correct:
- open a PR into
main - explain the new DataCite version
- mention which plan items were applied automatically
- mention any remaining manual edits
- mention that the apply workflow completed successfully
After the PR is approved, merge it.
This is the step that makes the release official in the repo.
This repo already has a deploy workflow on main.
So:
- merge to
main - deploy workflow runs
- merged files are published
The apply workflow itself does not publish to production. It prepares and commits the files. Publishing happens after merge to main.
If you prefer the terminal, these are the equivalent commands.
git checkout main
git pull
git checkout -b upgrade-4.8
node scripts/detect-datacite-release.jsOr for a specific version:
node scripts/detect-datacite-release.js --version 4.8 --release-date 2026-09-01Then edit:
reports/release-import-plan-4.8.json
node scripts/apply-datacite-release-plan.js \
--plan reports/release-import-plan-4.8.json \
--modules controlled-list,simple-property,property-group,complex-structure \
--set-currentThen review, commit, and open a PR.
That means the repo is already on the newest official DataCite 4.x version listed on versions.html.
Usually one of these is true:
- the plan item is missing required fields
- the change is still ambiguous
- you enabled a module for a change type that still needs manual instructions
Read the error and inspect the matching change entry in the plan JSON.
That is expected for unsupported or risky changes.
manual does not mean failure. It means a human should decide what to do.
Most likely:
commit_generated_fileswasfalse- the approved plan had no
applyitems - you ran detect instead of apply
Most likely:
commit_plan_fileswas set tofalse- the workflow failed before the commit step
- you are looking at a different branch than the one you ran the workflow on
Use this checklist every time:
- Confirm the newest official version on versions.html.
- Create a branch from
main. - Run
Detect DataCite Release. - Open the committed JSON plan in
reports/on the branch. - Review each change item.
- Mark items as
apply,skip, ormanual. - Commit the approved JSON plan.
- Run
Apply DataCite Release Plan. - Review generated files and the apply report.
- Open a PR.
- Merge to
main. - Check deployment.