Overview /

epic-capybara

github.com/eic/epic-capybara toolingcommunity · pass 2026-10-12 · commit 6fb78eff9b61 · assessor claude-opus-5-5

epic-capybara is shipped in eic-shell and runs in the CI of EICrecon, epic, npsim and eic/containers, and its default-branch CI includes an end-to-end comparison of EICrecon artifacts that succeeded on all recent runs. Knowledge is concentrated (bus factor 1, 3 authors from 1 e-mail domain in 24 months, 35% of merged PRs reviewed by a non-author), and the only unit test (a doctest) is not run in CI. There is no linter or formatter, no CONTRIBUTING, code of conduct, governance or citation metadata, and dependencies are mostly unversioned with requires-python = ">=3.7".

1.2overall, 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 naming two maintainers for epic_capybara/ and .github/workflows/.
highS com.conduct (1) Add CODE_OF_CONDUCT.md linking the ePIC collaboration code of conduct and its reporting contact.
highS eng.static-quality (0) Add .pre-commit-config.yaml with ruff and ruff-format and enable pre-commit.ci on the repository.
highS via.citation (0) Add CITATION.cff listing all contributors and enable the Zenodo-GitHub integration for releases.
highS via.support (1) State in the README which ePIC software working group owns epic-capybara and the maintainers' institutions.
highM com.contributors (1) Recruit a co-developer from another ePIC institution (for example among the EICrecon or epic CI users) and label newcomer issues as good first issue.
mediumS com.governance (1) Add a "Maintainers and governance" section to the README naming the maintainers, the owning ePIC group, and the decision process.
mediumS com.responsiveness (1) Close resolved issues (for example 22) and apply the existing bug/enhancement labels to all open issues.
mediumS dist.dependencies (1) Add tested minimum versions to every entry in [project] dependencies in pyproject.toml.
mediumS dist.packaging (2) Add version("1.2.0", ...) (and later releases) to the eic-spack py-epic-capybara recipe and require it in eic/containers packages.yaml.
mediumS dist.portability (1) Add a Python-version matrix (for example 3.10 and 3.13) with actions/setup-python to the build job in build.yml.
mediumS dist.releases (1) State in the README that releases follow SemVer and tag a release at least every six months.
mediumS dist.reproducibility (1) Document the eic-shell version in which each release is tested and write the capybara version into the generated index.html.
mediumS doc.contributing (1) Add CONTRIBUTING.md covering eic-shell or Hatch setup, hatch run cov, commit-message conventions and the review process.
mediumS doc.developer (1) Add docs/architecture.md describing the capy → bara → cate flow and the KS/Anderson-Darling tests, and add docstrings to the CLI commands.
mediumS doc.user (1) Rewrite the README install section to cover eic-shell, pip install epic-capybara, and from-source, and add a capybara bara a.root b.root --serve example with sample files.
mediumS eic.currency (2) Add an eic-shell nightly job (platform-release set to eic_xl:nightly) to build.yml.
mediumS eic.data-model (2) Read the podio/EDM4eic version from the input file metadata, print it in the report, and warn when the two inputs differ.
mediumS eic.environment (1) Add a job to build.yml that installs and runs capybara bara inside eic-shell with eic/run-cvmfs-osg-eic-shell.
mediumS eng.change-control (1) Set required_approving_review_count to 1 in ruleset 5452494 so every PR needs a non-author approval.
mediumS eng.ci (1) Add a step to .github/workflows/build.yml that runs hatch run cov (pytest) on every PR and push to main.
mediumS eng.modularity (1) Raise requires-python to >=3.10 and update the classifiers and tool.hatch.envs.test.matrix accordingly.
mediumM eng.testing (1) Add pytest tests for bara that compare two small ROOT files (for example from scikit-hep-testdata) and assert p-values and generated report files.
lowS eng.testing (1) Enable --doctest-modules for the epic_capybara package so bara.py doctests run.
lowS via.license (2) Add SPDX-License-Identifier MIT headers to all source files and state inbound = outbound licensing in a CONTRIBUTING file.
lowM eng.modularity (1) Split bara() into separate functions for reading, statistical comparison and report rendering.

Assessment by criterion

Code health & engineering practices 0.8

1

Change control & code review eng.change-control

Initial · confidence high

All default-branch changes arrive through squash-merged PRs under an active ruleset, but only 35% of merged PRs in 12 months were reviewed by someone other than the author, below the 50% required for level 2.

Evidence (4)

Gaps to the next level

  • The ruleset requires a PR but zero approving reviews, so most PRs are self-merged without review.
  • No CODEOWNERS file.

