How this site's numbers are produced: what's collected, what isn't, how metrics are defined, and what's still preliminary. This page is generated from the same code and config the site itself runs — see /corrections/ to report a problem with any of it.
What this is
This site publishes metrics only — no scores, no verdicts, and no judgment on whether a number is good or bad (DECISIONS.md D25, D29). Every metric shows its own definition, population, and window next to it; where a CHAOSS Knowledge Base definition exists, that metric links it directly. Each metric also carries a tier:
| Tier | Meaning |
|---|---|
| established | Widely used in CHAOSS and/or peer-reviewed literature, with a standard formula. |
| proxy | A defensible stand-in for something not directly observable (e.g. "reviewer" from a commit-trailer convention). |
| experimental | Mathematically well-defined, not yet validated for this project. |
| classified | Derived from classifying message text (Phase 2 only; preliminary — see below). |
Full principles: DECISIONS.md D1 (phasing) and the project's own METRICS.md conventions (§0).
Data sources
Nightly for Cassandra's own data; weekly (Sundays) for the five peer projects.
| Source | Collected | Not collected | Cadence |
|---|---|---|---|
| Git (apache/cassandra, trunk) | Commit SHA, author/committer name and email, timestamp, message (including reviewer trailers), per-file line stats. | Release branches (only the configured default branch, trunk, is walked) and any other apache/cassandra-* repo. | Nightly (06:17 UTC) |
| GitHub (apache/cassandra PRs, reviews, comments, check runs) | PR metadata, review events, review/issue comments, check runs. | A PR's base branch; GitHub Issues/Discussions (disabled on this repo -- JIRA is the issue tracker). | Nightly (06:17 UTC) |
| ASF JIRA (CASSANDRA project) | Issue metadata, status-change history, the Reviewer/Reviewers custom fields, comment metadata. | Comment bodies are fetched transiently for classification (Phase 2a) and never committed to the data branch. | Nightly (06:17 UTC) |
| Pony Mail (dev@/user@cassandra.apache.org) | Sender, timestamp, thread structure (Message-ID/In-Reply-To) -- metadata only in Phase 1. | Message bodies -- fetched transiently for classification (Phase 2a) and never committed to the data branch or the public repo. | Nightly (06:17 UTC) |
| ASF roster (Whimsy committee-info.json, public_ldap_people.json) | PMC/committer ASF ids, display names, PMC join dates. | A clean public committer-only (non-PMC) roster with join dates. | Nightly (06:17 UTC) |
| Releases (git tags; archive.apache.org as an existence cross-check) | GA release tags and dates (the git tag's own creatordate is authoritative); archive.apache.org directory existence as a cross-check, never for dating. | GitHub Releases (apache/cassandra publishes none). | Nightly (06:17 UTC) |
| Releases tab (ASF JIRA versions; Jenkins; Butler CI trends) | JIRA fixVersions (blocker-ladder placeholder descriptions, quoted verbatim, and their open issues) for each active release line; each line's Jenkins job (ci-cassandra.apache.org) last-build color/result; Butler's (butler.cassandra.apache.org) per-build test-failure/run/duration trend history. | Butler's per-test failure detail (its own per-suite endpoint times out); Butler history before roughly June 2026. | Nightly (06:17 UTC) |
| Security (OpenSSF Scorecard, published advisories) | Per-check Scorecard scores and reasons; published CVE/advisory records. | — | Nightly (06:17 UTC) |
| Peer projects (apache/kafka, spark, flink, pulsar, datafusion) | Git commits (bounded lookback), GitHub PRs/reviews, GA releases -- the same code this project uses for Cassandra's own collection, for the metrics shown on /peers/. | Issue-tracker metrics (JIRA and GitHub Issues aren't comparable across these six projects without more normalization work than this covers). | Weekly, Sundays (20:00 UTC) |
| ASF Slack | Nothing. | Not collected at all -- gated behind PMC consensus on dev@ and ASF Infra approval of a read-only bot on public channels (Phase 2b). | Not running |
Full source-by-source detail (verification method, rate limits, identity-resolution notes): DATA-SOURCES.md.
Metric catalogue
Every metric this site publishes, generated directly from the same registry the site renders from — a metric added here always appears below automatically, with no separate list to update.
| Metric | Definition | Tier | Window | Based on | Page |
|---|---|---|---|---|---|
| Active Contributors | Distinct non-bot contributors with at least one code commit in the month. | established | monthly | CHAOSS: Contributors | Community |
| Contributor Churn Rate | Share of contributors active 12-24 months before the month with no commit since. | proxy | monthly | project-specific | Community |
| Contributor Concentration (HHI) | Herfindahl-Hirschman concentration of commit share across contributors. | established | trailing-12m | DOJ/FTC: Herfindahl-Hirschman Index | Community |
| Contributor Dependency (N for 50%) | Smallest number of top contributors, by commit count, whose commits reach 50% of the total. | established | trailing-12m | CHAOSS: Contributor Absence Factor | Community |
| Contributor Funnel Conversion | Share of a cohort month's first-time committers reaching each later funnel stage (2nd/5th/sustained/committer/PMC) within 24 months. | proxy | cohort-month (730d horizon) | CHAOSS: Conversion Rate (adjacent), CHAOSS: New Contributors (adjacent) | Community |
| Contributor Tenure (Kaplan–Meier) | Kaplan-Meier survival probability over contributor tenure, using a 12-month-inactivity churn definition. | experimental | trailing-24m cohort, snapshot | Lin, Robles & Serebrenik (2017), Developer Turnover in Global, Industrial Open Source Projects, Foucault et al. (2015), Impact of Developer Turnover on Quality in Open-Source Software | Community |
| First → Second Contribution Conversion | Share of a cohort month's first-time committers who land a second commit within 180 days. | proxy | cohort-month | CHAOSS: Conversion Rate | Community |
| New Contributors | Contributors whose first-ever commit to apache/cassandra falls in the month. | established | monthly | CHAOSS: New Contributors | Community |
| PMC Joins per Quarter | New PMC members per quarter, from the ASF roster's join dates. | established | quarterly | project-specific | Community |
| Sustained Contributors | Count of contributors with at least 5 commits in the trailing 12 months. | established | trailing-12m | CHAOSS: Contributors (adjacent) | Community |
| Truck Factor (DOA) | Minimum contributors whose departure would leave over 50% of files with no capable author (Avelino DOA algorithm). | experimental | point-in-time, recomputed monthly | CHAOSS: Contributor Absence Factor / Bus Factor (adjacent), Avelino, Passos, Hora & Valente (2016), A Novel Approach for Estimating Truck Factors | Community |
| Elephant Factor | Smallest number of organizations, by commit share, whose commits reach 50% of the total. | experimental | trailing-12m | CHAOSS: Elephant Factor, CHAOSS wg-risk: Elephant Factor | Community |
| Organizational Concentration (HHI) | Herfindahl-Hirschman concentration of commit share across organizations. | established | trailing-12m | CHAOSS: Organizational Diversity | Community |
| Single-Organization Share | Share of commits from the single largest organization. | established | trailing-12m | CHAOSS: Organizational Diversity | Community |
| Unknown-Affiliation Rate | Share of commits whose contributor has no resolved organizational affiliation. | established | trailing-12m | project-specific | Community |
| Days Between Releases (median) | Median days between consecutive GA releases in the trailing 12 months. | proxy | trailing-12m | CHAOSS: Release Frequency | Community |
| Release Frequency | Count of GA releases (git tags, excluding alpha/beta/rc) in the trailing 24 months. | established | trailing-24m | CHAOSS: Release Frequency | Community |
| Release Interval Regularity (CoV) | Coefficient of variation of the intervals between GA releases. | proxy | trailing-24m | project-specific | Community |
| Time Since Last Release | Days since the most recent GA release, as of the run date. | established | snapshot | project-specific | Community |
| Change Request Closure Ratio — GitHub PR | GitHub PRs closed divided by GitHub PRs opened in the month (CHAOSS Change Request Closure Ratio). | proxy | monthly | CHAOSS: Change Request Closure Ratio | Community |
| Change Request Closure Ratio — JIRA Patch Submissions | JIRA issues resolved divided by issues entering Patch Available in the month. | established | monthly | CHAOSS: Change Request Closure Ratio | Community |
| Issue Closure Ratio — GitHub Issues | GitHub issues closed divided by GitHub issues opened in the month -- adapted from CHAOSS's Issues Closed metric (a count), not Change Request Closure Ratio: a GitHub issue is never a change request. | proxy | monthly | CHAOSS: Issues Closed (adapted) | Community |
| Median JIRA Resolution Latency | Median days from a JIRA issue's creation to its resolution. | established | monthly | CHAOSS: Issue Resolution Duration, CHAOSS: Change Request Closure Ratio (adjacent) | Community |
| Median JIRA Resolution Latency (12m cohort) | Median JIRA resolution latency, restricted to issues created within 12 months of resolution. | established | monthly (12m cohort) | CHAOSS: Issue Resolution Duration | Community |
| Open PR backlog | Count of currently open GitHub PRs. | established | snapshot | CHAOSS: Change Requests (adapted), CHAOSS: Issue Age (adapted, applied to change requests) | Community |
| Open PR backlog — age 1-3y | Count of open PRs aged 1-3 years. | established | snapshot | CHAOSS: Change Requests (adapted), CHAOSS: Issue Age (adapted, applied to change requests) | Community |
| Open PR backlog — age 30-90d | Count of open PRs aged 30-90 days. | established | snapshot | CHAOSS: Change Requests (adapted), CHAOSS: Issue Age (adapted, applied to change requests) | Community |
| Open PR backlog — age 90d-1y | Count of open PRs aged 90 days to 1 year. | established | snapshot | CHAOSS: Change Requests (adapted), CHAOSS: Issue Age (adapted, applied to change requests) | Community |
| Open PR backlog — age over 3y | Count of open PRs older than 3 years. | established | snapshot | CHAOSS: Change Requests (adapted), CHAOSS: Issue Age (adapted, applied to change requests) | Community |
| Open PR backlog — age under 30d | Count of open PRs younger than 30 days. | established | snapshot | CHAOSS: Change Requests (adapted), CHAOSS: Issue Age (adapted, applied to change requests) | Community |
| Open PR backlog — drafts | Count of currently open GitHub PRs marked draft. | established | snapshot | CHAOSS: Change Requests (adapted), CHAOSS: Issue Age (adapted, applied to change requests) | Community |
| Open PR backlog — linked ticket Fixed | Count of open PRs whose linked JIRA ticket is resolved Fixed. | established | snapshot | CHAOSS: Change Requests (adapted), CHAOSS: Issue Age (adapted, applied to change requests) | Community |
| Open PR backlog — linked ticket closed (other) | Count of open PRs whose linked JIRA ticket is closed with a non-Fixed resolution. | established | snapshot | CHAOSS: Change Requests (adapted), CHAOSS: Issue Age (adapted, applied to change requests) | Community |
| Open PR backlog — linked ticket still open | Count of open PRs whose linked JIRA ticket is still open. | established | snapshot | CHAOSS: Change Requests (adapted), CHAOSS: Issue Age (adapted, applied to change requests) | Community |
| Open PR backlog — no GitHub response | Share of open PRs with no GitHub comment or review yet. | established | snapshot | CHAOSS: Change Requests (adapted), CHAOSS: Issue Age (adapted, applied to change requests) | Community |
| Open PR backlog — no ticket key in title | Count of open PRs with no JIRA ticket key found in the title. | established | snapshot | CHAOSS: Change Requests (adapted), CHAOSS: Issue Age (adapted, applied to change requests) | Community |
| PR Merge Lead Time | Median days from a GitHub PR's creation to its merge. | proxy | monthly | CHAOSS: Change Request Closure Ratio (adjacent) | Community |
| PR Time to Close | Median days from a GitHub PR's creation to its close (merged or not). | proxy | monthly | CHAOSS: Change Requests (adjacent) | Community |
| Stale JIRA Issue Rate | Share of open JIRA issues with no activity in the preceding 90 days. | established | monthly | CHAOSS: Change Requests (adjacent), CHAOSS: Change Requests Declined (adjacent) | Community |
| Stale PR Rate | Share of open GitHub PRs with no activity in the preceding 90 days. | established | monthly | CHAOSS: Change Requests (adjacent), CHAOSS: Change Requests Declined (adjacent) | Community |
| Time to First Response (GitHub issues) | Median hours from a GitHub issue's creation to its first comment by someone other than the issue's own author. | established | monthly | CHAOSS: Issue Response Time, CHAOSS: Time to First Response | Community |
| Time to First Response (JIRA) | Median days from a JIRA issue's creation to its first comment or status change by someone else. | established | monthly | CHAOSS: Time to First Response, CHAOSS: Responsiveness practitioner guide | Community |
| PR Review Engagement (Reviewers/PR) | Mean unique non-self reviewers, and mean/median non-self reviews, per reviewed GitHub PR. | proxy | monthly | CHAOSS: Change Request Reviews (adjacent) | Community |
| PR Time to First Review | Median days from a GitHub PR's creation to its first non-self review. | proxy | monthly | CHAOSS: Time to First Response (GitHub-only variant) | Community |
| Reviewer Concentration (HHI) | Herfindahl-Hirschman concentration of review credit across reviewers. | proxy | trailing-12m | project-specific | Community |
| Unique Reviewers | Distinct non-bot individuals credited as a reviewer via commit trailer or JIRA field. | proxy | monthly | CHAOSS: Change Request Reviews (adjacent) | Community |
| Distinct Senders — dev@ | Distinct dev@ sender addresses with at least one message in the month. | established | monthly | project-specific | Conversations |
| Distinct Senders — user@ | Distinct user@ sender addresses with at least one message in the month. | established | monthly | project-specific | Conversations |
| Mailing List Messages — dev@ | Total dev@ messages per month, no exclusions. | established | monthly | project-specific | Conversations |
| Mailing List Messages — user@ | Total user@ messages per month, no exclusions. | established | monthly | project-specific | Conversations |
| New Threads — dev@ | Distinct dev@ threads whose own earliest message falls in the month. | established | monthly | project-specific | Conversations |
| New Threads — user@ | Distinct user@ threads whose own earliest message falls in the month. | established | monthly | project-specific | Conversations |
| Time to First Reply — dev@ | Median time from a dev@ thread's first message to its first reply. | established | monthly | CHAOSS: Time to First Response (applied to email) | Conversations |
| Time to First Reply — user@ | Median days from a user@ thread's first message to the first qualifying reply, excluding self-replies and automated senders. | established | monthly | CHAOSS: Time to First Response (applied to email) | Conversations |
| Unanswered Thread Rate — dev@ | Share of dev@ threads with no reply at all. | established | monthly | project-specific | Conversations |
| Unanswered Thread Rate — user@ | Share of user@ threads with no qualifying reply within 30 days of the thread's first message. | established | monthly | project-specific | Conversations |
| Commits referencing a ticket | Share of commits whose message references a JIRA ticket. | established | monthly | project-specific | Governance |
| Commits with CI evidence on JIRA before commit | Share of commits with CI evidence posted to JIRA before the commit landed. | proxy | monthly | project-specific | Governance |
| Commits with a named reviewer | Share of commits carrying a named reviewer, from the commit trailer or a JIRA reviewer field. | established | monthly | project-specific | Governance |
| Commits with a successful checkstyle run | Share of commits with a successful checkstyle run recorded. | established | monthly | project-specific | Governance |
| Commits with both CI artefacts attached | Share of commits with both CI artefacts attached to their JIRA ticket. | proxy | monthly | project-specific | Governance |
Full prose definitions, formulas, and strengths/weaknesses for every metric: METRICS.md.
Conversation patterns (classified) DECISIONS.md D26
- Pinned classifier model:
jev-1.13.0— never-latest; a model change is a versioned recompute. - Thread sampling: up to K=60 threads per venue-quarter stratum, seeded (seed=110) for reproducibility.
- Message-level labels map to one of 7 intensity tiers (−2 closing/positive … 4 attack); thread-level outcomes (escalation, resolution, abandonment) are derived deterministically from those tiers, never judged by the model directly.
- Cutoffs (0.5 / 0.7 / 0.9) are the private run's own fixed values, not yet calibrated against a precision/recall gate.
- Public-benchmark results against six human-labeled datasets: docs/benchmark/public-v1.md — strong ground truth for personal_attack/hostility/sarcasm, partial or none for the rest.
- Not yet covered: GitHub PR comments and ASF Slack (Phase 2a/2b scope).
Full taxonomy, thread model, and validation gates: COMMUNITY-HEALTH.md.
Peers DECISIONS.md D30
Apache Kafka, Apache Spark, Apache Flink, Apache Pulsar, Apache DataFusion — the owner's choice of comparable ASF top-level projects at a broadly similar scale, picked for real GitHub-PR activity, a real git history, and real GA releases. Not a statistically representative sample, and not a ranking — the same code computes the same metrics for Cassandra and every peer; no targets, no color-coding, no sort order implying rank.
Config: projects/peers.yaml.
Reproducibility
Every number on this site comes from a plain script, never an LLM at runtime (the pinned classifier above is the one exception — its output is cached by input hash, so re-rendering never calls the model again; D22).
data branch ├── raw/<source>/<table>/date=YYYY-MM-DD/part-*.parquet # append-only ├── snapshots/<run_id>/metrics.parquet # this run's full metric output └── manifests/<run_id>.json # this run's manifest
This build's run id and code revision are in the footer below, on every page. To re-run the
pipeline yourself: project-health run --project projects/cassandra.yaml --data-dir <data branch checkout>.
Source: the data branch · this repository.
Known limitations
- Identity resolution. Two raw identifiers (a git email, a GitHub login, a JIRA username) merge automatically only on a mechanical, high-confidence match (exact email, the GitHub-noreply pattern); everything else needs a human-reviewed identity_overrides.yaml entry and stays as separate, unresolved identities until then.
- Sampling and small-n. Classified metrics rest on a stratified sample (see Conversation patterns above); every rate/ratio/concentration/latency metric also carries its own minimum-sample floor (METRICS.md §0.6) — below it, the site shows "insufficient data" rather than an unstable number.
- GitHub-only vs. JIRA review. GitHub-PR-specific metrics (e.g. PR time to first review) see only the review activity that happened on GitHub, a subset of Cassandra's JIRA-centric review process — reported as a separate, narrower companion to the git-trailer/JIRA-reviewer-field proxy metrics, never merged with them.
- Partial peer collection. A peer project's GitHub-PR backfill can span several weekly runs; /peers/ shows "Collecting — N of 3 passes complete" rather than a number that looks final while that's in progress.