Does the rework map print the same story on strangers' repos?
Measured 2026-09-03 on 11 public GitHub repositories. Read-only: every repo was cloned into /tmp/panout-ideas/public-repos/, nothing was pushed, no issue or PR was opened, no maintainer was contacted.
Question: on repos the founder has never touched, is the share of commits reworked within 30 days higher for agent-authored commits than for human-authored ones, and is the gap positive, negative, or noise?
Scripts: classify.py (discovery/attribution), measure_pub.py (rework measurement), report.py (tables). Raw per-commit output in raw/*.json.
1. Method
Ported from /tmp/panout-ideas/backtest/measure.py; the R0 definition is byte-for-byte the same test, so public numbers are directly comparable to the founder-repo numbers in /tmp/panout-ideas/backtest/REPORT.md.
Clones. git clone --shallow-since=2026-02-01 --single-branch (full blobs, ~214 days of history โ deeper than the 180-day window so that every measured commit has its parent present). Discovery used cheap treeless clones (--filter=tree:0 --no-checkout).
Agent classification (trailer/marker). A commit is agent-authored if subject or body matches Co-authored-by: (Claude|Codex|Cursor|Copilot|Devin), a Co-authored-by: line whose address contains claude|copilot|codex|cursoragent|devin-ai-integration, Generated with [Claude Code], or ๐ค Generated with; or if the git author is the Copilot bot (198982749+Copilot@users.noreply.github.com) or literally named Copilot/Claude/Codex. Everything else is human. This is the same trailer-only rule as the founder backtest.
Population. Default branch (HEAD), commits authored in the last 180 days (since 2026-03-07), merge commits excluded from measurement.
Sample. Commits between 180 and 30 days old, so every commit has a complete 30-day forward window. Stratified: up to 100 most recent agent commits and 100 most recent human commits per repo (the founder backtest used a single un-stratified cap of 400; stratifying guarantees both classes are measurable in repos where one class is rare). Reduced from 300 to 100-per-class to hold total runtime under the budget โ this is the one deliberate deviation from the brief, and Section 6 shows what it costs.
Rework test. For commit C: added line ranges from git diff C^ C --unified=0, skipping lockfiles (package-lock.json, yarn.lock, pnpm-lock.yaml, Cargo.lock, poetry.lock, uv.lock, go.sum, composer.lock, Gemfile.lock), minified bundles, binaries, images, fonts, snapshots, and .sha256; top 20 files by added lines. E = newest descendant of C on the default branch within 30 days. Then:
- R0 โ
git blame --reverse --porcelain C..E -L <ranges> -- <file>(identical tomeasure.py). - R1 โ same plus
-w -M -C(whitespace-, rename- and copy-insensitive).
Reverse blame attributes each line to the last commit in which it survived; any attribution other than E means the line was changed or deleted inside the window. C counts as reworked if any added line fails to survive to E.
Time to first rework. Hours from C to the earliest last-surviving commit. As in the founder backtest this is a lower bound (the edit lands at that commit's child); 0 h means "the next commit touched it".
Path class. Each commit is assigned the class of the bucket holding most of its added lines, using path rules evaluated in order: ci (.github/workflows, .circleci, .gitlab-ci, azure-pipelines, Jenkinsfile, โฆ) โ tests (tests/, __tests__/, spec/, e2e/, *_test.go, *.test.ts, test_*.py, *Tests.cs) โ docs (.md/.mdx/.rst/.adoc, docs/, website/) โ src (known code extensions) โ config (.json/.yaml/.toml/.csproj/Dockerfile/โฆ) โ other.
2. Selection
Discovery started from gh searches (gh search prs 'Co-authored-by: Claude' --merged, gh search prs --author app/copilot-swe-agent --merged, gh search prs 'head:codex/' --merged, and gh api search/commits with the cloak-preview header). Those searches are not usable for this selection: sorted by recency they return an almost pure long tail of one-person hobby repos (the top hit across 100 merged Claude-trailer PRs had 15 PRs; nothing in the first 40 rows had the commit volume required), and the GitHub search API secondary rate limit repeatedly blocked pagination. So discovery was flipped: 48 well-known, high-traffic public repos were treeless-cloned and their agent share was computed from the commit history itself, which is both cheaper and the same measurement used downstream.
Candidates with โฅ300 commits in the last 180 days (48 probed, 44 qualified). Agent share is by the trailer rule above:
| Repo | Commits 180d | Agent | Share | Repo | Commits 180d | Agent | Share |
|---|---|---|---|---|---|---|---|
| microsoft/aspire | 1911 | 1317 | 68.9% | supabase/supabase | 3348 | 359 | 10.7% |
| github/spec-kit | 1331 | 700 | 52.6% | Skyvern-AI/skyvern | 2546 | 237 | 9.3% |
| n8n-io/n8n | 5487 | 2210 | 40.3% | block/goose | 1792 | 150 | 8.4% |
| mastra-ai/mastra | 5526 | 1795 | 32.5% | cloudflare/workers-sdk | 1335 | 97 | 7.3% |
| Azure/azure-sdk-tools | 1214 | 384 | 31.6% | All-Hands-AI/OpenHands | 1927 | 136 | 7.1% |
| elizaOS/eliza | 20648 | 6388 | 30.9% | langflow-ai/langflow | 1697 | 110 | 6.5% |
| microsoft/typescript-go | 847 | 232 | 27.4% | openai/codex | 5882 | 307 | 5.2% |
| gradio-app/gradio | 425 | 103 | 24.2% | microsoft/playwright | 1498 | 65 | 4.3% |
| temporalio/temporal | 1225 | 207 | 16.9% | cline/cline | 2216 | 86 | 3.9% |
| microsoft/vscode-copilot-chat | 526 | 86 | 16.3% | open-webui/open-webui | 2716 | 103 | 3.8% |
| pydantic/pydantic-ai | 1121 | 171 | 15.3% | danny-avila/LibreChat | 1530 | 57 | 3.7% |
| denoland/deno | 2202 | 331 | 15.0% | apache/airflow | 4391 | 135 | 3.1% |
| PostHog/posthog | 22010 | 3306 | 15.0% | coder/coder | 3531 | 104 | 2.9% |
| BerriAI/litellm | 11801 | 1708 | 14.5% | pola-rs/polars | 1070 | 31 | 2.9% |
| grafana/grafana | 6192 | 862 | 13.9% | browser-use/browser-use | 1430 | 40 | 2.8% |
| crewAIInc/crewAI | 780 | 106 | 13.6% | zed-industries/zed | 3969 | 67 | 1.7% |
| 12 more (ollama, sst/opencode, immich, astro, dagger, MoviePilot, spring-ai, google-cloud-go, genai-toolbox, openai-agents-python, charmbracelet/crush, QuantumNous/new-api) | 560โ5659 | 0โ29 | 0.0โ1.7% |
Selected 11 (bold above; the brief asked for 10, temporalio/temporal was added for a second Go/server-side data point). Selection rules applied: โฅ300 commits/180d, both classes present, prefer 20โ80% agent share, real software, language spread.
| # | Repo | Primary language | Commits 180d | Agent share | Dominant agent marker | Merge style |
|---|---|---|---|---|---|---|
| 1 | microsoft/aspire | C# | 1922 | 69.0% | Co-authored-by: Copilot | squash (25 merge commits) |
| 2 | github/spec-kit | Python + templates | 1331 | 52.6% | Co-authored-by: Copilot | squash |
| 3 | n8n-io/n8n | TypeScript | 5486 | 40.3% | Co-authored-by: Claude | squash |
| 4 | mastra-ai/mastra | TypeScript | 5530 | 32.5% | Claude / Codex mix | squash |
| 5 | Azure/azure-sdk-tools | C# + Python + TS | 1211 | 31.5% | Copilot bot author | squash (0 merge commits) |
| 6 | elizaOS/eliza | TypeScript | 20641 | 31.0% | Generated with [Claude Code] | merge + squash |
| 7 | microsoft/typescript-go | Go | 847 | 27.4% | Copilot / Claude | squash |
| 8 | gradio-app/gradio | Python + Svelte | 425 | 24.2% | Co-authored-by: Claude | squash |
| 9 | temporalio/temporal | Go | 1224 | 16.8% | Claude / Copilot | squash |
| 10 | microsoft/vscode-copilot-chat | TypeScript | 527 | 16.3% | Co-authored-by: Copilot | squash |
| 11 | denoland/deno | Rust + JS | 2201 | 15.0% | Co-authored-by: Claude | squash |
Only 6 of 11 land inside the 20โ80% target band. That band is scarce in public code: of 44 qualifying repos, 8 exceeded 20% and 26 were below 8%. The remaining slots were filled from the 13โ17% tier, choosing for language spread (Go, Rust) rather than share.
Excluded despite qualifying: PostHog/posthog, BerriAI/litellm, grafana/grafana (all โฅ6k commits in 180 days โ clone and measurement cost outside the runtime budget), and repos below ~8% agent share where the agent cell would be too thin to read.
3. Squash merges and PR-level attribution
Nine of the eleven repos squash-merge; Azure/azure-sdk-tools has zero merge commits in 180 days and microsoft/aspire has 25 in 1,922. Every agent contribution therefore lands as one linear commit on the default branch, and the co-author trailer survives into that squash commit โ so trailer classification works without PR lookups.
For the three Copilot-agent repos the brief asked for PR-level attribution, so it was done: gh search prs --repo <R> --author app/copilot-swe-agent --merged gave the set of PR numbers opened by the Copilot coding agent (805 / 314 / 71), matched to commits by the trailing (#NNNN) in the squash subject. Result on the measured samples:
| Repo | trailer=agent AND PR opened by Copilot | trailer=agent, PR opened by a human | trailer=human, PR by Copilot | both human |
|---|---|---|---|---|
| microsoft/aspire | 13 | 84 | 0 | 97 |
| Azure/azure-sdk-tools | 25 | 36 | 0 | 60 |
| microsoft/vscode-copilot-chat | 5 | 80 | 0 | 95 |
The trailer rule has zero false negatives against PR-level authorship, but it is far broader than it: 84โ94% of trailer-flagged commits come from PRs a human opened, that merely carry a Co-authored-by: Copilot trailer. The trailer measures "an agent was in the room", not "an agent shipped this". Section 6 shows the two definitions disagree on sign.
4. Results
4.1 Rework within 30 days, agent vs human
| Repo | Commits 180d | Agent share | n agent | n human | R0 agent | R0 human | R0 gap | R1 agent | R1 human | R1 gap | 95% CI (R1 gap) |
|---|---|---|---|---|---|---|---|---|---|---|---|
| microsoft/aspire | 1922 | 69.0% | 97 | 97 | 53.6% | 48.5% | +5.2 | 47.4% | 42.3% | +5.2 | โ8.8 โฆ +19.1 |
| github/spec-kit | 1331 | 52.6% | 100 | 96 | 38.0% | 56.2% | โ18.2 | 38.0% | 56.2% | โ18.2 | โ32.0 โฆ โ4.5 |
| n8n-io/n8n | 5486 | 40.3% | 99 | 99 | 55.6% | 57.6% | โ2.0 | 54.5% | 56.6% | โ2.0 | โ15.9 โฆ +11.8 |
| mastra-ai/mastra | 5530 | 32.5% | 99 | 99 | 98.0% | 89.9% | +8.1 | 98.0% | 89.9% | +8.1 | +1.5 โฆ +14.6 |
| Azure/azure-sdk-tools | 1211 | 31.5% | 62 | 60 | 38.7% | 41.7% | โ3.0 | 35.5% | 38.3% | โ2.8 | โ20.0 โฆ +14.3 |
| elizaOS/eliza | 20641 | 31.0% | 87 | 98 | 82.8% | 86.7% | โ4.0 | 81.6% | 86.7% | โ5.1 | โ15.7 โฆ +5.4 |
| microsoft/typescript-go | 847 | 27.4% | 100 | 99 | 23.0% | 24.2% | โ1.2 | 21.0% | 22.2% | โ1.2 | โ12.7 โฆ +10.2 |
| gradio-app/gradio | 425 | 24.2% | 76 | 99 | 96.1% | 86.9% | +9.2 | 96.1% | 86.9% | +9.2 | +1.2 โฆ +17.1 |
| microsoft/vscode-copilot-chat | 527 | 16.3% | 86 | 95 | 55.8% | 30.5% | +25.3 | 54.7% | 29.5% | +25.2 | +11.2 โฆ +39.1 |
| denoland/deno | 2201 | 15.0% | 100 | 98 | 55.0% | 14.3% | +40.7 | 53.0% | 10.2% | +42.8 | +31.3 โฆ +54.3 |
| temporalio/temporal | 1224 | 16.8% | 100 | 96 | 31.0% | 49.0% | โ18.0 | 28.0% | 47.9% | โ19.9 | โ33.2 โฆ โ6.6 |
| pooled | 1006 | 1036 | 56.5% | 53.8% | +2.7 | 54.7% | 52.1% | +2.5 | โ1.8 โฆ +6.9 |
CI is a normal-approximation interval on the difference of two proportions; it accounts for sampling only, not for the confounds in Section 6.
4.2 Direction of the gap
| R0 | R1 | |
|---|---|---|
| Repos with gap > +5 pts (agent reworked more) | 5 | 5 |
| Repos with gap < โ5 pts (agent reworked less) | 2 | 3 |
| Repos within ยฑ5 pts (noise) | 4 | 3 |
R1 gaps, sorted: deno +42.8, vscode-copilot-chat +25.2, gradio +9.2, mastra +8.1, aspire +5.2, typescript-go โ1.2, n8n โ2.0, azure-sdk-tools โ2.8, eliza โ5.1, spec-kit โ18.2, temporal โ19.9.
Pooled gap is +2.5 points with a CI spanning zero. -w -M -C (R1) barely moves anything: the largest R0โR1 change is 2.1 points (deno). Whitespace and rename insensitivity is not what drives these numbers.
For contrast, the founder-repo backtest reported pooled agent 64.6% vs human 51.4% (+13.2), and +21.7 on the founder-only slice. The public pooled gap is one fifth of that and not distinguishable from zero.
4.3 Median hours to first rework (R1, lower bound)
| Repo | agent reworked n | agent median h | human reworked n | human median h |
|---|---|---|---|---|
| microsoft/aspire | 46 | 213.1 | 41 | 170.5 |
| github/spec-kit | 38 | 135.4 | 54 | 38.2 |
| n8n-io/n8n | 54 | 68.7 | 56 | 98.1 |
| mastra-ai/mastra | 97 | 14.6 | 89 | 94.2 |
| Azure/azure-sdk-tools | 22 | 124.8 | 23 | 97.8 |
| elizaOS/eliza | 71 | 19.8 | 85 | 8.8 |
| microsoft/typescript-go | 21 | 143.9 | 22 | 184.2 |
| gradio-app/gradio | 73 | 47.8 | 86 | 21.3 |
| microsoft/vscode-copilot-chat | 47 | 52.6 | 28 | 16.4 |
| denoland/deno | 53 | 228.1 | 10 | 193.3 |
| temporalio/temporal | 28 | 133.6 | 46 | 91.6 |
| pooled | 550 | 76.5 | 540 | 67.7 |
Agent rework arrives 9 hours later than human rework at the median (76.5 h vs 67.7 h), and the per-repo sign splits 5 slower / 6 faster. No usable signal. The founder backtest saw a much larger separation (17.1 h agent vs 1.2 h human), which is a property of a single-committer repo where the author's own next commit lands minutes later.
5. What a maintainer would see: top task classes
Top two path classes by agent rework rate per repo (R1, classes with nโฅ5 agent commits):
| Repo | class 1 | class 2 | rest |
|---|---|---|---|
| microsoft/aspire | tests 51% (n=59) | other 50% (n=6) | src 47% (n=15); ci 33% (n=9) |
| github/spec-kit | config 85% (n=20) | tests 25% (n=68) | docs 22% (n=9) |
| n8n-io/n8n | tests 56% (n=63) | src 55% (n=31) | โ |
| mastra-ai/mastra | docs 100% (n=15) | tests 100% (n=54) | src 96% (n=27) |
| Azure/azure-sdk-tools | other 57% (n=7) | docs 50% (n=6) | src 42% (n=12); tests 29% (n=21); config 27% (n=15) |
| elizaOS/eliza | config 84% (n=19) | src 80% (n=30) | tests 79% (n=33) |
| microsoft/typescript-go | src 24% (n=33) | tests 22% (n=36) | other 15% (n=26) |
| gradio-app/gradio | src 100% (n=44) | tests 100% (n=18) | docs 83% (n=6); ci 60% (n=5) |
| microsoft/vscode-copilot-chat | tests 67% (n=24) | src 53% (n=53) | config 43% (n=7) |
| denoland/deno | src 60% (n=70) | tests 36% (n=28) | โ |
| temporalio/temporal | tests 28% (n=71) | src 26% (n=27) | โ |
Pooled, by class:
| class | agent n | agent rework | human n | human rework | gap |
|---|---|---|---|---|---|
| src | 345 | 60.9% | 330 | 41.8% | +19.1 |
| tests | 475 | 50.5% | 438 | 57.5% | โ7.0 |
| docs | 51 | 56.9% | 125 | 71.2% | โ14.3 |
| config | 70 | 65.7% | 80 | 46.2% | +19.5 |
| ci | 23 | 47.8% | 32 | 56.2% | โ8.4 |
| other | 42 | 33.3% | 31 | 19.4% | +14.0 |
Read as a maintainer would: in 9 of 11 repos the two named classes are simply tests and src, which are also the two largest classes by volume. In 4 repos the top class is a class with fewer than 25 agent commits (other n=6/7, docs n=6/15, config n=20). In mastra and gradio the top classes are pinned at 96โ100% for both agent and human commits โ the ranking there carries no information because nothing survives 30 days untouched in those monorepos.
The one pooled cut that looks non-obvious is src (+19.1) and config (+19.5) positive while tests (โ7.0) and docs (โ14.3) are negative. That is the most defensible finding in this report, but it is pooled across repos whose individual gaps run from โ20 to +43, so it is an artifact of which repos contribute volume to which class as much as it is a property of agents.
6. Sensitivity: the gap does not survive two obvious controls
6.1 Calendar-period matching
Sampling the 100 most recent commits of each class independently means the two samples cover different calendar periods whenever one class is rarer. The gap is largest exactly where the offset is largest:
| Repo | agent sample median date | human sample median date | offset | R1 gap |
|---|---|---|---|---|
| denoland/deno | 2026-04-24 | 2026-07-26 | 93 d | +42.8 |
| temporalio/temporal | 2026-06-24 | 2026-07-24 | 30 d | โ19.9 |
| microsoft/typescript-go | 2026-06-10 | 2026-07-15 | 35 d | โ1.2 |
| gradio-app/gradio | 2026-06-09 | 2026-07-04 | 25 d | +9.2 |
| microsoft/aspire | 2026-07-09 | 2026-06-26 | 13 d | +5.2 |
| others (n8n, mastra, eliza, spec-kit, azure-sdk-tools, vscode-copilot-chat) | โค9 d | โ18.2 โฆ +25.2 |
Recomputing the gap within calendar-month strata (strata needing โฅ10 agent and โฅ10 human commits, weighted by stratum size):
| Repo | raw R1 gap | month-stratified gap |
|---|---|---|
| microsoft/aspire | +5.2 | โ2.1 |
| github/spec-kit | โ18.2 | โ18.7 |
| n8n-io/n8n | โ2.0 | โ2.0 |
| mastra-ai/mastra | +8.1 | +9.2 |
| Azure/azure-sdk-tools | โ2.8 | โ2.9 |
| elizaOS/eliza | โ5.1 | โ4.5 |
| microsoft/typescript-go | โ1.2 | โ4.4 |
| gradio-app/gradio | +9.2 | +11.0 |
| microsoft/vscode-copilot-chat | +25.2 | +11.2 |
| denoland/deno | +42.8 | +19.7 |
| temporalio/temporal | โ19.9 | โ27.2 |
| pooled (size-weighted) | +2.5 | โ1.3 |
Time-matching cuts deno's gap by more than half and flips the pooled gap from +2.5 to โ1.3.
6.2 Trailer attribution vs PR-level attribution
Using the strict definition (agent = PR opened by app/copilot-swe-agent) instead of the trailer, on the same measured commits:
| Repo | strict-agent n | strict-agent rework | everything else n | rework | gap | trailer gap |
|---|---|---|---|---|---|---|
| microsoft/aspire | 13 | 7.7% | 181 | 47.5% | โ39.8 | +5.2 |
| Azure/azure-sdk-tools | 25 | 20.0% | 97 | 41.2% | โ21.2 | โ2.8 |
| microsoft/vscode-copilot-chat | 5 | 20.0% | 176 | 42.0% | โ22.0 | +25.2 |
The sign flips in all three repos. Commits from PRs the coding agent itself opened are reworked less than everything else; commits merely carrying an agent co-author trailer are reworked more. Cell counts are small (13/25/5), so this is not a claim that agent PRs are better โ it is a demonstration that the two attribution rules produce opposite answers on identical commits.
6.3 Within-author
Authors with โฅ10 agent-trailer and โฅ10 human commits in the same sample (holds the person fixed):
| Repo | author | agent n | agent rework | human n | human rework | gap |
|---|---|---|---|---|---|---|
| elizaOS/eliza | shawgotbags@โฆ | 39 | 76.9% | 42 | 92.9% | โ15.9 |
| elizaOS/eliza | shawmakesmagic@โฆ | 27 | 92.6% | 28 | 92.9% | โ0.3 |
| gradio-app/gradio | abubakar@huggingface.co | 42 | 95.2% | 15 | 73.3% | +21.9 |
| microsoft/vscode-copilot-chat | don.jayamanne@โฆ | 27 | 74.1% | 12 | 58.3% | +15.7 |
| denoland/deno | biwanczuk@gmail.com | 47 | 63.8% | 29 | 10.3% | +53.5 |
| pooled | 182 | 79.7% | 126 | 68.3% | +11.4 |
Only five author-repo cells qualify, and they disagree in sign. denoland/deno's entire +42.8 repo-level gap is one contributor: 47 of the 100 sampled agent commits and 29 of the 100 human commits are the same person, whose agent-trailer commits are reworked 63.8% vs 10.3% for their non-trailer commits. Whether that is "the agent produced worse code" or "this person uses the agent on the churny parts (perf work on ext/node stream paths) and hand-writes the stable parts" cannot be separated from git.
7. Sampling detail
| Repo | eligible window (30โ180 d, non-merge) | agent in window | sampled agent | sampled human | measured (both) |
|---|---|---|---|---|---|
| microsoft/aspire | 1595 | 1073 | 100 | 100 | 194 |
| github/spec-kit | 1108 | 555 | 100 | 100 | 196 |
| n8n-io/n8n | 4304 | 1610 | 100 | 100 | 198 |
| mastra-ai/mastra | 4137 | 1308 | 100 | 100 | 198 |
| Azure/azure-sdk-tools | 1076 | 353 | 100 | 100 | 122 |
| elizaOS/eliza | 9922 | 5181 | 100 | 100 | 185 |
| microsoft/typescript-go | 777 | 212 | 100 | 100 | 199 |
| gradio-app/gradio | 345 | 77 | 77 | 100 | 175 |
| microsoft/vscode-copilot-chat | 527 | 86 | 86 | 100 | 181 |
| denoland/deno | 2060 | 331 | 100 | 100 | 198 |
| temporalio/temporal | 1019 | 161 | 100 | 100 | 196 |
"Measured" is below "sampled" where a commit had no descendant within 30 days or touched only skipped files (lockfiles, binaries, minified assets). Azure/azure-sdk-tools loses 78 of 200, mostly dependabot lockfile-only commits.
8. Caveats
- Attribution is by commit trailer. On the three Copilot repos where it could be checked, the trailer rule flags 5โ7ร more commits than PR-level agent authorship, and the two rules give opposite signs (6.2). Nothing in git separates "the agent wrote this" from "the agent was open in another pane".
- Squash merges collapse the unit of work. Nine of eleven repos squash. A squash commit is a whole reviewed PR, so "one commit" means very different amounts of work in
deno(one PR โ one fix) than ineliza(thousands of small direct commits). Rework rates are not comparable across repos, only within. - Reverse blame is line identity, not semantics. A reformat, an unmatched rename, or a neighbouring edit that shifts a line counts as rework; a semantically wrong line nobody touched for 30 days counts as survived. R1 (
-w -M -C) was meant to test how much of the signal that explains: it moves nothing (โค2.1 pts anywhere), which means the proxy's noise is not mostly whitespace and renames โ it is genuine co-location of edits. - Ceiling saturation. In
mastra(98%/90%) andgradio(96%/87%) almost every commit is "reworked" within 30 days. In high-churn monorepos the metric has almost no dynamic range, and the per-class ranking in Section 5 is unreadable there. - Sample is 100 per class, not 300. Reduced to hold runtime under the budget, as the brief permitted. Per-repo CIs are consequently ยฑ13 points wide on average; only 4 of 11 repos have a CI excluding zero, and month-stratification (6.1) drops several repos to a single usable stratum.
- The 20โ80% agent-share band is rare in public code. Only 8 of 44 qualifying repos reached 20%. Five of the eleven selected sit at 15โ17%, so their agent samples reach further back in time than their human samples โ the exact confound measured in 6.1.
- Shallow clones.
--shallow-since=2026-02-01on the default branch only. Commits reachable only from other branches, and the pre-February history, are absent. This affects nothing in the 30โ180-day window but means-C(copy detection) cannot see pre-February sources. - Bot traffic is in the human class. dependabot, renovate and repo-maintenance bots are not agent-flagged and land in "human".
Azure/azure-sdk-tools(240 dependabot commits in 180 days) andgithub/spec-kit(147 github-actions commits) are the most affected; both show negative or near-zero gaps. - Single 30-day window, single snapshot. Measured once, on 2026-09-03. No repeat run, so run-to-run stability of these numbers is unknown.
- Path classes are heuristic.
spec-kit's templates andeliza's generated files land inconfig/otherin ways a maintainer might not agree with.
9. What the numbers say
- Pooled across 11 stranger repos and 2,042 measured commits, agent-trailer commits are reworked within 30 days 54.7% of the time vs 52.1% for human commits: a +2.5-point gap whose 95% interval (โ1.8 โฆ +6.9) contains zero.
- Per repo the gap is positive in 5, negative in 3, and inside ยฑ5 points in 3 (R1). The spread runs from โ19.9 to +42.8 points.
- Matching agent and human commits by calendar month moves the pooled gap to โ1.3.
- Switching from trailer attribution to PR-level attribution flips the sign in all three repos where both were computable.
- The same measurement on the founder's own repos produced +13.2 pooled (+21.7 founder-only).