Overview /

eic-shell

github.com/eic/eic-shell infrastructurecore · pass 2026-10-12 · commit 70c57ee44b02 · assessor claude-opus-5-5

eic-shell is the official installer and launcher of the EIC software environment (get.epic-eic.org redirects to it), but it has no license, no releases, no tests, and its only workflow deploys GitHub Pages, so changes to the scripts are not exercised before users download them from main. One human author made all commits in 24 months, no maintainers or owning group are documented, and the advertised -o/--organization option is not parsed. 91.7% of default-branch changes arrive through PRs under branch protection requiring one approval, and Dependabot updates the GitHub Actions.

1.0overall, of 3

Action plan

The smallest steps that raise each criterion to its next level, in priority order. Download as Markdown ·

PriorityEffortCriterionAction
highS com.bus-factor (1) Add .github/CODEOWNERS with two maintainers and have the second maintainer merge PRs.
highS com.conduct (1) Link the ePIC collaboration code of conduct with its reporting contact from the README, or add CODE_OF_CONDUCT.md.
highS com.contributors (0) Review and merge the open contributor PR
highS com.governance (0) 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.
highS dist.releases (0) Adopt CalVer or SemVer, tag a release with generated notes at least every six months, and record the installer version in the generated launcher.
highS eng.static-quality (0) Add .pre-commit-config.yaml with shellcheck and ruff (as eic/containers does) and enable pre-commit.ci.
highS via.citation (0) Add CITATION.cff listing all contributors and enable the Zenodo-GitHub integration.
highS via.license (0) Add a LICENSE file with an OSI-approved license (for example MIT or LGPL-3.0-or-later) agreed by the contributors.
highS via.support (0) State in the README the ePIC computing group responsible for eic-shell and the maintainers' institutions.
highM eng.modularity (0) Move the two launchers into template files (as proposed in PR
highM eng.testing (0) 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.
mediumS com.responsiveness (1) Label all open issues with the existing label set, close
mediumS dist.dependencies (1) 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.
mediumS dist.packaging (1) After tagging releases, add an eic-shell package to eic-spack that installs install.sh at the released version.
mediumS dist.portability (1) 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.
mediumS dist.reproducibility (2) 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.
mediumS doc.contributing (1) Add CONTRIBUTING.md describing how to test install.sh locally (with and without CVMFS, apptainer and docker), the shell conventions, and PR review expectations.
mediumS doc.developer (1) 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.
mediumS doc.user (1) 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.
mediumS eic.environment (1) 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.
mediumS eng.change-control (2) 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.
mediumS eng.ci (1) 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.
lowS eic.currency (2) Remove the singularity 2.x .simg branch and the legacy /cvmfs/eic.opensciencegrid.org/singularity/athena and /gpfs02 lookups, and decide

Assessment by criterion

Code health & engineering practices 0.6

2

Change control & code review eng.change-control

Established · confidence high

91.7% of first-parent commits in 12 months came from PRs and branch protection requires one approving review, but only 66.7% of merged PRs were reviewed by someone else, admins are exempt (PR #34 merged without review), and there is no CODEOWNERS.

Evidence (5)

Gaps to the next level

  • Fewer than 90% of merged PRs are reviewed by someone other than the author.
  • Branch protection does not apply to administrators; no CODEOWNERS file.
  • Review expectations are not documented in the repository.

Actions

  • medium S 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.
1

Continuous integration eng.ci

Initial · confidence high

The only workflow, deploy.yml, builds and deploys the GitHub Pages site on push to main; no workflow runs on pull requests and nothing executes install.sh or the generated launcher.

Evidence (3)

Gaps to the next level

  • No PR-triggered workflow; the script served to users at get.epic-eic.org is never run in CI.

Actions

  • medium 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.
0

Testing eng.testing

Absent · confidence high

There are no test files or test framework; argument handling is untested, and -o/--organization is listed in both help texts but not parsed by either case statement.

Evidence (4)

Gaps to the next level

  • No automated tests of install.sh, the generated launchers, or install.py.

Actions

  • high M 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.
0

Static analysis & consistency eng.static-quality

Absent · confidence high

No shell or Python linter, formatter, or pre-commit configuration exists; install.py contains an undefined name (testing) that a linter would flag.

Evidence (3)

Gaps to the next level

  • No shellcheck, shfmt, or ruff configured or enforced.

Actions

  • high S Add .pre-commit-config.yaml with shellcheck and ruff (as eic/containers does) and enable pre-commit.ci.
0

Architecture & language standards eng.modularity

Absent · confidence medium

The project is two loose scripts with no packaging: the 479-line install.sh embeds both launchers as heredocs, and it and install.py hard-code site paths (/gpfs02/eic/athena, /apps/singularity/3.7.1) and a legacy GitLab artifact URL with default version 3.0.1.

Evidence (4)

Gaps to the next level

  • Launcher scripts are generated from heredocs inside install.sh instead of separate template files.
  • Site-specific paths and a legacy download endpoint are hard-coded.

Actions

  • high M Move the two launchers into template files (as proposed in PR

Documentation & usability 1.0

1

User onboarding doc.user

Initial · confidence medium

The README and the EIC tutorial give a working curl-based install and ./eic-shell quick start, but docker, wget and python3 (non-CVMFS fallback) are not named or versioned, most options are documented only in --help, and the CI section is marked as outdated.

Evidence (3)

Gaps to the next level

  • Not all host dependencies are named with versions.
  • Installer and launcher options are not documented in the README; the CI section and included-software list are stale.

Actions

  • medium 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.
1

Developer & API documentation doc.developer

Initial · confidence medium

install.sh and install.py carry inline comments and a module docstring, but there is no description of how the installer, generated launchers, install.py fallback and the Pages hosting fit together.

Evidence (3)

Gaps to the next level

  • No architecture overview and no generated reference documentation.

Actions

  • medium 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.
1

Contribution guidelines doc.contributing

Initial · confidence low

Only the eic organization PR and issue templates apply; the repository has no CONTRIBUTING file describing how to test changes to the scripts or the PR process.

Evidence (3)

Gaps to the next level

  • No CONTRIBUTING.md covering local testing of install.sh, conventions, and the PR process.

Actions

  • medium 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.

Community & governance 0.6

1

Issue & PR responsiveness com.responsiveness

Initial · confidence medium

Median first response is 0.57 days, but half of the six issues opened in 12 months received no response and none is labeled, and three open PRs are older than 90 days.

Evidence (5)

Gaps to the next level

  • New issues are not labeled or otherwise triaged;

Actions

  • medium S Label all open issues with the existing label set, close
0

Contributor base com.contributors

Absent · confidence high

One human author committed in 24 months; contributor PRs (#31, #39, #40) were closed or remain open, and no external PR was merged in 12 months.

Evidence (4)

Gaps to the next level

  • Only one active author in 24 months.

Actions

  • high S Review and merge the open contributor PR
1

Knowledge concentration (bus factor) com.bus-factor

Initial · confidence high

The top author wrote all non-bot commits in 24 months and is the only merger; one other person reviews.

Evidence (4)
  • git.top_author_share_24m = 1.0
  • prs.distinct_reviewers_12m = 1
  • prs.distinct_mergers_12m = 1
  • files.codeowners = []

Gaps to the next level

  • Bus factor (50%) is 1 and only one person merges.
  • No CODEOWNERS or maintainer list.

Actions

  • high S Add .github/CODEOWNERS with two maintainers and have the second maintainer merge PRs.
0

Governance & roadmap com.governance

Absent · confidence medium

Discussion happens in public issues (#33), but no README section, CODEOWNERS or governance file names the maintainers, the owning ePIC group, or a decision process; there are no milestones.

Evidence (3)

Gaps to the next level

  • Maintainers and owning group are not identified in the repository.

Actions

  • high 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.
1

Code of conduct & user support com.conduct

Initial · confidence medium

The eic organization issue-template configuration links the ePIC Mattermost for questions, but no code of conduct applies to the repository or organization.

Evidence (2)

Gaps to the next level

  • No code of conduct with a reporting contact.

Actions

  • high S Link the ePIC collaboration code of conduct with its reporting contact from the README, or add CODE_OF_CONDUCT.md.

Infrastructure & distribution 1.0

1

Packaging & installability dist.packaging

Initial · confidence medium

Installation is a documented curl | bash of install.sh from main (also at get.epic-eic.org), but there is no package recipe in eic-spack, Spack, conda-forge or PyPI.

Evidence (3)

Gaps to the next level

  • No recipe in a domain package manager.

Actions

  • medium S After tagging releases, add an eic-shell package to eic-spack that installs install.sh at the released version.
0

Releases & versioning dist.releases

Absent · confidence high

There are no tags or releases; users and eic-shell --upgrade fetch install.sh from main.

Evidence (3)

Gaps to the next level

  • No versioned releases, version scheme, or release notes.

Actions

  • high 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.
1

Dependency management & supply chain dist.dependencies

Initial · confidence medium

The README states apptainer >= 1 or singularity >= 3, but docker, curl, wget and python3 are undeclared, and the non-CVMFS path runs install.py, which calls singularity pull and a legacy eicweb GitLab artifact URL.

Evidence (5)

Gaps to the next level

  • Host tools are not all declared with minimum versions.
  • The fallback download depends on the legacy install.py and an eicweb GitLab artifact endpoint.

Actions

  • medium 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.
2

Reproducibility & environments dist.reproducibility

Established · confidence medium

The launcher records organization, container and version and can select a tagged image (--version YY.MM.0-stable), but the installer itself is unversioned and --upgrade always takes main, and the default image is nightly.

Evidence (2)

Gaps to the next level

  • The installer is not versioned, so the launcher that produced an environment cannot be recreated.
  • No CI runs the installer in the environments it sets up.

Actions

  • medium 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.
1

Portability & heterogeneous computing dist.portability

Initial · confidence medium

The installer targets Linux (apptainer) and macOS (docker) but no platform is tested in CI, Linux aarch64 is not detected (it checks for arm64, which Linux reports as aarch64), and site-specific fallback paths remain.

Evidence (4)

Gaps to the next level

  • No CI on any platform.
  • Linux aarch64 detection does not match uname -m output; macOS arm64 always runs amd64 images under emulation.

Actions

  • medium 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.

EIC ecosystem integration 2.0

3

Reuse of EIC-supported components eic.reuse

Sustained · confidence medium

The project needs no domain functionality and has no parallel implementations, and it is the component other EIC software reuses to install the environment (eic/containers delegates its install.sh to it; eic/snippets batch scripts call it).

Evidence (2)
–

Data formats & interoperability eic.data-model

Not applicable · confidence high

Not applicable: The project is an installer and launcher and reads or writes no physics or detector data.

Not applicable: the scripts only download container images and generate a launcher script.

1

EIC environment compatibility eic.environment

Initial · confidence medium

Launching eic-shell images is the documented purpose of the project, but no CI job runs the installer or launcher against an eic container image.

Evidence (3)

Gaps to the next level

  • Compatibility with current eic_xl images is not tested in CI.

Actions

  • medium 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.
2

Currency with the EIC stack eic.currency

Established · confidence medium

The installer defaults to the current eicweb/eic_xl:nightly image on CVMFS or Docker Hub and the tutorial uses it, but ATHENA-era singularity 2.x, /gpfs02/eic/athena and GitLab-artifact code paths remain, and the CVMFS repository question in #30 is open.

Evidence (3)

Gaps to the next level

  • Deprecated singularity 2.x and legacy image-location code paths are still in use.

Actions

  • low S Remove the singularity 2.x .simg branch and the legacy /cvmfs/eic.opensciencegrid.org/singularity/athena and /gpfs02 lookups, and decide

Impact & long-term viability 0.8

0

Licensing via.license

Absent · confidence high

The repository has no LICENSE file and GitHub detects no license.

Evidence (2)
  • repo.license_spdx = null
  • files.license = []

Gaps to the next level

  • No license; the scripts are all rights reserved.

Actions

  • high S Add a LICENSE file with an OSI-approved license (for example MIT or LGPL-3.0-or-later) agreed by the contributors.
0

Citation & attribution via.citation

Absent · confidence high

There is no CITATION.cff, Zenodo DOI, codemeta or author list beyond a docstring in install.py.

Evidence (3)
  • files.citation_cff = []
  • files.zenodo_json = []
  • files.authors = []

Gaps to the next level

  • No citation information or maintained contributor list.

Actions

  • high S Add CITATION.cff listing all contributors and enable the Zenodo-GitHub integration.
3

Adoption & downstream use via.adoption

Sustained · confidence medium

get.epic-eic.org redirects to this installer, which the EIC tutorial and EICrecon documentation prescribe, EIC batch production scripts call it, and an analysis of the SoLID experiment outside EIC uses it.

Evidence (4)
0

Institutional backing & continuity via.support

Absent · confidence low

The repository names no current maintainers, affiliations, owning ePIC group or funding; the only named authors are in the install.py docstring (added 2021) and no longer commit.

Evidence (2)

Gaps to the next level

  • No identifiable current maintainers or institutional backing.

Actions

  • high S State in the README the ePIC computing group responsible for eic-shell and the maintainers' institutions.

Key metrics

Collected automatically at the assessed commit. People are counted, never named. Full data: metrics.json.

Commits, 12 months6git.commits_12m
Active authors, 12 months1git.authors_12m
Active authors, 24 months1git.authors_24m
New authors, 12 months0git.new_authors_12m
Bus factor (50% of commits, 24 months)1git.bus_factor_50_24m
Top author share of commits, 24 months100%git.top_author_share_24m
Institutional e-mail domains, 24 months0git.email_domains_24m
Default-branch changes via PR, 12 months92%git.first_parent_pr_fraction_12m
PRs merged, 12 months3prs.merged_12m
Merged PRs reviewed by non-author67%prs.reviewed_fraction_12m
Median days to merge64%prs.median_days_to_merge_12m
Merged PRs touching tests0%prs.test_touching_fraction_12m
Distinct reviewers, 12 months1prs.distinct_reviewers_12m
Issues opened, 12 months6issues.created_12m
Median days to first response57%issues.median_first_response_days_12m
Issues without response50%issues.unanswered_fraction_12m
Open issues older than 1 year4issues.open_older_365d
Releases, 24 months0releases.count_24m
Latest release–releases.latest_tag
Default-branch CI success rate100%ci.default_branch_success_rate
CI runs in eic-shellnoci.uses_eic_shell
License (SPDX)–repo.license_spdx
Ships in eic-shellnopackaging.in_eic_shell
eic-shell version–packaging.eic_shell_version
Source lines (excluding vendored)336code.source_lines
Test files0code.test_files