{"org":{"slug":"google-cloud","github_login":"GoogleCloudPlatform","display_name":"Google Cloud Platform","description":"Open-source projects from Google Cloud Platform.","logo_url":"https://github.com/GoogleCloudPlatform.png","primary_languages":["Go","Python","HCL"]},"run":{"id":566,"months_back":1,"started_at":"2026-10-15T05:01:51.259Z","completed_at":"2026-10-15T05:29:40.300Z","date_range":{"from":"2026-09-15T05:01:51.259Z","to":"2026-10-15T05:01:51.259Z"}},"metrics":{"org_run_id":566,"computed_at":"2026-10-15T05:29:40.300Z","scope":"org","org":{"name":"GoogleCloudPlatform","metrics":{"time_to_first_review":{"sample_size":4836,"median_hours":0.05,"p90_hours":24.23,"spread":{"gt_p90":483,"lt_median":2424,"between_median_p90":1929}},"time_to_approval":{"sample_size":2201,"median_hours":7.46,"p90_hours":145.77,"spread":{"gt_p90":220,"lt_median":1101,"between_median_p90":880}},"approval_to_merge":{"sample_size":2079,"median_hours":0.25,"p90_hours":9.4,"spread":{"gt_p90":207,"lt_median":1040,"between_median_p90":832}},"total_merged":5059,"merged_without_review":{"count":855,"percentage":16.9},"merged_without_approval":{"count":2973,"percentage":58.77},"reviewed_with_approval":{"count":2086,"reviewed":4204,"percentage":49.62},"first_commit_metrics":{"sample_size":7221,"avg_commits_per_pr":4.08,"avg_ratio_open_over_merge":0.22,"avg_first_commit_to_open_hours":33.96,"avg_first_commit_to_merge_hours":47.06},"pr_throughput":{"total_opened":7221,"total_merged":5059,"avg_opened_per_week":1444.2,"avg_merged_per_week":1011.8,"weeks_analyzed":5,"time_to_merge":{"sample_size":5059,"median_hours":4,"p90_hours":94.37,"spread":{"gt_p90":505,"lt_median":2530,"between_median_p90":2024}}},"reviewer_participation":{"avg_reviewers_per_pr":1.28},"pr_size":{"sample_size":7221,"additions":{"p90":1730,"median":86},"deletions":{"p90":175,"median":9},"total_lines":{"p90":2019,"median":124},"changed_files":{"p90":21,"median":3},"total_churn":13323789},"review_rounds":{"total":9029,"approved":2461,"commented":6401,"avg_per_pr":1.25,"changes_requested":167},"rereview":{"rereview_rate":66.67,"prs_with_changes_requested":123,"prs_with_rereview_approval":82},"bot_reviews":{"count":3420,"total":9029,"percentage":37.88},"ai_reviews":{"count":3322,"total":9029,"percentage":36.79,"of_bot_percentage":97.1},"stale_open_prs":{"open_count":1505,"stale_count":911,"stale_share_pct":60.5,"median_idle_hours":179.24,"above_median_idle_count":748,"idle_hours_histogram":[{"id":"lt_12h","count":143,"label":"<12h"},{"id":"h12_24","count":98,"label":"12–24h"},{"id":"d1_3","count":353,"label":"1–3d"},{"id":"d3_7","count":118,"label":"3–7d"},{"id":"d7_14","count":355,"label":"7–14d"},{"id":"d14_plus","count":438,"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":"911 open PRs (60.5%% of 1,505 open) have had no review activity for ≥ 72h. Oldest idle PR: 29.8d. 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":1505,"stale_count":911,"stale_share_pct":60.5,"oldest_stale_hours":715.85},"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":"merge-friction","type":"merge-friction","title":"Merge Pipeline Friction","impact":"Work that should be done sits waiting, increasing the chance of merge conflicts, stale CI, and reviewer re-engagement. Deployment frequency suffers even when review throughput looks healthy.","status":"triggered","actions":[{"id":"investigate_merge_tail","kind":"investigate","title":"Investigate PRs stuck longest after approval","priority":"primary","rationale":"P90 approval-to-merge (9.4h) is far above the median (15m) — a tail of stuck merges may hide behind a fast average."},{"id":"audit_ci_reliability","kind":"investigate","title":"Audit CI for the slowest-to-merge PRs","priority":"secondary","rationale":"Tail merge delays often trace to intermittent CI failures or long pipelines."},{"id":"check_merge_queue","kind":"investigate","title":"Check whether the merge queue or branch protection is serialising merges","priority":"secondary","rationale":"Queue congestion creates long post-approval waits even when CI is green."},{"id":"partner_mergify","kind":"external_tool","title":"Recommended tool: Mergify","partner":{"name":"Mergify","slug":"mergify","category":"merge_queue","logo_url":null,"product_id":3,"disclosure_type":"editorial"},"priority":"secondary","cta_label":"Learn more","rationale":"Merge queues and automation to cut post-approval wait and merge friction."}],"summary":"Approved PRs are stalling before they land — the bottleneck is after review, not during it.","evidence":{"time_to_merge_median_hours":4,"approval_to_merge_p90_hours":9.4,"approval_to_merge_median_hours":0.25,"approval_to_merge_fraction_of_cycle":0.063},"severity":"critical","confidence":0.77,"likely_causes":["Flaky or slow CI gating merges","Merge queue congestion or serialised merge windows","Release-branch freezes or deployment-gated merges","Authors waiting on unrelated approvals (e.g. code-owners, compliance)","Manual merge steps that require specific people to be online"],"interpretation":"Time from approval to merge is elevated, and/or the approval → merge step accounts for a disproportionate share of total cycle time. Review is doing its job; something downstream is holding PRs back from shipping.","triggered_rules":["approval_to_merge_tail_ratio_high"],"suggested_actions":["Investigate PRs stuck longest after approval","Audit CI for the slowest-to-merge PRs","Check whether the merge queue or branch protection is serialising merges"],"supporting_metrics":["Approval to Merge (median, p90)","Time to Merge (median)","Merge efficiency (opened / merged)"]},{"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 (1.0d) is 484.60x the median (3m) — 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":145.77,"approval_median_hours":7.46,"first_review_p90_hours":24.23,"first_review_tail_ratio":484.6,"first_review_median_hours":0.05},"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":"pr-size-risk","type":"pr-size-risk","title":"PR Size / Complexity Risk","impact":"Large PRs receive rubber-stamp approvals, hide regressions, slow down review (long feedback loops), and make bisecting harder when bugs do reach main. Cycle time and review quality both suffer.","status":"triggered","actions":[{"id":"review_p90_offenders","kind":"investigate","title":"Review p90 offenders — are they refactors that should be split?","priority":"primary","rationale":"P90 PR size is 2,019 lines (target: ≤1,000) while median is 124 — a tail of very large PRs is driving risk."},{"id":"encourage_incremental_prs","kind":"process_change","title":"Encourage stacked PRs for large features","priority":"secondary","rationale":"Splitting refactors from feature work reduces p90 spikes."},{"id":"add_pr_template_size_hint","kind":"process_change","title":"Add a target size hint to the PR template","priority":"secondary","rationale":"Team median (124 lines) is healthy — focus on the tail."},{"id":"partner_graphite","kind":"external_tool","title":"Recommended tool: Graphite","partner":{"name":"Graphite","slug":"graphite","category":"stacked_prs","logo_url":null,"product_id":2,"disclosure_type":"editorial"},"priority":"secondary","cta_label":"Learn more","rationale":"Stacked pull requests and merge tooling to keep changes small and reviewable."}],"summary":"PRs are too large for effective human review.","evidence":{"pr_size_total_lines_p90":2019,"pr_size_total_lines_median":124},"severity":"high","confidence":0.77,"likely_causes":["No shared expectation around PR size / scoping","Feature branches being merged as a single PR instead of stacked incrementally","Code generation / refactor commits inflating line counts","Reluctance to open \"partial\" PRs due to CI or review overhead"],"interpretation":"The typical PR is larger than the ~200-400 line band most research suggests reviewers can evaluate thoroughly. When p90 is also elevated, the team regularly ships PRs that are beyond the reach of meaningful line-by-line review.","triggered_rules":["pr_size_p90_above_threshold"],"suggested_actions":["Review p90 offenders — are they refactors that should be split?","Encourage stacked PRs for large features","Add a target size hint to the PR template"],"supporting_metrics":["PR Size — Total Lines (median)","PR Size — Total Lines (p90)"]},{"id":"review-quality-risk","type":"review-quality-risk","title":"Review Quality Risk","impact":"Reduced human review increases the chance of regressions reaching main, weakens knowledge sharing, and obscures ownership. When both conditions coincide, the process is structurally leaning on automation that can't replace judgement on design, naming, or architectural fit.","status":"triggered","actions":[{"id":"audit_bypass_prs","kind":"investigate","title":"Audit recent merged-without-review PRs to confirm bypasses are intentional","priority":"primary","rationale":"Merged without review is 16.9% vs 10.0% target."},{"id":"require_human_review","kind":"configure_github","title":"Add branch protection requiring at least one human review","priority":"secondary","rationale":"Explicit gates prevent self-merge drift under time pressure."},{"id":"add_codeowners","kind":"configure_github","title":"Add a CODEOWNERS file to pull the right humans in","priority":"secondary","rationale":"Targeted ownership reduces accidental bypass on sensitive paths."}],"summary":"Human review may be bypassed or diluted — the safety net is weaker than it looks.","evidence":{"bot_review_pct":37.88,"merged_without_review_pct":16.9},"severity":"medium","confidence":0.77,"likely_causes":["Explicit policy to self-merge trivial changes — but the definition of \"trivial\" has drifted","Dependabot / Renovate PRs auto-merging without gating on human review","A small group of trusted authors bypassing review under time pressure","Heavy reliance on bot reviewers (formatting, lint, security) as a proxy for human review"],"interpretation":"A non-trivial share of PRs are merging without human review, or bots are contributing the majority of review activity. In either case, the effective human review signal is thinner than raw review counts suggest.","triggered_rules":["merged_without_review_above_threshold"],"suggested_actions":["Audit recent merged-without-review PRs to confirm bypasses are intentional","Add branch protection requiring at least one human review","Add a CODEOWNERS file to pull the right humans in"],"supporting_metrics":["Merged without Review (%)","Bot Review Share (%)"]},{"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":"cap_reviewer_share","kind":"process_change","title":"Cap per-reviewer review share and rotate on-call","priority":"primary","rationale":"One reviewer handled 47.3%% of reviews (6,190 total; target single-reviewer share ≤ 35%)."},{"id":"reviewer_load_drilldown","kind":"investigate","title":"Check whether concentration is org-wide or repo-specific","priority":"secondary","rationale":"Scoped drill-down shows whether one service team dominates review load."}],"summary":"Review work is concentrated in a small number of reviewers — the team has a bus-factor bottleneck.","evidence":{"top1_share":47.3,"top2_share":49.5,"top3_share":51.5,"total_reviews":6190,"reviewer_count":418},"severity":"medium","confidence":0.74,"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":["top1_share_above_threshold"],"suggested_actions":["Cap per-reviewer review share and rotate on-call","Check whether concentration is org-wide or repo-specific"],"supporting_metrics":["Reviewer Load Distribution","Time to First Review (median, p90)"]},{"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.43 (1,444 opened vs 1,012 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.43,"avg_merged_per_week":1011.8,"avg_opened_per_week":1444.2},"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)"]},{"id":"dev-cycle-delay","type":"dev-cycle-delay","title":"Development Cycle Delay","impact":"Hidden work delays feedback from reviewers and CI, increases merge conflict risk, and makes it harder to course-correct early. It also distorts cycle-time metrics — the clock doesn't start until the PR is visible.","status":"triggered","actions":[{"id":"encourage_draft_prs","kind":"process_change","title":"Encourage draft PRs earlier — even WIP work benefits from visibility","priority":"primary","rationale":"Average first-commit-to-open is 1.4d vs 1.0d target (n=7,221)."},{"id":"adopt_stacked_workflow","kind":"process_change","title":"Adopt a stacked-PR workflow to surface work incrementally","priority":"secondary","rationale":"Incremental surfacing reduces large-batch merges and review load spikes."},{"id":"investigate_long_incubation","kind":"investigate","title":"Investigate the longest incubation PRs","priority":"secondary","rationale":"Identify whether deferral is cultural (\"finish before sharing\") or tooling."},{"id":"warn_branch_divergence","kind":"configure_github","title":"Consider automation that warns when a branch diverges from main too long","priority":"secondary","rationale":"Incubation of 1.4d correlates with larger PRs and more rebasing."}],"summary":"Work is incubating locally for too long before being opened for review.","evidence":{"first_commit_sample_size":7221,"avg_first_commit_to_open_hours":33.96},"severity":"low","confidence":0.83,"likely_causes":["Culture of \"finish before sharing\" rather than draft PRs","Reluctance to open PRs that aren't yet \"clean\"","Long-lived feature branches without intermediate syncs to main","Lack of draft PR / stacked PR workflow"],"interpretation":"The gap between first commit and PR open is high, indicating that engineers are accumulating work on local branches before surfacing it. Long incubation correlates with larger PRs, harder review, and more rebasing as main moves ahead.","triggered_rules":["first_commit_to_open_above_threshold"],"suggested_actions":["Encourage draft PRs earlier — even WIP work benefits from visibility","Adopt a stacked-PR workflow to surface work incrementally","Investigate the longest incubation PRs","Consider automation that warns when a branch diverges from main too long"],"supporting_metrics":["First Commit → PR Open (avg hours)"]}]},"ai_report":{"status":"PENDING","output_markdown":null}}