feat(ui): cycle-time percentiles card (p50/p90/p99) - #4468
Conversation
Add cycleTime to the stats feed and operator dashboard, plus an analytics CycleTimeCard with percentile tiles and a distribution sparkbar. Closes JSONbored#2194 Co-authored-by: Cursor <cursoragent@cursor.com>
|
Superagent didn't find any vulnerabilities or security issues in this PR. |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #4468 +/- ##
=======================================
Coverage 94.01% 94.02%
=======================================
Files 418 418
Lines 37439 37469 +30
Branches 13685 13692 +7
=======================================
+ Hits 35200 35230 +30
Misses 1583 1583
Partials 656 656
🚀 New features to boost your workflow:
|
Exercise computeCycleTimeAggregate day clamping/defaulting, missing D1 results, and null cycle deltas so codecov patch meets the 99% floor. Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
|
Warning 🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨 ⏸️ Gittensory review result - manual review recommendedReview updated: 2026-07-09 20:57:48 UTC
⏸️ Suggested Action - Manual Review
Review summary Nits — 6 non-blocking
Linked issue satisfactionPartially addressed 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.
|


Summary
cycleTime(p50/p90/p99 + histogram distribution) toStatsPayloadviacomputeCycleTimeAggregate, reading pairedgate_decision→pr_outcomerows fromreview_audit.cycleTimeon the operator dashboard payload and render a new read-onlyCycleTimeCardon/app/analyticswith three percentile Stat tiles and aMiniSparkbarwhen distribution data is present.Scope
type(scope): short summaryConventional Commit format, for examplefix(api): restore profile access checks.CONTRIBUTING.mdand does not reintroduce GitHub Pages, VitePress,site/, orCNAME.Closes #123) — a linked open issue is required for every contributor PR.Closes #2194
Validation
git diff --checknpm run actionlintnpm run typechecknpm run test:coveragelocally;codecov/patchrequires ≥99% coverage of the lines AND branches you changed (aim for 100% on your diff so CI variance does not fail near the threshold). Global coverage is a non-blocking trend with a loose 90% backstop, not the gate.npm run test:workersnpm run build:mcpnpm run test:mcp-packnpm run ui:openapi:checknpm run ui:lintnpm run ui:typechecknpm run ui:buildnpm audit --audit-level=moderateIf any required check was skipped, explain why:
npm run test:cigate pending CI; targeted unit/UI tests and coverage run locally on changed paths.Safety
UI Evidencesection below with JPG/JPEG or PNG screenshots arranged as organized, captioned, clickable thumbnails. SVG screenshots are not used as review evidence. Review-only screenshots or recordings are not committed to the repository.UI Evidence
/app/analyticsbefore: analytics page without cycle-time card
after: Review cycle time card with p50/p90/p99 + distribution
Screenshots to be uploaded to the PR (drag-and-drop) and URLs substituted above before merge.
Test plan
npm run test -- test/unit/stats.test.ts test/unit/operator-dashboard.test.tsnpm run test -- src/components/site/app-panels/cycle-time-card.test.tsx(UI)/app/analyticsshows empty state when no paired audit rows existNotes