Overview /

Firebird

github.com/eic/firebird toolingcommunity · pass 2026-10-12 · commit ee65aa1055a7 · assessor claude-opus-5-5

pyrobird ships in eic-shell and Firebird is linked as the EIC event display; CI runs the TypeScript and pytest suites, a Python 3.10-3.14 matrix and a server integration test on every PR, with 97% of default-branch runs succeeding. Knowledge is concentrated (bus factor 1, top author 72% of commits, 2 active authors in 12 months, no external PRs), and a 467-file PR (#137) was merged without human review. There are no git tags, GitHub releases or release notes, no formatter, no CONTRIBUTING, code of conduct or citation metadata, and the DD4hep plugin is neither built in CI nor tested 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.bus-factor (1) Add .github/CODEOWNERS and a maintainers section in the README naming at least two maintainers per component.
highS com.conduct (1) Add CODE_OF_CONDUCT.md linking the ePIC collaboration code of conduct and its reporting contact, and a "Getting help" section in the README.
highS dist.releases (1) Tag each release vYYYY.MM.N, create a GitHub release with generated notes, and state the CalVer scheme in the README.
highS eng.static-quality (1) Add .pre-commit-config.yaml with ruff, ruff-format, prettier and clang-format and enable pre-commit.ci.
highS via.citation (0) Add CITATION.cff listing all contributors and enable the Zenodo-GitHub integration for tagged releases.
highS via.support (1) State in the README the owning ePIC working group, the maintainers' institutions and any funding.
highM com.contributors (1) Recruit a co-developer from another ePIC institution through the ePIC software meetings and merge the open contributor PRs or close them.
mediumS com.governance (1) Add GOVERNANCE.md naming the maintainers, the owning ePIC group, the decision process and the path to maintainership.
mediumS com.responsiveness (1) Apply the existing [UI]/[pyrobird]/[engine] labels to all open issues and close or update those older than one year.
mediumS dist.dependencies (1) Add tested minimum versions to every [project] dependencies entry and VERSION to the fmt and Geant4 find_package calls.
mediumS dist.packaging (2) Publish a stable CalVer release to PyPI, add it to the eic-spack pyrobird recipe (with py-playwright for +batch) and pin it in eic/containers.
mediumS dist.portability (2) Add macos-latest and ubuntu-24.04-arm jobs and a Node 22/24 matrix to frontend.yaml and pyrobird.yaml.
mediumS dist.reproducibility (1) Write the pyrobird or plugin version and the conversion or steering options into the DEX origin object.
mediumS doc.contributing (2) Add CONTRIBUTING.md that consolidates setup, tests, conventions and review expectations, and label five newcomer issues good first issue.
mediumS doc.user (2) Add a CI job that runs the 02_run_local steps (pyrobird serve, fetch the sample files through the API) on the sample data.
mediumS eic.currency (2) Add an eic-shell job with platform-release set to eic_xl:nightly that builds the plugin and runs the pyrobird tests.
mediumS eic.data-model (2) Read the podio and EDM4eic/EDM4hep versions from the input file metadata in pyrobird and root2dex, record them in DEX origin, and warn on unsupported versions.
mediumS eic.environment (1) Add a workflow using eic/run-cvmfs-osg-eic-shell that builds dd4hep-plugin/, runs npsim with firebird_steering.py, and runs pyrobird convert on the output.
mediumS eng.change-control (2) Set required_approving_review_count to 1 on main and remove the always-bypass for the admin role in ruleset 10656024.
mediumS eng.change-control (2) Add .github/CODEOWNERS assigning firebird-ng/, packages/, pyrobird/ and dd4hep-plugin/ to at least two reviewers.
mediumS eng.ci (2) Update the required status checks in ruleset 10656024 to the current test-and-build, test (3.x) and integration-tests (3.x) job names.
mediumS eng.testing (2) Run coverage run -m pytest and vitest --coverage in CI and upload the reports to Codecov.
mediumM doc.developer (1) Generate TypeDoc for packages/* and Sphinx autodoc for pyrobird in docs.yaml and publish them with the VitePress site.
mediumM eng.ci (2) Add a job that builds dd4hep-plugin/ and runs ddsim with firebird_steering.py for a few events.
lowS eng.testing (2) Require a test change in PRs that change pyrobird/pyrobird/ or packages/*/src/, stated in the PR template.
lowS via.license (2) Add SPDX headers (GPL-3.0-or-later or MIT per directory) and run reuse lint in CI.
lowM eic.reuse (2) Offer the trajectory-writer action to npsim or DD4hep DDG4 so it ships with the simulation stack.

Assessment by criterion

Code health & engineering practices 2.0

2

Change control & code review eng.change-control

Established · confidence high

90% of first-parent commits in 12 months came from PRs and 57% of merged PRs were reviewed by a non-author, but branch protection requires zero approvals and admins can bypass the ruleset.

Evidence (4)

Gaps to the next level

  • Fewer than 90% of merged PRs are reviewed; PR 137 (467 files changed) was self-merged without a human review.
  • Branch protection sets required_approving_review_count to 0 and there is no CODEOWNERS file.

Actions

  • medium S Set required_approving_review_count to 1 on main and remove the always-bypass for the admin role in ruleset 10656024.
  • medium S Add .github/CODEOWNERS assigning firebird-ng/, packages/, pyrobird/ and dd4hep-plugin/ to at least two reviewers.
2

Continuous integration eng.ci

Established · confidence high

Three workflows run the frontend suites, pytest on Python 3.10-3.14 and a build-plus-server integration test on every PR and push, with 97% default-branch success; the DD4hep plugin is not built and the required checks are stale.

Evidence (4)

Gaps to the next level

  • The dd4hep-plugin/ CMake project is not built in any workflow.
  • Ruleset 10656024 requires integration-tests (3.8) and (3.9), which no longer exist, and does not require test-and-build or test (*).

Actions

  • medium S Update the required status checks in ruleset 10656024 to the current test-and-build, test (3.x) and integration-tests (3.x) job names.
  • medium M Add a job that builds dd4hep-plugin/ and runs ddsim with firebird_steering.py for a few events.
2

Testing eng.testing

Established · confidence high

Vitest specs cover the core, root2dex, library and pack packages and pytest covers most pyrobird modules, with a server integration test and a root2dex/pyrobird parity test against reference DEX files; coverage is not published and 14% of merged PRs touch tests.

Evidence (4)

Gaps to the next level

  • Test coverage is not measured or published.
  • Fewer than 40% of merged PRs in 12 months touch test files.
  • The DD4hep plugin has no tests.

Actions

  • medium S Run coverage run -m pytest and vitest --coverage in CI and upload the reports to Codecov.
  • low S Require a test change in PRs that change pyrobird/pyrobird/ or packages/*/src/, stated in the PR template.
1

Static analysis & consistency eng.static-quality

Initial · confidence high

CodeQL default setup analyses every PR and TypeScript compiles with strict, but no formatter or linter (Prettier, ESLint, ruff) is configured, and qodana.yaml is not run in CI.

Evidence (4)

Gaps to the next level

  • No formatter is configured or enforced for TypeScript, Python or C++.
  • The CodeQL check failed on PR 137, which was merged anyway.

Actions

  • high S Add .pre-commit-config.yaml with ruff, ruff-format, prettier and clang-format and enable pre-commit.ci.
3

Architecture & language standards eng.modularity

Sustained · confidence medium

The code is split into npm workspace packages with public-api.ts entry points, published as @dexvis/* on npm, a pyproject-based Python package with a CLI, and a C++20 DD4hep plugin built with CMake; the architecture is documented in docs/extensions.md, docs/design.md and CLAUDE.md.

Evidence (5)

Documentation & usability 1.7

2

User onboarding doc.user

Established · confidence medium

The hosted VitePress site has a pip-based local-run tutorial with downloadable sample data, documents the pyrobird server options, and has a troubleshooting page; the docs are not versioned with releases and no tutorial is executed in CI.

Evidence (4)

Gaps to the next level

  • Documentation is published only for main, not per release.
  • The tutorials are not executed in CI.
  • The docs do not state that pyrobird is available in eic-shell.

Actions

  • medium S Add a CI job that runs the 02_run_local steps (pyrobird serve, fetch the sample files through the API) on the sample data.
1

Developer & API documentation doc.developer

Initial · confidence high

Most pyrobird public functions (85 of 102) and the TypeScript API files carry docstrings, and the architecture is described in docs/extensions.md, docs/design.md and CLAUDE.md, but no API reference is generated.

Evidence (3)

Gaps to the next level

  • No generated API documentation (TypeDoc, Sphinx or similar).

Actions

  • medium M Generate TypeDoc for packages/* and Sphinx autodoc for pyrobird in docs.yaml and publish them with the VitePress site.
2

Contribution guidelines doc.contributing

Established · confidence medium

The README covers setup and running the test suites, the pyrobird README states conventions and the PR process, CLAUDE.md lists TypeScript standards, and the organization supplies PR and issue templates; review expectations, newcomer issues and a ready-made environment are missing.

Evidence (4)

Gaps to the next level

  • The guidance is spread over three files with no CONTRIBUTING.md, and review expectations are not documented.
  • The good first issue label exists but no issue carries it.
  • No devcontainer or eic-shell development environment is documented.

Actions

  • medium S Add CONTRIBUTING.md that consolidates setup, tests, conventions and review expectations, and label five newcomer issues good first issue.

Community & governance 1.0

1

Issue & PR responsiveness com.responsiveness

Initial · confidence medium

The median first response is 0.18 days, but 13 of 19 open issues are older than one year, no issue opened in 12 months is labeled, and 40% received no response.

Evidence (4)
  • issues.median_first_response_days_12m = 0.18
  • issues.open_older_365d = 13
  • issues.labeled_fraction_12m = 0.0
  • issues.unanswered_fraction_12m = 0.4

Gaps to the next level

  • More than half of open issues are older than one year.
  • New issues are not labeled or otherwise triaged; all 13 open PRs are older than 90 days.

Actions

  • medium S Apply the existing [UI]/[pyrobird]/[engine] labels to all open issues and close or update those older than one year.
1

Contributor base com.contributors

Initial · confidence high

Four authors were active in 24 months, but only two in 12 months, with no new authors and no merged PRs from outside the maintainer group.

Evidence (4)
  • git.authors_24m = 4
  • git.authors_12m = 2
  • git.new_authors_12m = 0
  • prs.external_fraction_12m = 0.0

Gaps to the next level

  • No external PRs have been merged.
  • Institutional spread is not documented (metrics:git.email_domains_24m = 0).

Actions

  • high M Recruit a co-developer from another ePIC institution through the ePIC software meetings and merge the open contributor PRs or close them.
1

Knowledge concentration (bus factor) com.bus-factor

Initial · confidence high

The top author wrote 72% of commits in 24 months (bus factor 1); two people review and three merge.

Evidence (4)
  • git.bus_factor_50_24m = 1
  • git.top_author_share_24m = 0.722
  • prs.distinct_reviewers_12m = 2
  • prs.distinct_mergers_12m = 3

Gaps to the next level

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

Actions

  • high S Add .github/CODEOWNERS and a maintainers section in the README naming at least two maintainers per component.
1

Governance & roadmap com.governance

Initial · confidence medium

The maintainer is identifiable from pyproject.toml and decisions such as the CalVer switch are proposed in public issues, but there is no documented decision process, maintainer path or milestones.

Evidence (3)

Gaps to the next level

  • No document stating who decides and how to become a reviewer or maintainer.

Actions

  • medium S Add GOVERNANCE.md naming the maintainers, the owning ePIC group, the decision process and the path to maintainership.
1

Code of conduct & user support com.conduct

Initial · confidence medium

The organization issue-template configuration links the ePIC Mattermost and meetings as support channels, but no code of conduct applies at repository or organization level; GitHub Discussions is enabled with no threads.

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, and a "Getting help" section in the README.

Infrastructure & distribution 1.4

2

Packaging & installability dist.packaging

Established · confidence high

pyrobird is on PyPI and in eic-spack (including 2026.10.0b1) and ships in eic-shell, but eic-shell pins an untagged git commit because 0.2.7 is broken on PyPI, and the DD4hep plugin has no recipe.

Evidence (4)

Gaps to the next level

  • eic-shell does not ship a released version; the last stable PyPI release (0.2.7) is marked broken in eic-spack.
  • The eic-spack recipe still depends on py-pyppeteer for +batch, which the project replaced with playwright.
  • The DD4hep plugin has no Spack recipe.

Actions

  • medium S Publish a stable CalVer release to PyPI, add it to the eic-spack pyrobird recipe (with py-playwright for +batch) and pin it in eic/containers.
1

Releases & versioning dist.releases

Initial · confidence high

Versions are uploaded to PyPI without git tags, GitHub releases or release notes; CalVer was agreed in an issue but is not documented in the repository.

Evidence (4)

Gaps to the next level

  • No tags, GitHub releases, release notes or changelog.
  • The version scheme is not documented in the repository.

Actions

  • high S Tag each release vYYYY.MM.N, create a GitHub release with generated notes, and state the CalVer scheme in the README.
1

Dependency management & supply chain dist.dependencies

Initial · confidence high

npm and uv lockfiles exist and Dependabot covers npm and GitHub Actions, but pyrobird's pyproject.toml gives a minimum version only for flask-compress, and CMake requires fmt and Geant4 without versions.

Evidence (4)

Gaps to the next level

  • The published pyrobird package declares no minimum versions for click, rich, pyyaml, flask, flask-cors, json5, uproot.
  • find_package(fmt) and find_package(Geant4) have no VERSION.

Actions

  • medium S Add tested minimum versions to every [project] dependencies entry and VERSION to the fmt and Geant4 find_package calls.
1

Reproducibility & environments dist.reproducibility

Initial · confidence medium

pyrobird/uv.lock and package-lock.json pin the environment and CI installs from them, but converted DEX files record only the input file and entry count, not the pyrobird version or conversion options.

Evidence (2)

Gaps to the next level

  • DEX outputs do not record the converter version or configuration (cuts, box size, steering parameters).
  • No eic-shell version is documented for the DD4hep plugin or releases.

Actions

  • medium S Write the pyrobird or plugin version and the conversion or steering options into the DEX origin object.
2

Portability & heterogeneous computing dist.portability

Established · confidence medium

pyrobird is tested on Python 3.10-3.14 with no site-specific paths in the code; CI runs only on ubuntu-latest with one Node.js version, though package.json declares Node 22, 24 and 26.

Evidence (3)

Gaps to the next level

  • No macOS or aarch64 CI job, although issue 57 reports a macOS-specific problem.
  • Only one of the declared Node.js versions is tested.

Actions

  • medium S Add macos-latest and ubuntu-24.04-arm jobs and a Node 22/24 matrix to frontend.yaml and pyrobird.yaml.

EIC ecosystem integration 1.8

2

Reuse of EIC-supported components eic.reuse

Established · confidence medium

Event input is read from EDM4eic/EDM4hep podio files with uproot, geometry comes from the epic TGeo export, and trajectories are recorded with DD4hep DDG4 actions; the DEX JSON format is documented as the browser exchange format, and no upstream contributions or reuse by other EIC software were found.

Evidence (3)

Gaps to the next level

  • No extension contributed upstream (for example the trajectory writer to DD4hep or npsim) and no EIC repository reuses a Firebird component.

Actions

  • low M Offer the trajectory-writer action to npsim or DD4hep DDG4 so it ships with the simulation stack.
2

Data formats & interoperability eic.data-model

Established · confidence medium

Inputs are EDM4eic/EDM4hep podio ROOT files and TGeo geometry; the DEX output format has a published JSON Schema, a declared version that collect_dex_problems checks, and upgrade round-trip and schema tests; the EDM4eic/EDM4hep version of inputs is not read or checked.

Evidence (3)

Gaps to the next level

  • The podio/EDM4eic/EDM4hep version of input files is not checked; branch-name differences are handled by detection.

Actions

  • medium S Read the podio and EDM4eic/EDM4hep versions from the input file metadata in pyrobird and root2dex, record them in DEX origin, and warn on unsupported versions.
1

EIC environment compatibility eic.environment

Initial · confidence high

pyrobird ships in eic-shell and the plugin docs show building in eicweb/eic_xl:nightly, but no CI job runs in an eic container image.

Evidence (2)

Gaps to the next level

  • CI does not build or test the plugin or pyrobird in an eic container image.

Actions

  • medium S Add a workflow using eic/run-cvmfs-osg-eic-shell that builds dd4hep-plugin/, runs npsim with firebird_steering.py, and runs pyrobird convert on the output.
2

Currency with the EIC stack eic.currency

Established · confidence medium

The current eic-shell builds pyrobird (git commit 25b6556) and the plugin requires DD4hep 1.27 or later against the shipped 1.38, with no open stack-incompatibility issues; there is no nightly eic-shell CI, and eic-shell has not picked up the October 2026 rewrite.

Evidence (2)

Gaps to the next level

  • No CI against eic-shell nightly to catch DD4hep, Geant4 or uproot changes.

Actions

  • medium S Add an eic-shell job with platform-release set to eic_xl:nightly that builds the plugin and runs the pyrobird tests.

Impact & long-term viability 1.5

2

Licensing via.license

Established · confidence high

GPL-3.0-or-later is detected by GitHub and declared in pyproject.toml, the MIT packages carry their own LICENSE and license fields, and the README explains the split; there are no SPDX headers or contribution terms.

Evidence (3)

Gaps to the next level

  • No SPDX-License-Identifier headers in source files.
  • No documented contribution terms (inbound = outbound or DCO).
  • The eic-spack recipe declares LGPL-3.0-or-later, which differs from the project license.

Actions

  • low S Add SPDX headers (GPL-3.0-or-later or MIT per directory) and run reuse lint in CI.
0

Citation & attribution via.citation

Absent · confidence high

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

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 tagged releases.
1

Institutional backing & continuity via.support

Initial · confidence medium

The repository is in the eic organization and the main maintainer's public profile lists an institution, but the documentation names no owning ePIC body, funding or institutional commitment.

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 the owning ePIC working group, the maintainers' institutions and any funding.

Key metrics

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

Commits, 12 months8git.commits_12m
Active authors, 12 months2git.authors_12m
Active authors, 24 months4git.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 months72%git.top_author_share_24m
Institutional e-mail domains, 24 months0git.email_domains_24m
Default-branch changes via PR, 12 months90%git.first_parent_pr_fraction_12m
PRs merged, 12 months7prs.merged_12m
Merged PRs reviewed by non-author57%prs.reviewed_fraction_12m
Median days to merge7%prs.median_days_to_merge_12m
Merged PRs touching tests14%prs.test_touching_fraction_12m
Distinct reviewers, 12 months2prs.distinct_reviewers_12m
Issues opened, 12 months10issues.created_12m
Median days to first response18%issues.median_first_response_days_12m
Issues without response40%issues.unanswered_fraction_12m
Open issues older than 1 year13issues.open_older_365d
Releases, 24 months0releases.count_24m
Latest release–releases.latest_tag
Default-branch CI success rate97%ci.default_branch_success_rate
CI runs in eic-shellnoci.uses_eic_shell
License (SPDX)GPL-3.0repo.license_spdx
Ships in eic-shellyespackaging.in_eic_shell
eic-shell versiongit.25b6556e473b99dbbb3b4663d34d683e28acfd5epackaging.eic_shell_version
Source lines (excluding vendored)38137code.source_lines
Test files22code.test_files