Overview /

JANA2

github.com/JeffersonLab/JANA2 reconstructioncore · pass 2026-10-12 · commit dc56dab0216c · assessor claude-opus-5-5

The main risks are concentration of authorship and review (one author wrote 90.9% of commits in 24 months, no merged PR in 12 months had a non-author review, a single person merges), the absence of any formatter or linter, and a modified BSD-style license that is not machine-detectable. Established practices are CI on every PR across Ubuntu, macOS and eic-shell nightly with downstream EICrecon and GlueX builds, eic-spack packaging shipped in eic-shell at the latest release, and CalVer releases with notes and per-release Zenodo DOIs.

1.5overall, 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 (0) Add CODEOWNERS naming at least two maintainers and have a second maintainer review and merge PRs.
highS com.responsiveness (0) Respond to and label every new issue (existing bug/enhancement labels), and close or label the 44 open issues older than one year.
highS eng.change-control (1) Require one approving review on master through branch protection or a ruleset, and have a second maintainer review each PR.
highS eng.static-quality (0) Add a .clang-format matching the documented conventions and a .pre-commit-config.yaml with clang-format, and enable pre-commit.ci on PRs.
highS via.license (1) Replace LICENSE with the standard BSD-3-Clause text (keeping the government notice in a separate NOTICE file) so GitHub detects BSD-3-Clause.
mediumS com.conduct (1) Add a "Getting help" section to README.md and docs/index.md linking GitHub Discussions (or the EIC Mattermost channel) and the issue tracker.
mediumS com.governance (1) Add GOVERNANCE.md naming the maintainers, the decision process, the path to maintainership and the link to the ePIC software meetings where JANA2 changes are discussed.
mediumS dist.dependencies (1) Add minimum VERSION arguments to every find_package and use the Catch2 v3 package from eic-shell/Spack instead of src/external/catch2.
mediumS dist.reproducibility (1) State in docs/Download.md the eic-shell release each JANA2 release is tested with, and document running in that image.
mediumS doc.contributing (1) Add CONTRIBUTING.md covering eic-shell setup, the CMake options used in CI, running ctest, and the PR process, plus .github/pull_request_template.md and issue templates.
mediumS doc.user (1) Add a dependency table with minimum versions and an "Installing via eic-shell / eic-spack" section to docs/install.md.
mediumS eic.data-model (2) Add a ctest that writes a podio file with PodioFileWriter, reads it back with PodioFileReader and compares collection contents.
mediumS eic.environment (1) Document in docs/install.md how to use the eic-shell JANA2 and how to build a development copy inside eic-shell.
mediumS eng.ci (2) Fix the failing test_integration_gluex.yml job and mark the Ubuntu, macOS, dependency-matrix and ePIC workflows as required status checks on master.
mediumS eng.testing (2) Add a coverage build (--coverage with lcov or gcovr) to test_platform_ubuntu.yml and publish it to Codecov.
mediumS via.citation (1) List the individual contributors in CITATION.cff (or .zenodo.json) and the ACAT 2019 paper as preferred-citation.
mediumS via.support (2) Document in the README the maintaining institutions, the owning ePIC/JLab software group, and the plan for maintainer turnover.
mediumM com.contributors (2) Label newcomer issues and invite EICrecon and GlueX developers to take ownership of specific components through PRs.
mediumM dist.releases (2) Add a tag-triggered .github/workflows/release.yml that creates the GitHub release, and add a "Breaking changes / Migration" section and a deprecation policy to docs/Download.md.
mediumM doc.developer (1) Add Doxygen comments to every public method in the installed headers of src/libraries/JANA/ starting with JApplication, JComponent, JEventProcessor and JEventUnfolder.
mediumM eng.modularity (2) Install only the user-facing headers (or move internals to an internal/ directory excluded from install) and drop C++14 from the accepted standards.
mediumM eng.testing (2) Add a CI step that compares the TimesliceExample or EICrecon output with a stored reference using epic-capybara.

Assessment by criterion

Code health & engineering practices 1.4

1