Actions

  • medium S Set required_approving_review_count to 1 in ruleset 5452494 so every PR needs a non-author approval.
1

Continuous integration eng.ci

Initial · confidence high

build.yml runs on every PR and on main, builds the wheel and runs capybara capy/bara on EICrecon artifacts, with all recent default-branch runs succeeding, but it never runs the pytest suite in tests/.

Evidence (3)

Gaps to the next level

  • CI does not run pytest (the tests/ directory is never executed).
  • No required status check on main.

Actions

  • medium S Add a step to .github/workflows/build.yml that runs hatch run cov (pytest) on every PR and push to main.
1

Testing eng.testing

Initial · confidence high

The only test file runs the doctests of epic_capybara/util.py; capy, bara, cate, github.py and filesystem.py have no unit tests, and the tests are not run in CI.

Evidence (3)

Gaps to the next level

  • No unit tests for the majority of modules (bara.py statistics, key normalisation, capy artifact download).
  • Doctests in bara.py (_normalize_key) are not collected by the test suite.
  • Tests are not executed in CI.

Actions

  • medium M Add pytest tests for bara that compare two small ROOT files (for example from scikit-hep-testdata) and assert p-values and generated report files.
  • low S Enable --doctest-modules for the epic_capybara package so bara.py doctests run.
0

Static analysis & consistency eng.static-quality

Absent · confidence high

No formatter, linter or type checker is configured in the repository or its workflows.

Evidence (2)
  • files.python_lint = []
  • files.pre_commit = []

Gaps to the next level

  • No formatter or linter (ruff, black, flake8) and no pre-commit configuration.

Actions

  • high S Add .pre-commit-config.yaml with ruff and ruff-format and enable pre-commit.ci on the repository.
1

Architecture & language standards eng.modularity

Initial · confidence medium

The package is split into CLI modules and helpers and installs through pyproject.toml with entry points, but it declares requires-python = ">=3.7" (below the 3.9 threshold) and bara is one 500-line function.

Evidence (3)

Gaps to the next level

  • Declared Python floor (3.7) and test matrix (3.7 to 3.11) are outdated.
  • Histogramming, statistical tests and report rendering are interleaved in the single bara() function.

Actions

  • medium S Raise requires-python to >=3.10 and update the classifiers and tool.hatch.envs.test.matrix accordingly.
  • low M Split bara() into separate functions for reading, statistical comparison and report rendering.

Documentation & usability 1.0

1

User onboarding doc.user

Initial · confidence high

The README gives a from-source install with Hatch and points to --help, but names no dependencies or versions, has no eic-shell route, no runnable example with input files, and documents nonexistent "legacy scripts".

Evidence (1)

Gaps to the next level

  • No mention that capybara is available in eic-shell, and no pip install epic-capybara route.
  • No runnable quick-start example with sample input files.
  • The "Legacy scripts" section refers to capy.py and bara.py, which do not exist at the repository root.

Actions

  • medium S Rewrite the README install section to cover eic-shell, pip install epic-capybara, and from-source, and add a capybara bara a.root b.root --serve example with sample files.
1

Developer & API documentation doc.developer

Initial · confidence high

A few helpers carry docstrings (skip_common_prefix, _normalize_key, _ad_rng), but the CLI commands and github.py are undocumented and there is no API reference or architecture overview.

Evidence (2)

Gaps to the next level

  • No generated API documentation.
  • No description of the capy/bara/cate data flow or of the statistical tests used.

Actions

  • medium S Add docs/architecture.md describing the capy → bara → cate flow and the KS/Anderson-Darling tests, and add docstrings to the CLI commands.
1

Contribution guidelines doc.contributing

Initial · confidence medium

The README shows how to run the development version with Hatch and the EIC organization supplies PR and issue templates, but there is no CONTRIBUTING file covering tests, conventions or the PR process.

Evidence (3)

Gaps to the next level

  • No CONTRIBUTING.md describing environment setup, running tests, and coding conventions.

Actions

  • medium S Add CONTRIBUTING.md covering eic-shell or Hatch setup, hatch run cov, commit-message conventions and the review process.

Community & governance 1.0

1

Issue & PR responsiveness com.responsiveness

Initial · confidence low

All 3 issues opened in 12 months came from a maintainer and none is labeled; 4 of 6 open issues are older than one year, which exceeds the half allowed at level 2.

Evidence (4)

Gaps to the next level

  • More than half of open issues are older than one year (issue 22 appears addressed by PR 23 but remains open).
  • Issues are not labeled or otherwise triaged.

