LF Health Score v2 - adding lifecycle & impact to Insights #1939
Replies: 6 comments 4 replies
|
Overall I really like the way this is shaping up. My one concern is regarding who is included as a "maintainer". For single repo, or smaller projects using the detected maintainers would work - but my concern is for medium and larger projects where often who is "officially" designated as a maintainer can be a much smaller group which generally maps to project leadership and doesn't necessarily capture who's a maintainer in the classic definition.
NOTE: I used CNCF projects because those are the ones I'm most familiar with and had immediate access to the data; however this pattern does extend beyond CNCF projects. From these projects - between 2-13% of the org members are officially designated as the "maintainers", but are not necessarily representative of what would classically be thought of as maintainers. In these instances it may be better to use org members as a basis for the health score; or alternatively fall-back to a generated list (similar to what is done now). |
|
Overall, I like the general direction. I think it's right to separate popularity from health, especially because a package may be relatively unimportant to the overall ecosystem, but critically important to my specific project. A few specific notes:
Given how you've defined "maintainer activity", I'd shorten this window, perhaps as low as 3 months, but probably 6. I'd also accept 12. This is all hunch-driven, of course. If you can generate a list of projects that would qualify as abandoned under different thresholds, we could look to see where the false positive rate becomes unacceptable. Also, maybe something like "inert" or the like would be a better term; it could avoid hurt feelings when there's a false positive while still signalling that the project may not respond to issues.
If a tree falls in a forest... 😄 I think if there are no recent issues/commits/releases/PRs/discussions (are GitHub discussions included in the measure, when available? If not, I think they should be), then it's reasonable to call the project "inert" until there is activity. Most "stable" projects will probably have at least some level of activity.
I'd omit it until it can be measured. Otherwise, the score "punishes" projects that may actually be providing it.
This might be in "I wish I had a pony" territory, but looking for user activity (i.e. are people helping each other in the project's official channels, etc) could be a good signal for activity. This gets complicated quickly, since projects may have several official or semi official channels, not all of which are public.
I think it's worth backfilling. A project's score trend is arguably a better signal of future health than a point-in-time snapshot.
I'd want to see the distribution of projects along various components. e.g. What's the distribution of project lifecycle activity, what's the distribution of the different supply chain scores, etc. Bonus points if there's a CSV file or Jupyter notebook that folks can use for additional analysis to make v2.1 suggestions 😄 |
|
Sorry for sitting on the late reply for a bit. I've been down this road more than once, and the nuance you're covering here makes me cautiously optimistic.
I @funnelfiasco is on the right track with replacing "stable / abandoned" with "inert" for repos with no interaction. One example I think of in this case is https://github.com/jtacoma/uritemplates -- a zero-dependency solution for a well-specified RFC, with high test coverage. It's also 10-15 years old, with one question asked (and answered) in the last 6 years. Is this "abandoned"? "stable"? I suspect there are similar examples in the NPM ecosystem, though the addition of a package registry there makes things more interesting in comparison with Go's module system. I think an "abandoned" declaration can be conclusively made if there are open unresponded issues (or PRs) older than a certain age. I'm willing to say a 90 day threshold there is sufficiently generous -- if you haven't done anything with the project in 90 days and the last activity on the project is someone asking a question, then probably no one is looking. I'm not sure how to treat "I don't respond to issues, but I do commit to the repo / merge PRs" -- given the current state of the world, I'd probably call that "active" with a low health score.
I think there's at least some value in measuring how well projects are tracking and adopting supply chain improvements (for example, are they using some variation of trusted publishing for NPM, or are releases being pushed by individual maintainers / long-lived keys). Unfortunately for your points system, some ecosystems have made more security progress (or started in a better place) than others, so you may simply have to say "this category is about X points", and then dish out the points differently for e.g. go libraries vs npm libraries. Stuff like https://github.com/std-uritemplate/std-uritemplate may end up making you mad as well. ¯_(ツ)_/¯
Also, how do you measure release cadence? Let me introduce you to https://github.com/babel/babel, which publishes approximately 1000 npm packages from a single repository. My recollection is that they only publish specific packages when there's a change in that package, but all the packages follow the same versioning scheme. The short answer here is that you'll need to do the standard data science thing and propose a measure, then actually implement the measurement, check the distribution to see if it makes sense / matches what you want, manually investigate outliers (hello Babel.js!), and then either accept the measurement or tweak it and repeat the process. I promise you that the world is weirder than you'd expect.
I think you probably want to do some data science on the current measures. Right now, they look like they were constructed in a vaccuum, and it's probably harder to get "excellent" than you intend. On the plus side, I think you're on a good track in the impact measurement, though I'm not sure that adding the log-value measurements of downloads + transitive dependencies + direct dependencies before normalizing by ecosystem is going to be the right mix. (In particular, I suspect that one or more of the components will end up dominating the other two before the normalization has occurred.) You might also want to look at using Looking at distributions of points and correlations or anti-correlations across your measures will help you with your specific scoring mechanics (pick a sample of e.g. 5k projects with 1k "important" to do more in-depth measurements on and test different ways of combining measurements).
I'm not sure that I'd prioritize backfilling, but I'd want to keep the following information once you start:
I think it makes sense to publish the methodology. If I were in charge, I'd want to also make the datasets available to (at least) academic researchers in the same way that e.g. scorecard scores have been used. (random example research using the OpenSSF maintained score: https://arxiv.org/html/2601.18344v1) |
I generally like the idea of splitting the single score into three, even if only because it makes things a little less suceptible to goodharts law (like what happened to openssf scorecard "Some projects have been observed making superficial changes (adding a SECURITY.md with minimal content, enabling branch protection without enforcement) to improve scores without improving actual security." https://safeguard.sh/resources/blog/openssf-scorecard-v5-release) In skimming that blog post - it sounds like there's a decent amount of overlap between its other advice and some of the goals of this proposal too.
Given the above, i worry a bit about making maintainer responsiveness a single determining factor in classifying a project as stable. Having read the book "Working in Public", i also am curious if there may even be different interpretations of the lifecycle states depending on the type of project (to use the authors terms: Toy, Stadium, Club, Federation). The Mozilla open source archetypes could be another source of inspiration on this.
I suspect the threshold may be different across projects/ecosystems or even by the purpose for which these metrics are being used as well. Im not sure which categories you could make to allow
Oh yeah I should probably introduce myself haha, I'm currently the main active maintainer of CollectOSS and I rely a lot on the metrics work that has been happening within CHAOSS and have recently been contributing to the development of some newer metrics surrounding AI (which makes me wonder whether these new project health scores may also need to be able to account for the types of ways that particular metrics have shifted in their meaning and usefulness with the rise of generative AI). Happy to collaborate and introduce you to the CHAOSS community if that is helpful as well! |
|
I like that you're headed for more sophistication around health metrics. Understand that project health is an unsolved problem which nobody yet has come up with project-agnostic, reliable metrics before, partly because it's a multifactor system and partly because a lot of the data is very hard to collect. But what you have above is definitely an iterative improvement on the prior LFX metrics. That said, I think it's important, including through the UI, to emphasize to LF members and others that project health is still an area of experimentation across our ecosystem, and that they need to compare the rating given there with what they actually know about the project. There is one foundational problem with this reformulation, though: "Maintainer health is the leading indicator": For larger projects like Kubernetes, Istio, the Linux Kernel, etc, there is a large pool of senior contributors who do most of the actual work. Discarding data from these contributors will make all large projects look deceptively understaffed. Contrawise, if a project is growing (in terms of activity and codebase) but the contributor pool (aside from maintainers) is not growing, or even shrinking, then the project is actually in trouble regardless of how active the maintainers are. Also, the pool of regular contributors is your recruitment pool for new maintainers, so the overall health of the non-maintainer contributor pool is a critical factor for evaluating project health. Overall, making project health all about maintainers will result in mis-evaluations as bad as the current system. Some additional nits:
Again, thanks for doing this! It shows some real serious thinking in how to measure project health, and is a great iterative improvement. As a member of WG-Data-Science in CHAOSS foundation, we'd love to have you show up for a meeting to discuss this model. |
|
Thanks everyone — this is exactly the kind of feedback we hoped for when we posted the full methodology instead of just the direction. We’ve gone through every comment, and here’s what we’re changing as a result. Changes we’re making to the methodology
You convinced us that silence alone isn’t abandonment (ignoring people is). A finished, zero-dependency library with no open issues (the uritemplates (https://github.com/jtacoma/uritemplates) example) shouldn’t get the same label as a project with unanswered issues piling up. We’re splitting the rule: - Open, unanswered issues/PRs beyond a threshold (~90–180 days, exact value set empirically — see validation below) + no maintainer activity → Abandoned
Changes to the validation phase (blocking rollout)Several of you said, in @evankanderson’s words: propose a measure, implement it, check the distribution, investigate outliers, then accept or tweak — “the world is weirder than you’d expect.” Agreed. Before the new scores replace the current ones, we’re running a data-analysis phase that now includes:
Deferred, but on the roadmap
Things already addressed since the original postA few concerns were resolved in revisions since this was posted, so worth stating explicitly:
Keep the feedback coming! |
Uh oh!
There was an error while loading. Please reload this page.
We're rethinking how LFX Insights evaluates open source projects, and we'd love community input before we ship it. This post lays out the full methodology so you can give informed feedback on the details, not just the direction.
What's changing
Today's single 0–100 health score has structural problems:
Failure modes today
Design principles
What we're proposing
Replace the single score with three independent assessments, shown together:
1. Lifecycle State
The lifecycle state is the headline classification. It's derived from signals — not set manually, and not computed from the composite score.
The "Stable" state is the key innovation. Today we can't distinguish a healthy mature library (no commits because it's done) from an abandoned one (no commits because nobody's home). The difference is maintainer responsiveness: if someone filed a critical CVE tomorrow, would the maintainer respond?
2. Health Score (0–100)
Rating bands
Maintainer Health (0–40 pts)
The single most important category. Measures whether someone is home and whether they'd respond to a crisis.
Security & Supply Chain (0–35 pts)
Development Activity (0–25 pts)
This category adjusts based on lifecycle state. A "Stable" project gets a floor of 15/25 if it has no open issues and no unresolved CVEs — it's healthy precisely because it doesn't need active development.
3. Impact Score (0–100)
The Impact Score answers "how bad is it if this breaks?" — designed to surface load-bearing upstream packages, including those with few direct dependents but large transitive reach (the left-pad / XZ class of risk).
Methodology
log(downloads + 1),log(direct_dependents + 1),log(transitive_dependents + 1)to compress power-law distributions.Signals & weights
Cross-ecosystem normalization
Manual override: Spotlight list
Known-critical primitives (compression, crypto, TLS, common parsers) are included regardless of computed score. A deliberate safety net for the methodology's structural blind spot: low-popularity-but-load-bearing packages no download/dependent signal will surface.
Known limitations
Even transitive + centrality will miss packages that are critical but rarely depended on in the observable graph — vendored code, build-time-only tools, dependencies pulled outside the registry. This is why maintainer-responsiveness and human curation remain essential.
Worked examples
lodash —
Declining· Health 52 (Fair) · Impact 94express —
Active· Health 78 (Healthy) · Impact 88is-odd —
Stable· Health 72 (Healthy) · Impact 23event-stream —
Abandoned· Health 11 (Critical) · Impact 41What this changes for you
Where we'd love your feedback
If you maintain a project, work with this data, or build tooling on top of it — we want to hear from you. Drop a comment below, or open a discussion thread on any single piece you have strong opinions about.
All reactions