feat(ui): add finding acceptance-rate card to the analytics dashboard (#2197) - #4725
Conversation
…JSONbored#2197) Render the finding acceptance-rate signal (inline findings the contributor acted on: posted inline -> PR merged) as a single analytics card. Display slice only per the bounty: the backend acceptance computation is tracked in JSONbored#1967, so the card reads an optional acceptance shape off the operator dashboard payload and degrades to a 'not yet available' empty state until it lands. Rate is banded (healthy/mixed/low) with a window-days label, reusing the shared AnalyticsCardShell + Stat/StatusPill primitives.
|
🚨 Contributor flagged. Click here for more info: Superagent Dashboard |
|
Superagent didn't find any vulnerabilities or security issues in this PR. |
|
Tip 🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩 ✅ Gittensory review result - approve/merge recommendedReview updated: 2026-07-10 21:28:14 UTC
✅ Suggested Action - Approve/Merge
Review summary Nits — 5 non-blocking
Flagged checks (non-blocking)
Review context
Contributor next steps
Signal definitions
Visual preview
Click any thumbnail to open the full-size screenshot. Before = production · After = this PR's preview deploy. 🟩 Safe / merged · 🟦 Advisory · 🟨 Held for review · 🟥 Blocked / closed 💰 Earn for open-source contributions like this. Gittensor lets GitHub contributors earn for the work they already do — register to start earning →. Checked by Gittensory, a quiet PR intelligence layer for OSS maintainers.
|
What
Adds the finding acceptance-rate card to the operator analytics dashboard (Closes #2197): the share of inline AI-review findings the contributor acted on (a finding was posted inline → the PR then merged), banded
healthy/mixed/lowwith a window-days label.Per the bounty, this is the display slice only — the backend acceptance computation is tracked separately in #1967. The card reads an optional
acceptanceshape off the operator-dashboard payload and degrades to a "not yet available" empty state while that field is absent, so it ships safely ahead of the backend and lights up automatically once the data lands. Nosrc/**change.Changes
acceptance-rate-card.tsx(new) —AcceptanceRateCard+FindingAcceptancetype. Reuses the sharedAnalyticsCardShell(feat(ui): shared analytics-card empty + loading skeleton states #2200) for the card/empty treatment andStat/StatusPillprimitives. Rate is rounded, guardstotal === 0(rate: null→—, no divide-by-zero), and singular/plural counts are handled.acceptance-rate-card.test.tsx(new) — 6 tests: populated (healthy), singular wording,mixedband,lowband, empty-window (rate null), and absent-field empty state — covering both arms of every guard.app.analytics.tsx— optionalacceptance?: FindingAcceptanceon the dashboard type + renders<AcceptanceRateCard acceptance={data.acceptance} />after the cycle-time card.Verification
ui:typecheck✓ ·ui:test(6/6) ✓ ·ui:build✓ · eslint 0 errors · prettier clean.Screenshots
Net-new card — no acceptance-rate card existed on
/app/analyticsbefore. After state shown in both the live empty (field absent today) and populated (once #1967 lands) forms, across desktop + mobile, light + dark.empty · light
empty · dark
empty · mobile
ready · light
ready · dark
ready · mobile
Closes #2197