# Sustainability action plan: eic-shell

From the EIC Software Sustainability Review, pass `2026-10-12`, assessed at commit `70c57ee44b02`. Full assessment: https://eic.github.io/SoftwareSustainabilityReview/projects/eic-shell.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 shellcheck and ruff (as eic/containers does) and enable pre-commit.ci. *(`eng.static-quality`, now level 0, effort S)*
- [ ] Review and merge the open contributor PR *(`com.contributors`, now level 0, effort S)*
- [ ] Add `.github/CODEOWNERS` with two maintainers and have the second maintainer merge PRs. *(`com.bus-factor`, now level 1, effort S)*
- [ ] Add a README "Maintainers" section naming the maintainers and the owning ePIC computing group, and stating how changes to defaults (image, organization, CVMFS repository) are decided. *(`com.governance`, now level 0, effort S)*
- [ ] Link the ePIC collaboration code of conduct with its reporting contact from the README, or add `CODE_OF_CONDUCT.md`. *(`com.conduct`, now level 1, effort S)*
- [ ] Adopt CalVer or SemVer, tag a release with generated notes at least every six months, and record the installer version in the generated launcher. *(`dist.releases`, now level 0, effort S)*
- [ ] Add a `LICENSE` file with an OSI-approved license (for example MIT or LGPL-3.0-or-later) agreed by the contributors. *(`via.license`, now level 0, effort S)*
- [ ] Add `CITATION.cff` listing all contributors and enable the Zenodo-GitHub integration. *(`via.citation`, now level 0, effort S)*
- [ ] State in the README the ePIC computing group responsible for eic-shell and the maintainers' institutions. *(`via.support`, now level 0, effort S)*
- [ ] Add `tests/` with bats tests for every `install.sh` and launcher option (including `-o`), the bind-path deduplication, and the generated `eic-shell` contents, run in CI. *(`eng.testing`, now level 0, effort M)*
- [ ] Move the two launchers into template files (as proposed in PR *(`eng.modularity`, now level 0, effort M)*

## Medium priority

- [ ] Enable "Do not allow bypassing the above settings" (enforce for admins) on `main` and add `.github/CODEOWNERS` naming two reviewers for `install.sh` and `install.py`. *(`eng.change-control`, now level 2, effort S)*
- [ ] Add `.github/workflows/test.yml` on `pull_request` and `push` that runs `install.sh` on `ubuntu-latest` and executes `./eic-shell -- eic-info`, and make it a required status check. *(`eng.ci`, now level 1, effort S)*
- [ ] Add a README "Requirements" section (bash, curl or wget, apptainer >= 1 or singularity >= 3, Docker version, CVMFS optional) and an "Options" section for `install.sh` and `eic-shell`, and replace the outdated CI section with the `eic/run-cvmfs-osg-eic-shell` route. *(`doc.user`, now level 1, effort S)*
- [ ] Add `docs/architecture.md` describing the install flow (CVMFS detection, image selection, launcher generation, `--upgrade`, get.epic-eic.org hosting) and publish it with the existing Pages workflow. *(`doc.developer`, now level 1, effort S)*
- [ ] Add `CONTRIBUTING.md` describing how to test `install.sh` locally (with and without CVMFS, apptainer and docker), the shell conventions, and PR review expectations. *(`doc.contributing`, now level 1, effort S)*
- [ ] Label all open issues with the existing label set, close *(`com.responsiveness`, now level 1, effort S)*
- [ ] After tagging releases, add an `eic-shell` package to eic-spack that installs `install.sh` at the released version. *(`dist.packaging`, now level 1, effort S)*
- [ ] Check for and document every required host tool with a minimum version at the start of `install.sh`, and replace the `install.py` fallback with a direct `apptainer pull` from the container registry. *(`dist.dependencies`, now level 1, effort S)*
- [ ] Tag installer releases and let `--upgrade` and get.epic-eic.org resolve to the latest tag, writing the installer version into the generated `eic-shell`. *(`dist.reproducibility`, now level 2, effort S)*
- [ ] Add a CI matrix of `ubuntu-latest` (apptainer) and `ubuntu-24.04-arm` (docker) that runs the installer, and match `aarch64` as well as `arm64` in the OS detection. *(`dist.portability`, now level 1, effort S)*
- [ ] Add a CI job that mounts CVMFS (`cvmfs-contrib/github-action-cvmfs`), installs with `-v nightly` and with a pinned stable tag, and runs `./eic-shell -- eic-info`. *(`eic.environment`, now level 1, effort S)*

## Low priority

- [ ] Remove the singularity 2.x `.simg` branch and the legacy `/cvmfs/eic.opensciencegrid.org/singularity/athena` and `/gpfs02` lookups, and decide *(`eic.currency`, now level 2, effort S)*
