{"org":{"slug":"microcks","github_login":"microcks","display_name":"Microcks","description":"Cloud-native API mocking and testing.","logo_url":"https://github.com/microcks.png","primary_languages":["Java","C#","TypeScript"]},"run":{"id":576,"months_back":1,"started_at":"2026-10-19T04:00:16.064Z","completed_at":"2026-10-19T04:01:13.534Z","date_range":{"from":"2026-09-19T04:00:16.064Z","to":"2026-10-19T04:00:16.064Z"}},"metrics":{"org_run_id":576,"computed_at":"2026-10-19T04:01:13.534Z","scope":"org","org":{"name":"microcks","metrics":{"time_to_first_review":{"sample_size":240,"median_hours":0.43,"p90_hours":46.9,"spread":{"gt_p90":24,"lt_median":120,"between_median_p90":96}},"time_to_approval":{"sample_size":229,"median_hours":0.44,"p90_hours":46.88,"spread":{"gt_p90":22,"lt_median":115,"between_median_p90":92}},"approval_to_merge":{"sample_size":224,"median_hours":0,"p90_hours":0,"spread":{"gt_p90":21,"lt_median":124,"between_median_p90":79}},"total_merged":228,"merged_without_review":{"count":4,"percentage":1.75},"merged_without_approval":{"count":4,"percentage":1.75},"reviewed_with_approval":{"count":224,"reviewed":224,"percentage":100},"first_commit_metrics":{"sample_size":313,"avg_commits_per_pr":1.36,"avg_ratio_open_over_merge":0.01,"avg_first_commit_to_open_hours":4.91,"avg_first_commit_to_merge_hours":22.67},"pr_throughput":{"total_opened":313,"total_merged":228,"avg_opened_per_week":52.17,"avg_merged_per_week":38,"weeks_analyzed":6,"time_to_merge":{"sample_size":228,"median_hours":0.43,"p90_hours":46.9,"spread":{"gt_p90":22,"lt_median":114,"between_median_p90":92}}},"reviewer_participation":{"avg_reviewers_per_pr":1.08},"pr_size":{"sample_size":313,"additions":{"p90":67,"median":1},"deletions":{"p90":7,"median":2},"total_lines":{"p90":69,"median":4},"changed_files":{"p90":2,"median":1},"total_churn":31392},"review_rounds":{"total":287,"approved":236,"commented":39,"avg_per_pr":0.92,"changes_requested":12},"rereview":{"rereview_rate":40,"prs_with_changes_requested":10,"prs_with_rereview_approval":4},"bot_reviews":{"count":7,"total":287,"percentage":2.44},"ai_reviews":{"count":7,"total":287,"percentage":2.44,"of_bot_percentage":100},"stale_open_prs":{"open_count":77,"stale_count":54,"stale_share_pct":70.1,"median_idle_hours":194.09,"above_median_idle_count":37,"idle_hours_histogram":[{"id":"lt_12h","count":7,"label":"<12h"},{"id":"h12_24","count":5,"label":"12–24h"},{"id":"d1_3","count":11,"label":"1–3d"},{"id":"d3_7","count":9,"label":"3–7d"},{"id":"d7_14","count":17,"label":"7–14d"},{"id":"d14_plus","count":28,"label":"14d+"}]}}},"repos":{},"signals":[{"id":"stale-open-prs","type":"stale-open-prs","title":"Stale Open PRs","impact":"Stale PRs decay in value (conflicts, outdated context), block dependent work, and inflate open-backlog counts without contributing to throughput.","status":"triggered","actions":[{"id":"triage_stale_prs","kind":"process_change","title":"Triage stale open PRs — close or request review on PRs idle >72h","priority":"primary","rationale":"54 open PRs (70.1%% of 77 open) have had no review activity for ≥ 72h. Oldest idle PR: 28.5d. Share exceeds 25% warning threshold.Count exceeds 5 warning threshold."},{"id":"stale_pr_drilldown","kind":"investigate","title":"Review the stale PR list and assign owners","priority":"secondary","rationale":"Drill-down shows which PRs are idle longest so you can close, split, or nudge for review."},{"id":"stale_pr_sla","kind":"process_change","title":"Add a weekly stale-PR hygiene ritual (close, draft, or re-request review)","priority":"secondary","rationale":"Recurring triage prevents silent backlog growth when throughput metrics look stable."}],"summary":"Open pull requests are sitting without review activity — work is stuck in limbo.","evidence":{"open_count":77,"stale_count":54,"stale_share_pct":70.1,"oldest_stale_hours":682.86},"severity":"critical","confidence":1,"likely_causes":["PRs opened then deprioritized without closing or converting to draft","Review requests going unanswered on low-visibility repos","Large or unclear PRs that reviewers defer indefinitely","Missing weekly hygiene on the open-PR backlog"],"interpretation":"Several open PRs have had no review activity for multiple days. This often indicates forgotten work, unclear ownership, or PRs that are too large or low-priority to pick up.","triggered_rules":["stale_open_count_above_threshold","stale_open_share_above_threshold"],"suggested_actions":["Triage stale open PRs — close or request review on PRs idle >72h","Review the stale PR list and assign owners","Add a weekly stale-PR hygiene ritual (close, draft, or re-request review)"],"supporting_metrics":["Merge efficiency (opened / merged)","Time to First Review (median, p90)"]},{"id":"reviewer-concentration","type":"reviewer-concentration","title":"Reviewer Concentration","impact":"Concentrated review load slows everyone downstream, increases burnout risk for overloaded reviewers, and leaves the team vulnerable when key reviewers are unavailable.","status":"triggered","actions":[{"id":"rotate_review_oncall","kind":"process_change","title":"Rotate review on-call and cap per-reviewer review share at 30%","priority":"primary","rationale":"Top 2 reviewers handled 77.6%% of reviews (259 total across 14 reviewers; target top-2 share ≤ 50%). Only 14 distinct reviewers — bus-factor risk compounds concentration."},{"id":"expand_reviewer_pool","kind":"process_change","title":"Expand the active reviewer pool and cross-train backups","priority":"secondary","rationale":"Only 14 reviewers for 259 reviews. Spreading load reduces single points of failure and shortens queue time."},{"id":"reviewer_load_drilldown","kind":"investigate","title":"Review who is carrying the queue this run","priority":"secondary","rationale":"Identify which repos or teams drive the concentration before changing rotation policy."}],"summary":"Review work is concentrated in a small number of reviewers — the team has a bus-factor bottleneck.","evidence":{"top1_share":69.1,"top2_share":77.6,"top3_share":84.6,"total_reviews":259,"reviewer_count":14},"severity":"critical","confidence":0.83,"likely_causes":["Informal \"default reviewer\" habits on specific repos or teams","CODEOWNERS or team structure that funnels work to the same people","Too few engineers with merge/review permissions relative to PR volume","Senior reviewers absorbing work that could be distributed more evenly"],"interpretation":"A disproportionate share of reviews is landing on one or two people. Headline latency metrics may look acceptable while those reviewers become a queue bottleneck and knowledge silo.","triggered_rules":["top2_share_above_threshold","top1_share_above_threshold"],"suggested_actions":["Rotate review on-call and cap per-reviewer review share at 30%","Expand the active reviewer pool and cross-train backups","Review who is carrying the queue this run"],"supporting_metrics":["Reviewer Load Distribution","Time to First Review (median, p90)"]},{"id":"review-latency","type":"review-latency","title":"Review Latency Problem","impact":"Slower feedback loops extend cycle time, increase rebase/merge-conflict overhead, and reduce the team's ability to ship incrementally. Tail pressure (p90 ≫ median) indicates the average is hiding a small number of PRs stuck for very long periods.","status":"triggered","actions":[{"id":"investigate_tail_prs","kind":"investigate","title":"Investigate the longest-waiting PRs for systemic delays","priority":"primary","rationale":"P90 first review (2.0d) is 109.07x the median (26m) — a small tail of stuck PRs may be hiding behind a healthy average."},{"id":"audit_pr_size_context","kind":"investigate","title":"Audit whether oversized or low-context PRs are being deferred","priority":"secondary","rationale":"Tail latency often clusters on PRs that are hard to review quickly."}],"summary":"PRs are waiting too long for review or approval relative to healthy targets.","evidence":{"approval_p90_hours":46.88,"approval_median_hours":0.44,"first_review_p90_hours":46.9,"first_review_tail_ratio":109.07,"first_review_median_hours":0.43},"severity":"critical","confidence":0.74,"likely_causes":["Reviewers are overloaded or unevenly distributed","No clear ownership or on-call review rotation","Reviewers context-switch between deep work and reviews without dedicated review windows","PRs are too large or lack context, so reviewers defer them"],"interpretation":"Median time to first review and/or time to approval is above healthy thresholds. When latency rises, in-flight PRs accumulate, context decays, and reviewers are pulled back to older work — compounding delivery risk.","triggered_rules":["first_review_tail_ratio_high"],"suggested_actions":["Investigate the longest-waiting PRs for systemic delays","Audit whether oversized or low-context PRs are being deferred"],"supporting_metrics":["Time to First Review (median, p90)","Time to Approval (median, p90)","Reviewer Load Distribution"]},{"id":"backlog-imbalance","type":"backlog-imbalance","title":"Backlog / Throughput Imbalance","impact":"A growing backlog means older PRs stale, merge conflicts mount, and reviewer attention fragments. Left unchecked this degrades review quality and extends cycle time across the board.","status":"triggered","actions":[{"id":"prioritise_oldest_prs","kind":"process_change","title":"Prioritise clearing the oldest open PRs before accepting new ones","priority":"primary","rationale":"Merge efficiency is 1.37 (52 opened vs 38 merged per week; warning threshold: 1.2)."},{"id":"temp_review_capacity","kind":"process_change","title":"Temporarily shift capacity toward review until intake catches up","priority":"secondary","rationale":"A growing backlog increases context decay even when individual cycle times look fine."},{"id":"investigate_spike_source","kind":"investigate","title":"Investigate whether a specific author or repo is driving the imbalance","priority":"secondary","rationale":"Early spikes are easier to correct when you know the source."},{"id":"revisit_wip_limits","kind":"process_change","title":"If the imbalance persists, revisit reviewer allocation and WIP limits","priority":"secondary","rationale":"Opened/merged ratio above 1.2 for multiple weeks warrants structural changes."}],"summary":"More PRs are being opened each week than the team is merging — the backlog is growing.","evidence":{"merge_efficiency":1.37,"avg_merged_per_week":38,"avg_opened_per_week":52.17},"severity":"low","confidence":0.83,"likely_causes":["Insufficient reviewer capacity for the current work pace","Pull requests being opened faster than review can keep up (e.g. end-of-sprint crunch)","A handful of stuck PRs consuming disproportionate review cycles","Temporary surge (release prep, audit, migration) that needs to be planned for"],"interpretation":"Work intake is outpacing completion. Even if individual cycle times look acceptable, the team is accumulating in-flight PRs that compete for attention and compound review load.","triggered_rules":["merge_efficiency_above_threshold"],"suggested_actions":["Prioritise clearing the oldest open PRs before accepting new ones","Temporarily shift capacity toward review until intake catches up","Investigate whether a specific author or repo is driving the imbalance","If the imbalance persists, revisit reviewer allocation and WIP limits"],"supporting_metrics":["Merge efficiency (opened / merged)","Time to Merge (median)"]}]},"ai_report":{"status":"PENDING","output_markdown":null}}