Actions

  • medium S Close resolved issues (for example 22) and apply the existing bug/enhancement labels to all open issues.
1

Contributor base com.contributors

Initial · confidence high

Three authors were active in 24 months, all from one e-mail domain, with no new authors in 12 months and no external PRs.

Evidence (4)
  • git.authors_24m = 3
  • git.email_domains_24m = 1
  • git.new_authors_12m = 0
  • prs.external_fraction_12m = 0.0

Gaps to the next level

  • Fewer than 4 active authors in 24 months, and no evidence of more than one institution.

Actions

  • high M Recruit a co-developer from another ePIC institution (for example among the EICrecon or epic CI users) and label newcomer issues as good first issue.
1

Knowledge concentration (bus factor) com.bus-factor

Initial · confidence high

The top author wrote 61% of commits in 24 months (bus factor 1) and made all 3 releases, while 3 people review and merge.

Evidence (4)
  • git.bus_factor_50_24m = 1
  • git.top_author_share_24m = 0.607
  • prs.distinct_mergers_12m = 3
  • releases.authors_24m = 1

Gaps to the next level

  • Bus factor (50%) is 1.
  • No CODEOWNERS or maintainer list naming at least 2 people.

Actions

  • high S Add .github/CODEOWNERS naming two maintainers for epic_capybara/ and .github/workflows/.
1

Governance & roadmap com.governance

Initial · confidence medium

A maintainer is identifiable from the pyproject.toml authors list and the eic-spack recipe, but there is no documented decision process, maintainer path, roadmap or milestones.

Evidence (2)

Gaps to the next level

  • No governance document describing who decides and how to become a maintainer.

Actions

  • medium S Add a "Maintainers and governance" section to the README naming the maintainers, the owning ePIC group, and the decision process.
1

Code of conduct & user support com.conduct

Initial · confidence medium

The EIC organization issue-template configuration links the ePIC Mattermost and software meetings as support channels, but no code of conduct applies at repository or organization level.

Evidence (2)

Gaps to the next level

  • No code of conduct with a reporting contact.

Actions

  • high S Add CODE_OF_CONDUCT.md linking the ePIC collaboration code of conduct and its reporting contact.

Infrastructure & distribution 1.2

2

Packaging & installability dist.packaging

Established · confidence high

PyPI provides the latest release 1.2.0 and the package ships in eic-shell, but the eic-spack recipe only offers main and eic-shell pins a commit that predates v1.1.0 and v1.2.0.

Evidence (4)

Gaps to the next level

  • The eic-spack recipe has no versioned releases, so eic-shell is not updated per project release.

Actions

  • medium S Add version("1.2.0", ...) (and later releases) to the eic-spack py-epic-capybara recipe and require it in eic/containers packages.yaml.
1

Releases & versioning dist.releases

Initial · confidence high

Three releases with generated notes were made between July and August 2026 and none in the preceding 12 months, and no version scheme is documented.

Evidence (3)

Gaps to the next level

  • No documented version scheme (SemVer or CalVer).
  • Releases do not cover the 24-month window at 2 per year.

Actions

  • medium S State in the README that releases follow SemVer and tag a release at least every six months.
1

Dependency management & supply chain dist.dependencies

Initial · confidence high

Dependencies are declared in pyproject.toml, but only bokeh (and uproot in the rntuple extra) carry minimum versions; Dependabot covers GitHub Actions only, which are not SHA-pinned.

Evidence (3)

Gaps to the next level

  • No minimum versions for awkward, click, hist, PyGithub, requests, scipy, uproot, although bara.py uses version-dependent SciPy APIs (PermutationMethod(rng=...)).

Actions

  • medium S Add tested minimum versions to every entry in [project] dependencies in pyproject.toml.
1

Reproducibility & environments dist.reproducibility

Initial · confidence low

pyproject.toml and the Hatch environment declare the dependency set and Anderson-Darling subsampling uses per-key deterministic seeds, but there is no lockfile, container or documented eic-shell version.

Evidence (2)

Gaps to the next level

  • No machine-readable pinned environment (lockfile, container image, or eic-shell version).
  • Reports do not record the epic-capybara or dependency versions used.

Actions

  • medium S Document the eic-shell version in which each release is tested and write the capybara version into the generated index.html.
1

Portability & heterogeneous computing dist.portability

Initial · confidence high

CI runs only on ubuntu-latest with the runner's default Python; no other Python version or OS is tested, and no site-specific paths were found.

