Overview /

EDM4eic

github.com/eic/EDM4eic data-modelcore · pass 2026-10-12 · commit 9b48c1d15c44 · assessor claude-opus-5-5

The main risks are that CI builds but never runs the project's ctest suite, that no formatter, linter, code of conduct, contribution guide or documented version scheme exists, and that 21 of 25 open issues are older than one year. Established practices are PR-only changes with branch protection requiring one approving review and the build-test check (95.8% of merged PRs reviewed), weekly and per-PR builds in eic-shell nightly with a downstream eic_container/benchmark trigger, and eic-spack packaging that ships the latest release (8.10.0) in eic-shell.

1.6overall, of 3

Action plan

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

PriorityEffortCriterionAction
highS com.conduct (0) Add CODE_OF_CONDUCT.md (or link the ePIC collaboration code of conduct) with a reporting contact.
highS com.conduct (0) Add a "Getting help" section to README.md linking the ePIC Mattermost channel for the data model.
highS eng.ci (1) Add ctest --test-dir build --output-on-failure to the run: block of the build-test step in .github/workflows/linux-eic-shell.yml.
highS eng.static-quality (0) Add .pre-commit-config.yaml with clang-format for utils/ and test/ and a YAML linter for edm4eic.yaml, and enable pre-commit.ci.
highS eng.static-quality (0) Add -Wall -Wextra to the write_events, read_events and generated datamodel targets.
highS eng.testing (1) Run ctest in linux-eic-shell.yml (see eng.ci) so the existing round-trip test gates every PR.
mediumS com.bus-factor (2) Extend .github/CODEOWNERS to cover CMakeLists.txt, utils/ and test/ with two named maintainers each.
mediumS com.bus-factor (2) Add RELEASING.md describing the version bump, tag, GitHub release and eic-spack update.
mediumS com.governance (1) Add GOVERNANCE.md stating that the ePIC admin team approves schema changes, how proposals are decided, and how one becomes a maintainer.
mediumS com.responsiveness (1) Close or label each of the 21 open issues older than one year, and label every new issue on arrival.
mediumS dist.dependencies (1) Remove the CLI11 lookup with the dead event_merge target and add find_dependency calls to cmake/EDM4EICConfig.cmake.in.
mediumS dist.portability (1) Add a matrix to build-test in linux-eic-shell.yml that also builds with CXX=clang++ and on ubuntu-24.04-arm.
mediumS dist.releases (1) State in README.md which changes require a major, minor or patch bump, and follow it for schema-breaking changes.
mediumS dist.reproducibility (1) Document in README.md the eic-shell release that first ships each EDM4eic version, and add a CI job pinned to the current stable eic-shell.
mediumS doc.contributing (1) Add CONTRIBUTING.md covering eic-shell setup, build, ctest, naming and units conventions for new datatypes, and the version-bump rule.
mediumS doc.contributing (1) Add .github/ISSUE_TEMPLATE/ with "new datatype proposal" and "bug report" templates.
mediumS doc.user (1) Add an "Installation" section to README.md naming podio, EDM4hep and ROOT with minimum versions and the eic-shell and spack install edm4eic routes.
mediumS doc.user (1) Add a short C++ and uproot example reading an EDM4eic collection, linked from the README.
mediumS eic.environment (1) Add an eic-shell section to README.md (EDM4eic is preinstalled; building a development version inside eic-shell).
mediumS eic.environment (1) Add a matrix entry with platform-release: eic_xl:<current stable> to build-test in linux-eic-shell.yml.
mediumS eng.modularity (2) Add find_dependency(podio 1.2), find_dependency(EDM4HEP) and find_dependency(ROOT 6) to cmake/EDM4EICConfig.cmake.in.
mediumS eng.testing (1) Add unit tests for utils/include/edm4eic/vector_utils.h and analysis_utils.h.
mediumS via.support (2) State in README.md the owning ePIC body, the maintainers' institutions and what happens when a maintainer leaves.
mediumM com.contributors (2) Invite detector and analysis groups that propose datatypes in issues (for example
mediumM doc.developer (2) Add docs/conventions.md covering units, covariance coordinate systems, parameter ordering and the association-to-link transition, and include it in the Doxygen input.
mediumM eic.data-model (2) Add a CI job that reads a stored file from the previous release with the PR build, using podio schema evolution.
mediumM eic.reuse (1) Document, per datatype that has an EDM4hep counterpart, why the EDM4eic version is needed, or replace it with the EDM4hep type.
mediumM eic.reuse (1) Deprecate and schedule removal of the MCReco*Association datatypes in favor of the link types.
mediumM eng.testing (1) Extend test/write_events.h and test/read_events.h to write and read back one object of every datatype and link type.
mediumM via.citation (2) Add CITATION.cff with the concept DOI and a DOI badge in README.md, and cite an EDM4eic description in an ePIC software publication.
lowS eng.ci (1) Delete the unused .gitlab-ci.yml.
lowS eng.modularity (2) Remove utils/src/event_merge.cpp and its CMake block, or port it to podio::Frame.
lowS via.license (2) Correct LICENSE.spdx to describe EDM4eic, and add REUSE metadata recording the Apache-2.0 and MIT files.
lowS via.license (2) State inbound = outbound licensing in a CONTRIBUTING.md.

Assessment by criterion

Code health & engineering practices 1.4

3

Change control & code review eng.change-control

Sustained · confidence high

All first-parent commits in 12 months came through PRs and 95.8% of merged PRs were reviewed by a non-author; branch protection on main requires one approving and code-owner review (enforced for admins), and a PR template sets expectations.

Evidence (5)
1

Continuous integration eng.ci

Initial · confidence high

linux-eic-shell.yml builds and installs on every PR, push and weekly (97.6% success on main) and triggers the downstream eic_container and benchmark pipelines, but it never runs ctest, so the project's own tests are not executed.

Evidence (4)

Gaps to the next level

  • The build-test job runs cmake --build build -- install only; the write_events/read_events ctest tests are never executed.
  • The downstream eicweb/eic_container and benchmark statuses failed on the assessed commit and are not required checks.
  • The legacy .gitlab-ci.yml targets a master branch and the retired juggler pipeline and does not run.

Actions

  • high S Add ctest --test-dir build --output-on-failure to the run: block of the build-test step in .github/workflows/linux-eic-shell.yml.
  • low S Delete the unused .gitlab-ci.yml.
1

Testing eng.testing

Initial · confidence high

The only tests are a write/read round trip of one RawTrackerHit collection out of 52 defined types, and CI does not run them.

Evidence (4)

Gaps to the next level

  • Tests cover one of 52 datatypes and components; the utils headers (vector_utils.h, analysis_utils.h) have no tests.
  • Tests are not run in CI.
  • No backward-compatibility test that reads files written by earlier releases (issue

Actions

  • high S Run ctest in linux-eic-shell.yml (see eng.ci) so the existing round-trip test gates every PR.
  • medium M Extend test/write_events.h and test/read_events.h to write and read back one object of every datatype and link type.
  • medium S Add unit tests for utils/include/edm4eic/vector_utils.h and analysis_utils.h.
0

Static analysis & consistency eng.static-quality

Absent · confidence high

No formatter, linter, static analyzer or pre-commit configuration exists, and no warning flags are set in the CMake files.

Gaps to the next level

  • No .clang-format, .clang-tidy, .pre-commit-config.yaml or YAML lint for edm4eic.yaml.
  • No compiler warning flags; utils/CMakeLists.txt only disables warnings for edm4eic_event_merge.

Actions

  • high S Add .pre-commit-config.yaml with clang-format for utils/ and test/ and a YAML linter for edm4eic.yaml, and enable pre-commit.ci.
  • high S Add -Wall -Wextra to the write_events, read_events and generated datamodel targets.
2

Architecture & language standards eng.modularity

Established · confidence medium

The data model is generated by podio from one YAML file, built with C++20 through CMake, and installs exported EDM4EIC:: targets with a package config; the installed config does not declare its dependencies and no architecture document exists beyond the type diagram.

Evidence (4)

Gaps to the next level

  • cmake/EDM4EICConfig.cmake.in does not call find_dependency for podio, EDM4HEP or ROOT, so consumers must locate them first.
  • utils/src/event_merge.cpp and its CLI11 lookup are only built for podio < 0.17.4, which the required podio 1.2 excludes (dead code).
  • No design or architecture document beyond the README type diagram.

Actions

  • medium S Add find_dependency(podio 1.2), find_dependency(EDM4HEP) and find_dependency(ROOT 6) to cmake/EDM4EICConfig.cmake.in.
  • low S Remove utils/src/event_merge.cpp and its CMake block, or port it to podio::Frame.

Documentation & usability 1.3

1

User onboarding doc.user

Initial · confidence high

The README gives generic CMake build commands and links a hosted Doxygen site, but names no dependencies or versions, has no eic-shell route, and has no runnable example.

Evidence (2)

Gaps to the next level

  • README does not list podio >= 1.2, EDM4hep >= 0.10.3 or ROOT 6 as dependencies.
  • No eic-shell or Spack install route documented.
  • No example showing how to read or write EDM4eic collections.

Actions

  • medium S Add an "Installation" section to README.md naming podio, EDM4hep and ROOT with minimum versions and the eic-shell and spack install edm4eic routes.
  • medium S Add a short C++ and uproot example reading an EDM4eic collection, linked from the README.
2

Developer & API documentation doc.developer

Established · confidence medium

Most members in edm4eic.yaml carry inline descriptions with units, Doxygen API docs are generated and deployed to GitHub Pages from main by CI, and the README carries a type-relation diagram; design conventions (covariance coordinate systems, units, links) are not documented.

Evidence (3)

Gaps to the next level

  • No documentation of the data-model conventions (coordinate systems of covariances, parameter ordering), which issues
  • 11 components have no Description, and the Doxyfile uses obsolete tags.

Actions

  • medium M Add docs/conventions.md covering units, covariance coordinate systems, parameter ordering and the association-to-link transition, and include it in the Doxygen input.
1

Contribution guidelines doc.contributing

Initial · confidence medium

Only a PR template exists; there is no CONTRIBUTING file, at repository or organization level, describing setup, testing, conventions or the schema-version bump.

Evidence (2)

Gaps to the next level

  • No CONTRIBUTING.md describing eic-shell setup, build, ctest and the rule to bump schema_version with the CMake version.
  • No issue templates.

Actions

  • medium S Add CONTRIBUTING.md covering eic-shell setup, build, ctest, naming and units conventions for new datatypes, and the version-bump rule.
  • medium S Add .github/ISSUE_TEMPLATE/ with "new datatype proposal" and "bug report" templates.

Community & governance 1.2

1

Issue & PR responsiveness com.responsiveness

Initial · confidence medium

Median first response is 0.99 days, but 21 of 25 open issues are older than one year and 12.5% of new issues were labeled.

Evidence (4)
  • issues.median_first_response_days_12m = 0.99
  • issues.open_older_365d = 21
  • issues.labeled_fraction_12m = 0.125
  • prs.open_older_90d = 10

Gaps to the next level

  • More than half of open issues are older than one year (for example
  • New issues are not labeled or otherwise triaged.

Actions

  • medium S Close or label each of the 21 open issues older than one year, and label every new issue on arrival.
2

Contributor base com.contributors

Established · confidence medium

Nine authors from two e-mail domains committed in 24 months and 8.3% of merged PRs came from outside the maintainer group; level 3 needs 10 authors from 3 institutions and 20% external PRs.

Evidence (4)
  • git.authors_24m = 9
  • git.email_domains_24m = 2
  • git.new_authors_12m = 3
  • prs.external_fraction_12m = 0.083

Gaps to the next level

  • Fewer than 10 authors and fewer than 3 institutions in 24 months.
  • External PRs are 8.3% of merged PRs, below 20%.

Actions

  • medium M Invite detector and analysis groups that propose datatypes in issues (for example
2

Knowledge concentration (bus factor) com.bus-factor

Established · confidence medium

Bus factor (50%) is 2 with a top-author share of 43.2%, six people reviewed and two merged in 12 months, and CODEOWNERS assigns edm4eic.yaml to the @eic/epic-admin team; bus factor 3 is not met.

Evidence (6)
  • git.bus_factor_50_24m = 2
  • git.top_author_share_24m = 0.432
  • prs.distinct_reviewers_12m = 6
  • prs.distinct_mergers_12m = 2
  • releases.authors_24m = 2
  • .github/CODEOWNERS#L1

Gaps to the next level

  • Bus factor (50%) is 2, below 3.
  • CODEOWNERS names a team whose membership is not publicly listed; CMake, utils and tests have no owners.
  • Release procedure (version bump in CMakeLists.txt and schema_version, tag, eic-spack update) is not documented.

Actions

  • medium S Extend .github/CODEOWNERS to cover CMakeLists.txt, utils/ and test/ with two named maintainers each.
  • medium S Add RELEASING.md describing the version bump, tag, GitHub release and eic-spack update.
1

Governance & roadmap com.governance

Initial · confidence medium

The approving team for edm4eic.yaml is identifiable from CODEOWNERS and datatype proposals are discussed in public issues, but there is no documented decision process or path to maintainership.

Evidence (2)

Gaps to the next level

  • No governance document stating who approves data-model changes and how.
  • No milestones or roadmap; open proposals (#111,

Actions

  • medium S Add GOVERNANCE.md stating that the ePIC admin team approves schema changes, how proposals are decided, and how one becomes a maintainer.
0

Code of conduct & user support com.conduct

Absent · confidence high

No code of conduct exists in the repository or the eic/.github organization repository, and the README names no support channel.

Gaps to the next level

  • No code of conduct with a reporting contact.
  • No documented support channel.

Actions

  • high S Add CODE_OF_CONDUCT.md (or link the ePIC collaboration code of conduct) with a reporting contact.
  • high S Add a "Getting help" section to README.md linking the ePIC Mattermost channel for the data model.

Infrastructure & distribution 1.4

1

Releases & versioning dist.releases

Initial · confidence medium

Twelve releases in 24 months, all with generated notes, but no version scheme is documented and minor releases carry breaking changes (C++20 requirement in 8.7.0, TrackParameters theta/phi swap in 8.10.0).

Evidence (5)

Gaps to the next level

  • No documented version scheme; edm4eic.yaml only defines the schema-version encoding and patch invariance.
  • No changelog or migration notes for breaking changes; no release workflow.

Actions

  • medium S State in README.md which changes require a major, minor or patch bump, and follow it for schema-breaking changes.
1

Dependency management & supply chain dist.dependencies

Initial · confidence medium

podio (1.2), EDM4hep (1.0 or 0.10.3) and ROOT (6) are found with minimum versions and Dependabot updates actions, but CLI11 is looked up without a version only for unreachable code and the installed config does not propagate dependencies.

Evidence (4)

Gaps to the next level

  • find_package(CLI11 CONFIG) has no version and serves only code gated on podio < 0.17.4.
  • Installed EDM4EICConfig.cmake declares no dependencies; issue
  • eic/run-cvmfs-osg-eic-shell@main is pinned to a branch; no SECURITY.md.

Actions

  • medium S Remove the CLI11 lookup with the dead event_merge target and add find_dependency calls to cmake/EDM4EICConfig.cmake.in.
1

Reproducibility & environments dist.reproducibility

Initial · confidence medium

CI builds in the eic_xl:nightly image and podio records the schema version in output files, but the image is unpinned and no environment for building or using a release is documented.

Evidence (2)

Gaps to the next level

  • The eic-shell version that each release is built and tested with is not documented.
  • No pinned container image in CI.

Actions

  • medium S Document in README.md the eic-shell release that first ships each EDM4eic version, and add a CI job pinned to the current stable eic-shell.
1

Portability & heterogeneous computing dist.portability

Initial · confidence high

CI builds only on Linux x86_64 with the eic-shell default compiler; no site paths are present, but Clang, aarch64 and macOS are untested even though CMakeLists.txt has an Apple branch.

Evidence (3)

Gaps to the next level

  • Only one OS, architecture and compiler is tested.

Actions

  • medium S Add a matrix to build-test in linux-eic-shell.yml that also builds with CXX=clang++ and on ubuntu-24.04-arm.

EIC ecosystem integration 1.8

1

Reuse of EIC-supported components eic.reuse

Initial · confidence medium

The model extends EDM4hep through podio and is itself reused by EICrecon, algorithms and juggler, but it defines its own ReconstructedParticle, Vertex, Cluster, CalorimeterHit, TrackerHit, Track and Cov2f-Cov6f types alongside EDM4hep equivalents, and keeps its own association datatypes next to podio links, without per-type justification.

Evidence (5)

Gaps to the next level

  • Types duplicating EDM4hep (ReconstructedParticle, Vertex, Cluster, CalorimeterHit, Cov3f/4f/6f) have no documented justification.
  • MCRecoAssociation datatypes remain alongside the podio-based MCRecoLink types (issue

Actions

  • medium M Document, per datatype that has an EDM4hep counterpart, why the EDM4eic version is needed, or replace it with the EDM4hep type.
  • medium M Deprecate and schedule removal of the MCReco*Association datatypes in favor of the link types.
2

Data formats & interoperability eic.data-model

Established · confidence medium

The project defines the EIC-standard podio/EDM4eic schema, declares schema_version and checks it against the CMake version at configure time; the round-trip test covers one type, is not run in CI, and files from older versions are reported unreadable.

Evidence (3)

Gaps to the next level

  • Round-trip I/O test covers only RawTrackerHit and does not run in CI.
  • Reading files written by older schema versions is not tested (issues

Actions

  • medium M Add a CI job that reads a stored file from the previous release with the PR build, using podio schema evolution.
1

EIC environment compatibility eic.environment

Initial · confidence high

CI builds in eic_xl:nightly through eic/run-cvmfs-osg-eic-shell every PR and week, but the README does not document building or using EDM4eic in eic-shell and no stable release is tested.

Evidence (2)

Gaps to the next level

  • README has no eic-shell instructions.
  • CI tests only the nightly image, not a pinned stable eic-shell release.

Actions

  • medium S Add an eic-shell section to README.md (EDM4eic is preinstalled; building a development version inside eic-shell).
  • medium S Add a matrix entry with platform-release: eic_xl:<current stable> to build-test in linux-eic-shell.yml.

Impact & long-term viability 2.2

2

Licensing via.license

Established · confidence medium

LGPL-3.0 is detected and source files carry SPDX headers, but LICENSE.spdx describes the Juggler package, tests and EDM4eicVersion.h.in are Apache-2.0, and the EDM4hep-derived sections of edm4eic.yaml are not identified.

Evidence (4)

Gaps to the next level

  • LICENSE.spdx names PackageName Juggler and the juggler homepage.
  • Third-party content (EDM4hep-derived datatypes, MIT-licensed docs/doxygen-awesome.css) is not recorded in a license inventory.
  • No documented contribution terms (inbound = outbound or DCO).

Actions

  • low S Correct LICENSE.spdx to describe EDM4eic, and add REUSE metadata recording the Apache-2.0 and MIT files.
  • low S State inbound = outbound licensing in a CONTRIBUTING.md.
2

Citation & attribution via.citation

Established · confidence medium

Zenodo mints a DOI for each release since v8.3.0 under concept DOI 10.5281/zenodo.17242837 with 17 creators, and datatypes carry Author fields; there is no reference publication and the README does not show the DOI.

Evidence (3)

Gaps to the next level

  • No reference publication or software paper.
  • No CITATION.cff; the README does not link the DOI.

Actions

  • medium M Add CITATION.cff with the concept DOI and a DOI badge in README.md, and cite an EDM4eic description in an ePIC software publication.
3

Adoption & downstream use via.adoption

Sustained · confidence high

EDM4eic ships in eic-shell and is a dependency of EICrecon, algorithms and juggler, so it is part of the ePIC reconstruction and simulation-campaign output.

Evidence (2)
  • packaging.in_eic_shell = true
  • packaging.eic_spack_dependents = ["algorithms", "eicrecon", "juggler"]
2

Institutional backing & continuity via.support

Established · confidence low

CODEOWNERS assigns approval of edm4eic.yaml to the @eic/epic-admin team in the ePIC organization, but no multi-institution maintenance commitment or succession plan is documented.

Evidence (1)

Gaps to the next level

  • The README does not name the owning ePIC body, maintainers or their institutions.
  • No succession or transition plan.

Actions

  • medium S State in README.md the owning ePIC body, the maintainers' institutions and what happens when a maintainer leaves.

Key metrics

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

Commits, 12 months26git.commits_12m
Active authors, 12 months7git.authors_12m
Active authors, 24 months9git.authors_24m
New authors, 12 months3git.new_authors_12m
Bus factor (50% of commits, 24 months)2git.bus_factor_50_24m
Top author share of commits, 24 months43%git.top_author_share_24m
Institutional e-mail domains, 24 months2git.email_domains_24m
Default-branch changes via PR, 12 months100%git.first_parent_pr_fraction_12m
PRs merged, 12 months24prs.merged_12m
Merged PRs reviewed by non-author96%prs.reviewed_fraction_12m
Median days to merge1.9prs.median_days_to_merge_12m
Merged PRs touching tests8%prs.test_touching_fraction_12m
Distinct reviewers, 12 months6prs.distinct_reviewers_12m
Issues opened, 12 months8issues.created_12m
Median days to first response99%issues.median_first_response_days_12m
Issues without response25%issues.unanswered_fraction_12m
Open issues older than 1 year21issues.open_older_365d
Releases, 24 months12releases.count_24m
Latest releasev8.10.0releases.latest_tag
Default-branch CI success rate98%ci.default_branch_success_rate
CI runs in eic-shellyesci.uses_eic_shell
License (SPDX)LGPL-3.0repo.license_spdx
Ships in eic-shellyespackaging.in_eic_shell
eic-shell version8.10.0packaging.eic_shell_version
Source lines (excluding vendored)747code.source_lines
Test files4code.test_files