docs: rewrite health score page for v2 methodology - #2110
Conversation
eslint --fix on non-lintable files (e.g. .md) exited non-zero, then
git add -u and npx lint-staged --no-stash both raced with the GPG
signing transaction, silently turning commits into pure deletions of
every staged file (disk content intact, reproduced consistently).
Root cause: git add -u and lint-staged --no-stash write to the git
index while GPG holds a lock on it during commit signing. On fast
JS/TS/Vue commits the race is won; on slower commits (tsc-check runs
after eslint errors) GPG gets ahead and the index is corrupted.
Fix:
- Filter eslint input to *.{js,ts,vue}; skip call when list is empty
- Move git add -u inside the eslint guard so it only runs after eslint
actually fixed files, not on every frontend commit
- Skip lint-staged entirely when no *.{js,ts,vue} files are staged,
eliminating the --no-stash/GPG race for docs and config commits
Signed-off-by: Joana Maia <jmaia@contractor.linuxfoundation.org>
- Add intro paragraph to Security and Supply Chain section (Sections 1 and 3 had one, Section 2 did not) - Standardize "last 12 months" throughout (was mixed with "trailing 12 months" in Abandoned classification, Issue Resolution, PR Merge Health) - Add Gerrit note to 3.4 PR Merge Health (3.3 Issue Resolution had one inline, 3.4 did not despite the same data gap) - Normalize "PRs" to "pull requests" in the Lifecycle States table and Classification Rules (health score section already used "pull requests") Signed-off-by: Joana Maia <jmaia@contractor.linuxfoundation.org>
There was a problem hiding this comment.
Pull request overview
Documents Health Score v2 while adjusting frontend pre-commit behavior.
Changes:
- Documents Lifecycle, Health, and Impact assessments.
- Adds scoring rubrics and missing-data handling.
- Restricts linting hooks to JS/TS/Vue files.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 11 comments.
| File | Description |
|---|---|
frontend/docs/metrics/health-score/index.md |
Rewrites Health Score methodology documentation. |
frontend/.husky/pre-commit |
Guards linting and staging by file type. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.
Suppressed comments (6)
Previously missed (1) — in code that hasn't changed since the last review.
frontend/docs/metrics/health-score/index.md:286
- This page says v2 replaces the original model, but other published docs still present v1 as current:
docs/index.md:25-27calls Health Score a single metric,docs/more/faq/index.md:22-23anddocs/more/glossary/index.md:41-43describe four dimensions, anddocs/features/community-collections/index.md:36lists the old rating thresholds. Update those references in this migration so users do not receive contradictory methodology depending on entry point.
The original Insights Health Score was a single 0–100 value, computed as an equal-weight mean of four sub-scores: Contributors (25 pts), Popularity (25 pts), Development (25 pts), and Security and Best Practices (25 pts). The current methodology replaces that with three independent assessments and re-weighted health categories.
frontend/docs/metrics/health-score/index.md:3
- This says every project gets all three assessments, but the same page later says projects without tracked packages receive no Impact Score (line 217). Qualify the opening so users are not promised an assessment that cannot exist for many projects.
LFX Insights now surfaces **three independent assessments** for every project: a **Lifecycle state**, a **Health Score**, and an **Impact Score**. Together, these replace the previous single composite score and answer three distinct questions:
frontend/docs/metrics/health-score/index.md:19
- The current frontend cannot display this sixth state:
frontend/config/trust-score.ts:54-68maps only active/stable/declining/abandoned/archived, andhealth-breakdown-templates.ts:23-59also has noinertcase, so an emittedinertvalue appears as “Unknown” with the generic no-data description. Addinertsupport before documenting it as a current UI output.
| **Lifecycle** | What state is this project in? | One of six states: Active, Stable, Declining, Inert, Abandoned, Archived |
frontend/docs/metrics/health-score/index.md:154
- No development floor is defined in the detailed rubric, even though line 295 explicitly credits a “development floor” for protecting stable projects. The listed tiers instead assign zero for no commits and no closed issues, so this claim cannot be reproduced from the documentation. Specify the floor amount and eligibility rule, or remove both floor-based claims.
A finished library with no open issues, no CVEs, and a recent release can score well here without recent commits. Intentionally low-activity projects are not penalized.
frontend/.husky/pre-commit:7
- This whole-file
git add -usilently stages unrelated unstaged hunks whenever a developer partially stages a JS/TS/Vue file: ESLint edits the working-tree file, thengit add -u <path>adds every change in that path, not just the formatter output. Preserve and restore unstaged patches (or use lint-staged's partial-staging support) instead of force-staging the complete file.
([ -z "$ESLINT_FILES" ] || (pnpm exec eslint --fix $ESLINT_FILES && git add -u $(git diff --name-only --diff-filter=d --cached --relative | grep -E '\.(js|ts|vue)$'))) && \
frontend/.husky/pre-commit:23
- Use the repository's required package runner here.
.claude/rules/pnpm-workspace-commands.md:7explicitly prohibitsnpx; invoking it can bypass the workspace's pinned tool resolution. Replace it withpnpm exec.
npx lint-staged --no-stash
- Rephrase opening: "every project" → "open source projects" (Impact
Score and Health Score are not guaranteed for all projects)
- Active state table row: replace prescriptive definition with accurate
fallback description ("does not meet criteria for any other state")
- Issue Resolution (3.3): rewrite to match spec — additive scoring
(close ratio up to 4 pts + median time to close up to 3 pts) rather
than a single tiered scale; correct thresholds (80%/50%, 7d/30d)
- PR Merge Health (3.4): rewrite to match spec — additive scoring
(merge ratio up to 3 pts + median time to merge up to 2 pts); correct
thresholds (70%/40%, not 80%/60%)
- Remove "percentile rank" qualifier from Impact methodology step 2
(log is monotonic so rank is unchanged; normalization method is
an implementation detail not verifiable from public docs)
- Remove "development floor" claim from migration table (no floor is
defined in sub-signals 3.1-3.4)
- Fix boundary gap: response time at exactly 90 days now falls in 0-pt
tier ("90 days or more") not in an unclassified gap
Signed-off-by: Joana Maia <jmaia@contractor.linuxfoundation.org>
Graph centrality is computed (PageRank) but not currently included in the rank_packages() impact formula. The formula averages three signals (transitive dependents, direct dependents, downloads / ecosystem popularity proxy) using a cumulative-share approach, not a weighted blend or log+percentile-rank as previously described. - Remove graph centrality from the Signals table - Replace three-step methodology (log-transform → percentile rank → weighted blend) with the accurate two-step description (cumulative share within ecosystem → average across available signals) - Update Signals table to note the Maven popularity score substitution Signed-off-by: Joana Maia <jmaia@contractor.linuxfoundation.org>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 2 out of 2 changed files in this pull request and generated no new comments.
Suppressed comments (5)
Previously missed (1) — in code that hasn't changed since the last review.
frontend/docs/metrics/health-score/index.md:116
- The rubric leaves low-severity advisories undefined. The first tier says 10 points requires no open vulnerabilities, but the deduction list assigns penalties only to Critical, High, and Moderate findings. Please state whether Low advisories deduct points or whether 10 points actually means no open Moderate-or-higher findings, so the score is reproducible.
- **10 pts:** No open vulnerabilities
- Points deducted per open advisory: 6 per Critical, 3 per High, 1 per Moderate (minimum 0)
frontend/.husky/pre-commit:23
- This still invokes
npx, despite the PR's statedpnpm execmigration and the repository rule that commands must never use npm/npx (.claude/rules/pnpm-workspace-commands.md:7). Use the workspace-installed binary so the hook does not bypass pnpm or fetch an unexpected version.
npx lint-staged --no-stash
frontend/.husky/pre-commit:7
git add -ustages every working-tree change in each listed path, not just ESLint's edits. If a JS/TS/Vue file is partially staged, this silently pulls its intentionally unstaged hunks into the commit. Preserve the staged patch or run ESLint through a partial-staging-safe lint-staged setup instead of force-adding whole files.
([ -z "$ESLINT_FILES" ] || (pnpm exec eslint --fix $ESLINT_FILES && git add -u $(git diff --name-only --diff-filter=d --cached --relative | grep -E '\.(js|ts|vue)$'))) && \
frontend/docs/metrics/health-score/index.md:19
- The shipped lifecycle mapping currently supports only
active,stable,declining,abandoned, andarchived(frontend/config/trust-score.ts:54-62), and the lifecycle-description switch also lacksinert. Aninertvalue therefore renders as “Unknown” with the generic no-data explanation. Either add application support for this documented state or do not present it as currently available.
| **Lifecycle** | What state is this project in? | One of six states: Active, Stable, Declining, Inert, Abandoned, Archived |
frontend/docs/metrics/health-score/index.md:127
- This rubric does not match the four security-practice inputs shown by the current UI.
health-breakdown-templates.ts:421-426tracks SECURITY.md, branch protection, required reviews, and required status checks; it does not track disclosure-process documentation or signed releases. Publishing different criteria makes the score impossible for users to reproduce.
- **2 pts:** `SECURITY.md` file present
- **2 pts:** Vulnerability disclosure process documented
- **2 pts:** Branch protection enabled on the default branch
- **2 pts:** Releases are cryptographically signed
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 2 out of 2 changed files in this pull request and generated no new comments.
Suppressed comments (5)
Previously missed (2) — in code that hasn't changed since the last review.
frontend/docs/metrics/health-score/index.md:51
- The documented 12-month abandonment threshold conflicts with the current UI explanation, which says “No maintainer activity in over 18 months” (
frontend/config/health-breakdown-templates.ts:41-52). The linked methodology discussion also leaves the exact threshold subject to empirical validation. Confirm the scorer's actual threshold and align the documentation and UI so users do not receive contradictory criteria.
2. **Abandoned:** open issues or pull requests have received no non-author response for an extended period (90 to 180 days), and maintainers have had no activity in the last 12 months.
frontend/docs/metrics/health-score/index.md:154
- No rule in the documented Development Activity rubric gives Stable projects special treatment. A finished project with no commits, issues, or PRs receives zero for those three signals and at most 8/25 from a recent release, so the claim that it “can score well here” is not supported. Document the lifecycle-based floor/adjustment if one exists, or revise this statement.
A finished library with no open issues, no CVEs, and a recent release can score well here without recent commits. Intentionally low-activity projects are not penalized.
frontend/.husky/pre-commit:23
npxremains here, so the hook does not implement the PR's statednpx→pnpm execchange and still violates the repository rule to never usenpx(.claude/rules/pnpm-workspace-commands.md:7). Resolve the workspace-managed binary through pnpm instead.
npx lint-staged --no-stash
frontend/docs/metrics/health-score/index.md:19
- This documents
Inertas a current lifecycle output, but the current UI only maps Active, Stable, Declining, Abandoned, and Archived (frontend/config/trust-score.ts:54-68). Aninertresult therefore renders asUnknownwith the generic no-data description. AddInertsupport to the UI as part of this rollout, or avoid presenting it as currently available.
| **Lifecycle** | What state is this project in? | One of six states: Active, Stable, Declining, Inert, Abandoned, Archived |
frontend/docs/metrics/health-score/index.md:127
- This 8-point rubric does not match the v2 inputs currently exposed to the UI: the contract tracks a security policy plus branch protection enabled, required reviews, and required status checks (
frontend/types/overview/responses.types.ts:114-120), with no disclosure-process or signed-release fields. The linked discussion likewise says branch-protection enforcement settings are scored. Align this table with the actual scorer, or implement the two advertised inputs before publishing them as point-earning criteria.
- **2 pts:** `SECURITY.md` file present
- **2 pts:** Vulnerability disclosure process documented
- **2 pts:** Branch protection enabled on the default branch
- **2 pts:** Releases are cryptographically signed
- Security Practices (2.2): update 4 documented checks to match actual implementation — SECURITY.md, branch protection enabled, required code reviews, required status checks. Remove "in development" claims for disclosure process and signed releases (not shipped). Simplify info callout to GitHub-only note. - Maintainer Responsiveness (1.1): clarify that null response data scores 0 pts (not redistributed) because the signal is available; projects with no open issues/PRs simply have no activity to measure. - Fix hook: replace `npx lint-staged` with `pnpm exec lint-staged` per workspace conventions (.claude/rules/pnpm-workspace-commands.md). Separate bugs filed: - IN-1240: Inert lifecycle state not handled in UI (renders as Unknown) - IN-1241: Open Vulnerabilities shows "No open vulnerabilities" when scan is unavailable (should show unavailable/no-data state) Signed-off-by: Joana Maia <jmaia@contractor.linuxfoundation.org>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.
Suppressed comments (2)
frontend/docs/metrics/health-score/index.md:19
- The new
Inertstate cannot currently be rendered as documented.frontend/config/trust-score.ts:54-68only maps active/stable/declining/abandoned/archived, andgetLifecycleDescriptionhas no inert branch, so aninertAPI value appears as “Unknown” with the generic unindexed-data explanation. Add the inert mapping and description before promising this sixth state.
| **Lifecycle** | What state is this project in? | One of six states: Active, Stable, Declining, Inert, Abandoned, Archived |
frontend/.husky/pre-commit:17
- The comment still names
npx lint-stagedeven though this change replaces the invocation withpnpm exec lint-staged. Update the rationale to match the actual command and avoid retaining a command prohibited by the workspace convention in contributor-facing hook documentation.
# Guard: only run when JS/TS/Vue files are staged. When only non-lintable
# files (e.g. .md) are staged, `npx lint-staged --no-stash` races with the
# GPG signing transaction and silently turns commits into pure deletions of
# every staged file (disk content intact). Skipping it when there is no
# matching work eliminates that race.
- Responsiveness: correct to 6-tier hour-based scale (24h/3d/1w/1m/3m)
matching the spec; previous 4-tier day-based scale was wrong
- Org diversity: fix 2-org tier from 4 pts to 5 pts per spec
- Active state: remove implied criteria ("typically has recent commits");
Active is an unconditional fallback with no thresholds
- Abandoned: align threshold to 18 months (was 12), matching UI copy
and spec
- Merge ratio: make tiers mutually exclusive (40-69% instead of 40%+)
- Development Activity intro: remove false claim that low-activity
projects "can score well"; Stable lifecycle adds context but does not
floor the formula
- Opening: qualify that Impact Score is not available for all projects
- Partial coverage: remove claim that per-repo breakdown is available
in the UI (not currently exposed)
- Open Vulnerabilities: note IN-1241 UI bug (null shown as "no vulns")
- Responsiveness null: clarify that null → 0 pts is correct per spec
(signal is available, not blocked; no redistribution applies)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: Joana Maia <jmaia@contractor.linuxfoundation.org>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.
Suppressed comments (10)
Previously missed (5) — in code that hasn't changed since the last review.
frontend/docs/metrics/health-score/index.md:135
- This documents an unattainable 8-point rubric. The shipped calculation caps Security Practices at 7: required reviews and status checks are 1 point each, and disabling force pushes supplies the omitted final point.
#### 2.2 Security Practices (max 8 pts)
Checks whether the repository has adopted documented security practices:
- **2 pts:** `SECURITY.md` file present
- **2 pts:** Branch protection enabled on the default branch
- **2 pts:** Required code reviews on pull requests
- **2 pts:** Required status checks before merging
frontend/docs/metrics/health-score/index.md:178
- The implementation has a fallback that is missing from this rubric: when no cleaned commit rows exist, it awards 4 points for a repository
lastCommitAtunder 3 months old, 2 points under 12 months, otherwise 0. Without this, readers cannot reproduce scores for the majority of repositories that use enrichment fallback data.
Counts commits authored in the last 6 months on the cleaned activity stream (bots and automation excluded).
frontend/docs/metrics/health-score/index.md:220
- Gerrit changesets are ingested into the PR analysis path, and the shipped development calculation can derive PR Merge Health from those records. It is only blocked when a repository has no PR/changeset rows, so declaring the signal unavailable for all Gerrit repositories is inaccurate.
Gerrit repositories do not ingest pull request data. This sub-signal is blocked for Gerrit-only projects and its weight redistributes within Development Activity.
frontend/docs/metrics/health-score/index.md:284
- This platform summary repeats that PR Merge Health is typically blocked, but the v2 pipeline explicitly maps Gerrit channels and analyzes changesets as PR data. Keep Issue Resolution blocked, but describe PR Merge Health as available when changeset data was ingested.
Gerrit does not ingest issue or PR data in the same format as GitHub and GitLab. Issue Resolution, PR Merge Health, and Security Practices are typically blocked. Commit Activity and Bus Factor remain available. Development Activity may compute from a reduced set of sub-signals.
frontend/docs/metrics/health-score/index.md:104
- The shipped query counts distinct organizations across all contributor activity in the last 12 months; it does not restrict the count to active maintainers. This wording overstates what the signal measures and can mislead readers when occasional contributors come from several organizations.
Measures how many distinct organizations the active maintainers are affiliated with, using contributor affiliation data. Projects maintained by contributors from multiple independent organizations are more resilient to any single organization withdrawing support.
frontend/docs/metrics/health-score/index.md:19
- The implementation can return no lifecycle state when every activity signal is unusable, so this output is not always one of the six named states. Document the unavailable case to keep consumers from treating missing data as
Active.
| **Lifecycle** | What state is this project in? | One of six states: Active, Stable, Declining, Inert, Abandoned, Archived |
frontend/docs/metrics/health-score/index.md:40
- These state definitions do not match the shipped lifecycle pipe: Stable does not test maintainer reachability, Abandoned uses 12 months without any commits plus an unanswered item aged at least 90 days, and Archived only checks the repository flag. As written, users will infer classifications from signals that are not evaluated.
| **Stable** | Low activity by design. The project is mature and does not need frequent changes. Maintainers are still reachable. |
| **Declining** | Activity dropped more than 50% in the last 6 months while issue volume increased; a sign the project is under pressure |
| **Inert** | No commits in 18+ months, but no open issues or pull requests either. Nothing to judge responsiveness by. A quiet project, not a neglected one. |
| **Abandoned** | No maintainer activity in 12+ months, with open issues or pull requests that have gone unanswered for an extended period |
| **Archived** | Explicitly archived in the repository host or marked deprecated in the package registry |
frontend/docs/metrics/health-score/index.md:54
- The detailed decision tree repeats signals that the shipped pipe does not use: package deprecation/yanking is not queried, and Abandoned is based on a 12-month no-commit gate plus a 90-day unanswered item—not 18 months of maintainer inactivity. Align these rules with the calculation so readers can reproduce classifications.
1. **Archived:** the repository's archived flag is set, or the package registry marks the package as deprecated or yanked.
2. **Abandoned:** open issues or pull requests have received no non-author response for an extended period (90 to 180 days), and maintainers have had no activity in the last 18 months.
3. **Inert:** no commits in the last 18 months, and no open issues or pull requests in that window (nothing to judge responsiveness by).
4. **Declining:** commits in the last 6 months are less than 50% of the prior 6 months, and the volume of newly opened issues is higher than the prior period.
5. **Stable:** the latest release is within the last 12 months, fewer than 50 issues are open, no critical vulnerabilities are open, and commits have dropped more than 50% vs. the prior period.
frontend/docs/metrics/health-score/index.md:55
Activeis not the fallback for repositories with no usable activity signal; the lifecycle pipe returns null before evaluating the decision tree. Qualify this fallback so it agrees with the unavailable case documented above.
6. **Active:** all other projects.
frontend/docs/metrics/health-score/index.md:314
- The Health formula remains activity-based for Stable projects; the lifecycle state does not change or floor Development points. Saying these libraries are “not penalized” contradicts the methodology above and should instead explain that Stable contextualizes a potentially lower score.
| **Stable "done" libraries** | Penalized: low commits meant a low score | Not penalized: the Stable state recognizes intentionally low-activity projects |
…havior IN-1236 - Remove "mature library won't score poorly" from intro — the formula applies equally regardless of lifecycle state - Update migration table "Not penalized" to accurately say the Stable lifecycle provides context but does not floor the Health Score formula - Open Vulnerabilities: absent scan data is coalesced to 0 advisories and scores as 10 pts (clean); it is not blocked/redistributed as previously documented — describe actual implementation behavior - Pre-commit hook: expand file extension guard from js|ts|vue to include cjs|mjs|cts|mts|tsx|jsx so eslint-fix covers all JS/TS variants present in the workspace Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Signed-off-by: Joana Maia <jmaia@contractor.linuxfoundation.org>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 2 out of 2 changed files in this pull request and generated no new comments.
Suppressed comments (7)
Previously missed (2) — in code that hasn't changed since the last review.
frontend/docs/metrics/health-score/index.md:39
- The Abandoned summary still says 12+ months, while the classification rule below and the current UI description use 18 months. Use one threshold so readers are not given two definitions of the same lifecycle state.
This issue also appears in the following locations of the same file:
- line 54
- line 291
- line 322
| **Abandoned** | No maintainer activity in 12+ months, with open issues or pull requests that have gone unanswered for an extended period |
frontend/docs/metrics/health-score/index.md:3
- Other entry points still describe the retired model:
frontend/docs/index.md:25-27calls Health Score a single unified metric,frontend/docs/more/faq/index.md:19-23says it is a weighted sum of four dimensions, andfrontend/docs/more/glossary/index.md:41-43repeats the four-dimension composite. Update those references with this rewrite; otherwise users receive contradictory methodology depending on where they enter the docs.
LFX Insights surfaces up to **three independent assessments** for open source projects: a **Lifecycle state**, a **Health Score**, and when applicable an **Impact Score**. Together, these replace the previous single composite score and answer three distinct questions:
frontend/docs/metrics/health-score/index.md:54
- This rule can classify a project as Stable without any evidence that maintainers are reachable, contradicting the Stable definition above and the UI description in
frontend/config/health-breakdown-templates.ts:27-29. Either include responsiveness in the classifier criteria or remove the reachability guarantee from the user-facing descriptions.
5. **Stable:** the latest release is within the last 12 months, fewer than 50 issues are open, no critical vulnerabilities are open, and commits have dropped more than 50% vs. the prior period.
frontend/docs/metrics/health-score/index.md:88
- “No response data available” also covers a blocked responsiveness signal, but blocked signals are redistributed rather than scored zero. The API explicitly exposes
responsivenessAvailable, and the UI handlesfalseas blocked (health-breakdown-templates.ts:303-308). Limit this zero-point tier to an available signal with no interactions so it does not contradict the missing-data policy.
- **0 pts:** Median response time 3 months or more, or no response data available
frontend/.husky/pre-commit:14
- This explanatory comment still names
npx lint-stagedeven though the hook now invokespnpm exec lint-staged. Refer to lint-staged generically so future debugging does not incorrectly attribute the behavior to the removed runner.
# files (e.g. .md) are staged, `npx lint-staged --no-stash` races with the
frontend/docs/metrics/health-score/index.md:322
- Under the documented original formula, Development contributed at most 25 points, so few commits alone could not reduce an otherwise healthy project to the Critical band. Describe the broader activity-based penalty instead of attributing the result solely to commits.
- **Stable libraries were penalized.** A mature utility with no bugs, no CVEs, and no need for active development scored near Critical simply because it had few recent commits.
frontend/docs/metrics/health-score/index.md:291
- The current API exposes only per-signal availability booleans and no partial-repository coverage state or counts (
frontend/types/overview/responses.types.ts:91-143), so the UI cannot always show the coverage details promised here. Remove this guarantee until partial coverage is surfaced, or add the required API/UI data.
Health Score comparisons across projects with different platform or data coverage are not directly comparable. A project with full GitHub and package data is scored on more signals than one on Gerrit with no published packages. Coverage details are always shown alongside the score.
…1236 - Remove "shown together in UI / prioritizing stewardship" sentence - Remove "look at Lifecycle before scores" sentence - Rewrite lifecycle state descriptions to be concrete and human-readable (Active: commits + responsive; Stable: low activity + recent release; Declining: commits dropped + issues up; Inert: no commits + no items; Abandoned: unanswered items + no maintainer; Archived: flagged) - Remove Classification Rules section; keep multi-repo rollup note - PR Merge Health: Gerrit is available (changesets/patchsets map to same metrics); remove blocked note and update platform coverage - Remove Bot and Non-Human Activity section (inline notes sufficient) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Signed-off-by: Joana Maia <jmaia@contractor.linuxfoundation.org>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.
Suppressed comments (1)
frontend/docs/metrics/health-score/index.md:274
- The UI cannot uphold this guarantee for partial multi-repository coverage:
HealthBreakdownResultsexposes only project-level availability booleans, with no contributing-repository counts orpartialstate, and the breakdown renders no Supply Chain Integrity row at all. Remove the claim that coverage details are always shown, or add the missing API/UI coverage data before documenting it.
Health Score comparisons across projects with different platform or data coverage are not directly comparable. A project with full GitHub and package data is scored on more signals than one on Gerrit with no published packages. Coverage details are always shown alongside the score.
- docs/index.md: replace "single unified metric" with v2 three-assessment description in the home page feature card - more/faq: update "four dimensions" question to describe v2 model (Lifecycle + Health Score + Impact Score); remove weighted-sum claim - more/glossary: rewrite Health Score entry to describe all three v2 assessments instead of the retired four-dimension composite - features/community-collections: update Avg. Health rating bands from old thresholds (80/60/40/20) to v2 bands (85/70/50/30) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Signed-off-by: Joana Maia <jmaia@contractor.linuxfoundation.org>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.
Suppressed comments (3)
Previously missed (1) — in code that hasn't changed since the last review.
frontend/docs/metrics/health-score/index.md:31
- This reintroduces the Active definition that the earlier review thread corrected. Active is the fallback when none of the other lifecycle states match; requiring both recent commits and responsiveness leaves fallback cases undocumented. Restore the fallback definition so this table matches the intended classifier.
This issue also appears on line 46 of the same file.
| **Active** | Regular commits in the last 6 months and maintainer is responsive to issues and pull requests. |
frontend/docs/metrics/health-score/index.md:46
- Poor responsiveness alone does not guarantee a low Health Score: this sub-signal is worth 15 points, so a project scoring zero here and full points elsewhere can still score 85 (Excellent). Describe the actual bounded effect rather than promising a low overall score.
The Health Score measures how well-maintained a project is, independent of how popular or critical it is. A widely-used project with poor maintainer responsiveness will score low here, even if its Impact Score is high.
frontend/.husky/pre-commit:14
- This new comment still names
npx lint-staged, although the command below was deliberately changed topnpm exec lint-staged. Update the explanation so it documents the actual command and does not reintroduce the prohibitednpxform as guidance.
# files (e.g. .md) are staged, `npx lint-staged --no-stash` races with the
…veat IN-1236 Signed-off-by: Joana Maia <jmaia@contractor.linuxfoundation.org>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 6 out of 6 changed files in this pull request and generated 1 comment.
Suppressed comments (2)
frontend/docs/metrics/health-score/index.md:35
- The bounded “90 to 180 days” interval means an item unanswered for more than 180 days no longer satisfies the documented Abandoned rule. Discussion #1939 describes 90–180 days as the candidate range for one eventual cutoff, not as a window. State the shipped rule as “at least N days” using the actual selected threshold so the classification remains valid after that point.
| **Abandoned** | Open issues or pull requests have gone unanswered for 90 to 180 days, and no maintainer activity in the last 18 months. |
frontend/docs/metrics/health-score/index.md:274
- The UI does not always show the promised coverage details.
HealthBreakdownResultsexposes only per-signal availability booleans, not the documentedpartialrepository coverage or contributing-repository counts, and the breakdown omits Supply Chain Integrity entirely. Remove this guarantee unless those details are added to the API and UI.
Health Score comparisons across projects with different platform or data coverage are not directly comparable. A project with full GitHub and package data is scored on more signals than one on Gerrit with no published packages. Coverage details are always shown alongside the score.
|
@jonathimer merging this one and deploying since the UI is already released - want to prevent the docs mismatching the real calculations. Feel free to still check out the documentation and suggest any further additions, improvements or fixes. We can open follow up PRs if needed |
Summary
docs/metrics/health-score/index.mdfor the v2 methodology, which replaces the original four-category equal-weight model with three independent assessments: Lifecycle state, Health Score (Maintainer 40 + Security & Supply Chain 35 + Development Activity 25), and Impact Score (package-mediated, 0–100)frontend/.husky/pre-commitwheregit add -uandnpx lint-staged --no-stashwrote to the git index while GPG held a lock duringgit commit -S, silently turning docs-only commits into pure deletions of staged files. Fix: guard botheslint --fix/git add -uandlint-stagedto only run when JS/TS/Vue files are staged. Also replacesnpx lint-stagedwithpnpm exec lint-stagedper workspace conventions (.claude/rules/pnpm-workspace-commands.md).Test plan
cd frontend && pnpm docs:dev— open/docs/metrics/health-score/and verify all three assessment sections renderwarning/info/tip) render as styled panelsCloses IN-1236