Evidence (2)
  • ci.runs_on = [ubuntu-latest]
  • code.site_specific_paths = []

Gaps to the next level

  • Only one Python version and one OS are tested.

Actions

  • medium S Add a Python-version matrix (for example 3.10 and 3.13) with actions/setup-python to the build job in build.yml.

EIC ecosystem integration 2.0

2

Data formats & interoperability eic.data-model

Established · confidence medium

Inputs are EDM4hep/EDM4eic podio ROOT files (TTree or RNTuple) read via uproot; outputs are an HTML report, not physics data; no data-model version is checked.

Evidence (2)

Gaps to the next level

  • No check of the podio or EDM4eic version of input files.
  • No tests reading TTree and RNTuple inputs.

Actions

  • medium S Read the podio/EDM4eic version from the input file metadata, print it in the report, and warn when the two inputs differ.
1

EIC environment compatibility eic.environment

Initial · confidence high

The package ships in eic-shell and is run there by downstream CI, but its own CI runs on a plain ubuntu-latest runner and the README does not document eic-shell use.

Evidence (2)
  • ci.uses_eic_shell = false
  • packaging.in_eic_shell = true

Gaps to the next level

  • CI does not build or test in an eic container image.
  • The README does not document building or running in eic-shell.

Actions

  • medium S Add a job to build.yml that installs and runs capybara bara inside eic-shell with eic/run-cvmfs-osg-eic-shell.
2

Currency with the EIC stack eic.currency

Established · confidence medium

The current eic-shell ships the package and the EICrecon eic-shell CI runs it, so it is compatible with the current stack; there is no nightly eic-shell CI and eic-shell pins a commit from before v1.1.0.

Evidence (3)

Gaps to the next level

  • No CI against eic-shell nightly to catch incompatibilities with new uproot, awkward or podio releases.
  • eic-shell does not ship the latest release (v1.2.0).

Actions

  • medium S Add an eic-shell nightly job (platform-release set to eic_xl:nightly) to build.yml.

Impact & long-term viability 1.5

2

Licensing via.license

Established · confidence high

The MIT license is detected by GitHub and declared in pyproject.toml; SPDX headers appear only in some files and there are no contribution terms.

Evidence (3)

Gaps to the next level

  • SPDX headers are missing from bara.py, capy.py, cate.py, util.py, github.py and filesystem.py.
  • No documented contribution terms (inbound = outbound or DCO).

Actions

  • low S Add SPDX-License-Identifier MIT headers to all source files and state inbound = outbound licensing in a CONTRIBUTING file.
0

Citation & attribution via.citation

Absent · confidence high

There is no CITATION.cff, .zenodo.json, codemeta, DOI or citation request in the README.

Gaps to the next level

  • No citation metadata or software DOI.

Actions

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

Institutional backing & continuity via.support

Initial · confidence medium

The repository is hosted in the eic organization with copyright held by "Electron-Ion Collider (EIC) Software", but no ePIC body is named as owner and no funding or institutional commitment is stated.

Evidence (2)

Gaps to the next level

  • Maintenance responsibility is not assigned to an EIC or ePIC working group in the documentation.

Actions

  • high S State in the README which ePIC software working group owns epic-capybara and the maintainers' institutions.

Key metrics

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

Commits, 12 months17git.commits_12m
Active authors, 12 months2git.authors_12m
Active authors, 24 months3git.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 months61%git.top_author_share_24m
Institutional e-mail domains, 24 months1git.email_domains_24m
Default-branch changes via PR, 12 months100%git.first_parent_pr_fraction_12m
PRs merged, 12 months17prs.merged_12m
Merged PRs reviewed by non-author35%prs.reviewed_fraction_12m
Median days to merge80%prs.median_days_to_merge_12m
Merged PRs touching tests0%prs.test_touching_fraction_12m
Distinct reviewers, 12 months3prs.distinct_reviewers_12m
Issues opened, 12 months3issues.created_12m
Median days to first response82%issues.median_first_response_days_12m
Issues without response67%issues.unanswered_fraction_12m
Open issues older than 1 year4issues.open_older_365d
Releases, 24 months3releases.count_24m
Latest releasev1.2.0releases.latest_tag
Default-branch CI success rate100%ci.default_branch_success_rate
CI runs in eic-shellnoci.uses_eic_shell
License (SPDX)MITrepo.license_spdx
Ships in eic-shellyespackaging.in_eic_shell
eic-shell versiongit.30735bc79b3d78afae1744775f863bb194527fe2packaging.eic_shell_version
Source lines (excluding vendored)994code.source_lines
Test files2code.test_files