Change control & code review eng.change-control

Initial · confidence high

84.4% of first-parent commits in 12 months arrived through PRs, but none of the merged PRs had a review from someone other than the author, below the 50% required for level 2.

Evidence (5)
  • git.first_parent_pr_fraction_12m = 0.844
  • prs.reviewed_fraction_12m = 0.0
  • prs.distinct_mergers_12m = 1
  • repo.default_branch_protected = true
  • repo.rulesets = 0

Gaps to the next level

  • No merged PR in 12 months was reviewed by a non-author.
  • Branch protection requires no approving review and no status checks; no CODEOWNERS or PR template.

Actions

  • high S Require one approving review on master through branch protection or a ruleset, and have a second maintainer review each PR.
2

Continuous integration eng.ci

Established · confidence high

Six workflows build and run ctest or the unit-test binary on every PR and push to master (Ubuntu, macOS, eic-shell nightly, a full-dependency container), with EICrecon and GlueX downstream builds, and 88% of recent default-branch runs succeed. Passing CI is not required before merge, and the GlueX integration workflow has failed on every master push since 2026-08-21.

Evidence (6)

Gaps to the next level

  • No required status checks on master (branch protection lists none).
  • Default-branch success rate 88%, below 90%; GlueX integration fails on master since 2026-08-21.
  • The CUDA platform workflow is disabled by targeting a non-existent branch.

Actions

  • medium S Fix the failing test_integration_gluex.yml job and mark the Ubuntu, macOS, dependency-matrix and ePIC workflows as required status checks on master.
2

Testing eng.testing

Established · confidence medium

Catch2 unit tests cover the Components, Engine, Services, Topology and Utils modules and run in CI on every PR, and end-to-end runs (TimesliceExample, EICrecon on npsim output) exist. There is no coverage measurement, no comparison against reference outputs in CI, and 30.8% of merged PRs touch tests.

Evidence (5)

Gaps to the next level

  • No coverage measured or published.
  • No regression test comparing outputs with reference files; the regressiontest plugin is not run in CI.
  • 30.8% of merged PRs touch tests, below 40%.
  • Calibrations, Geometry and CLI libraries have no unit tests.

Actions

  • medium S Add a coverage build (--coverage with lcov or gcovr) to test_platform_ubuntu.yml and publish it to Codecov.
  • medium M Add a CI step that compares the TimesliceExample or EICrecon output with a stored reference using epic-capybara.
0

Static analysis & consistency eng.static-quality

Absent · confidence high

The project configures no formatter, linter or static analyzer; the only .clang-format and .clang-tidy files belong to vendored pybind11. Compiler warnings (-Wall -Wextra in Debug, -Werror on macOS) and optional ASan/TSan build options exist but are not linters.

Evidence (4)

Gaps to the next level

  • No project formatter or linter configuration.
  • No sanitizer or static-analysis job in CI.

Actions

  • high S Add a .clang-format matching the documented conventions and a .pre-commit-config.yaml with clang-format, and enable pre-commit.ci on PRs.
2

Architecture & language standards eng.modularity

Established · confidence high

CMake builds components (core library, plugins, programs) with C++17 as default, configuration goes through the parameter manager, and an exported JANAConfig.cmake with JANA:: targets is installed. All headers, including Engine and Topology internals, are installed by glob, so public API and internals are not separated.

Evidence (5)

Gaps to the next level

  • Every header under Engine/, Topology/ and Utils/ is installed; no separation of public API from internals.
  • The build still accepts C++14.

Actions

  • medium M Install only the user-facing headers (or move internals to an internal/ directory excluded from install) and drop C++14 from the accepted standards.

Documentation & usability 1.0

1

User onboarding doc.user

Initial · confidence high

The README and the hosted docs give CMake build-and-run commands, a tutorial and a configuration how-to, but no list of dependencies or minimum versions and no eic-shell or Spack install route.

Evidence (4)

Gaps to the next level

  • Dependencies (CMake 3.16, ROOT, podio, ZeroMQ, Xerces-C, Python) and their versions are not listed.
  • No eic-shell or Spack installation route documented.
  • The tutorial links to src/examples/Tutorial, which no longer exists.

