# Sustainability action plan: algorithms

From the EIC Software Sustainability Review, pass `2026-10-12`, assessed at commit `77a1ddb499c7`. Full assessment: https://eic.github.io/SoftwareSustainabilityReview/projects/algorithms.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 the eic-shell build, building from source with CMake (DD4hep, EDM4hep, EDM4eic, fmt, Microsoft GSL with versions), and a minimal `Algorithm<Input<...>, Output<...>>` example. *(`doc.user`, now level 0, effort S)*
- [ ] Add `.github/CODEOWNERS` with two maintainers and have the second maintainer author and merge changes. *(`com.bus-factor`, now level 1, effort S)*
- [ ] Add `CODE_OF_CONDUCT.md` (or link the ePIC collaboration code of conduct) with a reporting contact, preferably in the eic/.github organization repository. *(`com.conduct`, now level 1, effort S)*
- [ ] Add `CITATION.cff` with the author list and enable the Zenodo-GitHub integration for release DOIs. *(`via.citation`, now level 0, effort S)*
- [ ] State in the README the ePIC working group that owns the library and the maintainers' institutions. *(`via.support`, now level 1, effort S)*
- [ ] Move the checks in `core/src/dummy.cpp` into Catch2 unit tests under `core/tests/` registered with `ctest`, and run them in CI. *(`eng.testing`, now level 0, effort M)*
- [ ] Recruit a second developer (for example from the EICrecon maintainer group) to own a component such as `RandomSvc` or `GeoSvc` and land PRs. *(`com.contributors`, now level 0, effort M)*

## Medium priority

- [ ] Remove the admin bypass from the "Default" ruleset so every PR, including maintainer and Dependabot PRs, needs one approval. *(`eng.change-control`, now level 2, effort S)*
- [ ] Add `.github/CODEOWNERS` naming at least two reviewers for `core/` and `cmake/`. *(`eng.change-control`, now level 2, effort S)*
- [ ] Add a `ctest --test-dir build --output-on-failure` step to `.github/workflows/linux-eic-shell.yml` once unit tests exist. *(`eng.ci`, now level 1, effort S)*
- [ ] Add `.pre-commit-config.yaml` with the clang-format hook and enable pre-commit.ci (or a clang-format check job). *(`eng.static-quality`, now level 1, effort S)*
- [ ] Add a CI job that configures with `-DENABLE_CLANG_TIDY=ON` in eic-shell. *(`eng.static-quality`, now level 1, effort S)*
- [ ] Add `docs/architecture.md` describing the service lifecycle, `AlgorithmSvc`, and how EICrecon/JANA2 binds `GeoSvc`, `RandomSvc`, and `LogSvc`. *(`eng.modularity`, now level 2, effort S)*
- [ ] Add a `Doxyfile` for `core/include` and convert header comments to Doxygen form. *(`doc.developer`, now level 1, effort S)*
- [ ] Write `docs/architecture.md` covering services, properties, and the algorithm interface. *(`doc.developer`, now level 1, effort S)*
- [ ] Add `CONTRIBUTING.md` covering eic-shell setup, CMake build, running tests, clang-format, and the PR/review process. *(`doc.contributing`, now level 1, effort S)*
- [ ] Respond to and resolve or label issue *(`com.responsiveness`, now level 1, effort S)*
- [ ] Add a "Maintainers and governance" README section naming the maintainers, the owning ePIC body, and how decisions are made. *(`com.governance`, now level 1, effort S)*
- [ ] State SemVer in the README and set `version_number` to the tag version in each release commit. *(`dist.releases`, now level 1, effort S)*
- [ ] Add `VERSION` minimums to every `find_package`, make `Microsoft.GSL` REQUIRED, and drop EDM4hep/EDM4eic if unused. *(`dist.dependencies`, now level 1, effort S)*
- [ ] Add `find_dependency` calls for all public link dependencies in `cmake/algorithmsConfig.cmake.in` and remove the Acts block. *(`dist.dependencies`, now level 1, effort S)*
- [ ] Document in the README the eic-shell release each algorithms release was built and tested with. *(`dist.reproducibility`, now level 1, effort S)*
- [ ] Run the unit tests with `ctest` in both the `g++` and `clang++` matrix jobs. *(`dist.portability`, now level 1, effort S)*
- [ ] Document the eic-shell build in the README and add a matrix entry for a pinned stable `eic_xl` release next to `nightly`. *(`eic.environment`, now level 1, effort S)*

## Low priority

- [ ] Delete the obsolete `.gitlab-ci.yml`. *(`eng.ci`, now level 1, effort S)*
- [ ] Remove `core/src/dummy.cpp` from the library sources once its checks move to tests. *(`eng.modularity`, now level 2, effort S)*
- [ ] Either use EDM4eic types in the public interface with a checked minimum version, or remove the EDM dependencies and document that the library is data-model agnostic. *(`eic.data-model`, now level 2, effort S)*
- [ ] Remove `-Wno-error=deprecated-declarations` so the nightly eic-shell job fails on deprecated APIs. *(`eic.currency`, now level 2, effort S)*
- [ ] Add SPDX headers to the four files, fix `PackageName` in `LICENSE.spdx`, and add the REUSE lint to CI. *(`via.license`, now level 2, effort S)*
