stackvitals 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mergescout/__init__.py +1 -0
- mergescout/archive/__init__.py +0 -0
- mergescout/archive/__main__.py +30 -0
- mergescout/archive/convert.py +83 -0
- mergescout/archive/events.py +55 -0
- mergescout/archive/manifest.py +45 -0
- mergescout/archive/stream.py +83 -0
- mergescout/bench/__init__.py +1 -0
- mergescout/bench/__main__.py +135 -0
- mergescout/bench/ci.py +257 -0
- mergescout/bench/deploys.py +115 -0
- mergescout/bench/matched.py +22 -0
- mergescout/bench/prior.py +42 -0
- mergescout/bench/report.py +230 -0
- mergescout/bench/shared.py +112 -0
- mergescout/bench/stars.py +57 -0
- mergescout/cli.py +89 -0
- mergescout/config.py +35 -0
- mergescout/crawl/__init__.py +0 -0
- mergescout/crawl/__main__.py +97 -0
- mergescout/crawl/chain.py +34 -0
- mergescout/crawl/fetch.py +146 -0
- mergescout/crawl/outcomes.py +69 -0
- mergescout/crawl/queries.py +250 -0
- mergescout/crawl/runner.py +176 -0
- mergescout/crawl/seed.py +77 -0
- mergescout/crawl/state.py +169 -0
- mergescout/crawl/writer.py +87 -0
- mergescout/discover/__init__.py +0 -0
- mergescout/discover/__main__.py +58 -0
- mergescout/discover/sweep.py +286 -0
- mergescout/github/__init__.py +0 -0
- mergescout/github/graphql.py +202 -0
- mergescout/github/identities.py +35 -0
- mergescout/github/releases.py +137 -0
- mergescout/labels.py +20 -0
- mergescout/mcp_server.py +228 -0
- mergescout/measure/__init__.py +0 -0
- mergescout/measure/__main__.py +75 -0
- mergescout/measure/api_cost.py +91 -0
- mergescout/measure/count_repos.py +30 -0
- mergescout/measure/jsonl.py +14 -0
- mergescout/measure/report.py +56 -0
- mergescout/measure/sample.py +37 -0
- mergescout/owners.py +22 -0
- mergescout/setup_check.py +64 -0
- mergescout/signals/__init__.py +0 -0
- mergescout/signals/__main__.py +96 -0
- mergescout/signals/bump_ledger.py +258 -0
- mergescout/signals/bumps.py +104 -0
- mergescout/signals/check.py +141 -0
- mergescout/signals/community_bench.py +149 -0
- mergescout/signals/delivery_bench.py +103 -0
- mergescout/signals/deps_map.py +261 -0
- mergescout/signals/deps_trends.py +117 -0
- mergescout/signals/evidence.py +94 -0
- mergescout/signals/exploits.py +43 -0
- mergescout/signals/flow_bench.py +258 -0
- mergescout/signals/identity.py +73 -0
- mergescout/signals/issues.py +76 -0
- mergescout/signals/labels.py +79 -0
- mergescout/signals/osv.py +232 -0
- mergescout/signals/owners_watch.py +80 -0
- mergescout/signals/repo_stats.py +96 -0
- mergescout/signals/rules.py +70 -0
- mergescout/signals/silver.py +33 -0
- mergescout/signals/top_packages.py +26 -0
- mergescout/signals/triage.py +71 -0
- mergescout/signals/triage_math.py +120 -0
- mergescout/signals/walls.py +91 -0
- mergescout/snapshot/__init__.py +0 -0
- mergescout/snapshot/__main__.py +215 -0
- mergescout/snapshot/build.py +147 -0
- mergescout/snapshot/publish.py +70 -0
- mergescout/snapshot/schema.py +34 -0
- mergescout/snapshot/score.py +30 -0
- mergescout/store/__init__.py +0 -0
- mergescout/store/__main__.py +46 -0
- mergescout/store/sync.py +148 -0
- mergescout/timeutil.py +11 -0
- mergescout/tool/__init__.py +0 -0
- mergescout/tool/action_pack.py +62 -0
- mergescout/tool/live.py +201 -0
- mergescout/tool/queries.py +293 -0
- mergescout/tool/refs.py +31 -0
- mergescout/tool/store.py +129 -0
- mergescout/tool/tracking.py +83 -0
- stackvitals/__init__.py +2 -0
- stackvitals/__main__.py +4 -0
- stackvitals/ci/__init__.py +1 -0
- stackvitals/ci/action.py +574 -0
- stackvitals/ci/analyze.py +577 -0
- stackvitals/ci/api.py +218 -0
- stackvitals/ci/automation.py +212 -0
- stackvitals/ci/bench.py +195 -0
- stackvitals/ci/burnin.py +102 -0
- stackvitals/ci/cli.py +570 -0
- stackvitals/ci/collect.py +239 -0
- stackvitals/ci/cost.py +107 -0
- stackvitals/ci/coverage.py +155 -0
- stackvitals/ci/feedback.py +699 -0
- stackvitals/ci/fingerprint.py +220 -0
- stackvitals/ci/gitlab.py +121 -0
- stackvitals/ci/gitlab_action.py +125 -0
- stackvitals/ci/impact.py +125 -0
- stackvitals/ci/investigate.py +59 -0
- stackvitals/ci/kinds.py +52 -0
- stackvitals/ci/monitors.py +105 -0
- stackvitals/ci/owners.py +116 -0
- stackvitals/ci/quarantine_runtime.py +90 -0
- stackvitals/ci/report.py +435 -0
- stackvitals/ci/retry.py +67 -0
- stackvitals/ci/selfheal.py +102 -0
- stackvitals/ci/shards.py +120 -0
- stackvitals/ci/share.py +59 -0
- stackvitals/ci/store.py +93 -0
- stackvitals/ci/testreports.py +351 -0
- stackvitals/ci/tickets.py +106 -0
- stackvitals/ci/track_record.json +11 -0
- stackvitals/ci/triage.py +130 -0
- stackvitals/ci/triggers.py +147 -0
- stackvitals/ci/upload.py +85 -0
- stackvitals/ci/validate.py +91 -0
- stackvitals/cli.py +111 -0
- stackvitals/codeowners.py +69 -0
- stackvitals/community/__init__.py +0 -0
- stackvitals/community/action.py +140 -0
- stackvitals/community/affiliation.py +51 -0
- stackvitals/community/analyze.py +507 -0
- stackvitals/community/build.py +56 -0
- stackvitals/community/chaoss.py +70 -0
- stackvitals/community/cli.py +79 -0
- stackvitals/community/collect.py +240 -0
- stackvitals/community/context.py +54 -0
- stackvitals/community/report.py +250 -0
- stackvitals/connectors/__init__.py +244 -0
- stackvitals/connectors/ai_spend.py +190 -0
- stackvitals/connectors/base.py +82 -0
- stackvitals/connectors/check.py +686 -0
- stackvitals/connectors/copilot.py +104 -0
- stackvitals/connectors/discord.py +103 -0
- stackvitals/connectors/discourse.py +117 -0
- stackvitals/connectors/incident_io.py +106 -0
- stackvitals/connectors/jira.py +210 -0
- stackvitals/connectors/linear.py +140 -0
- stackvitals/connectors/pagerduty.py +96 -0
- stackvitals/connectors/slack.py +110 -0
- stackvitals/connectors/sonar.py +77 -0
- stackvitals/connectors/store.py +120 -0
- stackvitals/connectors/tracker.py +108 -0
- stackvitals/connectors/writeback.py +105 -0
- stackvitals/contribute/__init__.py +1 -0
- stackvitals/contribute/brief.py +297 -0
- stackvitals/contribute/cli.py +64 -0
- stackvitals/core/__init__.py +1 -0
- stackvitals/core/actors.py +103 -0
- stackvitals/core/agent_ledger.py +120 -0
- stackvitals/core/agreements.py +95 -0
- stackvitals/core/ai_outcomes.py +276 -0
- stackvitals/core/alerts.py +224 -0
- stackvitals/core/appdata.py +112 -0
- stackvitals/core/bucket.py +190 -0
- stackvitals/core/bugs.py +43 -0
- stackvitals/core/calendar.py +34 -0
- stackvitals/core/capex.py +57 -0
- stackvitals/core/change_risk.py +181 -0
- stackvitals/core/changes.py +133 -0
- stackvitals/core/chat.py +143 -0
- stackvitals/core/config.py +373 -0
- stackvitals/core/dataflow.py +168 -0
- stackvitals/core/decisions.py +275 -0
- stackvitals/core/delivery.py +954 -0
- stackvitals/core/delivery_peers.py +98 -0
- stackvitals/core/delivery_report.py +429 -0
- stackvitals/core/deliverycli.py +147 -0
- stackvitals/core/devlake_dora.sql +485 -0
- stackvitals/core/digest.py +333 -0
- stackvitals/core/explaincli.py +107 -0
- stackvitals/core/explore.py +296 -0
- stackvitals/core/export.py +342 -0
- stackvitals/core/exportcli.py +117 -0
- stackvitals/core/findings.py +350 -0
- stackvitals/core/health.py +94 -0
- stackvitals/core/identity.py +82 -0
- stackvitals/core/insights.py +365 -0
- stackvitals/core/insightscli.py +43 -0
- stackvitals/core/installdoc.py +69 -0
- stackvitals/core/investment.py +187 -0
- stackvitals/core/joins.py +43 -0
- stackvitals/core/llmsdoc.py +40 -0
- stackvitals/core/merge_queue.py +70 -0
- stackvitals/core/metrics.py +109 -0
- stackvitals/core/model.py +285 -0
- stackvitals/core/projectcli.py +66 -0
- stackvitals/core/propose.py +86 -0
- stackvitals/core/pulse.py +85 -0
- stackvitals/core/recorded.py +145 -0
- stackvitals/core/releases.py +39 -0
- stackvitals/core/requests.py +528 -0
- stackvitals/core/resync.py +35 -0
- stackvitals/core/schema.py +205 -0
- stackvitals/core/services.py +203 -0
- stackvitals/core/settings.py +96 -0
- stackvitals/core/sqlcli.py +111 -0
- stackvitals/core/stats.py +222 -0
- stackvitals/core/store.py +125 -0
- stackvitals/core/summary.py +104 -0
- stackvitals/core/time.py +29 -0
- stackvitals/core/tomledit.py +149 -0
- stackvitals/core/uicli.py +138 -0
- stackvitals/core/webapp.py +79 -0
- stackvitals/core/what_changed.py +76 -0
- stackvitals/core/workspace.py +194 -0
- stackvitals/deps/__init__.py +1 -0
- stackvitals/deps/action.py +299 -0
- stackvitals/deps/actions_vulns.py +89 -0
- stackvitals/deps/cli.py +77 -0
- stackvitals/deps/dossier.py +341 -0
- stackvitals/deps/evidence.py +44 -0
- stackvitals/deps/fixplan.py +40 -0
- stackvitals/deps/guarddog.py +32 -0
- stackvitals/deps/hygiene.py +47 -0
- stackvitals/deps/imports.py +113 -0
- stackvitals/deps/lockfiles.py +198 -0
- stackvitals/deps/lookalike.py +80 -0
- stackvitals/deps/reach.py +59 -0
- stackvitals/deps/release.py +110 -0
- stackvitals/deps/runtimes.py +161 -0
- stackvitals/deps/supply.py +454 -0
- stackvitals/deps/vulns.py +588 -0
- stackvitals/editors/__init__.py +40 -0
- stackvitals/editors/vscode/extension.js +101 -0
- stackvitals/editors/vscode/marks.js +92 -0
- stackvitals/editors/vscode/package.json +26 -0
- stackvitals/flow/__init__.py +1 -0
- stackvitals/flow/action.py +178 -0
- stackvitals/flow/analyze.py +418 -0
- stackvitals/flow/automate.py +72 -0
- stackvitals/flow/build.py +46 -0
- stackvitals/flow/cli.py +93 -0
- stackvitals/flow/code_hosts.py +146 -0
- stackvitals/flow/collect.py +451 -0
- stackvitals/flow/gitlab_mr.py +75 -0
- stackvitals/flow/knowledge.py +202 -0
- stackvitals/flow/peers.py +90 -0
- stackvitals/flow/preflight.py +210 -0
- stackvitals/flow/report.py +253 -0
- stackvitals/flow/rules.py +135 -0
- stackvitals/flow/store.py +108 -0
- stackvitals/flow/survival.py +84 -0
- stackvitals/flow/triage.py +62 -0
- stackvitals/mcp_server.py +670 -0
- stackvitals/portal/__init__.py +0 -0
- stackvitals/portal/action.py +205 -0
- stackvitals/portal/batch.py +80 -0
- stackvitals/portal/campaigns.py +104 -0
- stackvitals/portal/catalog.py +104 -0
- stackvitals/portal/checks.py +63 -0
- stackvitals/portal/cli.py +172 -0
- stackvitals/portal/descriptor.py +105 -0
- stackvitals/portal/export.py +43 -0
- stackvitals/portal/github.py +48 -0
- stackvitals/portal/golden.py +95 -0
- stackvitals/portal/history.py +30 -0
- stackvitals/portal/inventory.py +264 -0
- stackvitals/portal/owners.py +78 -0
- stackvitals/portal/pages.py +153 -0
- stackvitals/portal/rollup.py +32 -0
- stackvitals/portal/scorecard.py +366 -0
- stackvitals/security/__init__.py +2 -0
- stackvitals/security/probes.py +154 -0
- stackvitals/security/repo_checks.py +132 -0
- stackvitals/security/workflows.py +111 -0
- stackvitals/shell.py +107 -0
- stackvitals/site.py +51 -0
- stackvitals/web/app/LICENSES.md +428 -0
- stackvitals/web/app/boot.js +1 -0
- stackvitals/web/app/chunks/AddRepo-KRPZXWCY.js +1 -0
- stackvitals/web/app/chunks/SetupRunning-XWFQAKRZ.js +1 -0
- stackvitals/web/app/chunks/accuracy-data-OQTDXI7Y.js +1 -0
- stackvitals/web/app/chunks/agents-data-BAL6QAOF.js +11 -0
- stackvitals/web/app/chunks/chunk-24LFKFZ6.js +1 -0
- stackvitals/web/app/chunks/chunk-3G4SQNUC.js +1 -0
- stackvitals/web/app/chunks/chunk-3IXWEOIJ.js +154 -0
- stackvitals/web/app/chunks/chunk-3ROQFHPV.js +1 -0
- stackvitals/web/app/chunks/chunk-45PGAQRO.js +8 -0
- stackvitals/web/app/chunks/chunk-4H53OYLG.js +1 -0
- stackvitals/web/app/chunks/chunk-4LUI7O5P.js +1 -0
- stackvitals/web/app/chunks/chunk-4SQPQ5TB.js +1 -0
- stackvitals/web/app/chunks/chunk-4WKQTWUC.js +2 -0
- stackvitals/web/app/chunks/chunk-576YHDEK.js +8 -0
- stackvitals/web/app/chunks/chunk-6BDBXA6V.js +1 -0
- stackvitals/web/app/chunks/chunk-6RLVD2DT.js +1 -0
- stackvitals/web/app/chunks/chunk-763NH7PP.js +1 -0
- stackvitals/web/app/chunks/chunk-76WAVKUG.js +1 -0
- stackvitals/web/app/chunks/chunk-7II2BD5F.js +1 -0
- stackvitals/web/app/chunks/chunk-7TJCBOAY.js +1 -0
- stackvitals/web/app/chunks/chunk-ASYNLVOP.js +1 -0
- stackvitals/web/app/chunks/chunk-CTKDYZMG.js +1 -0
- stackvitals/web/app/chunks/chunk-CVB26NMC.js +1 -0
- stackvitals/web/app/chunks/chunk-G7NGB5UX.js +1 -0
- stackvitals/web/app/chunks/chunk-GPVLJRZD.js +1 -0
- stackvitals/web/app/chunks/chunk-GQYFN4PE.js +75 -0
- stackvitals/web/app/chunks/chunk-GT4EAKAO.js +2 -0
- stackvitals/web/app/chunks/chunk-IYMBFPCV.js +1 -0
- stackvitals/web/app/chunks/chunk-LAAGCPU3.js +1 -0
- stackvitals/web/app/chunks/chunk-MAPYGK3P.js +1 -0
- stackvitals/web/app/chunks/chunk-P5TXDD45.js +1 -0
- stackvitals/web/app/chunks/chunk-PABICGBL.js +1 -0
- stackvitals/web/app/chunks/chunk-RPXHAG6F.js +1 -0
- stackvitals/web/app/chunks/chunk-RQZPSJ2Y.js +1 -0
- stackvitals/web/app/chunks/chunk-S2ZBMEVA.js +1 -0
- stackvitals/web/app/chunks/chunk-S654BBEP.js +6 -0
- stackvitals/web/app/chunks/chunk-T7QVTNXF.js +1 -0
- stackvitals/web/app/chunks/chunk-THFUOCPC.js +273 -0
- stackvitals/web/app/chunks/chunk-TO4VVRZ7.js +1 -0
- stackvitals/web/app/chunks/chunk-VQ5YXO54.js +1 -0
- stackvitals/web/app/chunks/chunk-VWKSMFWJ.js +1 -0
- stackvitals/web/app/chunks/chunk-Y6LUXDM6.js +1 -0
- stackvitals/web/app/chunks/chunk-YTANGYYH.js +1 -0
- stackvitals/web/app/chunks/connect-KONYWYTT.js +1 -0
- stackvitals/web/app/chunks/connections-data-2DYS4UVW.js +32 -0
- stackvitals/web/app/chunks/logos-N5IINUAM.js +1 -0
- stackvitals/web/app/chunks/more-KMJMJQD3.js +10 -0
- stackvitals/web/app/chunks/more-PC6FVS3P.js +1 -0
- stackvitals/web/app/chunks/more-RCIVCUDE.js +2 -0
- stackvitals/web/app/chunks/more-ZKKRY6NO.css +1 -0
- stackvitals/web/app/chunks/sealbox-35YL4EUH.js +3 -0
- stackvitals/web/app/chunks/session-DYYTOE2K.js +1 -0
- stackvitals/web/app/chunks/settingsApply-2HRJEZYM.js +1 -0
- stackvitals/web/app/chunks/settingsReview-GX2FZQ4M.js +3 -0
- stackvitals/web/app/chunks/uPlot.esm-OIWT3AHJ.js +3 -0
- stackvitals/web/app/demo/ci/impact.json +1 -0
- stackvitals/web/app/demo/ci/quarantine.json +1 -0
- stackvitals/web/app/demo/ci/tickets.json +1 -0
- stackvitals/web/app/demo/mobile/alerts.json +1 -0
- stackvitals/web/app/demo/mobile/app.json +1 -0
- stackvitals/web/app/demo/mobile/community.json +1 -0
- stackvitals/web/app/demo/mobile/connectors.json +1 -0
- stackvitals/web/app/demo/mobile/data.json +1 -0
- stackvitals/web/app/demo/mobile/decisions.json +1 -0
- stackvitals/web/app/demo/mobile/delivery.json +1 -0
- stackvitals/web/app/demo/mobile/deps.json +1 -0
- stackvitals/web/app/demo/mobile/flow.json +1 -0
- stackvitals/web/app/demo/mobile/health.json +1 -0
- stackvitals/web/app/demo/mobile/insights.json +1 -0
- stackvitals/web/app/demo/mobile/pulse.json +1 -0
- stackvitals/web/app/demo/mobile/security.json +1 -0
- stackvitals/web/app/demo/mobile/summary/ci_jobs.jsonl +5 -0
- stackvitals/web/app/demo/mobile/summary/devlake_project_pr_metrics.jsonl +14 -0
- stackvitals/web/app/demo/mobile/summary/devlake_pull_requests.jsonl +14 -0
- stackvitals/web/app/demo/mobile/summary/manifest.json +1 -0
- stackvitals/web/app/demo/mobile/summary/prs.jsonl +19 -0
- stackvitals/web/app/demo/mobile/summary/tests.jsonl +1 -0
- stackvitals/web/app/demo/mobile/supply.json +1 -0
- stackvitals/web/app/demo/mobile/vulns.json +1 -0
- stackvitals/web/app/demo/payments-api/alerts.json +1 -0
- stackvitals/web/app/demo/payments-api/app.json +1 -0
- stackvitals/web/app/demo/payments-api/community.json +1 -0
- stackvitals/web/app/demo/payments-api/connectors.json +1 -0
- stackvitals/web/app/demo/payments-api/data.json +1 -0
- stackvitals/web/app/demo/payments-api/decisions.json +1 -0
- stackvitals/web/app/demo/payments-api/delivery.json +1 -0
- stackvitals/web/app/demo/payments-api/deps.json +1 -0
- stackvitals/web/app/demo/payments-api/flow.json +1 -0
- stackvitals/web/app/demo/payments-api/health.json +1 -0
- stackvitals/web/app/demo/payments-api/insights.json +1 -0
- stackvitals/web/app/demo/payments-api/pulse.json +1 -0
- stackvitals/web/app/demo/payments-api/security.json +1 -0
- stackvitals/web/app/demo/payments-api/summary/ci_jobs.jsonl +5 -0
- stackvitals/web/app/demo/payments-api/summary/devlake_project_pr_metrics.jsonl +14 -0
- stackvitals/web/app/demo/payments-api/summary/devlake_pull_requests.jsonl +14 -0
- stackvitals/web/app/demo/payments-api/summary/manifest.json +1 -0
- stackvitals/web/app/demo/payments-api/summary/prs.jsonl +22 -0
- stackvitals/web/app/demo/payments-api/summary/tests.jsonl +3 -0
- stackvitals/web/app/demo/payments-api/supply.json +1 -0
- stackvitals/web/app/demo/payments-api/vulns.json +1 -0
- stackvitals/web/app/demo/portal.json +1 -0
- stackvitals/web/app/demo/settings.json +1 -0
- stackvitals/web/app/demo/web-app/alerts.json +1 -0
- stackvitals/web/app/demo/web-app/app.json +1 -0
- stackvitals/web/app/demo/web-app/community.json +1 -0
- stackvitals/web/app/demo/web-app/connectors.json +1 -0
- stackvitals/web/app/demo/web-app/data.json +1 -0
- stackvitals/web/app/demo/web-app/decisions.json +1 -0
- stackvitals/web/app/demo/web-app/delivery.json +1 -0
- stackvitals/web/app/demo/web-app/deps.json +1 -0
- stackvitals/web/app/demo/web-app/flow.json +1 -0
- stackvitals/web/app/demo/web-app/health.json +1 -0
- stackvitals/web/app/demo/web-app/insights.json +1 -0
- stackvitals/web/app/demo/web-app/pulse.json +1 -0
- stackvitals/web/app/demo/web-app/security.json +1 -0
- stackvitals/web/app/demo/web-app/summary/ci_jobs.jsonl +5 -0
- stackvitals/web/app/demo/web-app/summary/devlake_project_pr_metrics.jsonl +14 -0
- stackvitals/web/app/demo/web-app/summary/devlake_pull_requests.jsonl +14 -0
- stackvitals/web/app/demo/web-app/summary/manifest.json +1 -0
- stackvitals/web/app/demo/web-app/summary/prs.jsonl +18 -0
- stackvitals/web/app/demo/web-app/summary/tests.jsonl +2 -0
- stackvitals/web/app/demo/web-app/supply.json +1 -0
- stackvitals/web/app/demo/web-app/vulns.json +1 -0
- stackvitals/web/app/fonts/plex-mono-400.woff2 +0 -0
- stackvitals/web/app/fonts/plex-sans-400.woff2 +0 -0
- stackvitals/web/app/fonts/plex-sans-600.woff2 +0 -0
- stackvitals/web/app/fonts/plex-sans-condensed-700.woff2 +0 -0
- stackvitals/web/app/help/accuracy.json +1 -0
- stackvitals/web/app/help/connectors.json +1 -0
- stackvitals/web/app/help/getting-started.json +1 -0
- stackvitals/web/app/help/index.json +1 -0
- stackvitals/web/app/help/modules.json +1 -0
- stackvitals/web/app/help/privacy-and-security.json +1 -0
- stackvitals/web/app/help/reference.json +1 -0
- stackvitals/web/app/main.css +1 -0
- stackvitals/web/app/main.js +1 -0
- stackvitals/web/app/pages/about.css +1 -0
- stackvitals/web/app/pages/about.js +1 -0
- stackvitals/web/app/pages/activity.css +1 -0
- stackvitals/web/app/pages/activity.js +1 -0
- stackvitals/web/app/pages/agents.css +1 -0
- stackvitals/web/app/pages/agents.js +2 -0
- stackvitals/web/app/pages/ci.css +1 -0
- stackvitals/web/app/pages/ci.js +1 -0
- stackvitals/web/app/pages/community.css +1 -0
- stackvitals/web/app/pages/community.js +1 -0
- stackvitals/web/app/pages/connections.css +1 -0
- stackvitals/web/app/pages/connections.js +6 -0
- stackvitals/web/app/pages/delivery.css +1 -0
- stackvitals/web/app/pages/delivery.js +45 -0
- stackvitals/web/app/pages/deps.css +1 -0
- stackvitals/web/app/pages/deps.js +7 -0
- stackvitals/web/app/pages/explore.css +1 -0
- stackvitals/web/app/pages/explore.js +7 -0
- stackvitals/web/app/pages/health.css +1 -0
- stackvitals/web/app/pages/health.js +1 -0
- stackvitals/web/app/pages/help.css +1 -0
- stackvitals/web/app/pages/help.js +6 -0
- stackvitals/web/app/pages/insights.css +1 -0
- stackvitals/web/app/pages/insights.js +1 -0
- stackvitals/web/app/pages/investment.css +1 -0
- stackvitals/web/app/pages/investment.js +3 -0
- stackvitals/web/app/pages/overview.css +1 -0
- stackvitals/web/app/pages/overview.js +1 -0
- stackvitals/web/app/pages/portal.css +1 -0
- stackvitals/web/app/pages/portal.js +51 -0
- stackvitals/web/app/pages/prs.css +1 -0
- stackvitals/web/app/pages/prs.js +4 -0
- stackvitals/web/app/pages/settings.css +1 -0
- stackvitals/web/app/pages/settings.js +1 -0
- stackvitals/web/app/pages/setup.css +1 -0
- stackvitals/web/app/pages/setup.js +2 -0
- stackvitals/web/app/pages/standing.css +1 -0
- stackvitals/web/app/pages/standing.js +1 -0
- stackvitals/web/app/pages/welcome-sheet.js +1 -0
- stackvitals/web/app/pages/welcome.js +1 -0
- stackvitals/web/app/settings-workflow.json +1 -0
- stackvitals/web/index.html +34 -0
- stackvitals/web/site/index.html +108 -0
- stackvitals/web/site/integrations.html +15 -0
- stackvitals/web/site/setup.html +15 -0
- stackvitals/web/site/site.css +68 -0
- stackvitals-0.1.0.dist-info/METADATA +134 -0
- stackvitals-0.1.0.dist-info/RECORD +465 -0
- stackvitals-0.1.0.dist-info/WHEEL +4 -0
- stackvitals-0.1.0.dist-info/entry_points.txt +3 -0
- stackvitals-0.1.0.dist-info/licenses/LICENSE +202 -0
- stackvitals-0.1.0.dist-info/licenses/NOTICE +16 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"schema":1,"generated":"NOW-58m","facts":{"first_answer_hours":4.1,"answered_1d_share":0.88,"newcomer_answered_share":0.8,"newcomer_return_rate":0.38},"score":{"score":82,"group":"TypeScript, all sizes","repos":1204,"built_at":"NOW-6d","facts":[{"key":"first_answer_hours","name":"First answer to outside PRs","kind":"hours","you":4.1,"typical":7,"better_than":88},{"key":"newcomer_answered_share","name":"Newcomers answered within 2 weeks","kind":"share","you":0.8,"typical":0.71,"better_than":76}],"left_out":["newcomer_return_rate"]},"has_bench":true,"funnel":{"newcomers":12,"judged":8,"returned":3,"return_rate":0.38,"regulars":6,"maintainers":5},"answers":{"days":90,"issues":{"items":40,"km":{"median":4.1,"low":2.9,"high":6.1,"at_least":null,"answered":34,"waiting":0,"too_few":false,"closed_unanswered":1},"responders":4},"discussions":null,"left_out":null},"waiting":[],"waiting_total":0,"stars":{"weeks":[["NOW-80d",6],["NOW-73d",5],["NOW-66d",8],["NOW-59d",7],["NOW-52d",9],["NOW-45d",6],["NOW-38d",7],["NOW-31d",8],["NOW-24d",10],["NOW-17d",9],["NOW-10d",11],["NOW-3d",12]],"stars":860,"gained_12w":98,"growth_12w":0.129},"traffic":{"days":14,"since":"NOW-14d","views":[["NOW-14d",20,12],["NOW-13d",49,12],["NOW-12d",37,12],["NOW-11d",26,12],["NOW-10d",54,12],["NOW-9d",43,12],["NOW-8d",31,12],["NOW-7d",20,12],["NOW-6d",49,12],["NOW-5d",37,12],["NOW-4d",26,12],["NOW-3d",54,12],["NOW-2d",43,12],["NOW-1d",31,12]],"clones":[["NOW-14d",5,3],["NOW-13d",11,3],["NOW-12d",8,3],["NOW-11d",6,3],["NOW-10d",12,3],["NOW-9d",10,3],["NOW-8d",7,3],["NOW-7d",5,3],["NOW-6d",11,3],["NOW-5d",8,3],["NOW-4d",6,3],["NOW-3d",12,3],["NOW-2d",10,3],["NOW-1d",7,3]],"views_total":560,"visitors_total":168,"clones_total":126,"referrers":[["github.com",300],["google.com",90]],"referrers_day":"NOW-1d"},"quarters":[{"quarter":"2026 Q1","items":30,"median_hours":5.3,"within_1d":0.78,"newcomers":8},{"quarter":"2026 Q2","items":34,"median_hours":4.9,"within_1d":0.81,"newcomers":10},{"quarter":"2026 Q3","items":38,"median_hours":4.5,"within_1d":0.84,"newcomers":12},{"quarter":"2026 Q4","items":42,"median_hours":4.1,"within_1d":0.88,"newcomers":14}],"cohorts":{"months":[{"month":"MON-5","newcomers":4,"back_by_90d":1,"back_90_180d":1},{"month":"MON-4","newcomers":7,"back_by_90d":2,"back_90_180d":null},{"month":"MON-3","newcomers":5,"back_by_90d":1,"back_90_180d":null},{"month":"MON-2","newcomers":8,"back_by_90d":null,"back_90_180d":null},{"month":"MON-1","newcomers":6,"back_by_90d":null,"back_90_180d":null},{"month":"MON-0","newcomers":4,"back_by_90d":null,"back_90_180d":null}]},"dependency":{"days":180,"bus_factor":4,"top_share":0.22,"people":17,"merged":326,"peers":{"bus_factor":{"typical":3,"low":2,"high":5},"top_share":{"typical":0.3,"low":0.2,"high":0.45}}},"tenure":{"days":90,"newcomers":{"n":6,"median_h":6.6,"answered_1d_share":0.73},"regulars":{"n":40,"median_h":3.3,"answered_1d_share":0.93}},"orgs":null,"changes":[{"metric":"community.first_answer","label":"first answer to outside contributors","now":4.1,"base":4.5,"unit":"h","note":null,"changed":false,"direction":null,"detectable":1.8}],"context":{"governance":false,"security_policy":true,"code_of_conduct":null,"funding":[],"discussions":false,"contributing":true,"response_policy":{"said":"within 2 working days","hours":48},"maintainers_listed":null,"code_owners":5,"stated":null},"forum":null,"chat":null,"lever":{"newcomers":48213,"repos":3912,"by_answer":[{"bucket":"within 1 day","newcomers":21004,"returned":0.312},{"bucket":"1-3 days","newcomers":9120,"returned":0.268},{"bucket":"3-14 days","newcomers":8210,"returned":0.214},{"bucket":"over 14 days","newcomers":4410,"returned":0.171},{"bucket":"no answer","newcomers":5469,"returned":0.094}],"by_outcome":[{"outcome":"merged","newcomers":30120,"returned":0.331},{"outcome":"closed unmerged","newcomers":12544,"returned":0.142},{"outcome":"still open","newcomers":5549,"returned":0.088}]}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"connectors":{"linear":{"name":"Linear","as_of":"NOW-3h","key_expires":null,"scope":null,"expiring":false,"error":null,"rows":{"issue":230,"sprint":6},"complete":false},"copilot":{"name":"Copilot","as_of":"NOW-3h","key_expires":null,"scope":null,"expiring":false,"error":null,"rows":{"org_day":58},"complete":true},"sonar":{"name":"SonarQube","as_of":"NOW-58m","key_expires":null,"scope":"acme_web-app","expiring":false,"error":null,"rows":{"quality":30},"complete":true,"check":{"ok":true,"as":null,"detail":"Read the quality gate of acme_web-app on SonarCloud: OK.","checked_at":"NOW-2d","fix":null}}}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"schema":1,"window_days":30,"generated":"NOW-58m","runs":2626,"rerun_share":0.05,"infra_events":1,"queue":{"median_s":8,"p95_s":41},"minutes":{"linux":4210,"windows":0,"macos":0,"other":0},"pushes":{"pushes":655,"median_s":504,"p90_s":798,"first_try_share":0.91,"first_try_range":[0.88,0.94],"median_range_s":[462,554],"not_first_try":[["7c41e20","main",[4810000]],["7c70fd9","main",[4810037]],["7ca0192","main",[4810074]],["7ccf34b","feature/x-3",[4810111]],["7cfe504","main",[4810148]],["7d2d6bd","main",[4810185]],["7d5c876","main",[4810222]],["7d8ba2f","feature/x-7",[4810259]],["7dbabe8","main",[4810296]],["7de9da1","main",[4810333]],["7e18f5a","main",[4810370]],["7e48113","feature/x-11",[4810407]],["7e772cc","main",[4810444]],["7ea6485","main",[4810481]],["7ed563e","main",[4810518]]],"not_first_try_total":59},"weekly":[{"week":"NOW-80d","job_runs":560,"flakes":28,"flake_share":5,"push_median_s":612,"first_try_share":0.85},{"week":"NOW-73d","job_runs":575,"flakes":29,"flake_share":5,"push_median_s":588,"first_try_share":0.86},{"week":"NOW-66d","job_runs":590,"flakes":35,"flake_share":6,"push_median_s":600,"first_try_share":0.84},{"week":"NOW-59d","job_runs":600,"flakes":24,"flake_share":4,"push_median_s":576,"first_try_share":0.87},{"week":"NOW-52d","job_runs":612,"flakes":24,"flake_share":4,"push_median_s":564,"first_try_share":0.86},{"week":"NOW-45d","job_runs":608,"flakes":24,"flake_share":4,"push_median_s":558,"first_try_share":0.88},{"week":"NOW-38d","job_runs":620,"flakes":19,"flake_share":3,"push_median_s":546,"first_try_share":0.87},{"week":"NOW-31d","job_runs":633,"flakes":19,"flake_share":3,"push_median_s":540,"first_try_share":0.88},{"week":"NOW-24d","job_runs":640,"flakes":19,"flake_share":3,"push_median_s":528,"first_try_share":0.89},{"week":"NOW-17d","job_runs":655,"flakes":20,"flake_share":3,"push_median_s":546,"first_try_share":0.87},{"week":"NOW-10d","job_runs":661,"flakes":13,"flake_share":2,"push_median_s":516,"first_try_share":0.9},{"week":"NOW-3d","job_runs":670,"flakes":13,"flake_share":2,"push_median_s":504,"first_try_share":0.91}],"changes":[{"metric":"ci.first_try_green","label":"pushes green on the first try","now":0.91,"base":0.88,"unit":"share","note":null,"changed":true,"direction":"up","detectable":0.05},{"metric":"ci.flaky_runs","label":"flaky job runs","now":13,"base":19,"unit":"count","note":null,"changed":false,"direction":null,"detectable":2.1}],"tests":[{"id":"checkout.spec.ts > applies coupon","suite":"test-results","workflow":".github/workflows/ci.yml","message":"Timed out 5000ms waiting for expect(locator).toBeVisible()","owners":["@acme/core"],"runs":140,"failures":5,"flake_events":5,"flake_rate":0.0357,"rate_low":0,"rate_high":0.0857,"state":"flaky","since":"NOW-24d","last_flake":"NOW-1d","monitors":["pass_on_retry"],"labels":["timing"],"retry_minutes":186,"prs_affected":[1800,1807,1814,1821,1828],"evidence":[{"run":11800000,"att":2,"kind":"retry"},{"run":11800911,"att":2,"kind":"flip"},{"run":11801822,"att":2,"kind":"retry"},{"run":11802733,"att":2,"kind":"flip"}],"decision":null,"flake":"timing","began":{"first":"NOW-24d","runs_before":61,"runs_after":79,"flakes":5,"p":0.0012,"clear":true,"landed":["5e1a9c3d41c2e09b7","5e30784d41c2e09b7"]},"variants":{"node 20":4,"node 22":1}},{"id":"search.test.tsx > debounces input","suite":"test-results","workflow":".github/workflows/ci.yml","message":null,"owners":["@acme/core"],"runs":140,"failures":2,"flake_events":2,"flake_rate":0.0143,"rate_low":0,"rate_high":0.0643,"state":"suspect","since":"NOW-7d","last_flake":"NOW-1d","monitors":["pass_on_retry"],"labels":[],"retry_minutes":54,"prs_affected":[1800,1807],"evidence":[{"run":11800000,"att":2,"kind":"retry"},{"run":11800911,"att":2,"kind":"flip"}],"decision":{"verb":"mute","kind":"test","id":"search.test.tsx > debounces input","by":"jules","until":"NOW+5d","reason":"rewriting the search box this sprint","at":"NOW-9d"},"flake":"timing","began":{"first":"NOW-7d","runs_before":4,"runs_after":136,"flakes":2,"p":0.41,"clear":false,"landed":[]},"muted_until":"NOW+5d","variants":{"node 20":2,"node 22":0}},{"id":"web-app/smoke::boots","suite":"test-results","workflow":".github/workflows/ci.yml","runs":96,"failures":0,"flake_events":0,"flake_rate":0,"rate_low":0,"rate_high":0.03,"state":"ok"}],"jobs":[{"workflow":".github/workflows/playwright.yml","job":"webkit","top_step":"Run tests","median_s":384,"p95_s":538,"trend":[["NOW-10d",346],["NOW-9d",376],["NOW-8d",407],["NOW-7d",361],["NOW-6d",392],["NOW-5d",346],["NOW-4d",376],["NOW-3d",407],["NOW-2d",361],["NOW-1d",392]],"runs":150,"failures":3,"flake_events":3,"flake_rate":0.02,"rate_low":0,"rate_high":0.07,"state":"flaky","since":"NOW-20d","last_flake":"NOW-1d","monitors":["pass_on_retry"],"labels":["timing"],"retry_minutes":132,"prs_affected":[1800,1807,1814],"evidence":[{"run":11800000,"att":2,"kind":"retry"},{"run":11800911,"att":2,"kind":"flip"},{"run":11801822,"att":2,"kind":"retry"}],"decision":null,"flake":"network","began":{"first":"NOW-20d","runs_before":38,"runs_after":112,"flakes":3,"p":0.0012,"clear":true,"landed":["5e20db1d41c2e09b7","5e36b72d41c2e09b7"]},"flake_steps":["Run tests"],"variants":{}},{"workflow":".github/workflows/playwright.yml","job":"chromium","runs":120,"failures":0,"flake_events":0,"flake_rate":0,"rate_low":0,"rate_high":0.03,"state":"ok","median_s":354,"p95_s":472,"retry_minutes":0,"trend":[["NOW-10d",326],["NOW-9d",361],["NOW-8d",349],["NOW-7d",337],["NOW-6d",326],["NOW-5d",361],["NOW-4d",349],["NOW-3d",337],["NOW-2d",326],["NOW-1d",361]]},{"workflow":".github/workflows/build.yml","job":"next","runs":120,"failures":0,"flake_events":0,"flake_rate":0,"rate_low":0,"rate_high":0.03,"state":"ok","median_s":186,"p95_s":248,"retry_minutes":0,"trend":[["NOW-10d",171],["NOW-9d",190],["NOW-8d",184],["NOW-7d",177],["NOW-6d",171],["NOW-5d",190],["NOW-4d",184],["NOW-3d",177],["NOW-2d",171],["NOW-1d",190]]},{"workflow":".github/workflows/unit.yml","job":"vitest","runs":120,"failures":0,"flake_events":0,"flake_rate":0,"rate_low":0,"rate_high":0.03,"state":"ok","median_s":132,"p95_s":176,"retry_minutes":0,"trend":[["NOW-10d",121],["NOW-9d",135],["NOW-8d",130],["NOW-7d",126],["NOW-6d",121],["NOW-5d",135],["NOW-4d",130],["NOW-3d",126],["NOW-2d",121],["NOW-1d",135]]},{"workflow":".github/workflows/lint.yml","job":"eslint","runs":120,"failures":0,"flake_events":0,"flake_rate":0,"rate_low":0,"rate_high":0.03,"state":"ok","median_s":54,"p95_s":72,"retry_minutes":0,"trend":[["NOW-10d",50],["NOW-9d",55],["NOW-8d",53],["NOW-7d",51],["NOW-6d",50],["NOW-5d",55],["NOW-4d",53],["NOW-3d",51],["NOW-2d",50],["NOW-1d",55]]}],"failure_groups":[{"id":"a1","type":"TimeoutError","where":"checkout.spec.ts > applies coupon","message":"Timed out 5000ms waiting for expect(locator).toBeVisible()","failures":5,"tests":2,"runs":5,"first":"NOW-24d","last":"NOW-1d","prompt":"Investigate a recurring CI failure in acme/web-app: checkout.spec.ts > applies coupon fails with a timeout, then passes on a re-run.","top_tests":["checkout.spec.ts > applies coupon","search.test.tsx > debounces input"]}],"slow_tests":[{"id":"checkout.spec.ts > applies coupon","median_ms":2400,"p95_ms":6100,"samples":140,"slower":{"pct":18},"trend":[["NOW-8d",2000],["NOW-7d",2060],["NOW-6d",2120],["NOW-5d",2180],["NOW-4d",2240],["NOW-3d",2300],["NOW-2d",2360],["NOW-1d",2420]]},{"id":"search.test.tsx > debounces input","median_ms":1700,"p95_ms":4900,"samples":140,"slower":null,"trend":[["NOW-8d",2000],["NOW-7d",2060],["NOW-6d",2120],["NOW-5d",2180],["NOW-4d",2240],["NOW-3d",2300],["NOW-2d",2360],["NOW-1d",2420]]}],"new_tests":[{"id":"web-app/refunds::partial","suite":"test-results","first":"NOW-5d","runs":14,"failures":0,"flake_events":0,"state":"ok"}],"skipped_tests":[{"id":"web-app/legacy::export_csv","suite":"test-results","suites":1,"since":"NOW-40d","new":false,"days":40}],"coverage":{"latest":{"pct":0.74,"covered":7410,"lines":10014,"at":"NOW-3h"},"change":0.012,"trend":[["NOW-30d",0.728],["NOW-29d",0.7314],["NOW-28d",0.7298],["NOW-27d",0.7332],["NOW-26d",0.7316],["NOW-25d",0.73],["NOW-24d",0.7334],["NOW-23d",0.7318],["NOW-22d",0.7352],["NOW-21d",0.7336],["NOW-20d",0.732],["NOW-19d",0.7354],["NOW-18d",0.7338],["NOW-17d",0.7372],["NOW-16d",0.7356],["NOW-15d",0.734],["NOW-14d",0.7374],["NOW-13d",0.7358],["NOW-12d",0.7392],["NOW-11d",0.7376],["NOW-10d",0.736],["NOW-9d",0.7394],["NOW-8d",0.7378],["NOW-7d",0.7412],["NOW-6d",0.7396],["NOW-5d",0.738],["NOW-4d",0.7414],["NOW-3d",0.7398],["NOW-2d",0.7432],["NOW-1d",0.7416]],"prs":[{"pr":3307,"pct":0.92,"covered":46,"lines":50,"missed":{"internal/refund/idem.go":[41,42,77,78]},"at":"NOW-6h"},{"pr":3320,"pct":0,"covered":0,"lines":0,"missed":{},"at":"NOW-2d"}]},"has_test_reports":true,"benchmark":{"group":"TypeScript, 1k-10k stars","repos":412,"metrics":[{"name":"Time from push to all checks done","kind":"time","you":612,"typical":540,"place":"slower than about 58%"},{"name":"Pushes green on the first try","kind":"share","you":0.81,"typical":0.86,"place":"below about 62%"}]},"test_outages":2,"pr_edit_workflows":[".github/workflows/pr-title.yml"],"cost":{"days":30,"private":true,"minutes":4210,"usd":33.68,"private_usd":33.68,"rerun_minutes":253,"rerun_usd":2.02,"self_hosted_minutes":0,"by_runner":{"linux":4210},"workflows":[{"workflow":"CI","minutes":3452,"usd":27.62},{"workflow":"StackVitals","minutes":168,"usd":1.35},{"workflow":"Release","minutes":589,"usd":4.72}],"jobs":[{"workflow":"CI","job":"webkit","minutes":960,"usd":7.68},{"workflow":"CI","job":"chromium","minutes":708,"usd":5.66},{"workflow":"CI","job":"next","minutes":372,"usd":2.98},{"workflow":"CI","job":"vitest","minutes":264,"usd":2.11},{"workflow":"CI","job":"eslint","minutes":108,"usd":0.86}],"prices_read":"2026-10-29","tests":[{"id":"checkout.spec.ts > applies coupon","suite":"test-results","minutes":47.5,"usd":0.38,"flakes":5,"prs":5}]},"impact":{"prs":118,"failures":23,"caught":21,"recall":0.913,"skipped_share":0.64}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"state":{"test:search.test.tsx > debounces input":{"verb":"mute","kind":"test","id":"search.test.tsx > debounces input","by":"jules","until":"NOW+5d","reason":"rewriting the search box this sprint","at":"NOW-9d"},"finding:red_ci":{"verb":"snooze","kind":"finding","id":"red_ci","by":"tomasz","until":"NOW+9d","reason":"release week","at":"NOW-5d"}},"log":[{"verb":"mute","kind":"test","id":"search.test.tsx > debounces input","by":"jules","at":"NOW-9d","until":"NOW+5d","reason":"rewriting the search box this sprint","source":"comment"},{"verb":"snooze","kind":"finding","id":"red_ci","by":"tomasz","at":"NOW-5d","until":"NOW+9d","reason":"release week","source":"app"}]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"schema":1,"generated":"NOW-58m","window_days":90,"since":"NOW-90d","prs":170,"agreements":{"rules":{"review_within_hours":24,"max_pr_lines":400},"labels":{"review_within_hours":"First review within 24 h","max_pr_lines":"PRs under 400 lines"},"window_days":14,"merged":26,"counts":{"review_within_hours":2,"max_pr_lines":2},"exceptions":[{"pr":3307,"rule":"review_within_hours","value":120,"limit":24,"open":true,"at":"NOW-58m"},{"pr":3319,"rule":"review_within_hours","value":31.5,"limit":24,"open":false,"at":"NOW-6d"},{"pr":3300,"rule":"max_pr_lines","value":812,"limit":400,"open":false,"at":"NOW-4d"},{"pr":3296,"rule":"max_pr_lines","value":455,"limit":400,"open":false,"at":"NOW-10d"}],"weekly":{"review_within_hours":[["NOW-80d",0],["NOW-73d",1],["NOW-66d",0],["NOW-59d",1],["NOW-52d",1],["NOW-45d",0],["NOW-38d",1],["NOW-31d",1],["NOW-24d",0],["NOW-17d",1],["NOW-10d",0],["NOW-3d",0]],"max_pr_lines":[["NOW-80d",0],["NOW-73d",1],["NOW-66d",0],["NOW-59d",1],["NOW-52d",1],["NOW-45d",0],["NOW-38d",1],["NOW-31d",1],["NOW-24d",0],["NOW-17d",1],["NOW-10d",0],["NOW-3d",0]]}},"deploy_source":"deployments api","deploy_confidence":"high","incident_source":"GitHub issues, reverts and hotfixes, and Linear","deploy_check":{"source":"deployments api","deployments":267,"considered":[{"source":"deployments api","found":267,"used":true},{"source":"releases","found":6,"used":false},{"source":"deploy workflows","found":271,"used":false}],"order_reason":null,"workflows":[{"name":"CI","path":".github/workflows/ci.yml","counted":0,"skipped":0,"kind":null,"why":"its name doesn't match deploy_workflow","used":false},{"name":"StackVitals","path":".github/workflows/stackvitals.yml","counted":0,"skipped":0,"kind":null,"why":"its name doesn't match deploy_workflow","used":false}],"settings":{"source":"auto","deploy_workflow":"(?i)deploy|release|publish","production":["production","prod","live"]},"releases":{"published":6,"prereleases_skipped":1}},"deployments":[{"id":"dep-0","name":"production","sha":"9a3c1f0","finished":"NOW-11d"},{"id":"dep-1","name":"production","sha":"9a574c3","finished":"NOW-10d"},{"id":"dep-2","name":"production","sha":"9a72796","finished":"NOW-9d"},{"id":"dep-3","name":"production","sha":"9a8da69","finished":"NOW-8d"},{"id":"dep-4","name":"production","sha":"9aa8d3c","finished":"NOW-7d"},{"id":"dep-5","name":"production","sha":"9ac400f","finished":"NOW-6d"},{"id":"dep-6","name":"production","sha":"9adf2e2","finished":"NOW-5d"},{"id":"dep-7","name":"production","sha":"9afa5b5","finished":"NOW-4d"},{"id":"dep-8","name":"production","sha":"9b15888","finished":"NOW-3d"},{"id":"dep-9","name":"production","sha":"9b30b5b","finished":"NOW-2d"}],"phases":{"coding":{"n":170,"enough":true,"p50_h":4.5,"p75_h":11.2,"low_h":9.5,"high_h":13.4,"linearb_band":"elite"},"pickup":{"n":146,"enough":true,"p50_h":1,"p75_h":2.2,"low_h":1.9,"high_h":2.6,"linearb_band":"elite"},"review":{"n":143,"enough":true,"p50_h":3.8,"p75_h":7.6,"low_h":6.5,"high_h":9.1,"linearb_band":"elite"},"approve":{"n":143,"enough":true,"p50_h":2.3,"p75_h":5.3,"low_h":4.5,"high_h":6.4,"linearb_band":"elite"},"merge":{"n":166,"enough":true,"p50_h":0.4,"p75_h":0.8,"low_h":0.7,"high_h":1,"linearb_band":"elite"},"deploy":{"n":164,"enough":true,"p50_h":0.6,"p75_h":1.1,"low_h":0.9,"high_h":1.3,"linearb_band":"elite"},"cycle":{"n":164,"enough":true,"p50_h":10.3,"p75_h":22.9,"low_h":19.5,"high_h":27.5,"linearb_band":"elite"},"cycle_to_merge":{"n":170,"enough":true,"p50_h":5.1,"p75_h":10.6,"low_h":9,"high_h":12.7,"linearb_band":"elite"}},"outliers":{"over_60_days":1,"over_p98":2},"dora":{"report":"2023","deployments":267,"deployment_days":63,"deployment_days_per_week":4.8,"deployment_days_per_month":21,"frequency_tier":"elite","monthly":[{"month":"MON-5","deployments":71},{"month":"MON-4","deployments":78},{"month":"MON-3","deployments":84},{"month":"MON-2","deployments":80},{"month":"MON-1","deployments":91},{"month":"MON-0","deployments":96}],"lead_time_hours":13.8,"lead_time_n":164,"lead_time_tier":"elite","lead_time_range_hours":[11.7,16.6],"lead_time_tier_span":null,"change_failure_rate":0.05,"failed_deployments":13,"cfr_tier":"elite","cfr_range":[0.02,0.09],"cfr_tier_span":null,"cfr_fix_chain":null,"linkage":{"reverts":10,"fix_chain_found":9,"disagree":1,"never_shipped":0},"recovery_hours":1.2,"recovery_n":13,"recovery_tier":"elite","recovery_range_hours":[0.8,1.8],"recovery_tier_span":null,"evidence":{"deployments":[["9a3c1f0","NOW-90d"],["9a574c3","NOW-90d"],["9a72796","NOW-90d"],["9a8da69","NOW-89d"],["9aa8d3c","NOW-89d"],["9ac400f","NOW-89d"],["9adf2e2","NOW-88d"],["9afa5b5","NOW-88d"],["9b15888","NOW-88d"],["9b30b5b","NOW-87d"],["9b4be2e","NOW-87d"],["9b67101","NOW-87d"],["9b823d4","NOW-86d"],["9b9d6a7","NOW-86d"],["9bb897a","NOW-86d"],["9bd3c4d","NOW-85d"],["9beef20","NOW-85d"],["9c0a1f3","NOW-85d"],["9c254c6","NOW-84d"],["9c40799","NOW-84d"],["9c5ba6c","NOW-84d"],["9c76d3f","NOW-83d"],["9c92012","NOW-83d"],["9cad2e5","NOW-83d"],["9cc85b8","NOW-82d"],["9ce388b","NOW-82d"],["9cfeb5e","NOW-82d"],["9d19e31","NOW-81d"],["9d35104","NOW-81d"],["9d503d7","NOW-81d"],["9d6b6aa","NOW-80d"],["9d8697d","NOW-80d"],["9da1c50","NOW-80d"],["9dbcf23","NOW-79d"],["9dd81f6","NOW-79d"],["9df34c9","NOW-79d"],["9e0e79c","NOW-78d"],["9e29a6f","NOW-78d"],["9e44d42","NOW-78d"],["9e60015","NOW-77d"],["9e7b2e8","NOW-77d"],["9e965bb","NOW-77d"],["9eb188e","NOW-76d"],["9eccb61","NOW-76d"],["9ee7e34","NOW-76d"],["9f03107","NOW-75d"],["9f1e3da","NOW-75d"],["9f396ad","NOW-75d"],["9f54980","NOW-74d"],["9f6fc53","NOW-74d"],["9f8af26","NOW-74d"],["9fa61f9","NOW-73d"],["9fc14cc","NOW-73d"],["9fdc79f","NOW-73d"],["9ff7a72","NOW-72d"],["a012d45","NOW-72d"],["a02e018","NOW-72d"],["a0492eb","NOW-71d"],["a0645be","NOW-71d"],["a07f891","NOW-71d"],["a09ab64","NOW-70d"],["a0b5e37","NOW-70d"],["a0d110a","NOW-70d"],["a0ec3dd","NOW-69d"],["a1076b0","NOW-69d"],["a122983","NOW-69d"],["a13dc56","NOW-68d"],["a158f29","NOW-68d"],["a1741fc","NOW-68d"],["a18f4cf","NOW-67d"],["a1aa7a2","NOW-67d"],["a1c5a75","NOW-67d"],["a1e0d48","NOW-66d"],["a1fc01b","NOW-66d"],["a2172ee","NOW-66d"],["a2325c1","NOW-65d"],["a24d894","NOW-65d"],["a268b67","NOW-65d"],["a283e3a","NOW-64d"],["a29f10d","NOW-64d"],["a2ba3e0","NOW-64d"],["a2d56b3","NOW-63d"],["a2f0986","NOW-63d"],["a30bc59","NOW-63d"],["a326f2c","NOW-62d"],["a3421ff","NOW-62d"],["a35d4d2","NOW-62d"],["a3787a5","NOW-61d"],["a393a78","NOW-61d"],["a3aed4b","NOW-60d"],["a3ca01e","NOW-60d"],["a3e52f1","NOW-60d"],["a4005c4","NOW-59d"],["a41b897","NOW-59d"],["a436b6a","NOW-59d"],["a451e3d","NOW-58d"],["a46d110","NOW-58d"],["a4883e3","NOW-58d"],["a4a36b6","NOW-57d"],["a4be989","NOW-57d"],["a4d9c5c","NOW-57d"],["a4f4f2f","NOW-56d"],["a510202","NOW-56d"],["a52b4d5","NOW-56d"],["a5467a8","NOW-55d"],["a561a7b","NOW-55d"],["a57cd4e","NOW-55d"],["a598021","NOW-54d"],["a5b32f4","NOW-54d"],["a5ce5c7","NOW-54d"],["a5e989a","NOW-53d"],["a604b6d","NOW-53d"],["a61fe40","NOW-53d"],["a63b113","NOW-52d"],["a6563e6","NOW-52d"],["a6716b9","NOW-52d"],["a68c98c","NOW-51d"],["a6a7c5f","NOW-51d"],["a6c2f32","NOW-51d"],["a6de205","NOW-50d"],["a6f94d8","NOW-50d"],["a7147ab","NOW-50d"],["a72fa7e","NOW-49d"],["a74ad51","NOW-49d"],["a766024","NOW-49d"],["a7812f7","NOW-48d"],["a79c5ca","NOW-48d"],["a7b789d","NOW-48d"],["a7d2b70","NOW-47d"],["a7ede43","NOW-47d"],["a809116","NOW-47d"],["a8243e9","NOW-46d"],["a83f6bc","NOW-46d"],["a85a98f","NOW-46d"],["a875c62","NOW-45d"],["a890f35","NOW-45d"],["a8ac208","NOW-45d"],["a8c74db","NOW-44d"],["a8e27ae","NOW-44d"],["a8fda81","NOW-44d"],["a918d54","NOW-43d"],["a934027","NOW-43d"],["a94f2fa","NOW-43d"],["a96a5cd","NOW-42d"],["a9858a0","NOW-42d"],["a9a0b73","NOW-42d"],["a9bbe46","NOW-41d"],["a9d7119","NOW-41d"],["a9f23ec","NOW-41d"],["aa0d6bf","NOW-40d"],["aa28992","NOW-40d"],["aa43c65","NOW-40d"],["aa5ef38","NOW-39d"],["aa7a20b","NOW-39d"],["aa954de","NOW-39d"],["aab07b1","NOW-38d"],["aacba84","NOW-38d"],["aae6d57","NOW-38d"],["ab0202a","NOW-37d"],["ab1d2fd","NOW-37d"],["ab385d0","NOW-37d"],["ab538a3","NOW-36d"],["ab6eb76","NOW-36d"],["ab89e49","NOW-36d"],["aba511c","NOW-35d"],["abc03ef","NOW-35d"],["abdb6c2","NOW-35d"],["abf6995","NOW-34d"],["ac11c68","NOW-34d"],["ac2cf3b","NOW-34d"],["ac4820e","NOW-33d"],["ac634e1","NOW-33d"],["ac7e7b4","NOW-33d"],["ac99a87","NOW-32d"],["acb4d5a","NOW-32d"],["acd002d","NOW-32d"],["aceb300","NOW-31d"],["ad065d3","NOW-31d"],["ad218a6","NOW-30d"],["ad3cb79","NOW-30d"],["ad57e4c","NOW-30d"],["ad7311f","NOW-29d"],["ad8e3f2","NOW-29d"],["ada96c5","NOW-29d"],["adc4998","NOW-28d"],["addfc6b","NOW-28d"],["adfaf3e","NOW-28d"],["ae16211","NOW-27d"],["ae314e4","NOW-27d"],["ae4c7b7","NOW-27d"],["ae67a8a","NOW-26d"],["ae82d5d","NOW-26d"],["ae9e030","NOW-26d"],["aeb9303","NOW-25d"],["aed45d6","NOW-25d"],["aeef8a9","NOW-25d"],["af0ab7c","NOW-24d"],["af25e4f","NOW-24d"],["af41122","NOW-24d"],["af5c3f5","NOW-23d"],["af776c8","NOW-23d"],["af9299b","NOW-23d"],["afadc6e","NOW-22d"],["afc8f41","NOW-22d"],["afe4214","NOW-22d"],["afff4e7","NOW-21d"],["b01a7ba","NOW-21d"],["b035a8d","NOW-21d"],["b050d60","NOW-20d"],["b06c033","NOW-20d"],["b087306","NOW-20d"],["b0a25d9","NOW-19d"],["b0bd8ac","NOW-19d"],["b0d8b7f","NOW-19d"],["b0f3e52","NOW-18d"],["b10f125","NOW-18d"],["b12a3f8","NOW-18d"],["b1456cb","NOW-17d"],["b16099e","NOW-17d"],["b17bc71","NOW-17d"],["b196f44","NOW-16d"],["b1b2217","NOW-16d"],["b1cd4ea","NOW-16d"],["b1e87bd","NOW-15d"],["b203a90","NOW-15d"],["b21ed63","NOW-15d"],["b23a036","NOW-14d"],["b255309","NOW-14d"],["b2705dc","NOW-14d"],["b28b8af","NOW-13d"],["b2a6b82","NOW-13d"],["b2c1e55","NOW-13d"],["b2dd128","NOW-12d"],["b2f83fb","NOW-12d"],["b3136ce","NOW-12d"],["b32e9a1","NOW-11d"],["b349c74","NOW-11d"],["b364f47","NOW-11d"],["b38021a","NOW-10d"],["b39b4ed","NOW-10d"],["b3b67c0","NOW-10d"],["b3d1a93","NOW-9d"],["b3ecd66","NOW-9d"],["b408039","NOW-9d"],["b42330c","NOW-8d"],["b43e5df","NOW-8d"],["b4598b2","NOW-8d"],["b474b85","NOW-7d"],["b48fe58","NOW-7d"],["b4ab12b","NOW-7d"],["b4c63fe","NOW-6d"],["b4e16d1","NOW-6d"],["b4fc9a4","NOW-6d"],["b517c77","NOW-5d"],["b532f4a","NOW-5d"],["b54e21d","NOW-5d"],["b5694f0","NOW-4d"],["b5847c3","NOW-4d"],["b59fa96","NOW-4d"],["b5bad69","NOW-3d"],["b5d603c","NOW-3d"],["b5f130f","NOW-3d"],["b60c5e2","NOW-2d"],["b6278b5","NOW-2d"],["b642b88","NOW-2d"],["b65de5b","NOW-1d"],["b67912e","NOW-1d"]],"lead_time":[[3287,"9a3c1f0",1822],[3284,"9a574c3",1697],[3281,"9a72796",1573],[3278,"9a8da69",1449],[3275,"9aa8d3c",1325],[3272,"9ac400f",1201],[3269,"9adf2e2",1076],[3266,"9afa5b5",952],[3263,"9b15888",828],[3260,"9b30b5b",704],[3257,"9a3c1f0",580],[3254,"9a574c3",455]],"lead_time_total":164,"failed":[["9a3c1f0","issue",2000],["9a8da69","issue",2013],["9adf2e2","revert",2026],["9b30b5b","issue",2039],["9a72796","issue",2052],["9ac400f","revert",2065],["9b15888","issue",2078],["9a574c3","issue",2091],["9aa8d3c","revert",2104],["9afa5b5","issue",2117],["9a3c1f0","issue",2130],["9a8da69","revert",2143],["9adf2e2","issue",2156]],"recovery":[["9a3c1f0","issue",2000,36],["9a8da69","issue",2013,84],["9adf2e2","revert",2026,66],["9b30b5b","issue",2039,42],["9a72796","issue",2052,96],["9ac400f","revert",2065,72],["9b15888","issue",2078,48],["9a574c3","issue",2091,102],["9aa8d3c","revert",2104,78],["9afa5b5","issue",2117,60],["9a3c1f0","issue",2130,36],["9a8da69","revert",2143,84],["9adf2e2","issue",2156,66]]},"rework_rate":0.041,"rework_deployments":11,"deployments_n":267,"rework_range":[0.025,0.066],"deployment_days_per_six_months":126,"lead_time_working_hours":5.8},"changes":[{"metric":"delivery.pickup","label":"pickup","now":2.2,"base":2.6,"unit":"h","note":null,"changed":false,"direction":"down","detectable":1.4,"n_now":9,"n_base":41},{"metric":"delivery.deployments","label":"deployments","now":22,"base":21,"unit":"count","note":null,"changed":false,"direction":null,"detectable":1.6,"n_now":null,"n_base":null},{"metric":"delivery.change_failure","label":"deployments that failed","now":0.05,"base":0.05,"unit":"share","note":null,"changed":false,"direction":null,"detectable":0.06,"n_now":9,"n_base":41}],"incidents":[{"number":2000,"source":"issue","created":"NOW-2d","hours_to_restore":0.6},{"number":2013,"source":"issue","created":"NOW-85d","hours_to_restore":1.4},{"number":2026,"source":"pull","created":"NOW-80d","hours_to_restore":1.1},{"number":2039,"source":"issue","created":"NOW-75d","hours_to_restore":0.7},{"number":2052,"source":"issue","created":"NOW-70d","hours_to_restore":1.6},{"number":2065,"source":"pull","created":"NOW-65d","hours_to_restore":1.2},{"number":2078,"source":"issue","created":"NOW-60d","hours_to_restore":0.8},{"number":2091,"source":"issue","created":"NOW-55d","hours_to_restore":1.7},{"number":2104,"source":"pull","created":"NOW-50d","hours_to_restore":1.3},{"number":2117,"source":"issue","created":"NOW-45d","hours_to_restore":1},{"number":2130,"source":"issue","created":"NOW-40d","hours_to_restore":0.6},{"number":2143,"source":"pull","created":"NOW-35d","hours_to_restore":1.4},{"number":2156,"source":"issue","created":"NOW-30d","hours_to_restore":1.1}],"stuck":{"hanging_review":[{"pr":3307,"since":"NOW-5d"}],"long_lived":[],"high_interaction":[],"red_and_idle":[]},"by_team":{"storefront":{"n":85,"pickup":{"enough":true,"p75_h":2},"cycle_to_merge":{"enough":true,"p75_h":10.1},"dora":{"deployment_days_per_week":4.3,"lead_time_hours":13.8,"change_failure_rate":0.05,"recovery_hours":1.2}},"checkout":{"n":85,"pickup":{"enough":true,"p75_h":2.6},"cycle_to_merge":{"enough":true,"p75_h":12.2},"dora":{"deployment_days_per_week":2.9,"lead_time_hours":16.6,"change_failure_rate":0.07,"recovery_hours":1.6}}},"by_owner":{},"by_service":{"storefront":{"prs":41,"n":41,"pickup":{"n":41,"enough":true,"p50_h":1.4,"p75_h":3.1},"cycle_to_merge":{"n":41,"enough":true,"p50_h":9.5,"p75_h":22},"review":{"n":41,"enough":true,"p50_h":2,"p75_h":5.5},"deployments":38,"dora":{"deployment_days_per_week":3,"frequency_tier":"high","lead_time_hours":26.4,"lead_time_tier":"high","change_failure_rate":0.079,"cfr_tier":"medium"}},"checkout":{"prs":17,"n":17,"pickup":{"n":17,"enough":true,"p50_h":2.2,"p75_h":6.8},"cycle_to_merge":{"n":17,"enough":true,"p50_h":14,"p75_h":41.5},"review":{"n":17,"enough":true,"p50_h":3.1,"p75_h":9}}},"tracker":{"sources":["linear"],"issues":230,"merged_prs":170,"linked_prs":119,"incidents":8,"lead_time":{"REQUIREMENT":{"n":64,"lead_p50_h":190,"lead_p75_h":410,"cycle_p50_h":52,"cycle_p75_h":120},"BUG":{"n":71,"lead_p50_h":60,"lead_p75_h":160,"cycle_p50_h":14,"cycle_p75_h":40},"TASK":{"n":38,"lead_p50_h":96,"lead_p75_h":220,"cycle_p50_h":20,"cycle_p75_h":61}},"planning":[{"name":"Cycle 30","state":"CLOSED","scope":24,"done":19,"carried_over":3,"added_after_start":2,"points_scope":40,"points_done":32},{"name":"Cycle 31","state":"CLOSED","scope":29,"done":22,"carried_over":4,"added_after_start":3,"points_scope":41,"points_done":33},{"name":"Cycle 32","state":"CLOSED","scope":27,"done":20,"carried_over":5,"added_after_start":2,"points_scope":42,"points_done":34},{"name":"Cycle 33","state":"CLOSED","scope":25,"done":23,"carried_over":3,"added_after_start":3,"points_scope":43,"points_done":35},{"name":"Cycle 34","state":"CLOSED","scope":30,"done":21,"carried_over":4,"added_after_start":2,"points_scope":44,"points_done":36},{"name":"Cycle 35","state":"ACTIVE","scope":28,"done":19,"carried_over":5,"added_after_start":3,"points_scope":45,"points_done":37}],"by_team":{"teams":{"storefront":{"done":48},"checkout":{"done":33}},"unmatched":6,"by_email":9,"suggested":[]}},"investment":{"since":"MON-5","months":[{"month":"MON-5","n":49,"counts":{"feature":21,"fix":12,"maintenance":8,"security":2,"docs":3,"other":3}},{"month":"MON-4","n":52,"counts":{"feature":21,"fix":12,"maintenance":8,"security":3,"docs":3,"other":5}},{"month":"MON-3","n":55,"counts":{"feature":22,"fix":13,"maintenance":9,"security":3,"docs":3,"other":5}},{"month":"MON-2","n":51,"counts":{"feature":20,"fix":12,"maintenance":8,"security":3,"docs":3,"other":5}},{"month":"MON-1","n":58,"counts":{"feature":22,"fix":14,"maintenance":9,"security":3,"docs":3,"other":7}},{"month":"MON-0","n":61,"counts":{"feature":23,"fix":15,"maintenance":10,"security":3,"docs":4,"other":6}}],"n":326,"counts":{"feature":129,"fix":78,"maintenance":52,"security":17,"docs":19,"other":31},"shares":{"feature":0.396,"fix":0.239,"maintenance":0.16,"security":0.052,"docs":0.058,"other":0.095},"decided_by":{"label":124,"issue":72,"title":82,"only":26,"other":31},"bots":61},"epics":{"since":"MON-5","linked":196,"no_epic":39,"feature_share":0.46,"epics":[{"epic":"WEB-100","title":"Checkout redesign","prs":61,"share":0.31},{"epic":"WEB-117","title":"Search speed","prs":43,"share":0.22},{"epic":"WEB-134","title":"Accounts","prs":29,"share":0.15}]},"ai":{"agent_prs":{"n":16,"merged":14,"merged_share":0.88},"assisted_prs":{"n":143,"share":0.44,"tools":{"copilot":86,"claude":57},"pickup_p75_h":2.4,"others_pickup_p75_h":2.2,"size_p75":240,"others_size_p75":190},"ai_reviewed_prs":{"n":65},"by_agent":{"copilot agent":{"prs":8,"decided":11,"merge_rate":0.79,"review_rounds_p50":3,"window":{"n":8,"review_p75_h":12.2,"ci_failed_share":0.24,"reverted_share":0.04}},"claude agent":{"prs":6,"decided":6,"merge_rate":0.88,"review_rounds_p50":2,"window":{"n":6,"review_p75_h":9.1,"ci_failed_share":0.17,"reverted_share":0.02}}},"review_load":{"weeks":[{"week_end":"NOW-35d","opened":{"agent":4,"person":14},"merged":{"agent":3,"person":13}},{"week_end":"NOW-28d","opened":{"agent":6,"person":15},"merged":{"agent":4,"person":14}},{"week_end":"NOW-21d","opened":{"agent":8,"person":16},"merged":{"agent":5,"person":13}},{"week_end":"NOW-14d","opened":{"agent":10,"person":14},"merged":{"agent":6,"person":14}},{"week_end":"NOW-7d","opened":{"agent":12,"person":15},"merged":{"agent":7,"person":13}},{"week_end":"NOW-0d","opened":{"agent":14,"person":16},"merged":{"agent":8,"person":14}}],"waiting":{"agent":9,"person":4},"reviewers":{"n":7,"max_open":6,"agent_share":0.58}},"expected_review":[{"pr":3307,"kind":"agent","similar":14,"p50_h":6.1,"p75_h":12.2},{"pr":3318,"kind":"person","similar":15,"p50_h":7.2,"p75_h":13.7},{"pr":3320,"kind":"person","similar":16,"p50_h":8.4,"p75_h":15.2},{"pr":3322,"kind":"agent","similar":17,"p50_h":9.5,"p75_h":16.7}],"outcomes":{"window":{"agent":{"n":14,"pickup_p75_h":3.1,"review_p75_h":7.6,"size_p75":120,"ci_n":13,"ci_failed_share":0.22,"flaky_share":0.05,"reverted_share":0.02,"failed_deploy_share":0.05,"merge_rate":0.9,"merge_rate_n":18},"assisted":{"n":143,"pickup_p75_h":2.4,"review_p75_h":7.6,"size_p75":240,"ci_n":129,"ci_failed_share":0.18,"flaky_share":0.06,"reverted_share":0.02,"failed_deploy_share":0.05,"merge_rate":0.9,"merge_rate_n":147},"others":{"n":169,"pickup_p75_h":2.2,"review_p75_h":7.6,"size_p75":190,"ci_n":152,"ci_failed_share":0.15,"flaky_share":0.05,"reverted_share":0.01,"failed_deploy_share":0.05,"merge_rate":0.9,"merge_rate_n":173}},"matched":{"assisted":{"ci_failed":{"matched":114,"of":143,"matched_share":0.8,"gap":0.03,"low":-0.03,"high":0.09,"detectable":0.08,"verdict":"no measurable difference"},"reverted":{"matched":114,"of":143,"matched_share":0.8,"gap":0,"low":-0.06,"high":0.06,"detectable":0.08,"verdict":"no measurable difference"},"merged":{"matched":114,"of":143,"matched_share":0.8,"gap":-0.01,"low":-0.07,"high":0.05,"detectable":0.08,"verdict":"no measurable difference"}},"agent":{"ci_failed":{"matched":11,"of":14,"matched_share":0.8,"gap":0.07,"low":0.01,"high":0.13,"detectable":0.08,"verdict":"higher"},"merged_by_others":{"matched":11,"of":14,"matched_share":0.8,"gap":0.12,"low":0.06,"high":0.18,"detectable":0.08,"verdict":"higher"}}},"coverage":{"people_prs":312,"marked":143,"marked_share":0.44,"authors":14,"authors_marking":6},"monthly":[{"month":"MON-5","agent":{"n":2},"assisted":{"n":17},"others":{"n":32}},{"month":"MON-4","agent":{"n":2},"assisted":{"n":19},"others":{"n":33}},{"month":"MON-3","agent":{"n":2},"assisted":{"n":22},"others":{"n":33}},{"month":"MON-2","agent":{"n":2},"assisted":{"n":21},"others":{"n":30}},{"month":"MON-1","agent":{"n":2},"assisted":{"n":26},"others":{"n":32}},{"month":"MON-0","agent":{"n":2},"assisted":{"n":28},"others":{"n":33}}]},"copilot":{"org":"acme","window_days":28,"days_kept":58,"first_day":"NOW-58d","monthly_active_users":23,"monthly_active_agent_users":7,"acceptance":0.31,"org_prs_by_copilot":19,"org_prs_merged_by_copilot":14,"repo_prs_by_copilot":9,"repo_prs_merged_by_copilot":7},"baseline":null,"spend":{"window_days":30,"providers":{"anthropic":412.37,"openai":96.1,"cursor":640},"total_usd":1148.47,"ai_prs":38,"per_ai_pr_usd":30.22,"cursor_agent_requests":2210,"tools":{"claude_code":{"sessions":311,"lines_added":18420,"commits":96,"prs":27,"acceptance":0.82,"est_usd":388.5},"cursor":{"agent_requests":2210,"lines_added":9310}}}},"merge_queue":{"prs":142,"merged":136,"window_days":90,"p50_h":0.6,"p90_h":1.9,"removals":{"CI_FAILURE":4,"MERGE_CONFLICT":2},"failed_runs":9,"runs":151,"removed_by_flakes":[{"pr":3290,"at":"NOW-12d","jobs":["playwright / webkit"]},{"pr":3301,"at":"NOW-6d","jobs":["playwright / webkit"]}]},"excluded":0,"peers":{"group":"TypeScript, 1k-10k stars","repos":388,"metrics":[{"key":"pickup_p75_hours","name":"Pickup: opened to first maintainer review (P75)","you":6.2,"typical":9.8,"place":"faster than about 61%"},{"key":"cycle_to_merge_p75_hours","name":"Opened to merged (P75)","you":41,"typical":52,"place":"faster than about 55%"}]},"dora_rows":{"deployments":[["NOW-364d",false,null],["NOW-359d",false,null],["NOW-354d",false,null],["NOW-349d",false,null],["NOW-344d",false,null],["NOW-339d",false,null],["NOW-334d",false,null],["NOW-329d",false,null],["NOW-324d",false,null],["NOW-319d",false,null],["NOW-314d",false,null],["NOW-309d",false,null],["NOW-304d",false,null],["NOW-299d",false,null],["NOW-294d",false,null],["NOW-289d",true,1.7],["NOW-284d",false,null],["NOW-279d",false,null],["NOW-274d",false,null],["NOW-269d",false,null],["NOW-264d",false,null],["NOW-259d",false,null],["NOW-254d",false,null],["NOW-249d",false,null],["NOW-244d",false,null],["NOW-239d",false,null],["NOW-234d",false,null],["NOW-229d",false,null],["NOW-224d",false,null],["NOW-219d",false,null],["NOW-214d",false,null],["NOW-209d",false,null],["NOW-204d",true,1.7],["NOW-199d",false,null],["NOW-194d",false,null],["NOW-189d",false,null],["NOW-184d",false,null],["NOW-179d",false,null],["NOW-174d",false,null],["NOW-169d",false,null],["NOW-164d",false,null],["NOW-159d",false,null],["NOW-154d",false,null],["NOW-149d",false,null],["NOW-144d",false,null],["NOW-139d",false,null],["NOW-134d",false,null],["NOW-129d",false,null],["NOW-124d",false,null],["NOW-119d",true,1.7],["NOW-114d",false,null],["NOW-109d",false,null],["NOW-104d",false,null],["NOW-99d",false,null],["NOW-94d",false,null],["NOW-89d",false,null],["NOW-84d",false,null],["NOW-79d",false,null],["NOW-74d",false,null],["NOW-69d",false,null],["NOW-64d",false,null],["NOW-59d",false,null],["NOW-54d",false,null],["NOW-49d",false,null],["NOW-44d",false,null],["NOW-39d",false,null],["NOW-34d",true,1.7],["NOW-29d",false,null],["NOW-24d",false,null],["NOW-19d",false,null],["NOW-14d",false,null],["NOW-9d",false,null],["NOW-4d",false,null]],"prs":[["NOW-364d",7.2],["NOW-364d",19.3],["NOW-359d",17.6],["NOW-359d",10.7],["NOW-354d",9],["NOW-354d",21],["NOW-349d",19.3],["NOW-349d",12.4],["NOW-344d",10.7],["NOW-344d",22.8],["NOW-339d",21],["NOW-339d",14.1],["NOW-334d",12.4],["NOW-334d",5.5],["NOW-329d",22.8],["NOW-329d",15.9],["NOW-324d",14.1],["NOW-324d",7.2],["NOW-319d",5.5],["NOW-319d",17.6],["NOW-314d",15.9],["NOW-314d",9],["NOW-309d",7.2],["NOW-309d",19.3],["NOW-304d",17.6],["NOW-304d",10.7],["NOW-299d",9],["NOW-299d",21],["NOW-294d",19.3],["NOW-294d",12.4],["NOW-289d",10.7],["NOW-289d",22.8],["NOW-284d",21],["NOW-284d",14.1],["NOW-279d",12.4],["NOW-279d",5.5],["NOW-274d",22.8],["NOW-274d",15.9],["NOW-269d",14.1],["NOW-269d",7.2],["NOW-264d",5.5],["NOW-264d",17.6],["NOW-259d",15.9],["NOW-259d",9],["NOW-254d",7.2],["NOW-254d",19.3],["NOW-249d",17.6],["NOW-249d",10.7],["NOW-244d",9],["NOW-244d",21],["NOW-239d",19.3],["NOW-239d",12.4],["NOW-234d",10.7],["NOW-234d",22.8],["NOW-229d",21],["NOW-229d",14.1],["NOW-224d",12.4],["NOW-224d",5.5],["NOW-219d",22.8],["NOW-219d",15.9],["NOW-214d",14.1],["NOW-214d",7.2],["NOW-209d",5.5],["NOW-209d",17.6],["NOW-204d",15.9],["NOW-204d",9],["NOW-199d",7.2],["NOW-199d",19.3],["NOW-194d",17.6],["NOW-194d",10.7],["NOW-189d",9],["NOW-189d",21],["NOW-184d",19.3],["NOW-184d",12.4],["NOW-179d",10.7],["NOW-179d",22.8],["NOW-174d",21],["NOW-174d",14.1],["NOW-169d",12.4],["NOW-169d",5.5],["NOW-164d",22.8],["NOW-164d",15.9],["NOW-159d",14.1],["NOW-159d",7.2],["NOW-154d",5.5],["NOW-154d",17.6],["NOW-149d",15.9],["NOW-149d",9],["NOW-144d",7.2],["NOW-144d",19.3],["NOW-139d",17.6],["NOW-139d",10.7],["NOW-134d",9],["NOW-134d",21],["NOW-129d",19.3],["NOW-129d",12.4],["NOW-124d",10.7],["NOW-124d",22.8],["NOW-119d",21],["NOW-119d",14.1],["NOW-114d",12.4],["NOW-114d",5.5],["NOW-109d",22.8],["NOW-109d",15.9],["NOW-104d",14.1],["NOW-104d",7.2],["NOW-99d",5.5],["NOW-99d",17.6],["NOW-94d",15.9],["NOW-94d",9],["NOW-89d",7.2],["NOW-89d",19.3],["NOW-84d",17.6],["NOW-84d",10.7],["NOW-79d",9],["NOW-79d",21],["NOW-74d",19.3],["NOW-74d",12.4],["NOW-69d",10.7],["NOW-69d",22.8],["NOW-64d",21],["NOW-64d",14.1],["NOW-59d",12.4],["NOW-59d",5.5],["NOW-54d",22.8],["NOW-54d",15.9],["NOW-49d",14.1],["NOW-49d",7.2],["NOW-44d",5.5],["NOW-44d",17.6],["NOW-39d",15.9],["NOW-39d",9],["NOW-34d",7.2],["NOW-34d",19.3],["NOW-29d",17.6],["NOW-29d",10.7],["NOW-24d",9],["NOW-24d",21],["NOW-19d",19.3],["NOW-19d",12.4],["NOW-14d",10.7],["NOW-14d",22.8],["NOW-9d",21],["NOW-9d",14.1],["NOW-4d",12.4],["NOW-4d",5.5]]},"dora_weeks":[{"week":"NOW-87d","deployments":18,"lead_time_hours":11,"change_failure_rate":0,"recovery_hours":null},{"week":"NOW-80d","deployments":23,"lead_time_hours":14,"change_failure_rate":0.08,"recovery_hours":1.4},{"week":"NOW-73d","deployments":21,"lead_time_hours":17,"change_failure_rate":0.05,"recovery_hours":null},{"week":"NOW-66d","deployments":19,"lead_time_hours":13,"change_failure_rate":0,"recovery_hours":null},{"week":"NOW-59d","deployments":24,"lead_time_hours":16,"change_failure_rate":0.05,"recovery_hours":null},{"week":"NOW-52d","deployments":22,"lead_time_hours":12,"change_failure_rate":0.08,"recovery_hours":1.4},{"week":"NOW-45d","deployments":20,"lead_time_hours":15,"change_failure_rate":0,"recovery_hours":null},{"week":"NOW-38d","deployments":18,"lead_time_hours":11,"change_failure_rate":0.05,"recovery_hours":null},{"week":"NOW-31d","deployments":23,"lead_time_hours":14,"change_failure_rate":0.05,"recovery_hours":null},{"week":"NOW-24d","deployments":21,"lead_time_hours":17,"change_failure_rate":0.08,"recovery_hours":1.4},{"week":"NOW-17d","deployments":19,"lead_time_hours":13,"change_failure_rate":0.05,"recovery_hours":null},{"week":"NOW-10d","deployments":24,"lead_time_hours":16,"change_failure_rate":0.05,"recovery_hours":null},{"week":"NOW-3d","deployments":22,"lead_time_hours":12,"change_failure_rate":0,"recovery_hours":null}],"deploy_attempts":{"source":"deployments api","attempts":283,"succeeded":267,"failed":13,"cancelled":3,"success_rate":0.9536,"median_minutes":11.2},"deployments_unreadable":false,"deploy_names":[{"name":"production","n":267}],"deployment_list":[{"id":"dep-0","name":"production","sha":"9e7b2e8","finished":"NOW-1d","prs":[3267],"authors":1,"lead_hours":8.3,"incidents":[]},{"id":"dep-1","name":"production","sha":"9e60015","finished":"NOW-3d","prs":[3264,3263],"authors":2,"lead_hours":11.7,"incidents":[]},{"id":"dep-2","name":"production","sha":"9e44d42","finished":"NOW-5d","prs":[3261,3260,3259],"authors":1,"lead_hours":15.2,"incidents":[2026]},{"id":"dep-3","name":"production","sha":"9e29a6f","finished":"NOW-7d","prs":[3258],"authors":2,"lead_hours":18.6,"incidents":[]},{"id":"dep-4","name":"production","sha":"9e0e79c","finished":"NOW-9d","prs":[3255,3254],"authors":1,"lead_hours":8.3,"incidents":[]},{"id":"dep-5","name":"production","sha":"9df34c9","finished":"NOW-11d","prs":[3252,3251,3250],"authors":2,"lead_hours":11.7,"incidents":[]},{"id":"dep-6","name":"production","sha":"9dd81f6","finished":"NOW-13d","prs":[3249],"authors":1,"lead_hours":15.2,"incidents":[]},{"id":"dep-7","name":"production","sha":"9dbcf23","finished":"NOW-15d","prs":[3246,3245],"authors":2,"lead_hours":18.6,"incidents":[]},{"id":"dep-8","name":"production","sha":"9da1c50","finished":"NOW-17d","prs":[3243,3242,3241],"authors":1,"lead_hours":8.3,"incidents":[2104]},{"id":"dep-9","name":"production","sha":"9d8697d","finished":"NOW-19d","prs":[3240],"authors":2,"lead_hours":11.7,"incidents":[]},{"id":"dep-10","name":"production","sha":"9d6b6aa","finished":"NOW-21d","prs":[3237,3236],"authors":1,"lead_hours":15.2,"incidents":[]},{"id":"dep-11","name":"production","sha":"9d503d7","finished":"NOW-23d","prs":[3234,3233,3232],"authors":2,"lead_hours":18.6,"incidents":[]},{"id":"dep-12","name":"production","sha":"9d35104","finished":"NOW-25d","prs":[3231],"authors":1,"lead_hours":8.3,"incidents":[]},{"id":"dep-13","name":"production","sha":"9d19e31","finished":"NOW-27d","prs":[3228,3227],"authors":2,"lead_hours":11.7,"incidents":[]},{"id":"dep-14","name":"production","sha":"9cfeb5e","finished":"NOW-29d","prs":[3225,3224,3223],"authors":1,"lead_hours":15.2,"incidents":[2013]},{"id":"dep-15","name":"production","sha":"9ce388b","finished":"NOW-31d","prs":[3222],"authors":2,"lead_hours":18.6,"incidents":[]},{"id":"dep-16","name":"production","sha":"9cc85b8","finished":"NOW-33d","prs":[3219,3218],"authors":1,"lead_hours":8.3,"incidents":[]},{"id":"dep-17","name":"production","sha":"9cad2e5","finished":"NOW-35d","prs":[3216,3215,3214],"authors":2,"lead_hours":11.7,"incidents":[]}],"releases":[{"tag":"v5.14.0","at":"NOW-2d","prs":6,"fixes":1,"fix_share":0.1667,"reverted":[],"incidents_after":0,"settled":false},{"tag":"v5.13.0","at":"NOW-11d","prs":11,"fixes":2,"fix_share":0.1818,"reverted":[],"incidents_after":0,"settled":false},{"tag":"v5.12.0","at":"NOW-20d","prs":7,"fixes":3,"fix_share":0.4286,"reverted":[3236],"incidents_after":1,"settled":true},{"tag":"v5.11.0","at":"NOW-29d","prs":12,"fixes":1,"fix_share":0.0833,"reverted":[],"incidents_after":0,"settled":true},{"tag":"v5.10.0","at":"NOW-38d","prs":8,"fixes":2,"fix_share":0.25,"reverted":[],"incidents_after":0,"settled":true},{"tag":"v5.9.0","at":"NOW-47d","prs":13,"fixes":3,"fix_share":0.2308,"reverted":[],"incidents_after":0,"settled":true},{"tag":"v5.8.0","at":"NOW-56d","prs":9,"fixes":1,"fix_share":0.1111,"reverted":[],"incidents_after":0,"settled":true},{"tag":"v5.7.0","at":"NOW-65d","prs":14,"fixes":2,"fix_share":0.1429,"reverted":[],"incidents_after":0,"settled":true}],"bugs":{"weeks":[{"week":"NOW-80d","opened":3,"closed":2,"open":14},{"week":"NOW-73d","opened":6,"closed":7,"open":15},{"week":"NOW-66d","opened":4,"closed":6,"open":16},{"week":"NOW-59d","opened":7,"closed":5,"open":17},{"week":"NOW-52d","opened":5,"closed":4,"open":18},{"week":"NOW-45d","opened":3,"closed":3,"open":19},{"week":"NOW-38d","opened":6,"closed":2,"open":14},{"week":"NOW-31d","opened":4,"closed":7,"open":15},{"week":"NOW-24d","opened":7,"closed":6,"open":16},{"week":"NOW-17d","opened":5,"closed":5,"open":17},{"week":"NOW-10d","opened":3,"closed":4,"open":18},{"week":"NOW-3d","opened":6,"closed":3,"open":19}],"open":17,"median_open_days":23,"sources":["github","linear"],"oldest":[{"src":"github","id":1200,"days":210},{"src":"github","id":1237,"days":177},{"src":"github","id":1274,"days":144},{"src":"github","id":1311,"days":111},{"src":"github","id":1348,"days":78}]},"change_risk":{"backtest":{"train":182,"test":78,"test_troubled":11,"auc":0.72,"top_fifth_trouble":0.38,"overall_trouble":0.141},"troubled":31,"note":null,"open":[{"pr":3307,"risk":0.42,"level":"high","base":0.141,"reasons":["touches src/checkout/, where 31% of PRs needed a fix","the author's first change there","no test changes"]},{"pr":3318,"risk":0.36,"level":"high","base":0.141,"reasons":["touches src/checkout/, where 31% of PRs needed a fix","the author's first change there","no test changes"]},{"pr":3320,"risk":0.3,"level":"medium","base":0.141,"reasons":["large change (over 400 lines)"]},{"pr":3322,"risk":0.24,"level":"medium","base":0.141,"reasons":["large change (over 400 lines)"]}]},"what_changed":[{"incident":{"source":"issue","number":2000,"created":"NOW-2d","resolved":null,"deployment":"dep-0"},"window_hours":72,"candidates":[{"kind":"deployment","ref":"9e7b2e8","at":"NOW-2d","why":"the deployment this incident is tied to","deployment":"dep-0"},{"kind":"pull request","ref":"#3267","title":"Cache cart totals","at":"NOW-2d","why":"a revert later undid it"},{"kind":"dependency","ref":"#3265","title":"Bump next","at":"NOW-2d","why":"shipped in that deployment"}]},{"incident":{"source":"issue","number":2013,"created":"NOW-85d","resolved":null,"deployment":"dep-3"},"window_hours":72,"candidates":[{"kind":"deployment","ref":"9e29a6f","at":"NOW-85d","why":"the deployment this incident is tied to","deployment":"dep-3"},{"kind":"pull request","ref":"#3258","title":"Cache cart totals","at":"NOW-85d","why":"a revert later undid it"},{"kind":"dependency","ref":"#3256","title":"Bump next","at":"NOW-85d","why":"shipped in that deployment"}]}],"code_survival":{"30":{"people":{"prs":64,"share":0.91},"agents":{"prs":18,"share":0.83}},"90":{"people":{"prs":41,"share":0.84},"agents":{"prs":9,"share":0.71}}},"code_quality":{"project":"acme_web-app","day":"NOW-3h","gate":"ERROR","failing":["new_coverage"],"measures":{"bugs":4,"vulnerabilities":1,"code_smells":212,"coverage":71.4,"duplicated_lines_density":3.2},"month_ago":{"bugs":6,"vulnerabilities":1,"code_smells":198,"coverage":73,"duplicated_lines_density":3.4},"days":[{"day":"NOW-30d","bugs":6,"vulnerabilities":1,"code_smells":198,"coverage":73},{"day":"NOW-29d","bugs":6,"vulnerabilities":1,"code_smells":198,"coverage":72.9},{"day":"NOW-28d","bugs":6,"vulnerabilities":1,"code_smells":199,"coverage":72.9},{"day":"NOW-27d","bugs":6,"vulnerabilities":1,"code_smells":199,"coverage":72.8},{"day":"NOW-26d","bugs":6,"vulnerabilities":1,"code_smells":200,"coverage":72.8},{"day":"NOW-25d","bugs":6,"vulnerabilities":1,"code_smells":200,"coverage":72.7},{"day":"NOW-24d","bugs":6,"vulnerabilities":1,"code_smells":201,"coverage":72.7},{"day":"NOW-23d","bugs":6,"vulnerabilities":1,"code_smells":201,"coverage":72.6},{"day":"NOW-22d","bugs":6,"vulnerabilities":1,"code_smells":202,"coverage":72.6},{"day":"NOW-21d","bugs":6,"vulnerabilities":1,"code_smells":202,"coverage":72.5},{"day":"NOW-20d","bugs":6,"vulnerabilities":1,"code_smells":203,"coverage":72.5},{"day":"NOW-19d","bugs":6,"vulnerabilities":1,"code_smells":203,"coverage":72.4},{"day":"NOW-18d","bugs":5,"vulnerabilities":1,"code_smells":204,"coverage":72.3},{"day":"NOW-17d","bugs":5,"vulnerabilities":1,"code_smells":204,"coverage":72.3},{"day":"NOW-16d","bugs":5,"vulnerabilities":1,"code_smells":205,"coverage":72.2},{"day":"NOW-15d","bugs":5,"vulnerabilities":1,"code_smells":205,"coverage":72.2},{"day":"NOW-14d","bugs":5,"vulnerabilities":1,"code_smells":206,"coverage":72.1},{"day":"NOW-13d","bugs":5,"vulnerabilities":1,"code_smells":206,"coverage":72.1},{"day":"NOW-12d","bugs":5,"vulnerabilities":1,"code_smells":207,"coverage":72},{"day":"NOW-11d","bugs":5,"vulnerabilities":1,"code_smells":207,"coverage":72},{"day":"NOW-10d","bugs":5,"vulnerabilities":1,"code_smells":208,"coverage":71.9},{"day":"NOW-9d","bugs":5,"vulnerabilities":1,"code_smells":208,"coverage":71.8},{"day":"NOW-8d","bugs":5,"vulnerabilities":1,"code_smells":209,"coverage":71.8},{"day":"NOW-7d","bugs":5,"vulnerabilities":1,"code_smells":209,"coverage":71.7},{"day":"NOW-6d","bugs":4,"vulnerabilities":1,"code_smells":210,"coverage":71.7},{"day":"NOW-5d","bugs":4,"vulnerabilities":1,"code_smells":210,"coverage":71.6},{"day":"NOW-4d","bugs":4,"vulnerabilities":1,"code_smells":211,"coverage":71.6},{"day":"NOW-3d","bugs":4,"vulnerabilities":1,"code_smells":211,"coverage":71.5},{"day":"NOW-2d","bugs":4,"vulnerabilities":1,"code_smells":212,"coverage":71.5},{"day":"NOW-1d","bugs":4,"vulnerabilities":1,"code_smells":212,"coverage":71.4}]},"sizes":{"n":170,"p50":96,"p75":214,"under_100":88,"100_155":27,"156_228":15,"over_228":40},"merge_frequency":1.3,"review_depth":2.1,"merged_without_review":{"n":3,"share":0.0176},"merged_flags":{"lightning":[{"pr":3263,"review_minutes":2},{"pr":3250,"review_minutes":4}],"without_review":[{"pr":3259},{"pr":3245},{"pr":3238}]},"devlake_pr_cycle":[{"month":"MON-2","avg_hours":15.18,"n":30},{"month":"MON-1","avg_hours":13.8,"n":34},{"month":"MON-0","avg_hours":12.42,"n":38}],"capex":{"file":"capex.csv","rows":652,"months":[{"month":"MON-5","prs":49,"agent_prs":0,"author_weeks":{"feature":17,"fix":10,"maintenance":6,"security":2,"docs":2,"other":2},"feature_share":0.4286},{"month":"MON-4","prs":52,"agent_prs":1,"author_weeks":{"feature":17,"fix":10,"maintenance":6,"security":2,"docs":2,"other":4},"feature_share":0.4038},{"month":"MON-3","prs":55,"agent_prs":0,"author_weeks":{"feature":18,"fix":10,"maintenance":7,"security":2,"docs":2,"other":4},"feature_share":0.4},{"month":"MON-2","prs":51,"agent_prs":1,"author_weeks":{"feature":16,"fix":10,"maintenance":6,"security":2,"docs":2,"other":4},"feature_share":0.3922},{"month":"MON-1","prs":58,"agent_prs":0,"author_weeks":{"feature":18,"fix":11,"maintenance":7,"security":2,"docs":2,"other":6},"feature_share":0.3793},{"month":"MON-0","prs":61,"agent_prs":1,"author_weeks":{"feature":18,"fix":12,"maintenance":8,"security":2,"docs":3,"other":5},"feature_share":0.377}]}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"schema":1,"generated":"NOW-58m","open":[{"pr":3320,"package":"next","ecosystem":"npm","from":"14.2.15","to":"14.2.18","bump":"patch","bot":"renovate","security":false,"age_hours":40},{"pr":3324,"package":"@playwright/test","ecosystem":"npm","from":"1.48.2","to":"1.49.0","bump":"minor","bot":"renovate","security":false,"age_hours":18},{"pr":3326,"package":"cross-spawn","ecosystem":"npm","from":"7.0.3","to":"7.0.6","bump":"patch","bot":"renovate","security":true,"age_hours":9}],"security_overdue":[],"merged_90d":61,"merge_median_hours":9,"bots":["renovate"],"last_opened":"NOW-1d","quiet_days":0}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"schema":1,"generated":"NOW-58m","window_days":90,"open":22,"drafts":3,"merged":170,"closed_unmerged":11,"stages":{"pickup":{"median_s":3600,"p90_s":9360,"n":146},"review":{"median_s":13680,"p90_s":35568,"n":143},"merge":{"median_s":1440,"p90_s":3744,"n":166},"cycle":{"median_s":18360,"p90_s":47736,"n":170}},"merged_without_review":5,"groups":{"insider":{"merged":156,"closed_unmerged":9,"merge_rate":0.92,"merged_without_review":5,"pickup":{"median_s":3600,"p90_s":9360,"n":146},"review":{"median_s":13680,"p90_s":35568,"n":143},"merge":{"median_s":1440,"p90_s":3744,"n":166},"cycle":{"median_s":18360,"p90_s":47736,"n":170}},"outsider":{"merged":14,"closed_unmerged":2,"merge_rate":0.88,"merged_without_review":0,"pickup":{"median_s":8640,"p90_s":22464,"n":14},"review":{"median_s":19080,"p90_s":49608,"n":14},"merge":{"median_s":1800,"p90_s":4680,"n":14},"cycle":{"median_s":34200,"p90_s":88920,"n":14}}},"queue":[{"n":3307,"title":"Migrate settings page to server actions","author":"jules","outsider":false,"actor":"reviewer","who":["noor"],"why":"review asked, not started","since":"NOW-5d","step":"review","waiting_s":432000,"usual_s":3600,"stale":false,"slow":true,"gaps":[{"what":"tests","why":"87% of merged PRs in src/checkout include test files"}]},{"n":3318,"title":"Cache product images at the edge","author":"noor","outsider":false,"actor":"author","who":["noor"],"why":"approved, not merged yet","since":"NOW-1d","step":"merge","waiting_s":86400,"usual_s":null,"stale":false,"slow":false,"gaps":[]},{"n":3320,"title":"Bump next from 14.2.15 to 14.2.18","author":"renovate[bot]","outsider":false,"actor":"reviewer","who":["jules"],"why":"update waiting for a review","since":"NOW-2d","step":"review","waiting_s":172800,"usual_s":3600,"stale":false,"slow":false,"gaps":[{"what":"size","why":"912 lines; 90% of merged PRs in the whole repo have at most 640"}]},{"n":3322,"title":"Dark mode for the order history","author":"kai","outsider":false,"actor":"reviewer","who":["jules","noor"],"why":"in review","since":"NOW-1d","step":"review","waiting_s":86400,"usual_s":3600,"stale":false,"slow":false,"gaps":[]}],"stale":0,"load":[{"reviewer":"noor","open_requests":2,"oldest_since":"NOW-2d"},{"reviewer":"jules","open_requests":2,"oldest_since":"NOW-5d"}],"monthly":[{"month":"MON-5","opened":52,"merged":49,"pickup_median_s":4500,"cycle_median_s":21980},{"month":"MON-4","opened":55,"merged":52,"pickup_median_s":4320,"cycle_median_s":21247},{"month":"MON-3","opened":58,"merged":55,"pickup_median_s":4140,"cycle_median_s":20515},{"month":"MON-2","opened":54,"merged":51,"pickup_median_s":3960,"cycle_median_s":19782},{"month":"MON-1","opened":60,"merged":58,"pickup_median_s":3780,"cycle_median_s":19049},{"month":"MON-0","opened":63,"merged":61,"pickup_median_s":3600,"cycle_median_s":18317}],"bots":{"open":3,"closed":61},"measures":{"flow.pickup_time":{"metric":"flow.pickup_time","version":1,"value":3600,"n":146,"low":3060,"high":4320,"unit":"s","as_of":"NOW-58m","window_days":90,"note":null},"flow.cycle_time":{"metric":"flow.cycle_time","version":1,"value":18360,"n":170,"low":15606,"high":22032,"unit":"s","as_of":"NOW-58m","window_days":90,"note":null},"flow.open_prs":{"metric":"flow.open_prs","version":1,"value":22,"n":22,"low":null,"high":null,"unit":"count","as_of":"NOW-58m","window_days":null,"note":null}},"habits":{"scope":"whole repo","merged_prs":170,"include":{"tests":0.64,"docs":0.18,"changelog":0.41},"size":{"median_lines":86,"p75_lines":210,"p90_lines":520},"asks":[{"ask":"tests","share":0.21,"prs":36},{"ask":"a smaller pull request","share":0.08,"prs":14}],"folders":[{"area":"src/checkout","merged_prs":72,"include":{"tests":0.87,"changelog":0.62,"docs":0.08},"size":{"median_lines":64,"p75_lines":150,"p90_lines":380},"reviewed_prs":43,"asks":[{"ask":"tests","share":0.2326,"prs":10}]},{"area":"src/storefront","merged_prs":58,"include":{"tests":0.73,"changelog":0.12,"docs":0.15},"size":{"median_lines":86,"p75_lines":190,"p90_lines":470},"reviewed_prs":35,"asks":[{"ask":"docs","share":0.2286,"prs":8}]},{"area":"src/search","merged_prs":21,"include":{"tests":0.59,"changelog":0.52,"docs":0.22},"size":{"median_lines":108,"p75_lines":230,"p90_lines":560},"reviewed_prs":13,"asks":[{"ask":"tests","share":0.2308,"prs":3}]},{"area":"e2e","merged_prs":17,"include":{"tests":0.45,"changelog":0.47,"docs":0.29},"size":{"median_lines":130,"p75_lines":270,"p90_lines":650},"reviewed_prs":10,"asks":[{"ask":"docs","share":0.2,"prs":2}]}]},"excluded":2,"knowledge":{"areas":[{"area":"src/checkout","prs":72,"owner":"ana-li","share":0.44,"single_owner":false,"owner_quiet_days":1},{"area":"src/storefront","prs":58,"owner":"kwame-o","share":0.71,"single_owner":true,"owner_quiet_days":0},{"area":"src/search","prs":21,"owner":"jun-park","share":0.86,"single_owner":true,"owner_quiet_days":36},{"area":"e2e","prs":17,"owner":"ana-li","share":0.41,"single_owner":false,"owner_quiet_days":1},{"area":".github/workflows","prs":6,"owner":"kwame-o","share":0.83,"single_owner":true,"owner_quiet_days":0}],"hotspots":[{"area":"src/checkout","prs_90d":32,"prs":72},{"area":"src/storefront","prs_90d":26,"prs":58},{"area":"src/search","prs_90d":9,"prs":21},{"area":"e2e","prs_90d":8,"prs":17}]},"delivery":{"source":"merges","releases":0,"per_week":9.4,"lead_time_median_s":null,"change_fail":null,"recovery_median_s":null},"baselines":{"pickup":7920,"merge":2880,"author":16416}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"as_of":"NOW-58m","sources":{"CI Health":{"kind":"module","last_try":"NOW-58m","last_ok":"NOW-58m","failing_since":null,"error":null,"complete":true,"read":{"runs":48,"requests":61}},"Copilot":{"kind":"connector","last_try":"NOW-3h","last_ok":"NOW-3h","failing_since":null,"error":null,"complete":true,"read":{"org_day":58}},"Delivery":{"kind":"module","last_try":"NOW-58m","last_ok":"NOW-58m","failing_since":null,"error":null,"complete":true,"read":{}},"Dependencies":{"kind":"module","last_try":"NOW-58m","last_ok":"NOW-1d","failing_since":"NOW-20h","complete":null,"read":{},"error":"OSV could not be reached (ConnectTimeout); the next run tries again."},"Insights":{"kind":"module","last_try":"NOW-58m","last_ok":"NOW-58m","failing_since":null,"error":null,"complete":true,"read":{}},"Linear":{"kind":"connector","last_try":"NOW-3h","last_ok":"NOW-3h","failing_since":null,"error":null,"complete":false,"read":{"issue":230,"sprint":6}},"Team Flow":{"kind":"module","last_try":"NOW-58m","last_ok":"NOW-58m","failing_since":null,"error":null,"complete":false,"read":{"prs":100,"points":40}},"SonarQube":{"kind":"connector","last_try":"NOW-58m","last_ok":"NOW-58m","failing_since":null,"error":null,"complete":true,"read":{"quality":30}}},"history":{"ci/days":{"oldest":"NOW-179d","newest":"NOW-0d","files":172,"bytes":7052000,"keeps_days":180},"flow/closed":{"oldest":"NOW-38d","newest":"NOW-0d","files":38,"bytes":1558000,"keeps_days":400}},"dropped":null}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"schema":1,"generated":"NOW-58m","findings":[{"kind":"fix_job","title":"playwright / webkit re-runs cost 2.2 h","action":"Pin the WebKit browser version in CI.","hours":2.2,"n":6,"open_since":"2026-10-04","key":"fix_job","decision":null},{"kind":"review_wait","action":"Assign a reviewer to #3307.","hours":5,"open_since":"2026-10-19","n":1,"title":"1 review request not started after 3 days","key":"review_wait","decision":null},{"kind":"red_ci","title":"Failing checks kept 9 PRs red for 7 h","action":"Quarantine checkout.spec.ts > applies coupon until the coupon fix lands.","hours":7,"n":9,"open_since":"2026-10-01","key":"red_ci","decision":{"verb":"snooze","by":"tomasz","until":"NOW+9d","reason":"release week","at":"NOW-5d","kind":"finding","id":"red_ci"}}],"opportunity":{"hours":7.2,"findings":2,"inside_another":0},"track_record":{"since":"2026-07-01","top_findings":5,"shrank_by_half":3,"cleared":2},"red_ci":{"definition":"Time a ready pull request spent with a failing check on its newest commit, until a new commit, a passing re-run or the merge.","prs":170,"without_checks":2,"red_prs":17,"red_hours_total":14.7,"rerun_hours_total":7,"rerun_waits":9,"open_red":[],"cycle_hours":{"red":{"median":14.8,"n":17},"clear":{"median":7.4,"n":153}},"measures":{"insight.red_ci_share":{"metric":"insight.red_ci_share","version":1,"value":0.1,"n":170,"low":0.04000000000000001,"high":0.17,"unit":"share","as_of":"NOW-58m","window_days":90,"note":null}},"rerun_jobs":[{"workflow":"CI","job":"e2e (chromium)","hours":4.2,"prs":7,"runs":[]},{"workflow":"CI","job":"lint","hours":1.1,"prs":2,"runs":[]}],"rerun_tests":[{"test":"checkout.spec.ts > applies coupon","hours":2.8,"prs":4,"pr_list":[1790,1799,1808,1817],"runs":[]},{"test":"search.test.tsx > debounces input","hours":2,"prs":3,"pr_list":[1790,1799,1808],"runs":[]}],"top":[{"pr":1790,"hours":17,"waits":[{"ended_by":"rerun"},{"ended_by":"push"}]},{"pr":1799,"hours":13.8,"waits":[{"ended_by":"rerun"}]},{"pr":1808,"hours":10.6,"waits":[{"ended_by":"rerun"}]}]},"chains":[{"test":"checkout.spec.ts > applies coupon","hours":3.1,"prs":5,"pr_list":[1800,1807,1814,1821,1828],"state":"flaky","flake_events":5,"runs":140,"owners":["@acme/core"],"owners_from":"CODEOWNERS line 4","decision":null}]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"weeks":[{"week":"2026-09-07","flow":{"yes":4,"no":2,"mixed":1},"friction":{"yes":3,"no":3,"mixed":1},"satisfaction":{"yes":5,"no":1,"mixed":0}},{"week":"2026-09-14","flow":{"yes":5,"no":2,"mixed":1},"friction":{"yes":4,"no":2,"mixed":1},"satisfaction":{"yes":5,"no":1,"mixed":1}},{"week":"2026-09-21","flow":{"yes":6,"no":2,"mixed":1},"friction":{"yes":3,"no":3,"mixed":1},"satisfaction":{"yes":5,"no":1,"mixed":0}},{"week":"2026-09-28","flow":{"yes":4,"no":2,"mixed":1},"friction":{"yes":4,"no":2,"mixed":1},"satisfaction":{"yes":5,"no":1,"mixed":1}},{"week":"2026-10-05","flow":{"yes":5,"no":2,"mixed":1},"friction":{"yes":3,"no":3,"mixed":1},"satisfaction":{"yes":5,"no":1,"mixed":0}},{"week":"2026-10-12","flow":{"yes":6,"no":2,"mixed":1},"friction":{"yes":4,"no":2,"mixed":1},"satisfaction":{"yes":5,"no":1,"mixed":1}},{"week":"2026-10-19","flow":{"yes":4,"no":2,"mixed":1},"friction":{"yes":3,"no":3,"mixed":1},"satisfaction":{"yes":5,"no":1,"mixed":0}},{"week":"2026-10-26","flow":{"yes":5,"no":2,"mixed":1},"friction":{"yes":4,"no":2,"mixed":1},"satisfaction":{"yes":5,"no":1,"mixed":1}}],"beside":{"flow":"pickup","friction":"first_try","satisfaction":"deployments"},"min_answers":5}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"schema":1,"generated":"NOW-2d","score":3.2,"probes":[{"probe":"hasDangerousWorkflowUntrustedCheckout","risk":"critical","effort":"S","result":"pass","why":"A pull_request_target or workflow_run workflow checks out the pull request's code with secrets in reach.","fix":"Use pull_request for untrusted code, or check it out only after a maintainer's label or approval gate.","findings":[],"guarded":[]},{"probe":"hasDangerousWorkflowScriptInjection","risk":"critical","effort":"S","result":"fail","why":"Text an outsider writes (a title, a body, a branch name) is pasted into a run: script.","fix":"Pass it through env: (FOO: ${{ github.event.issue.title }}) and use \"$FOO\" in the script.","findings":[{"path":".github/workflows/preview.yml","job":"comment","detail":"${{ github.event.pull_request.title }} pasted into run:"}],"guarded":[]},{"probe":"topLevelPermissions","risk":"high","effort":"S","result":"fail","why":"A workflow's token gets write access it may not need.","fix":"Add `permissions: contents: read` at the top and grant writes only on the jobs that need them.","findings":[{"path":".github/workflows/ci.yml","detail":"no top-level permissions: the token gets the repo's default write access"}],"guarded":[]},{"probe":"pinsDependencies","risk":"medium","effort":"M","result":"fail","why":"An action used by tag, or a script piped from the internet, can change under you (as tj-actions/changed-files did).","fix":"Pin each action to its full commit (uses: owner/action@<40-character sha> # v4) and download scripts before running them.","findings":[{"path":".github/workflows/ci.yml","job":"test","detail":"actions/setup-node@v4 is used by tag"},{"path":"Dockerfile","detail":"FROM node:20-alpine has no digest"}],"guarded":[]},{"probe":"branchProtectionLevel","risk":"high","effort":"S","result":"pass","why":"The default branch can be force-pushed or merged into without review or checks.","fix":"Add a ruleset on the default branch: block force pushes and deletion, require a review and the CI checks.","findings":[],"guarded":[]},{"probe":"securityPolicyPresent","risk":"medium","effort":"S","result":"pass","why":"No SECURITY.md tells people how to report a vulnerability privately.","fix":"Add SECURITY.md with a contact and a disclosure timeline, and turn on private vulnerability reporting.","findings":[],"guarded":[]},{"probe":"releasesAreSigned","risk":"high","effort":"M","result":"unknown","why":"Recent releases carry no signature or provenance file to check them against.","fix":"Sign release assets with Sigstore (actions/attest-build-provenance) or publish .intoto.jsonl provenance.","findings":[],"guarded":[]},{"probe":"hasSBOM","risk":"medium","effort":"S","result":"fail","why":"No SBOM in the repo or the release assets.","fix":"Attach an SPDX or CycloneDX SBOM to each release (anchore/sbom-action).","findings":[],"guarded":[]},{"probe":"sastToolConfigured","risk":"medium","effort":"S","result":"fail","why":"No code scanning (CodeQL, Semgrep, SonarCloud) runs on pull requests.","fix":"Turn on CodeQL's default setup in the repo's Security settings, or add a Semgrep workflow.","findings":[],"guarded":[]},{"probe":"hasBinaryArtifacts","risk":"high","effort":"S","result":"fail","why":"Compiled files are committed, so nobody can review what they do.","fix":"Build them in CI instead and remove them from the repo.","findings":[],"guarded":[]},{"probe":"fuzzed","risk":"medium","effort":"M","result":"fail","why":"No fuzzing setup was found.","fix":"Add ClusterFuzzLite, Go native fuzz tests, or join OSS-Fuzz.","findings":[],"guarded":[]},{"probe":"hasOpenSSFBadge","risk":"low","effort":"M","result":"fail","why":"No OpenSSF Best Practices badge.","fix":"Fill in the questionnaire at bestpractices.dev.","findings":[],"guarded":[]},{"probe":"packagedWithAutomatedWorkflow","risk":"medium","effort":"S","result":"unknown","why":"Releases aren't published by a workflow, so their build can't be traced.","fix":"Publish from a workflow (with trusted publishing on PyPI and npm).","findings":[],"guarded":[]}],"facts":{"workflows":{"sast":[],"publish":[],"files":5},"tree":{"binaries":["tools/bin/imagemin","vendor/legacy/sass.dll"],"sbom_files":[],"fuzzing":[]},"branch":{"tiers":[{"tier":1,"rule":"no force pushes or deletion","state":"met"},{"tier":2,"rule":"reviews required","state":"met"},{"tier":3,"rule":"status checks required","state":"unknown"},{"tier":4,"rule":"two reviewers and code owners","state":"unknown"},{"tier":5,"rule":"stale reviews dismissed, admins included","state":"unknown"}],"readable":true,"level":2},"policy":{"file":"acme/.github:SECURITY.md","contact":true,"disclosure":false,"private_reporting":false},"releases":{"releases":0,"signed":[],"sbom":[]},"oss_fuzz":false,"badge":null},"history":[["NOW-77d",4.1],["NOW-70d",4],["NOW-63d",3.9],["NOW-56d",3.8],["NOW-49d",3.8],["NOW-42d",3.7],["NOW-35d",3.6],["NOW-28d",3.5],["NOW-21d",3.4],["NOW-14d",3.4],["NOW-7d",3.3],["NOW-0d",3.2]],"weakened":true}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
{"workflow":".github/workflows/playwright.yml","job":"webkit","state":"flaky","flake_events":3,"failures":3,"runs":150,"flake_rate":0.02,"prs_affected":3,"retry_minutes":132}
|
|
2
|
+
{"workflow":".github/workflows/playwright.yml","job":"chromium","state":"ok","flake_events":0,"failures":0,"runs":120,"flake_rate":0,"prs_affected":0,"retry_minutes":0}
|
|
3
|
+
{"workflow":".github/workflows/build.yml","job":"next","state":"ok","flake_events":0,"failures":0,"runs":120,"flake_rate":0,"prs_affected":0,"retry_minutes":0}
|
|
4
|
+
{"workflow":".github/workflows/unit.yml","job":"vitest","state":"ok","flake_events":0,"failures":0,"runs":120,"flake_rate":0,"prs_affected":0,"retry_minutes":0}
|
|
5
|
+
{"workflow":".github/workflows/lint.yml","job":"eslint","state":"ok","flake_events":0,"failures":0,"runs":120,"flake_rate":0,"prs_affected":0,"retry_minutes":0}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{"id":3305,"pr_pickup_time":24,"pr_review_time":137,"pr_coding_time":202,"pr_deploy_time":26,"pr_cycle_time":776,"pr_merged_date":"2026-10-18T12:00:00Z"}
|
|
2
|
+
{"id":3302,"pr_pickup_time":94,"pr_review_time":228,"pr_coding_time":370,"pr_deploy_time":48,"pr_cycle_time":846,"pr_merged_date":"2026-10-12T12:00:00Z"}
|
|
3
|
+
{"id":3299,"pr_pickup_time":64,"pr_review_time":319,"pr_coding_time":538,"pr_deploy_time":70,"pr_cycle_time":816,"pr_merged_date":"2026-10-06T12:00:00Z"}
|
|
4
|
+
{"id":3296,"pr_pickup_time":34,"pr_review_time":410,"pr_coding_time":706,"pr_deploy_time":26,"pr_cycle_time":786,"pr_merged_date":"2026-09-30T12:00:00Z"}
|
|
5
|
+
{"id":3293,"pr_pickup_time":104,"pr_review_time":502,"pr_coding_time":202,"pr_deploy_time":48,"pr_cycle_time":856,"pr_merged_date":"2026-09-24T12:00:00Z"}
|
|
6
|
+
{"id":3290,"pr_pickup_time":74,"pr_review_time":137,"pr_coding_time":370,"pr_deploy_time":70,"pr_cycle_time":826,"pr_merged_date":"2026-09-18T12:00:00Z"}
|
|
7
|
+
{"id":3287,"pr_pickup_time":44,"pr_review_time":228,"pr_coding_time":538,"pr_deploy_time":26,"pr_cycle_time":796,"pr_merged_date":"2026-09-12T12:00:00Z"}
|
|
8
|
+
{"id":3284,"pr_pickup_time":114,"pr_review_time":319,"pr_coding_time":706,"pr_deploy_time":48,"pr_cycle_time":866,"pr_merged_date":"2026-09-06T12:00:00Z"}
|
|
9
|
+
{"id":3281,"pr_pickup_time":84,"pr_review_time":410,"pr_coding_time":202,"pr_deploy_time":70,"pr_cycle_time":836,"pr_merged_date":"2026-08-31T12:00:00Z"}
|
|
10
|
+
{"id":3278,"pr_pickup_time":54,"pr_review_time":502,"pr_coding_time":370,"pr_deploy_time":26,"pr_cycle_time":806,"pr_merged_date":"2026-08-25T12:00:00Z"}
|
|
11
|
+
{"id":3275,"pr_pickup_time":24,"pr_review_time":137,"pr_coding_time":538,"pr_deploy_time":48,"pr_cycle_time":776,"pr_merged_date":"2026-08-19T12:00:00Z"}
|
|
12
|
+
{"id":3272,"pr_pickup_time":94,"pr_review_time":228,"pr_coding_time":706,"pr_deploy_time":70,"pr_cycle_time":846,"pr_merged_date":"2026-08-13T12:00:00Z"}
|
|
13
|
+
{"id":3269,"pr_pickup_time":64,"pr_review_time":319,"pr_coding_time":202,"pr_deploy_time":26,"pr_cycle_time":816,"pr_merged_date":"2026-08-07T12:00:00Z"}
|
|
14
|
+
{"id":3266,"pr_pickup_time":34,"pr_review_time":410,"pr_coding_time":370,"pr_deploy_time":48,"pr_cycle_time":786,"pr_merged_date":"2026-08-01T12:00:00Z"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{"id":3305,"pull_request_key":3305,"title":"Refactor config loading","author_name":"someone","merged_date":"2026-10-18T12:00:00Z"}
|
|
2
|
+
{"id":3302,"pull_request_key":3302,"title":"Add metrics for retries","author_name":"someone","merged_date":"2026-10-12T12:00:00Z"}
|
|
3
|
+
{"id":3299,"pull_request_key":3299,"title":"Fix flaky timeout","author_name":"someone","merged_date":"2026-10-06T12:00:00Z"}
|
|
4
|
+
{"id":3296,"pull_request_key":3296,"title":"Update docs","author_name":"someone","merged_date":"2026-09-30T12:00:00Z"}
|
|
5
|
+
{"id":3293,"pull_request_key":3293,"title":"Speed up cold start","author_name":"someone","merged_date":"2026-09-24T12:00:00Z"}
|
|
6
|
+
{"id":3290,"pull_request_key":3290,"title":"Tidy error messages","author_name":"someone","merged_date":"2026-09-18T12:00:00Z"}
|
|
7
|
+
{"id":3287,"pull_request_key":3287,"title":"Split large handler","author_name":"someone","merged_date":"2026-09-12T12:00:00Z"}
|
|
8
|
+
{"id":3284,"pull_request_key":3284,"title":"Refactor config loading","author_name":"someone","merged_date":"2026-09-06T12:00:00Z"}
|
|
9
|
+
{"id":3281,"pull_request_key":3281,"title":"Add metrics for retries","author_name":"someone","merged_date":"2026-08-31T12:00:00Z"}
|
|
10
|
+
{"id":3278,"pull_request_key":3278,"title":"Fix flaky timeout","author_name":"someone","merged_date":"2026-08-25T12:00:00Z"}
|
|
11
|
+
{"id":3275,"pull_request_key":3275,"title":"Update docs","author_name":"someone","merged_date":"2026-08-19T12:00:00Z"}
|
|
12
|
+
{"id":3272,"pull_request_key":3272,"title":"Speed up cold start","author_name":"someone","merged_date":"2026-08-13T12:00:00Z"}
|
|
13
|
+
{"id":3269,"pull_request_key":3269,"title":"Tidy error messages","author_name":"someone","merged_date":"2026-08-07T12:00:00Z"}
|
|
14
|
+
{"id":3266,"pull_request_key":3266,"title":"Split large handler","author_name":"someone","merged_date":"2026-08-01T12:00:00Z"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"generated":"NOW-58m","files":{"prs.jsonl":{"rows":18,"generated":"NOW-58m"},"ci_jobs.jsonl":{"rows":5,"generated":"NOW-58m"},"tests.jsonl":{"rows":2,"generated":"NOW-58m"},"devlake_pull_requests.jsonl":{"rows":14,"generated":"NOW-58m"},"devlake_project_pr_metrics.jsonl":{"rows":14,"generated":"NOW-58m"}}}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{"number":3305,"title":"Refactor config loading","author_kind":"person","role":"insider","status":"MERGED","created_at":"2026-10-16T12:00:00Z","merged_at":"2026-10-18T12:00:00Z","pickup_s":1440,"additions":40,"deletions":10}
|
|
2
|
+
{"number":3302,"title":"Add metrics for retries","author_kind":"person","role":"insider","status":"MERGED","created_at":"2026-10-10T12:00:00Z","merged_at":"2026-10-12T12:00:00Z","pickup_s":5640,"additions":77,"deletions":23}
|
|
3
|
+
{"number":3299,"title":"Fix flaky timeout","author_kind":"person","role":"insider","status":"MERGED","created_at":"2026-10-04T12:00:00Z","merged_at":"2026-10-06T12:00:00Z","pickup_s":3840,"additions":114,"deletions":36}
|
|
4
|
+
{"number":3296,"title":"Update docs","author_kind":"person","role":"insider","status":"MERGED","created_at":"2026-09-28T12:00:00Z","merged_at":"2026-09-30T12:00:00Z","pickup_s":2040,"additions":151,"deletions":49}
|
|
5
|
+
{"number":3293,"title":"Speed up cold start","author_kind":"person","role":"insider","status":"MERGED","created_at":"2026-09-22T12:00:00Z","merged_at":"2026-09-24T12:00:00Z","pickup_s":6240,"additions":188,"deletions":62}
|
|
6
|
+
{"number":3290,"title":"Tidy error messages","author_kind":"person","role":"outsider","status":"MERGED","created_at":"2026-09-16T12:00:00Z","merged_at":"2026-09-18T12:00:00Z","pickup_s":4440,"additions":225,"deletions":75}
|
|
7
|
+
{"number":3287,"title":"Split large handler","author_kind":"person","role":"insider","status":"MERGED","created_at":"2026-09-10T12:00:00Z","merged_at":"2026-09-12T12:00:00Z","pickup_s":2640,"additions":262,"deletions":88}
|
|
8
|
+
{"number":3284,"title":"Refactor config loading","author_kind":"person","role":"insider","status":"MERGED","created_at":"2026-09-04T12:00:00Z","merged_at":"2026-09-06T12:00:00Z","pickup_s":6840,"additions":299,"deletions":11}
|
|
9
|
+
{"number":3281,"title":"Add metrics for retries","author_kind":"person","role":"insider","status":"MERGED","created_at":"2026-08-29T12:00:00Z","merged_at":"2026-08-31T12:00:00Z","pickup_s":5040,"additions":336,"deletions":24}
|
|
10
|
+
{"number":3278,"title":"Fix flaky timeout","author_kind":"person","role":"insider","status":"MERGED","created_at":"2026-08-23T12:00:00Z","merged_at":"2026-08-25T12:00:00Z","pickup_s":3240,"additions":73,"deletions":37}
|
|
11
|
+
{"number":3275,"title":"Update docs","author_kind":"person","role":"insider","status":"MERGED","created_at":"2026-08-17T12:00:00Z","merged_at":"2026-08-19T12:00:00Z","pickup_s":1440,"additions":110,"deletions":50}
|
|
12
|
+
{"number":3272,"title":"Speed up cold start","author_kind":"person","role":"outsider","status":"MERGED","created_at":"2026-08-11T12:00:00Z","merged_at":"2026-08-13T12:00:00Z","pickup_s":5640,"additions":147,"deletions":63}
|
|
13
|
+
{"number":3269,"title":"Tidy error messages","author_kind":"person","role":"insider","status":"MERGED","created_at":"2026-08-05T12:00:00Z","merged_at":"2026-08-07T12:00:00Z","pickup_s":3840,"additions":184,"deletions":76}
|
|
14
|
+
{"number":3266,"title":"Split large handler","author_kind":"person","role":"insider","status":"MERGED","created_at":"2026-07-30T12:00:00Z","merged_at":"2026-08-01T12:00:00Z","pickup_s":2040,"additions":221,"deletions":89}
|
|
15
|
+
{"number":3307,"title":"Migrate settings page to server actions","author_kind":"person","role":"insider","status":"OPEN","created_at":"2026-10-15T12:00:00Z","merged_at":null,"pickup_s":null,"additions":167,"deletions":22}
|
|
16
|
+
{"number":3318,"title":"Cache product images at the edge","author_kind":"person","role":"insider","status":"OPEN","created_at":"2026-10-19T12:00:00Z","merged_at":null,"pickup_s":null,"additions":178,"deletions":33}
|
|
17
|
+
{"number":3320,"title":"Bump next from 14.2.15 to 14.2.18","author_kind":"bot","role":"insider","status":"OPEN","created_at":"2026-10-18T12:00:00Z","merged_at":null,"pickup_s":null,"additions":180,"deletions":35}
|
|
18
|
+
{"number":3322,"title":"Dark mode for the order history","author_kind":"person","role":"insider","status":"OPEN","created_at":"2026-10-19T12:00:00Z","merged_at":null,"pickup_s":null,"additions":182,"deletions":37}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
{"test_id":"checkout.spec.ts > applies coupon","state":"flaky","failures":5,"flake_events":5,"runs":140,"message":"Timed out 5000ms waiting for expect(locator).toBeVisible()"}
|
|
2
|
+
{"test_id":"search.test.tsx > debounces input","state":"suspect","failures":2,"flake_events":2,"runs":140,"message":null}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"schema":1,"generated":"NOW-58m","packages":912,"systems":{"NPM":906,"ACTIONS":6},"policy":{"deny":["AGPL-3.0-only"],"min_scorecard":5},"outside_lookups":true,"licences":{"denied":[{"name":"pdf-render-lite","version":"2.1.0","licence":"AGPL-3.0-only","system":"NPM"}],"accepted":[],"unknown":7,"by_licence":{"MIT":702,"ISC":96,"Apache-2.0":48,"BSD-3-Clause":23,"BSD-2-Clause":17,"BlueOak-1.0.0":6,"AGPL-3.0-only":1,"BUSL-1.1":1}},"drift":[{"name":"fast-csv-stream","from":"MIT","from_quarter":"2026 Q2","to":"BUSL-1.1","to_quarter":"2026 Q3"}],"scorecards":{"checked":41,"projects":48,"drops":[{"project":"github.com/nicolo-ribaudo/tc39-proposal","before":7.1,"after":5.4,"since":"NOW-20d","packages":["next"]}],"low":[{"project":"github.com/legacy/left-pad-ng","score":3.2,"packages":["left-pad-ng"]}],"below_policy":[]},"runtimes":[{"runtime":"nodejs","version":"20","file":".nvmrc","use":"runs","eol":"2026-04-30","latest":"20.18.1","status":"behind the newest patch","latest_date":"2024-11-20"}],"reachability":null}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"schema":1,"generated":"NOW-58m","ref":"main","scanner":"OSV-Scanner 2.7.0","offline":false,"files":["package-lock.json"],"skipped":[],"open":[{"id":"GHSA-3xgq-45jj-v275","aliases":["CVE-2024-21538"],"file":"package-lock.json","ecosystem":"npm","package":"cross-spawn","version":"7.0.3","severity":"high","malware":false,"fixed":"7.0.5","first_seen":"NOW-9d","imported":null},{"id":"GHSA-mwcw-c2x4-8c55","aliases":["CVE-2024-55565"],"file":"package-lock.json","ecosystem":"npm","package":"nanoid","version":"3.3.7","severity":"moderate","malware":false,"fixed":"3.3.8","first_seen":"NOW-22d","imported":true},{"id":"GHSA-pxg6-pf52-xh8x","aliases":["CVE-2024-47764"],"file":"package-lock.json","ecosystem":"npm","package":"cookie","version":"0.6.0","severity":"low","malware":false,"fixed":"0.7.0","first_seen":"NOW-40d","imported":false}],"closed":[{"id":"GHSA-r9px-m959-cxf4"},{"id":"GHSA-c2qf-rxjj-qqgw"}]}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"accuracy":"The rules behind StackVitals' verdicts and headline numbers were each checked against public data and, where a\njudgement was needed, against labelled examples. Each card in `bench/accuracy/` holds the method, the\nsample, the labels (links only), the competing rules scored beside ours, and what the check can't show. This\npage is built from those cards' result files by `bench/accuracy/summary.py`; the exact statistical settings are in\n[methods.md](methods.md).\n\n**How the labels were made.**\n- Two model families labelled each sample blind, from the same codebook and evidence: Claude, then Gemini 3.5\n Flash-Lite.\n- Each disagreement was settled by a third reading that saw the two labels without knowing whose they were.\n- That third reading was Claude's. Gemini, adjudicating a sample of the same disputes, agreed with it on 15 of 40.\n- Each adjudicator mostly sided with its own family: Claude's 33 times, Gemini's 23 times.\n- So each card shows its headline on each labeller's labels as well as the adjudicated ones.\n- A check by six models from three families (OpenAI gpt-5.4-mini and gpt-5-mini, Google gemini-3.8-flash and gemini-3.5-flash, Anthropic Claude Sonnet and Haiku), each answering alone the same plain-language questions on 120 labelled items (the CI and reply items drawn first from those the first two labellers disagreed on). Where a majority formed, it matched the labels on CI causes 21 of the 24 it decided (40 asked), the release behind a bug 11 of the 12 it decided (15 asked), how releases reach users 9 of the 14 it decided (15 asked), but issue replies only 11 of the 24 it decided (30 asked): it called most replies the labels call drive-bys or project answers helpful answers from other users, so the Community card's reply labels are the least settled. On the replay's disputed items it reached no majority on 11 of 20.\n- No person has audited the labels yet.\n\n**How sure.** A rule is an *early observation* when its check rests on few cases; its numbers are a direction,\nnot a settled rate: `flaky.already_failing` (1 of 6 held-out matches with the same error); `flaky.maybe_flaky` (2 held-out matches in 150 failures); `flaky.pr_details` (24 matches in 4 repos, one repo gave most); `dora.incident_link` (15 reports named the release that broke). A rule whose bar *failed* is kept only where failing costs nothing it promised: `flaky.known_flaky` (too few calls to show 5%: the label says \"likely\", the advice says to check the error first, and the verdict check waits for a green re-run). The rest are validated on\nheld-out data ([rules.md](rules.md)).\n\n**Reproduce a number.** `python bench/accuracy/reproduce.py list` names the command behind every result file;\n`reproduce.py check <card>` re-scores it and says whether the numbers match. Scoring reads the evidence each\ncard was labelled from (the `.work` folders: CI histories, crawl records, logs), which is too large and holds\ntoo much third-party text for the repo; `reproduce.py pack` builds it into one archive (about 600 MB before\ncompression), shared on request. The final labels are committed beside each card, with links to the public items.\n\n## Weekly changes and ranges\n\nA change is flagged only when it is unlikely to be ordinary week-to-week variation. The digest checks many numbers at once, so it uses false-alarm control (Benjamini-Hochberg) rather than one cut-off per number: on this replay the two behave alike, but a fixed cut-off flags more often as numbers are added and this doesn't. The 26 repos are the independent units; shuffling their weeks tests the no-change case, it doesn't add repos.\n\n| | Result | |\n|---|---|---|\n| Shuffled weeks that flag anything (nothing changed) | **7.5%** | every difference: 97.9%; each number at p < 0.1: 20.8%; at p < 0.05: 11.3% |\n| 10x slowdowns caught in the same scans (first week) | **24.7%** | p < 0.1: 44.8%; p < 0.05: 32.4%; detection is the weak side |\n| 10x slowdowns lasting two weeks, caught in the second | **34.8%** | the 14-day checks; 15.1% with weekly checks only |\n| Small repos' first-try share pulled toward peers (3 pushes seen) | **29.3% less squared error** | a 95% range for later pushes held 94.6% of them |\n\nWeak spot: A small repo's week can't tell even a large slowdown from noise; the page says so instead of guessing. Labels: none (replayed history). Card: [bench/accuracy/uncertainty](../bench/accuracy/uncertainty/README.md).\n\n## AI-assisted pull requests, like with like\n\nAgents' pull requests are compared with people's from the same repo, month and size.\n\n| | Result | |\n|---|---|---|\n| Agents' PRs merged by someone else, against people's: unadjusted | **-9.0 points** | |\n| The same, same repo, month and size | **+0.5 points** | -0.0 to +1.1; can't be told from no difference |\n| Shuffled AI labels (nothing to find) | **+0.1 points** | 200 shuffles |\n| Marked PRs that state AI involvement (precision) | **98.5%** | 96-99%, 194 PRs; by repo: 188 repos, 95-99% counting each once; 1% from unredacted/freesocks-control-plane, without it 189 of 192 |\n| Stated AI involvement that is marked (recall, a floor) | **78.8%** | held out 66.3%; weighted to the crawl |\n| People's merge rate after a repo adopts agents (pre-registered) | **-0.9 points** | -2.7 to +0.7; throughput: not credible, adopters were already growing |\n\nWeak spot: Markers find about 79% of stated AI involvement (66% held out) and none that goes unsaid, so \"AI-marked\" is a floor; matching can't see what a PR was for. Labels: crawl markers; the marking itself checked on 400 PRs labelled by Claude and Gemini. Card: [bench/accuracy/ai](../bench/accuracy/ai/README.md).\n\n## Flaky CI\n\nA job is flaky when the same code failed and passed; no failure is called safe to re-run: a likely flake needs history, a flake's sign in its log and no changed file named, and still waits for a green re-run.\n\n| | Result | |\n|---|---|---|\n| Flagged flakes that were real flakes (event precision) | **97.2%** | 92-99%, 108 events; Claude's labels 97.2%, Gemini's 80.2%, adjudicated 97.2%; by repo: 40 repos, 87-99% counting each once; 4.6% from polyaxon/haupt, without it 100 of 103 |\n| Flagged flakes GitHub's own history confirms weren't the change (no labeller) | **42 of 112** | a floor, not a precision: every flagged flake passed on identical code, so history can confirm one but never refute it; all 112 flagged jobs, where precision uses the 108 the labels could decide |\n| The plain \"passed on retry\" rule on the same repos | **96.9%** | 94-98%; ours +0.3 points (-4.0 to +4.0, not significant); scored on the retries it can see; the retries only it flags were real 53.8% of the time |\n| \"Known flaky\" failures the change caused, old rule | **44.1%** | 15 of 34, 29-61% |\n| The same, 2026-10-22 rule (3+ flakes, one in the failing step), held out | **13 of 81** | 10-26%, 48 jobs in 15 repos; by repo: 11 repos, 4-45% counting each once; 53.1% from lxc/incus, without it 13 of 38; the 5% bar failed, so the rule was tightened (next row) (on the tuning sample: 0 of 5, all one job) |\n| Stricter rule (history, a flake's sign in the log, no changed file named), pre-registered, fresh held out | **0 of 4** | 0-49%, 3 jobs in 2 repos; it kept 4 of 44 calls history made (9.1%); the 5% bar is unproven, so it reads \"likely flaky\", never safe; \"maybe yours\" (a changed file named): 4 of 5 the change's |\n| End-to-end replay: \"known flaky\" calls a re-run turned green that the change had caused | **3 of 45 to 15 of 52** | the labellers disagree: 2-18% adjudicated by Claude (its 3 are a pull-request label check), 18-42% by Gemini; Claude's labels alone 0 of 41, Gemini's 17 of 50; people's labels pending. 2,874 failed pull-request jobs replayed as of each attempt in 35 repos; known flakes are re-run, never passed |\n| Calls that blamed the change but went green on a re-run (random draw, 3 per run at most) | **4 of 66 to 22 of 80 were the change** | 2-15% to 19-38%: a green re-run doesn't prove the change clean either way, so the verdict check, by design, never passes red CI |\n| Harmless failures the 2026-10-22 rule called known flaky (on its tuning sample) | **5 of 19** | 26.3%, 12-49%; the rest cost a look |\n| \"Already failing on main\" (same step, same error) failures the change caused | **0 of 12** | 0-24%, 5 repos; the step alone: 4 of 20, so the error must match; the verdict check still blocks |\n| \"Maybe flaky\" first failures (they look like flakes) the change caused | **0 of 4** | 0-49%; never-flaked failures overall: 58 of 98; signs written on these logs; asks for one re-run, still blocks |\n| \"PR details\" failures (a check on the PR's title, description or labels) that were the change's code | **1 of 24** | 1-20%, 4 repos; 21 had been called known flaky, so a re-run that fails again was advised; still blocks; by repo: 4 repos, 0-53% counting each once; 75% from DataDog/datadog-api-client-go, without it 1 of 6: preliminary |\n| Never-flaked failures that were intermittent (misses) | **17.3%** | 11-26%; Claude's labels 16.8%, Gemini's 25.4%, adjudicated 17.3% |\n| Labellers on \"caused by the change\" | **69.2% agree (kappa 0.43)** | cause: 55.9% agree (kappa 0.47) |\n| Labellers against GitHub's history, where it decides | **Claude 100%** | Gemini 81.2% of their definite answers on 48 failures; always answering \"not caused\" would score 91.7% |\n\nWeak spot: 14-day reads miss rare flakes; status precision (re-running pinned commits) isn't measured yet; Rust jobs were real flakes 80% of the time. Labels: Claude and Gemini 3.5 Flash-Lite, disagreements adjudicated blind by Claude; no person audited. Card: [bench/accuracy/flaky](../bench/accuracy/flaky/README.md).\n\n## Deployments and failures\n\nDeployments come from the source that matches how a repo ships; a revert blames the deployment that shipped what it undid.\n\n| | Result | |\n|---|---|---|\n| Repos whose deployment source is right: StackVitals | **53 of 60** | 78-94%; the first 25 led to one fix of the rule, the later 35 are held out: 85.7%; Claude's labels 92%, Gemini's 88%, adjudicated 92% on the first |\n| The same with no setup: DevLake's default pattern / every merge | **15% / 8.3%** | paired on the same repos: 45 to 1 against DevLake's default |\n| DevLake with a pattern a user would write (deploy, release, publish or push-image) | **36.7%** | 26-49%; paired: 33 to 2; it also counts docs-site builds |\n| Lead time per pull request, on the same pull requests as Middleware | **95 of 96 within 10%** | 5 repos, 90 days, no labeller; the rest were rebased long after they were written (Middleware starts at the rebase); Middleware returned about a month where 90 days were asked on 4 of 5 repos |\n| Reverts where time order blamed a release lacking the change | **71 of 89** | fix chain right on 87 of 89; 117 reverts in 23 repos, checked with the commit graph (no labeller); time order wrong by repo: 18 repos, 57-92% counting each once; 14.6% from Alfresco/alfresco-ng2-components, without it 60 of 76 |\n| Regression reports naming the release that broke: the last release before the report was it | **6 of 15** | 20-64%; the version the report names: 10 of 15 (not significant, so DORA's rule stays); 15 of 60 reports said which release |\n| Repos whose deployment tier changes with the definition | **61.9%** | 4,618 crawled repos |\n| Labellers on whether a workflow ships | **95.3% agree (kappa 0.79)** | on each repo's full set of sources: 56% agree (kappa 0.50); held-out repos: 91.3% agree (kappa 0.74) and 48.6% agree (kappa 0.38) |\n\nWeak spot: Shipping workflows with plain names (docker, pypi, CD) are missed: workflow recall 60% on the held-out repos; releases from maintenance branches with backports defeat both linkage rules. Labels: Claude and Gemini 3.5 Flash-Lite, disagreements adjudicated blind by Claude; no person audited. Card: [bench/accuracy/dora](../bench/accuracy/dora/README.md).\n\n## First responses\n\nA first response is the project's (a maintainer, a regular responder or someone who triages), and issues still waiting stay in the median.\n\n| | Result | |\n|---|---|---|\n| Non-maintainer first comments that are drive-bys (issue-metrics counts them) | **45.8%** | 40-52%, held-out repos |\n| Project answers the roles-only rule missed / regular responders and triagers catch | **18.9% / 56.5%** | drive-bys among what they add: 16.3%; regular responders alone, by labeller: Claude's labels 11.1%, Gemini's 21.5%, adjudicated 16.7% |\n| Repos where an answered-only median hides that most issues wait | **61.1%** | 2,370 crawled repos |\n| Labellers on the kind of comment (held-out set) | **67.8% agree (kappa 0.52)** | first set: 72% agree (kappa 0.57); drive-bys counted by issue-metrics: Claude's labels 46.9%, Gemini's 50.8%, adjudicated 45.8% |\n\nWeak spot: About 43% of occasional contributors' project answers still go uncounted; the rule errs toward \"waiting\". Labels: Claude and Gemini 3.5 Flash-Lite, disagreements adjudicated blind by Claude; no person audited. Card: [bench/accuracy/community](../bench/accuracy/community/README.md).\n\n## Against a general AI agent\n\nThe same questions, answered by an agent with live GitHub access, with and without StackVitals. On single failures the agent is as accurate either way; what StackVitals adds is answers with nobody asking (the PR comment and verdict) and comparisons with similar repos without GitHub calls.\n\n| | Result | |\n|---|---|---|\n| Failure questions right: agent / agent with StackVitals / StackVitals alone | **20 / 20 / 13 of 20** | a live agent reading the log needs nothing from StackVitals here; agent against StackVitals alone: 7 to 0 (McNemar p = 0.016) |\n| Labelled flaky jobs found (both agents) | **16 of 16** | GitHub calls: 214 without, 259 with StackVitals |\n| Comparing with similar public repos: repos it rests on | **14-23 vs 56-311** | 198 calls for the live agent, 0 with StackVitals |\n| 100 more failures in 44 repos, Sonnet: agent / with StackVitals | **86 / 88 of 91** | McNemar p = 0.625; GitHub calls per failure 2.1 without, 2.2 with; 9 checks on the PR itself scored apart |\n| 100 more failures in 44 repos, Haiku (half of them): agent / with StackVitals | **44 / 43 of 48** | McNemar p = 1.000; GitHub calls per failure 2.8 without, 2.2 with; 3 checks on the PR itself scored apart |\n| Same failures, no agent: StackVitals alone / with opt-in model triage | **60 / 79 of 91** | what the PR comment and verdict check say with nobody asking; an agent reading the log does better |\n\nWeak spot: Questions beyond GitHub's 90-day log retention, where kept history matters most, are not asked yet. Labels: Claude (the flaky card's first labels). Card: [bench/accuracy/agents](../bench/accuracy/agents/README.md).\n\n## Rule changes\n\nEvery rule a number rests on, with each revision and why, is in [registry.json](../bench/accuracy/registry.json).\n\n- 2026-10-22, `flaky.event`: was same-code flips in any workflow; all 3 flips that weren't real flakes, and 5 checks of the PR's own text, were pull-request runs of workflows that also run on PR edits or labels; now 9 of 108 events left out (3 wrong, 5 PR-text checks, 1 real timing flake); 99 of 99 kept are real.\n- 2026-10-23, `flaky.event`: was pull-request flips left out in PR-edit workflows; held out, all 17 flips in such workflows were real flakes; now reverted to the earlier rule.\n- 2026-10-22, `flaky.known_flaky`: was any earlier flake; 15 of 34 failures it called safe were caused by the change (44%); now 7 called safe (5 clearly labelled, 0 caused), all one job; the other 29 now cost a look.\n- 2026-10-23, `flaky.known_flaky`: was known flaky passes the verdict check; 13 of 81 held-out safe calls were the change's own failure; matching past flakes' errors didn't separate them; now known flaky still reads 'likely a flake, re-run it', but the verdict check passes only once CI is green.\n- 2026-10-23, `flaky.known_flaky`: was known flaky: likely a flake, re-run it; in the agent head-to-head a smaller model trusted it on 2 failures the change caused; now now asks to check the error isn't from the change before re-running; those 2 were then answered right.\n- 2026-10-28, `flaky.known_flaky`: was 3+ flakes in the window, one in the failing step (history alone); shown as \"Known flaky\"; held out, 13 of 81 such calls were the change's own failure; a flake's sign in the failing step's log and no changed file named separated them on the tuning data (0 of 31 caused when both held; 8 of 8 clear caused when a changed file was named); now fresh read: 4 of 44 calls kept, 0 caused (0-49%), so the 5% bar is unproven; shown as \"Likely flaky\" with its evidence, never \"safe\"; the rest read flaked before, or maybe yours (4 of 5 clear fresh cases caused).\n- 2026-10-22, `flaky.outside_failure`: was failure-section match including 'failed to download and build'; a dependency's own build failing matched; now taken out; 4 matches given up for safety.\n- 2026-10-22, `flaky.outside_failure`: was TEST_FAILED matching any 'FAILED:'; ninja's 'FAILED:' build lines hid an sccache outage; now test-runner forms only.\n- 2026-10-22, `flaky.already_failing`: was the same step alone; 4 of 22 such failures were caused by the change, with a different error in that step; now 12 matched, none caused.\n- 2026-10-23, `flaky.maybe_flaky`: was track record over all 24 signature matches; the product says maybe flaky only for never-flaked failures (a whole-release review); now the track record counts never-flaked matches: 1 of 6 (0 of 4 tuning, 1 of 2 held out).\n- 2026-10-23, `flaky.pr_details`: was error lines mentioning a title, label or description anywhere; a test assertion about chart labels matched; now the words must be about the PR.\n- 2026-10-23, `flaky.pr_details`: was only jobs whose steps read the PR (triggers.metadata_jobs); label checks gated by `if:` and checks reading the PR in a script were missed (2 matches of 24); now any job of a workflow run by PR edits, with the error guard.\n- 2026-10-23, `flaky.pr_details`: was \"checkbox\", \"template\" or \"PR\" alone; any failing step; a whole-release review: a template rendering error in a CI workflow run on labels matched; now those words need the PR's wording beside them, and a failing test rules it out; still 24 of 24 matched.\n- 2026-10-21, `dora.deploy_source`: was display name checked against the deny list; a file named deploy.yml titled 'Check and Publish' hit the deny word 'check'; now a file named only deploy, release or publish ships whatever its display name; 22 to 23 of 25.\n- 2026-10-22, `dora.fix_chain`: was every revert counted as a failed deployment; 11 of 18 undid a change that never shipped; now never-shipped reverts are no failed deployment.\n- 2026-10-23, `community.regular_responders`: was answers and first reviews only; triage acts mark people acting for the project; on the labelled comments the rule missed, they found 8 project answers among 11; now held out: 4 more project answers (47% to 57% weighted); on Claude's labels 45% to 53%, on Gemini's 32% to 38%.\n- 2026-10-22, `community.first_response_km`: was closed-unanswered items treated as still waiting; they stopped being at risk when they closed; now censored at closing.\n- 2026-10-24, `uncertainty.digest`: was weekly checks only; in a slowdown's second week the weekly check's baseline holds the first slow week, so 10x slowdowns were caught in 15% of scans; now on the same replay, second-week catches of 10x slowdowns 15% to 35%, first-week 31% to 25%, false alarms 7.4% to 7.5%; CUSUM charts tried and dropped (no gain).\n- 2026-10-23, `ai.detection`: was AI trailers in the last 5 commits, labels matched exactly, agent account or branch; 5 of 23 missed PRs named the tool in their description; label spellings and Jules task links missed in the tune half; now recall 75.0% to 78.8% weighted (63.9% to 66.3% held out); precision 185 of 187 to 191 of 194.\n","limitations":"What each part of StackVitals can't see or do, where its measured accuracy is weak, and what it needs from your repo.\nNumbers come from the accuracy cards ([accuracy.md](accuracy.md)).\n\n## Every module\n\n- **Labels:** two model families (Claude, then Gemini 3.5 Flash-Lite) labelled each sample, and Claude settled their\n disagreements blind. No person has audited them. Gemini, settling a sample of the same disputes, agreed with\n Claude's rulings on 15 of 40 ([accuracy.md](accuracy.md)).\n- **Ranges:** where a card counts each repo once, that range is quoted, since one busy repo can dominate a sample.\n- **Weekly changes:** 7.5% of shuffled scans flag something, but only 25% of 10x slowdowns are caught in their first\n week (35% in their second), and none in a first week with under 5 merged pull requests ([uncertainty card](../bench/accuracy/uncertainty/README.md)). On a small\n repo, \"steady\" means \"can't tell\".\n- **History:** the `stackvitals-data` branch keeps 400 days of pull requests and issues and 180 days of CI, capped at\n 250 MB. The first run reads up to 90 days of CI.\n- **Permissions:** a missing one skips that part, and the job summary names it.\n\n- **History in a bucket** (`storage: s3://...`) is kept by the Action only. `stackvitals ui` and `sql`, Explore, the MCP\n server, the Portal's org view and `stackvitals ci quarantine` (skipping flaky tests in your CI) read the stackvitals-data\n branch and don't see a bucket yet. Switching starts a fresh history; the branch isn't copied.\n\n## CI health\n\n- **Scope:** flaky jobs come from GitHub Actions history only. From Jenkins, GitLab CI, CircleCI or Buildkite, test-level\n flakes come through uploaded test reports (`stackvitals ci upload`); their job-level history isn't kept. GitLab CI is the exception: its job (`templates/gitlab/stackvitals.yml`, preview) keeps pipeline history in the project.\n**Can't see or do**\n- Single flaky tests need uploaded test reports. In a sample of 190 crawled repos, about 3% of active repos kept\n readable ones ([features card](../bench/accuracy/features/README.md)).\n- Jobs with rare flakes look like \"never flaked\" in a short window. Status precision (re-running pinned commits) is\n not measured.\n- No verdict lets a failure through, and none says \"safe to re-run\". Likely flaky, outside failure, already failing,\n maybe flaky and PR details all still block the verdict check until CI is green. GitLab job logs aren't read, so\n there a job that flaked before is never called a likely flake.\n\n**Weak accuracy** ([flaky card](../bench/accuracy/flaky/README.md))\n- **Likely flaky (known flaky):** history alone was the change's own failure in 13 of 81 held-out calls (10-26%;\n 13 of 38 without lxc/incus). The stricter rule (a flake's sign in the log, no changed file named), pre-registered\n and scored on 36 fresh repos, kept 4 of 44 calls, none the change's, but that is 0-49%: the 5% bar is unproven and\n it covers few failures (9% of history's calls there). So the label says \"likely\" and the advice says to check the\n error before re-running.\n- **Flagged flakes:** 97.2% real (92-99%; 87-99% counting each of 40 repos once), but 80.2% on Gemini's labels.\n Rust jobs: 12 of 15 (55-93%).\n- **Misses:** 17.3% of never-flaked failures were intermittent (11-26%); 25.4% on Gemini's labels.\n- **PR details:** 1 of 24 matches was the change's code (1-20%; 0-53% counting each repo once). DataDog's API client\n gave 75% of them, so this is preliminary.\n- **Already failing on main, same error:** 0 of 12 tuned (0-24%), 1 of 6 held out.\n- **Maybe flaky:** held out, the signs matched 2 of 150 never-flaked failures, so they rarely help.\n\n**Model triage** (opt-in, [agents card](../bench/accuracy/agents/README.md))\n- At most 3 failures a run. Its view sits beside the verdict and never changes it.\n- On 91 failures: StackVitals alone 60 right, with triage 79, an agent reading the log 86 (Sonnet).\n- Private logs are sent only with `allow_private = true`; free tiers may keep what they're sent.\n\n**Needs:** `actions: read` (`write` to re-run), `pull-requests: write` for the comment, `checks: write` for the\nverdict check, `issues: write` for flaky-test issues.\n\n## Team Flow\n\n- **Reviewer suggestions:** a real reviewer was in the top 3 for 82.2% of 1,186 pull requests (80-84%; 75-89%\n resampling repos, against 70-87% for the busiest reviewers). That is not \"the best reviewer\", and the check read no\n CODEOWNERS files ([team card](../bench/accuracy/team/README.md)).\n- **Automation:** review requests, size labels and the docs label are off until a team turns them on. Requests need\n `pull-requests: write`; size is lines changed only; the docs label never approves.\n- **Agreements and pulse:** off until set (agreements) and counts only (pulse); neither has an accuracy card.\n- **Needs:** `pull-requests: read`, `checks: read`, `statuses: read`. Without the check permissions it still runs,\n without check status.\n\n## Delivery\n\n([DORA card](../bench/accuracy/dora/README.md))\n- **Deployments:** the source was right for 53 of 60 repos (78-94%) and 30 of 35 held out (71-94%). Workflow recall\n was 60% held out (44-73%): plain names like docker, pypi or CD are missed. Check with\n `stackvitals delivery owner/repo --deploys` and set `[delivery] source` or `deploy_workflow`. Only 9 of the 60 repos\n deploy services.\n- **Incidents:** each links to the last deployment before it. Where a report named the release that broke, that was\n the last release 6 of 15 times (20-64%; 19-66% counting each of 13 repos once).\n- **Reverts:** the fix chain was right on 87 of 89; time order was wrong on 71 of 89 (57-92% by repo). Releases from\n maintenance branches with backports defeat both.\n- **Tiers:** on 4,618 repos, 61.9% change tier with the deployment definition.\n- **Rework and change failure rate** see only failures that leave a trace (a revert, a hotfix, an incident label or\n tool), never ones nobody linked ([dora-guide.md](dora-guide.md)).\n- **AI-assisted outcomes:** markers miss most AI help, so \"AI-marked\" is a floor, and matching can't see what a pull\n request was for ([AI card](../bench/accuracy/ai/README.md)). Under 5 matched pull requests it says \"too few to\n compare\". It shows an association, never a cause.\n- **Investment:** on pip, pytest and aiohttp 3 to 7% stayed unsorted; titles that name a component leave more unsorted\n until you set `[investment.labels]`.\n- **Needs:** `deployments: read`; production environments named production, prod or live, or set `production`.\n\n## Dependencies\n\n([deps card](../bench/accuracy/deps/README.md))\n- **Known vulnerabilities:** every package in the lockfiles OSV-Scanner reads (npm, PyPI, Go, Rust, Maven, RubyGems,\n NuGet, Composer and more). On 100 crawled repos, 65 had a lockfile it reads; Maven `pom.xml` files that take versions\n from a parent were read 20 of 46 times, `go.mod` 14 of 17, `Package.resolved` 1 of 3. GitHub's malware advisories are\n matched on the next scheduled or post-CI run without waiting for a full rescan; how often that beats OSV isn't\n measured, and malware detection has no measured recall.\n- **Release signs:** npm and PyPI only; a new install script or lost provenance never fired on 296 ordinary releases,\n new dependencies on 5%. Release age alone is a note. GuardDog (opt-in) runs only on Linux runners and is experimental.\n- **Runtimes:** read from version files, Dockerfiles and workflow setup steps; a version given as a range (\">=18\") is\n left out. Old lines in a test matrix are listed, not flagged.\n- **Dossiers (deep evidence):** npm and PyPI only, 4,033 packages. The verdict is none when evidence is thin, and never \"safe\". The\n card measures coverage, not how often the verdict is right.\n- **Exploits:** EPSS scores 99% of CVEs. The open-advisory alarm (exploited, or EPSS 10% or more) matched no package in\n the crawl, so it is rare by design.\n- **Rollbacks:** 19 in 48,994 merged bot upgrades, a rare flag, not a rate.\n- **Paths:** npm and uv lockfiles only; poetry.lock doesn't say which packages are direct, and requirements.txt and Pipfile.lock have no graph.\n- **Look-alikes:** only added packages. On npm the name alone flagged 1.1% of legitimate names against 0.25% of\n malicious ones, so a flag also needs under 1,000 weekly downloads. When downloads can't be read (or outside lookups are off), a near name is only a note to check, not an alarm.\n- **Reachability:** Go only, from govulncheck you run in the workflow; checked on 3 repos. Standard-library results\n depend on the scan's Go version.\n- **Imports (Python, JavaScript, Rust):** whether the repo's own code imports the package, not whether it calls the\n vulnerable code; a package reached only through another reads \"no direct import\", and a Python package whose import\n name isn't known reads \"unknown\". Not measured against call-path tools yet.\n- **Scorecards:** shown, never deciding a verdict.\n- **Needs:** `contents: read` and GitHub's dependency graph (turn it on for private repos). The comment goes only on\n same-repo pull requests.\n\n## Community\n\n([community card](../bench/accuracy/community/README.md))\n- **First responses:** held out, regular responders and people who triage catch 57% of project answers the\n roles-only rule misses (46-69%; 38% on Gemini's labels), and about 16% of what they add are drive-bys. About 43% of\n occasional contributors' answers still go uncounted; the rule errs toward \"waiting\".\n- **Traffic:** GitHub deletes it after 14 days and the built-in token can't read it; keeping it needs your own GitHub\n App with \"Administration: read\".\n- **Score:** a fact with too little data is left out.\n- **Needs:** `issues: read`.\n\n## Portal\n\n- **Scope:** a lightweight catalog built on GitHub alone: owners, scorecards, campaigns, required checks, golden paths and\n a docs index, with GitHub's own sign-in and repository roles. It doesn't replace an internal developer portal with\n plugins, live service data from clouds or its own access control (Backstage, Port, Cortex, OpsLevel); it exports\n to Backstage instead.\n- Golden paths open a pull request in a repo the requester can already write to; they never create repos or run\n arbitrary scripts. Required checks post a check run; a branch rule must still name it.\n- The built-in token reads public repos only; private repos need an org-owned read-only App. A public portal repo\n leaves private repos out.\n- The org view adds up and takes medians of what each repo published; repos that never ran a module are left out of\n that module's figures, not counted as zero.\n- Data the token can't read shows \"not available\".\n- `catalog-info.yaml`: 186 of 198 real files read cleanly (94%); all 12 flagged had real faults\n ([features card](../bench/accuracy/features/README.md)). Levels have no accuracy card.\n\n## Connectors\n\n([connectors.md](connectors.md))\n- **Jira and Linear:** Jira Cloud only. The first pull reads 180 days, at most 20 pages a run. On a public repo,\n titles, links and sprint names are never stored. Write-back is tested against recorded answers, not live services.\n- **PagerDuty and incident.io:** until `services` or `incident_types` is set, every incident in the account counts.\n Incident links have the weakness under Delivery.\n- **Copilot:** needs an org App with \"Organization Copilot metrics: read\"; the workflow token can't have it. Each day\n arrives two days late.\n- **Untested live:** comment commands' access check and uploads from other CI systems are covered by tests only.\n- **GitLab:** CI only (flaky jobs, pages, merge request notes; no verdict check); merge requests, deploys and incidents aren't read yet. The GitLab job is tested against a stand-in API, not a live project.\n\n## The app\n\n- It shows what the last run published, nothing newer.\n- Pages from a private repo may be public on your plan; set `pages: artifact` (a download kept 7 days) or use\n `stackvitals ui owner/repo`.\n- GitHub Pages builds a branch about 10 times an hour at most; busy repos should set `pages: deploy`.\n- Explore loads DuckDB from jsDelivr. Its timing (2.8 to 3.2 s for a first query on 20,648 pull requests) dates from\n 2026-10-21 and is due a re-check ([scaling.md](scaling.md)).\n- Decisions need triage access and settings need write access.\n\n## The MCP server\n\n([agents card](../bench/accuracy/agents/README.md))\n- On one failure inside GitHub's log retention it adds nothing: Sonnet 86 right without it, 88 with it, of 91\n (p = 0.63). Questions beyond 90-day retention are not tested yet.\n- Its CI and flow tools need a GitHub token. Without published data they read live: up to 90 days of CI, 3 months\n of pull requests.\n- It never changes a repo; `propose_change` returns a link a person submits.\n- It offers 11 tools by default; the other 24 (Portal, Community, contribution and detail tools) load with\n `--tools all`.\n\n## Failure modes\n\nWhat happens when something goes wrong mid-run. Each line is held by a test in `tests/test_flow_*.py`.\n\n| What goes wrong | What StackVitals does | Test |\n|---|---|---|\n| Two runs push at once | The later one re-runs its steps on the fresh data; neither side is lost | `test_overlapping_runs_converge_without_losing_either_side` |\n| A run dies before its commit | Nothing is half-written; the next run catches up | `test_a_run_that_dies_before_its_commit_leaves_nothing_and_the_next_run_catches_up` |\n| The same event arrives twice | Nothing changes the second time | `test_the_same_event_processed_twice_changes_nothing` |\n| One module fails | It is reported; the others still run and save | `test_a_failing_step_does_not_lose_the_other_steps_work_and_is_reported` |\n| A comment, chat post or issue is refused | Noted in the summary; the data is already saved | `test_a_hook_that_fails_is_noted_and_the_next_hooks_still_run` |\n| The API budget runs out | What was read is saved; the next run resumes | `test_a_run_that_spends_its_budget_still_saves_what_it_read` |\n| GitHub asks the issue finder's GraphQL reads to slow down | Waits as told (`Retry-After`), shared by every client on the token | `test_secondary_limit_uses_retry_after` |\n| The network drops during the issue finder's reads | Retries, then gives up cleanly with its own error | `test_retries_network_drops_then_gives_up_cleanly` |\n| A connector key is refused | Said without the key; what was pulled is kept | `test_a_refused_key_is_said_without_the_key_and_keeps_what_was_pulled` |\n| A test report is hostile (an XML bomb) | Refused, never a crash | `test_hostile_xml_is_refused_without_crashing` |\n| A JSON test report stopped early | Read and marked as cut short | `test_a_json_report_that_stopped_early_says_so` |\n| A pull request's own files try to fool or break the dependency check | Odd file names can't inject workflow commands, a renamed or off-registry package borrows no verdict, an unreadable lockfile is skipped | `test_the_pr_check_cannot_be_fooled_or_broken_by_the_prs_own_files` |\n\n**Not tested yet:** Bors and other merge bots outside GitHub's merge queue, monorepo task runners (Nx, Turborepo,\nBazel) that skip unchanged tests, and GitHub Enterprise Server.\n","methods":"Every headline number in StackVitals carries its sample size and a 95% range. This page lists the method and the\nsettings each one uses, so anyone can check them against the code (`src/stackvitals/core/stats.py`,\n`core/changes.py`, `core/ai_outcomes.py`, `src/mergescout/bench/`) and against the accuracy cards\n([accuracy.md](accuracy.md)).\n\n## Shares: Wilson ranges\nA share of k in n gets Wilson's score interval at z = 1.96. With no trials, the range is 0 to 1.\n\n## Medians and percentiles: order-statistic ranges\nA median or percentile gets a distribution-free range from the binomial order statistics: positions n·q ± 1.96·√(n·q·(1−q)),\nwith no assumption about the shape of the data. Under 6 values, no range is shown.\n\n## Waiting times: Kaplan-Meier\nTime to a first answer counts items still waiting instead of dropping them:\n- an item still waiting is censored at the time of the scan;\n- an item closed or merged without an answer is censored when it closed.\n\nThe median comes with a Brookmeyer-Crowley range on Greenwood's variance. When the curve never clearly drops below one\nhalf, the upper end reads \"or more\". Under 10 items, the page says \"too few\".\n\n## Weekly changes: a test per number, then false-alarm control\n**The test.** Each scan compares the latest 7 days with the 4 weeks before:\n- times use Mann-Whitney (medians shown);\n- shares use Fisher's exact test;\n- counts use a binomial test against the weekly average.\n\nFewer than 5 items on either side is not a test: it says \"too few to tell\" and doesn't count against the others.\n\n**Calibration.** Work arrives in batches, so events in a week are not independent. Each number is also tested for each\nof the repo's past 8 weeks, and the spread of those results (mean squared z, each capped at 16) widens this week's\ntest. The spread is blended with a typical swing worth 4 weeks:\n- 1.5 for review times, set on half of 20 public repos and checked on the other half;\n- 1.0 for shares and counts.\n\nThe result is read on a t-distribution with one degree of freedom per week of evidence (an empirical null).\n\n**False-alarm control.** Benjamini-Hochberg at q = 0.1 over every test the scan actually ran. Only survivors read as\nchanged; the digest says how many numbers it checked.\n\n**Smallest change it could catch.** Each check states the change it would catch about 80% of the time in a scan of\nthat many checks: a factor for times, points for shares.\n\n## Small repos: shrinkage toward similar repos\nA small repo's share (for example first-try green) is pulled toward similar public repos:\n- **Prior:** a Beta(a, b) per peer group (same language and size band, published only with 20+ repos), fitted by\n beta-binomial maximum likelihood to the group's (hits, tries).\n- **Repo's value:** the posterior Beta(a + k, b + n − k): its mean, with a 95% range from its quantiles.\n\nRaw and shrunken values are both shown, with how far the peers pulled the number.\n\n## AI-assisted work: like with like\n**Matching.** AI-assisted and other pull requests are compared only within matched groups:\n- the same repo and month;\n- the same size band, log2(lines added + deleted + 1);\n- for the same-author view, the same author and size band.\n\n**Estimate.** The gap is a Mantel-Haenszel risk difference with Sato's variance, and a 95% range. When every group goes\nthe same way, the no-gap standard error is used so the range stays honest.\n\n**Groups too small:** a group with fewer than 5 matched PRs says nothing; under 10 PRs on a side, numbers are left out.\n\n**Check:** shuffling the AI labels within groups (200 placebos) shows the spread of gaps when nothing is going on.\n\nThese comparisons are observational: matching removes repo, month, size and author differences, not the choice of\nwhich work people give to AI.\n\n## Comparing StackVitals with other rules\nOn the accuracy cards ([accuracy.md](accuracy.md)), every \"ours against theirs\" carries a test:\n- **Rules scored on the same items:** McNemar's exact test on the items only one of the two got right.\n- **Independent samples:** Fisher's exact test.\n- **A rival's rate built from several measured parts** (for example \"passed on retry\", which flags our events plus\n the ones we leave out): a 95% range from 20,000 Jeffreys posterior draws of each part (seed 7), and the range of the\n difference against ours.\n\nA difference whose test or range doesn't exclude zero is printed as \"not significant\". It never reads as a win.\n\n## Labels\nEach card's labelled sample is labelled twice, by two different model families, each blind to StackVitals' verdict:\n1. **Claude**, which made the first labels.\n2. **Gemini (Flash-Lite)**, from the same codebook and evidence.\n\nDisagreements are settled by a third reading with both answers and the evidence. Cards publish both labellers'\nagreement (share and Cohen's kappa) and every changed label. No person has audited the labels yet.\n\nOnly links and labels are published, never log text.\n","rules":"Every rule a StackVitals verdict or number rests on, from `bench/accuracy/registry.json`: what it does, the data it was tuned on and checked on, the bar it had to meet (set before the check where a date says so), its result and each change since. The card linked under each rule has the method and the labels. Generated; a test keeps it in step.\n\n## `flaky.event` (version 3)\n\nA job is flaky when the same code failed and passed: a re-run of the same run, or another run on the same tree.\n\n- **Card:** [bench/accuracy/flaky](../bench/accuracy/flaky/README.md)\n- **Tuned on:** none (written before sampling)\n- **Checked on:** 263 failed jobs in 51 repos (flaky/items.csv)\n- **Bar:** event precision lower bound at least 85% (set 2026-10-21)\n- **Result:** met (92-99%); ties the plain retry rule scored on the retries it can see (96.9%); history confirms 42 of 112 flagged flakes as not the change and can't refute any\n- **How sure:** validated\n- **Changed 2026-10-22:** was same-code flips in any workflow; why: all 3 flips that weren't real flakes, and 5 checks of the PR's own text, were pull-request runs of workflows that also run on PR edits or labels; effect: 9 of 108 events left out (3 wrong, 5 PR-text checks, 1 real timing flake); 99 of 99 kept are real\n- **Changed 2026-10-23:** was pull-request flips left out in PR-edit workflows; why: held out, all 17 flips in such workflows were real flakes; effect: reverted to the earlier rule\n\n## `flaky.known_flaky` (version 4)\n\nA pull request's job failure is called known flaky (shown as \"Likely flaky: check the error, then re-run it\", never \"safe\") only when the job had 3+ flakes in the window, one in the failing step; the failing step's log, up to its first error, shows an outside service, the runner or a wait failing and no failing test; and no line there names a file the pull request changed. A changed file named reads \"maybe yours\"; anything else reads \"flaked before\" (look first). It never passes the verdict check on its own.\n\n- **Card:** [bench/accuracy/flaky](../bench/accuracy/flaky/README.md)\n- **Tuned on:** masking.py's 36 failures in 9 repos and the first held-out read's 108 calls in 15 repos (heldout.py), which counted as tuning once it was used to write this rule\n- **Checked on:** pre-registered 2026-10-28 (flaky/README.md), then scored on a fresh read of 36 repos none of the earlier reads used: 197 known-flaky calls by history in 19 jobs and 9 repos, 44 labelled at most 3 per job (flaky/safe-rule-results.json)\n- **Bar:** masking upper bound at most 5% (set 2026-10-21)\n- **Result:** bar not met: the rule kept 4 of the 44 fresh calls (9%; 3 jobs, 2 repos), none the change's own (0 of 4, 0-49%); 73 clear calls with none caused would be needed. On the data it was written from, 0 of 31 and 0 of 8. The history rule alone: 5 of 22 clear fresh calls caused (23%)\n- **How sure:** bar failed (too few calls to show 5%: the label says \"likely\", the advice says to check the error first, and the verdict check waits for a green re-run)\n- **Changed 2026-10-22:** was any earlier flake; why: 15 of 34 failures it called safe were caused by the change (44%); effect: 7 called safe (5 clearly labelled, 0 caused), all one job; the other 29 now cost a look\n- **Changed 2026-10-23:** was known flaky passes the verdict check; why: 13 of 81 held-out safe calls were the change's own failure; matching past flakes' errors didn't separate them; effect: known flaky still reads 'likely a flake, re-run it', but the verdict check passes only once CI is green\n- **Changed 2026-10-23:** was known flaky: likely a flake, re-run it; why: in the agent head-to-head a smaller model trusted it on 2 failures the change caused; effect: now asks to check the error isn't from the change before re-running; those 2 were then answered right\n- **Changed 2026-10-28:** was 3+ flakes in the window, one in the failing step (history alone); shown as \"Known flaky\"; why: held out, 13 of 81 such calls were the change's own failure; a flake's sign in the failing step's log and no changed file named separated them on the tuning data (0 of 31 caused when both held; 8 of 8 clear caused when a changed file was named); effect: fresh read: 4 of 44 calls kept, 0 caused (0-49%), so the 5% bar is unproven; shown as \"Likely flaky\" with its evidence, never \"safe\"; the rest read flaked before, or maybe yours (4 of 5 clear fresh cases caused)\n\n## `flaky.outside_failure` (version 1)\n\nThe failing step's log shows a registry, cache, network or runner error and no failing tests.\n\n- **Card:** [bench/accuracy/flaky](../bench/accuracy/flaky/README.md)\n- **Tuned on:** the 284 labelled failures it is scored on (signatures written from common errors, then checked there)\n- **Checked on:** 633 unlabelled failures from the same reads (flaky/outside-fresh-results.json), judged by re-runs and the default branch\n- **Bar:** none caused by the change among matches (set 2026-10-22)\n- **Result:** tuning set: 35 matched, none caused (90-100%); held out: 41 matched, none of 38 clearly labelled caused (0-9%); fresh: 5 of 8 history-decided matches not caused, the other 3 one repo's lasting registry rate limit\n- **How sure:** validated\n- **Changed 2026-10-22:** was failure-section match including 'failed to download and build'; why: a dependency's own build failing matched; effect: taken out; 4 matches given up for safety\n- **Changed 2026-10-22:** was TEST_FAILED matching any 'FAILED:'; why: ninja's 'FAILED:' build lines hid an sccache outage; effect: test-runner forms only\n- **Tried and dropped:** withhold 'outside failure' when the pull request edits CI files; why: on 36 fresh matches it caught none of the change-caused cases and took the excuse from 4 real outages\n\n## `flaky.already_failing` (version 1)\n\nA pull request's job failure reads already failing on main when the default branch failed in the same step in the 3 days before with the same error (2 of every 3 error lines shared); it still blocks the verdict check.\n\n- **Card:** [bench/accuracy/flaky](../bench/accuracy/flaky/README.md)\n- **Tuned on:** 23 labelled pull-request failures in 12 repos whose step had just failed on the default branch (flaky/already-results.json)\n- **Checked on:** 60 held-out candidates in a second, wider read\n- **Bar:** caused by the change at most 5% at the upper bound before it may pass the verdict check (set 2026-10-22)\n- **Result:** not shown: same error 1 of 6 held out (only 11 of 60 matched), 0 of 12 tuned; the step alone 5 of 51 held out\n- **How sure:** early observation (1 of 6 held-out matches with the same error)\n- **Changed 2026-10-22:** was the same step alone; why: 4 of 22 such failures were caused by the change, with a different error in that step; effect: 12 matched, none caused\n\n## `flaky.maybe_flaky` (version 1)\n\nA failure with no flake history whose failing step (or test message) shows a wait or deadline running out, a benchmark gate or a live service in a test reads maybe flaky (re-run once to tell); it still blocks.\n\n- **Card:** [bench/accuracy/flaky](../bench/accuracy/flaky/README.md)\n- **Tuned on:** the 284 labelled logs and the agent card's misses (flaky/maybe-results.json)\n- **Checked on:** 150 never-flaked held-out failures, 2 matched\n- **Bar:** caused by the change at most 20% at the upper bound (it asks for a re-run, it doesn't excuse) (set 2026-10-22)\n- **Result:** fits: 0 of 22 tuned; held out the signs matched only 2 of 150 (1 the change's): too rare to judge\n- **How sure:** early observation (2 held-out matches in 150 failures)\n- **Changed 2026-10-23:** was track record over all 24 signature matches; why: the product says maybe flaky only for never-flaked failures (a whole-release review); effect: the track record counts never-flaked matches: 1 of 6 (0 of 4 tuning, 1 of 2 held out)\n\n## `flaky.pr_details` (version 1)\n\nA pull-request failure in a workflow that also runs when the PR's title, description or labels change, with no failing test in the step, whose error lines are about the PR (the pull request, a PR title or label, a label to add or missing, a checkbox, checklist or template left unchecked or incomplete), reads PR details: fix the PR, not the code; it still blocks.\n\n- **Card:** [bench/accuracy/flaky](../bench/accuracy/flaky/README.md)\n- **Tuned on:** the agent head-to-head's misses (agents/results2.json): 9 such failures in 4 repos, called known flaky or new\n- **Checked on:** none apart from the tuning repos: all 231 labelled pull-request failures (47 repos) were scored, the 9 included\n- **Bar:** caused by the change's code at most 20% at the upper bound (it changes the advice, it doesn't excuse) (set 2026-10-23)\n- **Result:** 1 of 24 matches the change's code (1-20.2%), in 4 repos: at the bar's edge, from a small sample; 21 of the 24 had read known flaky\n- **How sure:** early observation (24 matches in 4 repos, one repo gave most)\n- **Changed 2026-10-23:** was error lines mentioning a title, label or description anywhere; why: a test assertion about chart labels matched; effect: the words must be about the PR\n- **Changed 2026-10-23:** was only jobs whose steps read the PR (triggers.metadata_jobs); why: label checks gated by `if:` and checks reading the PR in a script were missed (2 matches of 24); effect: any job of a workflow run by PR edits, with the error guard\n- **Changed 2026-10-23:** was \"checkbox\", \"template\" or \"PR\" alone; any failing step; why: a whole-release review: a template rendering error in a CI workflow run on labels matched; effect: those words need the PR's wording beside them, and a failing test rules it out; still 24 of 24 matched\n\n## `dora.deploy_source` (version 2)\n\nDeployments API to production, else deploy workflows unless a side service, else non-prerelease releases, else release workflows; workflow names matched on deploy, release, publish or push-image minus 47 deny words.\n\n- **Card:** [bench/accuracy/dora](../bench/accuracy/dora/README.md)\n- **Tuned on:** the delivery repos of the platform work\n- **Checked on:** 25 untuned repos (dora/sources-labels.csv), then 35 more drawn after the rule was fixed (dora/sources-more-labels.csv)\n- **Bar:** none set before sampling\n- **Result:** 23 of 25, then 30 of 35 held out: 53 of 60 (78-94%); DevLake default 9 of 60, configured 22 of 60; workflow recall 60% on the held-out repos\n- **How sure:** validated\n- **Changed 2026-10-21:** was display name checked against the deny list; why: a file named deploy.yml titled 'Check and Publish' hit the deny word 'check'; effect: a file named only deploy, release or publish ships whatever its display name; 22 to 23 of 25\n\n## `dora.fix_chain` (version 2)\n\nA revert links to the pull request it undoes and the deployment that shipped it; never shipped when no deployment ran it.\n\n- **Card:** [bench/accuracy/dora](../bench/accuracy/dora/README.md)\n- **Tuned on:** 18 reverts in 23 repos (the same set it is scored on)\n- **Checked on:** 99 reverts in 16 more repos chosen for the most reverts (dora/linkage-more-results.json)\n- **Bar:** none set before sampling\n- **Result:** right on 87 of 89 links checked with the compare API across both samples (73 of 73 held out); time order wrong on 71 of 89\n- **How sure:** validated\n- **Changed 2026-10-22:** was every revert counted as a failed deployment; why: 11 of 18 undid a change that never shipped; effect: never-shipped reverts are no failed deployment\n\n## `community.regular_responders` (version 2)\n\nPeople who answered 10+ others' issues or first-reviewed 2+ others' pull requests in a year, or who labelled, assigned, closed or marked as duplicate someone else's issue (only triage rights allow it), count as the project's responders.\n\n- **Card:** [bench/accuracy/community](../bench/accuracy/community/README.md)\n- **Tuned on:** 400 comments from 85 repos (community/labels-main.csv)\n- **Checked on:** 400 comments from 86 other repos (labels-validation.csv); for version 2 the same set, used once for the decision\n- **Bar:** none set before sampling\n- **Result:** held out: catches 57% of project answers weighted (47% before), 4 more answers; holds on either labeller's labels\n- **How sure:** validated\n- **Changed 2026-10-23:** was answers and first reviews only; why: triage acts mark people acting for the project; on the labelled comments the rule missed, they found 8 project answers among 11; effect: held out: 4 more project answers (47% to 57% weighted); on Claude's labels 45% to 53%, on Gemini's 32% to 38%\n- **Tried and dropped:** also counting people with 3+ merged pull requests; why: caught 7 more points of project answers on the first set, but 9 of the 15 comments it added were drive-bys or other users' replies\n\n## `community.first_response_km` (version 2)\n\nTime to first project response with items still waiting kept in (Kaplan-Meier); an item closed unanswered is censored at closing.\n\n- **Card:** [bench/accuracy/community](../bench/accuracy/community/README.md)\n- **Tuned on:** none\n- **Checked on:** 86,733 outside issues in 2,370 repos\n- **Bar:** none\n- **Result:** median counting waiting issues is 5.2 times the answered-only one\n- **How sure:** validated\n- **Changed 2026-10-22:** was closed-unanswered items treated as still waiting; why: they stopped being at risk when they closed; effect: censored at closing\n\n## `uncertainty.digest` (version 2)\n\nBenjamini-Hochberg at q = 0.1 over every check in a scan, on p-values calibrated against the repo's past 8 weeks (typical swing 1.5 for times, each past week capped at a four-sigma swing); pickup and opened-to-merged time are also checked over 14 days, calibrated on past windows that don't overlap them.\n\n- **Card:** [bench/accuracy/uncertainty](../bench/accuracy/uncertainty/README.md)\n- **Tuned on:** swing chosen on half of 20 public repos; the cap on halves of 29\n- **Checked on:** the other halves; the replay on 26 repos\n- **Bar:** at most 10% of shuffled scans flag anything (set 2026-10-21)\n- **Result:** 7.5% (met); 10x slowdowns caught 25% in their first week, 35% in their second\n- **How sure:** validated\n- **Changed 2026-10-24:** was weekly checks only; why: in a slowdown's second week the weekly check's baseline holds the first slow week, so 10x slowdowns were caught in 15% of scans; effect: on the same replay, second-week catches of 10x slowdowns 15% to 35%, first-week 31% to 25%, false alarms 7.4% to 7.5%; CUSUM charts tried and dropped (no gain)\n\n## `uncertainty.shrinkage` (version 1)\n\nA small repo's first-try share pulled toward its peer group's beta-binomial prior (maximum likelihood, groups of 20+).\n\n- **Card:** [bench/accuracy/uncertainty](../bench/accuracy/uncertainty/README.md)\n- **Tuned on:** half of 6,623 repos fit the priors\n- **Checked on:** 1,923 repos of the other half\n- **Bar:** lower out-of-sample error under 30 pushes; ranges cover 90-97% (set 2026-10-21)\n- **Result:** 29% less squared error at 3 pushes; 94.6% coverage (met)\n- **How sure:** validated\n\n## `ai.matched` (version 1)\n\nAgents' and AI-marked PRs compared within the same repo, month and size band (Mantel-Haenszel with Sato's variance).\n\n- **Card:** [bench/accuracy/ai](../bench/accuracy/ai/README.md)\n- **Tuned on:** none\n- **Checked on:** 1.46 million PRs in 21,804 repos\n- **Bar:** shuffled AI labels' range includes zero (set 2026-10-21)\n- **Result:** met (-1.2 to +1.5 points)\n- **How sure:** validated\n\n## `dora.incident_link` (version 1)\n\nAn incident is linked to the last production deployment (or release) finished before it was reported (DevLake's rule).\n\n- **Card:** [bench/accuracy/dora](../bench/accuracy/dora/README.md)\n- **Tuned on:** none (DevLake's published rule)\n- **Checked on:** 60 regression and incident issues naming a version, 39 crawl repos; 15 named the release that broke\n- **Bar:** none set before sampling: a first measurement of a rule we adopted from DevLake (set 2026-10-23)\n- **Result:** right 6 of 15 (40%, 20-64%); the version the report names: 10 of 15, held out 4 of 9 against 2 of 9 (p 0.5): kept, with the caveat in docs/dora-guide.md\n- **How sure:** early observation (15 reports named the release that broke)\n\n## `ai.adoption` (version 1)\n\nThroughput, people's merged PRs, review wait and merge rate after a repo starts taking agents' PRs, by staggered difference-in-differences against repos that haven't started (preregistration.md).\n\n- **Card:** [bench/accuracy/ai](../bench/accuracy/ai/README.md)\n- **Tuned on:** none (pre-registered 2026-10-23)\n- **Checked on:** 1,764 adopting and 16,269 comparison repos\n- **Bar:** leads and the 3-month-earlier negative control include zero (set 2026-10-23)\n- **Result:** merge rate: no measurable change (-2.7 to +0.7 points); throughput and review wait: not credible (adopters already growing)\n- **How sure:** validated\n\n## `ai.detection` (version 2)\n\nA PR is an agent's (agent account or agent branch) or AI-assisted (AI trailer in its last 5 commits or its description, an agent task link in the description, or an AI label in any spelling).\n\n- **Card:** [bench/accuracy/ai](../bench/accuracy/ai/README.md)\n- **Tuned on:** odd ids of 400 labelled PRs (v2 additions: Jules links, label spellings)\n- **Checked on:** even ids (208 decided)\n- **Bar:** precision of 95% or more; recall reported as a floor (set 2026-10-23)\n- **Result:** met: 191 of 194 (95.5-99.5%); recall 78.8% weighted, 66.3% on the held-out half\n- **How sure:** validated\n- **Changed 2026-10-23:** was AI trailers in the last 5 commits, labels matched exactly, agent account or branch; why: 5 of 23 missed PRs named the tool in their description; label spellings and Jules task links missed in the tune half; effect: recall 75.0% to 78.8% weighted (63.9% to 66.3% held out); precision 185 of 187 to 191 of 194\n"}
|