# Sustainability action plan: Geant4

From the EIC Software Sustainability Review, pass `2026-10-12-2`, assessed at commit `f3d5293d3847`. Full assessment: https://eic.github.io/SoftwareSustainabilityReview/projects/geant4.html

Levels: 0 Absent · 1 Initial · 2 Established · 3 Sustained. Each item names the step to the next level.

## High priority

- [ ] Make the Geant4 CDash project (cdash-sft.web.cern.ch, project Geant4) publicly readable, or publish nightly results for each release branch. *(`eng.ci`, now level 0, effort S)*
- [ ] Add `CODE_OF_CONDUCT.md` (or link the CERN Code of Conduct) with a named reporting contact, and link it from the README and forum. *(`com.conduct`, now level 1, effort S)*
- [ ] Make geant4-dev (or a read-only mirror carrying per-merge-request history) publicly readable, so merged changes and their approvals can be inspected. *(`eng.change-control`, now level 0, effort M)*
- [ ] Add a GitHub Actions workflow on the mirror that builds each imported release and runs `ctest` on the basic examples on Linux and macOS. *(`eng.ci`, now level 0, effort M)*
- [ ] Submit the Geant4 Software License to the OSI approval process and the SPDX license list, or relicense under an OSI-approved license. *(`via.license`, now level 0, effort L)*

## Medium priority

- [ ] Add a public CI job (or pre-commit.ci on the mirror) that runs `clang-format --dry-run --Werror` and the `.clang-tidy` checks on each imported tree, and publish CODING_GUIDELINES.rst. *(`eng.static-quality`, now level 1, effort S)*
- [ ] Add a "Installing with Spack" section (`spack install geant4`, with variants for Qt, GDML and datasets) to the Installation Guide. *(`doc.user`, now level 1, effort S)*
- [ ] Generate and publish the Doxygen reference from a public CI job for each release (and the development branch). *(`doc.developer`, now level 2, effort S)*
- [ ] Copy the geant4-dev CONTRIBUTING.rst and CODING_GUIDELINES.rst into the public tree, covering build, `GEANT4_ENABLE_TESTING`, conventions and the PR path. *(`doc.contributing`, now level 1, effort S)*
- [ ] Assign every new Bugzilla report to its category owner within a week and record that rule on the Bug Reports page. *(`com.responsiveness`, now level 1, effort S)*
- [ ] Have a second named person cut and publish the next patch release and its GitHub import, following the Tag and Release Policy. *(`com.bus-factor`, now level 2, effort S)*
- [ ] Add a deprecation section to the Tag and Release Policy stating that deprecated interfaces are announced in release notes and removed only in a major release. *(`dist.releases`, now level 2, effort S)*
- [ ] Add `VERSION` arguments to every `find_package` in `G4OptionalComponents.cmake` and `G4InterfaceOptions.cmake`, matching the Installation Guide and release notes. *(`dist.dependencies`, now level 1, effort S)*
- [ ] (EIC side) Rebase the eAST branch of eic/geant4 onto 11.4.3 and update the eic-spack pin. *(`eic.currency`, now level 2, effort S)*
- [ ] Fix `CITATION.cff` (bare DOI, single `name - Geant4 Collaboration` entity author, version and date-released) and validate it with cffconvert. *(`via.citation`, now level 1, effort S)*
- [ ] Publish the `tests/` tree (at least `ctests_examples` and `ctests_integration`) with each release so `GEANT4_ENABLE_TESTING=ON` works on public sources. *(`eng.testing`, now level 1, effort M)*
- [ ] Review the 71 Bugzilla reports opened before October 2025 and close, resolve or re-target each. *(`com.responsiveness`, now level 1, effort M)*
- [ ] Build the `packaging/rpm` Alma 9 image for each release and push it as `geant4/geant4:<version>`. *(`dist.reproducibility`, now level 2, effort M)*
- [ ] Add a public ctest that writes and re-reads a GDML geometry and an ntuple file and compares the results. *(`eic.data-model`, now level 2, effort M)*
- [ ] (EIC side) Add a scheduled eic/containers job that builds the latest Geant4 patch and beta with the nightly stack and runs the npsim jobs. *(`eic.environment`, now level 2, effort M)*
- [ ] Port the HepMCEx01, HepMCEx02 and MCTruth examples to HepMC3 and Pythia8. *(`eic.currency`, now level 2, effort M)*
- [ ] Declare internal headers with `PRIVATE_HEADERS` in each `sources.cmake` so only the user-facing API is installed. *(`eng.modularity`, now level 2, effort L)*

## Low priority

- [ ] Add `.github/pull_request_template.md` asking for the Bugzilla report, affected category and how the change was tested. *(`doc.contributing`, now level 1, effort S)*
- [ ] Record the origin of each externally contributed change (GitHub PR or Bugzilla number) in the History entry and release notes, so external contributions can be counted. *(`com.contributors`, now level 2, effort S)*
- [ ] Sync `.github/CODEOWNERS` with `.gitlab/CODEOWNERS` so every top-level category has two owners. *(`com.bus-factor`, now level 2, effort S)*
- [ ] (EIC side) Name the ePIC contact for Geant4 and record EIC requirements through the Geant4 Technical Forum, linked from the EIC software documentation. *(`com.governance`, now level 2, effort S)*
- [ ] Add an Installation Guide or FAQ section describing GPU offload options (G4HepEm, AdePT, Celeritas) and their status. *(`dist.portability`, now level 2, effort S)*
