{"org":{"slug":"aws","github_login":"aws","display_name":"AWS","description":"Open-source projects from Amazon Web Services.","logo_url":"https://github.com/aws.png","primary_languages":["Python","Go","Java"]},"run":{"id":564,"months_back":1,"started_at":"2026-10-15T03:00:42.269Z","completed_at":"2026-10-15T03:18:57.244Z","date_range":{"from":"2026-09-15T03:00:42.269Z","to":"2026-10-15T03:00:42.269Z"}},"metrics":{"org_run_id":564,"computed_at":"2026-10-15T03:18:57.244Z","scope":"org","org":{"name":"aws","metrics":{"time_to_first_review":{"sample_size":2559,"median_hours":1.3,"p90_hours":92.68,"spread":{"gt_p90":255,"lt_median":1280,"between_median_p90":1024}},"time_to_approval":{"sample_size":2205,"median_hours":4.41,"p90_hours":137.48,"spread":{"gt_p90":220,"lt_median":1103,"between_median_p90":882}},"approval_to_merge":{"sample_size":2046,"median_hours":0.2,"p90_hours":13.35,"spread":{"gt_p90":204,"lt_median":1023,"between_median_p90":819}},"total_merged":2401,"merged_without_review":{"count":261,"percentage":10.87},"merged_without_approval":{"count":334,"percentage":13.91},"reviewed_with_approval":{"count":2067,"reviewed":2140,"percentage":96.59},"first_commit_metrics":{"sample_size":4152,"avg_commits_per_pr":3.19,"avg_ratio_open_over_merge":0.09,"avg_first_commit_to_open_hours":23.38,"avg_first_commit_to_merge_hours":51.36},"pr_throughput":{"total_opened":4152,"total_merged":2401,"avg_opened_per_week":830.4,"avg_merged_per_week":480.2,"weeks_analyzed":5,"time_to_merge":{"sample_size":2401,"median_hours":8.27,"p90_hours":142.38,"spread":{"gt_p90":240,"lt_median":1201,"between_median_p90":960}}},"reviewer_participation":{"avg_reviewers_per_pr":1.63},"pr_size":{"sample_size":4152,"additions":{"p90":1701,"median":49},"deletions":{"p90":213,"median":6},"total_lines":{"p90":2095,"median":68},"changed_files":{"p90":22,"median":3},"total_churn":25501476},"review_rounds":{"total":8205,"approved":3134,"commented":4854,"avg_per_pr":1.98,"changes_requested":217},"rereview":{"rereview_rate":59.35,"prs_with_changes_requested":155,"prs_with_rereview_approval":92},"bot_reviews":{"count":1541,"total":8205,"percentage":18.78},"ai_reviews":{"count":117,"total":8205,"percentage":1.43,"of_bot_percentage":7.6},"stale_open_prs":{"open_count":1238,"stale_count":830,"stale_share_pct":67,"median_idle_hours":174.06,"above_median_idle_count":619,"idle_hours_histogram":[{"id":"lt_12h","count":116,"label":"<12h"},{"id":"h12_24","count":40,"label":"12–24h"},{"id":"d1_3","count":252,"label":"1–3d"},{"id":"d3_7","count":180,"label":"3–7d"},{"id":"d7_14","count":298,"label":"7–14d"},{"id":"d14_plus","count":352,"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":"830 open PRs (67.0%% of 1,238 open) have had no review activity for ≥ 72h. Oldest idle PR: 29.7d. 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":1238,"stale_count":830,"stale_share_pct":67,"oldest_stale_hours":711.63},"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 (13.3h) is far above the median (12m) — 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":8.27,"approval_to_merge_p90_hours":13.35,"approval_to_merge_median_hours":0.2,"approval_to_merge_fraction_of_cycle":0.024},"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 (3.9d) is 71.29x the median (1.3h) — 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":137.48,"approval_median_hours":4.41,"first_review_p90_hours":92.68,"first_review_tail_ratio":71.29,"first_review_median_hours":1.3},"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.73 (830 opened vs 480 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."},{"id":"partner_linearb","kind":"external_tool","title":"Recommended tool: LinearB","partner":{"name":"LinearB","slug":"linearb","category":"eng_analytics","logo_url":null,"product_id":6,"disclosure_type":"editorial"},"priority":"secondary","cta_label":"Learn more","rationale":"Engineering metrics and delivery analytics to diagnose throughput and backlog imbalance."}],"summary":"More PRs are being opened each week than the team is merging — the backlog is growing.","evidence":{"merge_efficiency":1.73,"avg_merged_per_week":480.2,"avg_opened_per_week":830.4},"severity":"high","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":"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,095 lines (target: ≤1,000) while median is 68 — 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 (68 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":2095,"pr_size_total_lines_median":68},"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 10.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":18.78,"merged_without_review_pct":10.87},"severity":"low","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 (%)"]}]},"ai_report":{"status":"PENDING","output_markdown":null}}