Actions

  • medium S Add a dependency table with minimum versions and an "Installing via eic-shell / eic-spack" section to docs/install.md.
1

Developer & API documentation doc.developer

Initial · confidence medium

An architecture overview (docs/concepts.md, docs/behavior.md) exists and Doxygen is generated and deployed to Pages by CI, but most public methods lack doc comments (for example JApplicationFwd.h declarations and JComponent.h carry none).

Evidence (4)

Gaps to the next level

  • Most public methods of JApplication, JComponent, JEventUnfolder and JEventProcessor have no Doxygen comments.

Actions

  • medium M Add Doxygen comments to every public method in the installed headers of src/libraries/JANA/ starting with JApplication, JComponent, JEventProcessor and JEventUnfolder.
1

Contribution guidelines doc.contributing

Initial · confidence high

The inherited organization CONTRIBUTING.md gives a generic fork-and-PR note and docs/development/contributing.md lists coding conventions and the release procedure, but neither covers development setup or running the tests, and there are no issue or PR templates.

Evidence (4)

Gaps to the next level

  • No documented development setup or test commands (ctest).
  • No issue or PR templates.

Actions

  • medium S Add CONTRIBUTING.md covering eic-shell setup, the CMake options used in CI, running ctest, and the PR process, plus .github/pull_request_template.md and issue templates.

Community & governance 0.8

0

Issue & PR responsiveness com.responsiveness

Absent · confidence medium

