# Sustainability action plan: npsim

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

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

## High priority

- [ ] Add README sections for using npsim in eic-shell, building from source (DD4hep >= 1.18, Geant4, ROOT, fmt, nlohmann_json, optional OpenCASCADE), and a one-command `npsim --compactFile ... -G -N 10` quick start. *(`doc.user`, now level 0, effort S)*
- [ ] Link the npsim simulation tutorial and document the options and defaults that `npsim.py` adds on top of `ddsim`. *(`doc.user`, now level 0, effort S)*
- [ ] Add `.github/CODEOWNERS` with two owners per component and add a second maintainer to the eic-spack recipe. *(`com.bus-factor`, now level 1, effort S)*
- [ ] Add a "Maintainers" README section naming the maintainers and the owning ePIC working group, and stating how decisions on npsim defaults are made. *(`com.governance`, now level 0, effort S)*
- [ ] Add `CODE_OF_CONDUCT.md` with a reporting contact, or link the ePIC collaboration code of conduct from the README. *(`com.conduct`, now level 1, effort S)*
- [ ] Add a `LICENSE` file with an OSI-approved license compatible with DD4hep (LGPL-3.0) and the vendored MIT clipp, agreed by the copyright holders. *(`via.license`, now level 0, effort S)*
- [ ] Add `CITATION.cff` listing the contributors and enable the Zenodo-GitHub integration. *(`via.citation`, now level 0, effort S)*

## Medium priority

- [ ] Remove the "always" bypass actors from the "Default" ruleset (or set them to pull-request-only) so every PR needs an approval. *(`eng.change-control`, now level 2, effort S)*
- [ ] Add `.github/CODEOWNERS` naming at least two reviewers for `src/plugins/`, `src/python/`, `src/geocad/` and `src/tools/`. *(`eng.change-control`, now level 2, effort S)*
- [ ] Add an aggregating job with `if: always()` that fails when any of `build`, `npsim-gun`, `npsim-dis`, `convert-to-step` or `convert-to-dot` failed, and make it the required status check. *(`eng.ci`, now level 2, effort S)*
- [ ] Add `.pre-commit-config.yaml` with clang-format (and ruff for `src/python`) and enable pre-commit.ci, or add a `clang-format --dry-run --Werror` CI job. *(`eng.static-quality`, now level 1, effort S)*
- [ ] Add a `RelWithDebInfo` entry to the CI build matrix so `-Wall -Wextra -Werror -pedantic` applies in CI. *(`eng.static-quality`, now level 1, effort S)*
- [ ] Add a `Doxyfile` and publish the API docs to the existing GitHub Pages site from `linux-eic-shell.yml`. *(`doc.developer`, now level 1, effort S)*
- [ ] Add `docs/architecture.md` describing the npsim front-end, each plugin's role in the DDG4 chain, and the geometry tools. *(`doc.developer`, now level 1, effort S)*
- [ ] Add `CONTRIBUTING.md` covering eic-shell/devcontainer setup, `cmake`/`ctest`, running clang-format, and PR review and capybara-report expectations. *(`doc.contributing`, now level 1, effort S)*
- [ ] Respond to *(`com.responsiveness`, now level 1, effort S)*
- [ ] Review, merge or close the nine open PRs older than 90 days (including *(`com.responsiveness`, now level 1, effort S)*
- [ ] Add an AUTHORS or README contributors section with institutions, and review the open contributor PR *(`com.contributors`, now level 1, effort S)*
- [ ] State SemVer in the README and bump `project(npsim VERSION ...)` with each tag. *(`dist.releases`, now level 1, effort S)*
- [ ] Add `VERSION` arguments to the `find_package` calls for ROOT, fmt, nlohmann_json and OpenCASCADE. *(`dist.dependencies`, now level 1, effort S)*
- [ ] Document in the README which eic-shell release ships each npsim release and how the seed and steering options are stored in the EDM4hep output metadata. *(`dist.reproducibility`, now level 1, effort S)*
- [ ] Add a CI step that opens the produced `.edm4hep.root` with uproot and checks the podio/EDM4hep version metadata and the expected collections. *(`eic.data-model`, now level 2, effort S)*
- [ ] Add a `platform-release` matrix over a pinned `eic_xl:<stable>` and `eic_xl:nightly` in `.github/workflows/linux-eic-shell.yml`. *(`eic.environment`, now level 2, effort S)*
- [ ] State in the README the ePIC working group responsible for npsim and the maintainers' institutions. *(`via.support`, now level 1, effort S)*
- [ ] Add ctest tests that run each DDG4 plugin through a minimal `ddsim`/`npsim` steering on a small test geometry and assert its effect (vertex shift, kept particles, photon suppression). *(`eng.testing`, now level 1, effort M)*
- [ ] Move the DIRC QE table to the epic geometry (issue *(`eng.modularity`, now level 1, effort M)*
- [ ] Replace `src/tools/include/clipp.h` with `find_package(CLI11)` from eic-shell. *(`dist.dependencies`, now level 1, effort M)*

## Low priority

- [ ] Set `project(npsim VERSION ...)` to the release version and use `${PROJECT_VERSION}` in `write_basic_package_version_file`. *(`eng.modularity`, now level 1, effort S)*
- [ ] Add an `ubuntu-24.04-arm` build job using the arm64 eic-shell image, and state in the README that GPU offload is provided by Geant4 (not npsim) where applicable. *(`dist.portability`, now level 2, effort S)*
