# Sustainability action plan: Firebird

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

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

## High priority

- [ ] Add `.pre-commit-config.yaml` with `ruff`, `ruff-format`, `prettier` and `clang-format` and enable pre-commit.ci. *(`eng.static-quality`, now level 1, effort S)*
- [ ] Add `.github/CODEOWNERS` and a maintainers section in the README naming at least two maintainers per component. *(`com.bus-factor`, now level 1, effort S)*
- [ ] Add `CODE_OF_CONDUCT.md` linking the ePIC collaboration code of conduct and its reporting contact, and a "Getting help" section in the README. *(`com.conduct`, now level 1, effort S)*
- [ ] Tag each release `vYYYY.MM.N`, create a GitHub release with generated notes, and state the CalVer scheme in the README. *(`dist.releases`, now level 1, effort S)*
- [ ] Add `CITATION.cff` listing all contributors and enable the Zenodo-GitHub integration for tagged releases. *(`via.citation`, now level 0, effort S)*
- [ ] State in the README the owning ePIC working group, the maintainers' institutions and any funding. *(`via.support`, now level 1, effort S)*
- [ ] Recruit a co-developer from another ePIC institution through the ePIC software meetings and merge the open contributor PRs or close them. *(`com.contributors`, now level 1, effort M)*

## Medium priority

- [ ] Set `required_approving_review_count` to 1 on `main` and remove the always-bypass for the admin role in ruleset 10656024. *(`eng.change-control`, now level 2, effort S)*
- [ ] Add `.github/CODEOWNERS` assigning `firebird-ng/`, `packages/`, `pyrobird/` and `dd4hep-plugin/` to at least two reviewers. *(`eng.change-control`, now level 2, effort S)*
- [ ] Update the required status checks in ruleset 10656024 to the current `test-and-build`, `test (3.x)` and `integration-tests (3.x)` job names. *(`eng.ci`, now level 2, effort S)*
- [ ] Run `coverage run -m pytest` and `vitest --coverage` in CI and upload the reports to Codecov. *(`eng.testing`, now level 2, effort S)*
- [ ] Add a CI job that runs the `02_run_local` steps (`pyrobird serve`, fetch the sample files through the API) on the sample data. *(`doc.user`, now level 2, effort S)*
- [ ] Add `CONTRIBUTING.md` that consolidates setup, tests, conventions and review expectations, and label five newcomer issues `good first issue`. *(`doc.contributing`, now level 2, effort S)*
- [ ] Apply the existing `[UI]`/`[pyrobird]`/`[engine]` labels to all open issues and close or update those older than one year. *(`com.responsiveness`, now level 1, effort S)*
- [ ] Add `GOVERNANCE.md` naming the maintainers, the owning ePIC group, the decision process and the path to maintainership. *(`com.governance`, now level 1, effort S)*
- [ ] Publish a stable CalVer release to PyPI, add it to the eic-spack `pyrobird` recipe (with `py-playwright` for `+batch`) and pin it in eic/containers. *(`dist.packaging`, now level 2, effort S)*
- [ ] Add tested minimum versions to every `[project] dependencies` entry and `VERSION` to the `fmt` and `Geant4` `find_package` calls. *(`dist.dependencies`, now level 1, effort S)*
- [ ] Write the pyrobird or plugin version and the conversion or steering options into the DEX `origin` object. *(`dist.reproducibility`, now level 1, effort S)*
- [ ] Add `macos-latest` and `ubuntu-24.04-arm` jobs and a Node 22/24 matrix to `frontend.yaml` and `pyrobird.yaml`. *(`dist.portability`, now level 2, effort S)*
- [ ] Read the podio and EDM4eic/EDM4hep versions from the input file metadata in pyrobird and root2dex, record them in DEX `origin`, and warn on unsupported versions. *(`eic.data-model`, now level 2, effort S)*
- [ ] Add a workflow using `eic/run-cvmfs-osg-eic-shell` that builds `dd4hep-plugin/`, runs `npsim` with `firebird_steering.py`, and runs `pyrobird convert` on the output. *(`eic.environment`, now level 1, effort S)*
- [ ] Add an eic-shell job with `platform-release` set to `eic_xl:nightly` that builds the plugin and runs the pyrobird tests. *(`eic.currency`, now level 2, effort S)*
- [ ] Add a job that builds `dd4hep-plugin/` and runs `ddsim` with `firebird_steering.py` for a few events. *(`eng.ci`, now level 2, effort M)*
- [ ] Generate TypeDoc for `packages/*` and Sphinx autodoc for `pyrobird` in `docs.yaml` and publish them with the VitePress site. *(`doc.developer`, now level 1, effort M)*

## Low priority

- [ ] Require a test change in PRs that change `pyrobird/pyrobird/` or `packages/*/src/`, stated in the PR template. *(`eng.testing`, now level 2, effort S)*
- [ ] Add SPDX headers (GPL-3.0-or-later or MIT per directory) and run `reuse lint` in CI. *(`via.license`, now level 2, effort S)*
- [ ] Offer the trajectory-writer action to npsim or DD4hep DDG4 so it ships with the simulation stack. *(`eic.reuse`, now level 2, effort M)*