6 of 11 issues opened in 12 months (54.5%) received no response, a majority; most of these are maintainer-filed tracking issues, but one external report (#496) is also unanswered. No issue opened in 12 months is labeled and 44 of 50 open issues are older than one year.

Evidence (5)

Gaps to the next level

  • Most issues opened in 12 months have no response.
  • No labeling or triage of new issues; 88% of open issues are older than one year.

Actions

  • high S Respond to and label every new issue (existing bug/enhancement labels), and close or label the 44 open issues older than one year.
2

Contributor base com.contributors

Established · confidence high

8 authors from 3 e-mail domains committed in 24 months and 15.4% of merged PRs came from outside the maintainer group; fewer than 10 active authors prevents level 3.

Evidence (4)
  • git.authors_24m = 8
  • git.email_domains_24m = 3
  • git.new_authors_12m = 1
  • prs.external_fraction_12m = 0.154

Gaps to the next level

  • Fewer than 10 active authors in 24 months; external PRs are 15.4% of merges, below 20%.

Actions

  • medium M Label newcomer issues and invite EICrecon and GlueX developers to take ownership of specific components through PRs.
0

Knowledge concentration (bus factor) com.bus-factor

Absent · confidence high

The top author wrote 90.9% of commits in 24 months, no merged PR in 12 months had a non-author reviewer, and one person merged all PRs.

Evidence (6)
  • git.top_author_share_24m = 0.909
  • git.bus_factor_50_24m = 1
  • prs.distinct_reviewers_12m = 0
  • prs.distinct_mergers_12m = 1
  • releases.authors_24m = 2
  • files.codeowners = []

Gaps to the next level

  • One person writes over 80% of commits and nobody else reviews or merges.
  • No CODEOWNERS or maintainer list.

Actions

  • high S Add CODEOWNERS naming at least two maintainers and have a second maintainer review and merge PRs.
1

Governance & roadmap com.governance

Initial · confidence medium

The LICENSE file lists authors and the docs describe the release procedure, but there is no documented decision process or path to maintainership; the only open milestone is past its due date.

Evidence (3)

Gaps to the next level

  • No GOVERNANCE document or description of who decides and how to become a maintainer.

Actions

  • medium S Add GOVERNANCE.md naming the maintainers, the decision process, the path to maintainership and the link to the ePIC software meetings where JANA2 changes are discussed.
1

Code of conduct & user support com.conduct

Initial · confidence medium

The JeffersonLab organization Contributor Covenant applies with a reporting phone number, but neither the README nor the docs name a support channel; GitHub Discussions is enabled with only a welcome post and release announcements.

Evidence (3)

Gaps to the next level

  • No support channel documented in the README or docs.

Actions

  • medium S Add a "Getting help" section to README.md and docs/index.md linking GitHub Discussions (or the EIC Mattermost channel) and the issue tracker.

Infrastructure & distribution 2.0

3

Packaging & installability dist.packaging

Sustained · confidence high

The eic-spack recipe provides the latest release 2026.03.01, which eic-shell ships; the recipe was updated one day after the release.

Evidence (5)
  • packaging.eic_spack.versions = ["master", "2026.03.01", "2026.03.00", "2026.02.00", "2.4.3"]
  • packaging.in_eic_shell = true
  • packaging.eic_shell_version = 2026.03.01
  • releases.latest_tag = v2026.03.01
  • github.com/eic/eic-spack/pull/1012
2

Releases & versioning dist.releases

Established · confidence high

10 releases in 24 months, a documented CalVer scheme (YEAR.MAJOR.PATCH), and notes for every release. Releases are cut manually, there is no deprecation policy, and breaking changes are not consistently flagged with migration notes.

Evidence (4)

Gaps to the next level

  • No release workflow; the release procedure is manual.
  • No deprecation policy; breaking changes lack a consistent section and migration notes.

Actions

  • medium M Add a tag-triggered .github/workflows/release.yml that creates the GitHub release, and add a "Breaking changes / Migration" section and a deprecation policy to docs/Download.md.
1

Dependency management & supply chain dist.dependencies

Initial · confidence high

Dependencies are declared through find_package in CMakeLists.txt without minimum versions, and vendored code includes Catch2 2.13.7 (2021) and a 2002 md5 implementation.

Evidence (4)
  • CMakeLists.txt#L80-L126
  • eic.vendored_candidates = ["src/external/catch2", "src/external/md5", "src/external/tomlplusplus", "src/python/externals/pybind11-2.10.3"]
  • ci.action_refs_not_sha_pinned = 29
  • files.dependabot = []

Gaps to the next level

  • No VERSION on find_package for podio, ROOT, cppzmq or Xerces-C.
  • Vendored Catch2 v2 and md5 are no longer maintained upstream; no Dependabot or SECURITY.md.

Actions

  • medium S Add minimum VERSION arguments to every find_package and use the Catch2 v3 package from eic-shell/Spack instead of src/external/catch2.
1

Reproducibility & environments dist.reproducibility

Initial · confidence medium

Containerfiles for development environments exist, but only the CUDA container is documented, CI images are unpinned (:latest, nightly), and configuration is only dumped on request rather than recorded with outputs.

Evidence (3)

Gaps to the next level

  • No documented, versioned environment (eic-shell version or tagged image) per release.
  • Parameter values and software versions are not recorded with outputs by default.

Actions

  • medium S State in docs/Download.md the eic-shell release each JANA2 release is tested with, and document running in that image.
3

Portability & heterogeneous computing dist.portability

Sustained · confidence medium

CI builds and tests on Linux (GCC, eic-shell) and macOS (AppleClang), with no site-specific paths in code, JANA2 runs unmodified in ePIC production campaigns through EICrecon, and CUDA support is provided through an example plugin and documented container.

Evidence (5)

EIC ecosystem integration 2.2

3

Reuse of EIC-supported components eic.reuse

Sustained · confidence medium

JANA2 is itself the EIC-supported reconstruction framework and integrates podio for its data model; EICrecon and ejana in eic-spack depend on it.

Evidence (4)
2

Data formats & interoperability eic.data-model

Established · confidence medium

JANA2 inserts and retrieves podio collections in podio::Frames and its examples read and write podio ROOT files; it does not declare or check a data-model version and has no I/O round-trip test.

Evidence (3)

Gaps to the next level

  • No write-then-read round-trip test of podio files in ctest.
  • Only compile-time podio version guards; no data-model version recorded or checked.

Actions

  • medium S Add a ctest that writes a podio file with PodioFileWriter, reads it back with PodioFileReader and compares collection contents.
1

EIC environment compatibility eic.environment

Initial · confidence medium

CI builds, tests and runs EICrecon in the eic_xl:nightly image, but neither the README nor the docs describe building or running JANA2 in eic-shell.

Evidence (3)

Gaps to the next level

  • Building and running in eic-shell is not documented.
  • CI tests only the nightly image, not a pinned stable eic-shell release.

Actions

  • medium S Document in docs/install.md how to use the eic-shell JANA2 and how to build a development copy inside eic-shell.
3

Currency with the EIC stack eic.currency

Sustained · confidence medium

eic-shell ships the latest JANA2 release with ROOT 6.40.04 and podio 1.8; ROOT 6.40 incompatibility (#500) was fixed the day it was reported and podio's removed operator-> was handled before removal (#477). The nightly eic-shell build shows deprecation warnings in JANA2 code only from pybind11 and the Python C API, not from EIC-supported components.

Evidence (5)

Impact & long-term viability 1.8

1

Licensing via.license

Initial · confidence medium

LICENSE carries a BSD-3-Clause-style text modified with "All Rights Reserved", "as a licensed user" and a U.S. Government clause, which GitHub does not recognize as an SPDX license.

Evidence (2)

Gaps to the next level

  • No recognized SPDX identifier; the license text deviates from standard BSD-3-Clause.

Actions

  • high S Replace LICENSE with the standard BSD-3-Clause text (keeping the government notice in a separate NOTICE file) so GitHub detects BSD-3-Clause.
1

Citation & attribution via.citation

Initial · confidence high

CITATION.cff and a Zenodo concept DOI with a DOI for every release exist, but both name a single collective author and no contributor list is maintained.

Evidence (3)

Gaps to the next level

  • No maintained author or contributor list; CITATION.cff and Zenodo list one collective author.

Actions

  • medium S List the individual contributors in CITATION.cff (or .zenodo.json) and the ACAT 2019 paper as preferred-citation.
2

Institutional backing & continuity via.support

Established · confidence medium

The repository is owned by Jefferson Lab and the LICENSE states the software was developed under a U.S. Government contract by Jefferson Science Associates; there is no documented multi-institution maintenance commitment or succession plan.

Evidence (2)

Gaps to the next level

  • No documented multi-institution maintenance commitment or succession plan.

Actions

  • medium S Document in the README the maintaining institutions, the owning ePIC/JLab software group, and the plan for maintainer turnover.

Key metrics

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

Commits, 12 months140git.commits_12m
Active authors, 12 months4git.authors_12m
Active authors, 24 months8git.authors_24m
New authors, 12 months1git.new_authors_12m
Bus factor (50% of commits, 24 months)1git.bus_factor_50_24m
Top author share of commits, 24 months91%git.top_author_share_24m
Institutional e-mail domains, 24 months3git.email_domains_24m
Default-branch changes via PR, 12 months84%git.first_parent_pr_fraction_12m
PRs merged, 12 months26prs.merged_12m
Merged PRs reviewed by non-author0%prs.reviewed_fraction_12m
Median days to merge4.0prs.median_days_to_merge_12m
Merged PRs touching tests31%prs.test_touching_fraction_12m
Distinct reviewers, 12 months0prs.distinct_reviewers_12m
Issues opened, 12 months11issues.created_12m
Median days to first response53%issues.median_first_response_days_12m
Issues without response55%issues.unanswered_fraction_12m
Open issues older than 1 year44issues.open_older_365d
Releases, 24 months10releases.count_24m
Latest releasev2026.03.01releases.latest_tag
Default-branch CI success rate88%ci.default_branch_success_rate
CI runs in eic-shellyesci.uses_eic_shell
License (SPDX)NOASSERTIONrepo.license_spdx
Ships in eic-shellyespackaging.in_eic_shell
eic-shell version2026.03.01packaging.eic_shell_version
Source lines (excluding vendored)47758code.source_lines
Test files50code.test_files