Is the agent-vs-human rework gap a property of the repo, or a draw?
Measured 2026-09-03 on the 11 public repositories already cloned in /tmp/panout-ideas/public-repos/. Read-only: no repository was modified, nothing was re-cloned, nothing was pushed, no issue or PR was opened, no maintainer was contacted.
Two questions:
- A. Split each repo's eligible commit window into two non-overlapping calendar halves. Does a repo's agent-vs-human R1 rework gap in one half predict its gap in the other?
- B. Re-run the corrective definitions (R1, R4, R4-strict) on bot-free, time-stratified samples. How many of the 11 repos print a gap whose bootstrap CI excludes zero, and how many print per-class agent rework rates a maintainer could actually read?
Scripts in this directory:
measure_stability.py— per-repo measurement (sampling, split, R1/R2/R3/R4/R4-strict, path class). Derived from/tmp/panout-ideas/public-map/measure_pub.py(classification, skip list, endpoint, blame, path classes) and/tmp/panout-ideas/restricted/measure_restricted.py(R2/R3/R4 clauses).analyze.py— tables A1–A5, B1–B4 (_tables.md).extra.py— tables B0, B0b (_extra.md).build_report.py— composes this file.raw/*.json— per-commit output, one file per repo.
Runtime: 11 repos measured in parallel, 9 s (azure-sdk-tools) to 272 s (eliza), ~5 min wall; analysis ~30 s. The sample stayed at 100 per class per half — no reduction to 60 was needed.
1. Method
1.1 Inherited definitions
Unchanged from the two prior runs:
- Agent classification — trailer/marker rule from
measure_pub.py:Co-authored-by:naming Claude/Codex/Cursor/Copilot/Devin,Generated with [Claude Code], the robot-emoji marker, aCo-authored-by:address containingclaude|copilot|codex|cursoragent|devin-ai-integration, the Copilot bot author address, or a git author literally namedCopilot/Claude/Codex. Everything else is human. - Rework endpoint —
E= newest descendant ofCon the default branch within 30 days (git rev-list --ancestry-path --until=<C+30d> C..HEAD, first entry). - Added ranges —
git diff C^ C --unified=0 -M, same skip list (lockfiles, minified bundles, binaries, images, fonts, snapshots,.sha256), top 20 files by added lines. - R1 —
git blame --reverse --porcelain -w -M -C C..E -L <ranges> -- <file>. Any added line whose last-surviving commit is notEcounts as rework. (R0 was not recomputed: the public-map run showed R0→R1 moves ≤2.1 pts anywhere, and the brief asks for R1.) - R2 / R3 / R4 / R4-strict — verbatim clauses from
measure_restricted.py. The reworking commit is approximated as the first commit on the ancestry path after the blamed last-surviving commit that touches the same file.- R2 = R1 and some reworking commit has a different git author email than
C. - R3 = R1 and some reworking commit either touches a test path or has a subject matching
fix|bug|revert|hotfix|regress|broke|typo|wrong|incorrect|crash|error. - R4 = R1 and (R2 or R3).
- R4-strict = R1 and (R2 or fix-word subject) — drops R3's test-path clause.
- R2 = R1 and some reworking commit has a different git author email than
ci → tests → docs → src → config → other), commit assigned the class holding most of its added lines.1.2 What changed for this run
- Bots excluded from both classes. Any commit whose author name or email matches
[bot],dependabot,renovate, orgithub-actionsis dropped before sampling. The public-map run left these in the human class; they are 975 of mastra's 4,137 eligible commits and 234 of azure-sdk-tools' 1,076 (table A1). - Two halves. The eligible window (commits 180–30 days old, non-merge, non-bot) is cut at the median commit date of that repo's own eligible population, giving two contiguous, non-overlapping calendar intervals with equal commit counts. A pure calendar midpoint was tried first and rejected:
microsoft/vscode-copilot-chat's clone has 506 of its 507 eligible commits before its range midpoint (its cloned branch tip is 2026-05-20), andelizaOS/eliza's clone only reaches back to 2026-06-19, so a fixed global midpoint left one half empty in both. Cut dates and observed ranges are in table A1. - Random sampling inside each half, seeded (
random.Random(1234)), up to 100 agent-trailer and 100 human commits per half. The public-map run took the 100 most recent per class over the whole window, which is exactly the calendar-offset confound its own §6.1 flagged. - Part B uses the union of the two half-samples (up to 200 agent + 200 human per repo, bot-free, time-stratified) rather than a fresh un-stratified 100/100. This is a deliberate deviation: it is the same commits already measured for A, it doubles n per class, and it removes the calendar offset. Table B0 shows what that costs relative to the public-map numbers.
1.3 Statistics
- Gap = agent rate − human rate, in percentage points.
- Per-gap CIs: percentile bootstrap, 5,000 resamples (2,000 where noted), resampling commits with replacement within each class. Sampling error only.
- Across-repo correlation: Spearman rho (ties averaged), with a repo-clustered percentile bootstrap (5,000 resamples of the 11 repos with replacement).
- Noise floor (A5): each repo's measured commits are re-split at random into two groups of the same sizes as its real halves, and the across-repo Spearman is recomputed, 2,000 times. This is the correlation a perfectly stable repo property would produce at these sample sizes.
2. Part A — split-half stability
A1. Sampling and window split
| Repo | eligible window (dates in clone) | eligible non-merge non-bot n | bots dropped | cut date | h1 agent pop/samp | h1 human pop/samp | h2 agent pop/samp | h2 human pop/samp | measured |
|---|---|---|---|---|---|---|---|---|---|
| microsoft/aspire | 2026-03-07 .. 2026-08-03 | 1446 | 149 | 2026-05-11 | 471/100 | 252/100 | 535/100 | 188/100 | 393 |
| github/spec-kit | 2026-03-09 .. 2026-08-03 | 982 | 126 | 2026-06-09 | 152/100 | 339/100 | 314/100 | 177/100 | 396 |
| n8n-io/n8n | 2026-03-09 .. 2026-08-03 | 4014 | 290 | 2026-06-04 | 587/100 | 1420/100 | 819/100 | 1188/100 | 399 |
| mastra-ai/mastra | 2026-03-07 .. 2026-08-03 | 3162 | 975 | 2026-06-01 | 654/100 | 927/100 | 489/100 | 1092/100 | 396 |
| Azure/azure-sdk-tools | 2026-03-09 .. 2026-08-03 | 842 | 234 | 2026-05-13 | 125/100 | 296/100 | 216/100 | 205/100 | 356 |
| elizaOS/eliza | 2026-06-19 .. 2026-08-03 | 9831 | 91 | 2026-07-02 | 2981/100 | 1934/100 | 2200/100 | 2716/100 | 390 |
| microsoft/typescript-go | 2026-03-07 .. 2026-07-31 | 766 | 11 | 2026-05-13 | 76/76 | 307/100 | 136/100 | 247/100 | 374 |
| gradio-app/gradio | 2026-03-07 .. 2026-08-03 | 345 | 0 | 2026-05-25 | 19/19 | 153/100 | 58/58 | 115/100 | 272 |
| microsoft/vscode-copilot-chat | 2026-03-07 .. 2026-05-20 | 507 | 20 | 2026-03-23 | 44/44 | 209/100 | 42/42 | 212/100 | 283 |
| denoland/deno | 2026-03-07 .. 2026-08-03 | 2051 | 9 | 2026-05-27 | 307/100 | 718/100 | 23/23 | 1003/100 | 320 |
| temporalio/temporal | 2026-03-09 .. 2026-08-03 | 1008 | 11 | 2026-05-22 | 62/62 | 442/100 | 99/99 | 405/100 | 356 |
A2. R1 gap per half
| Repo | h1 n ag | h1 n hu | h1 agent R1 | h1 human R1 | h1 gap | h2 n ag | h2 n hu | h2 agent R1 | h2 human R1 | h2 gap | sign agree | h1-h2 | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| microsoft/aspire | 98 | 97 | 73.5% | 54.6% | +18.8 | 100 | 98 | 64.0% | 48.0% | +16.0 | yes | 2.8 | ||
| github/spec-kit | 100 | 99 | 77.0% | 67.7% | +9.3 | 100 | 97 | 40.0% | 53.6% | -13.6 | NO | 22.9 | ||
| n8n-io/n8n | 100 | 100 | 60.0% | 48.0% | +12.0 | 99 | 100 | 63.6% | 58.0% | +5.6 | yes | 6.4 | ||
| mastra-ai/mastra | 100 | 98 | 92.0% | 89.8% | +2.2 | 100 | 98 | 97.0% | 86.7% | +10.3 | yes | 8.1 | ||
| Azure/azure-sdk-tools | 99 | 91 | 38.4% | 41.8% | -3.4 | 72 | 94 | 36.1% | 35.1% | +1.0 | NO | 4.4 | ||
| elizaOS/eliza | 95 | 98 | 80.0% | 71.4% | +8.6 | 98 | 99 | 65.3% | 70.7% | -5.4 | NO | 14.0 | ||
| microsoft/typescript-go | 76 | 99 | 26.3% | 38.4% | -12.1 | 100 | 99 | 22.0% | 35.4% | -13.4 | yes | 1.3 | ||
| gradio-app/gradio | 19 | 97 | 94.7% | 79.4% | +15.4 | 57 | 99 | 96.5% | 83.8% | +12.7 | yes | 2.7 | ||
| microsoft/vscode-copilot-chat | 44 | 99 | 70.5% | 63.6% | +6.8 | 42 | 98 | 38.1% | 36.7% | +1.4 | yes | 5.5 | ||
| denoland/deno | 99 | 99 | 45.5% | 44.4% | +1.0 | 23 | 99 | 34.8% | 34.3% | +0.4 | yes | 0.6 | ||
| temporalio/temporal | 62 | 99 | 58.1% | 37.4% | +20.7 | 99 | 96 | 27.3% | 43.8% | -16.5 | NO | 37.2 |
Across-repo (n=11 repos) half-1 gap vs half-2 gap: Spearman rho = +0.164, Kendall tau = +0.164, Pearson r = +0.231. Repo-clustered percentile bootstrap (5000 resamples of the 11 repos): 95% CI on Spearman rho = [-0.617, +0.898] (share of resamples with rho>0: 64.0%). Sign agreement: 7/11 repos. Mean |half-1 gap - half-2 gap| = 9.6 pts; median = 5.5 pts. Half-1 gaps: temporalio/temporal +20.7, microsoft/aspire +18.8, gradio-app/gradio +15.4, n8n-io/n8n +12.0, github/spec-kit +9.3, elizaOS/eliza +8.6, microsoft/vscode-copilot-chat +6.8, mastra-ai/mastra +2.2, denoland/deno +1.0, Azure/azure-sdk-tools -3.4, microsoft/typescript-go -12.1
Half-2 gaps: microsoft/aspire +16.0, gradio-app/gradio +12.7, mastra-ai/mastra +10.3, n8n-io/n8n +5.6, microsoft/vscode-copilot-chat +1.4, Azure/azure-sdk-tools +1.0, denoland/deno +0.4, elizaOS/eliza -5.4, microsoft/typescript-go -13.4, github/spec-kit -13.6, temporalio/temporal -16.5
A3. Is each half's gap itself distinguishable from zero?
| Repo | h1 gap | h1 95% CI | h1 excl. 0 | h2 gap | h2 95% CI | h2 excl. 0 |
|---|---|---|---|---|---|---|
| microsoft/aspire | +18.8 | +5.5 .. +32.1 | yes | +16.0 | +2.9 .. +30.1 | yes |
| github/spec-kit | +9.3 | -2.8 .. +21.5 | no | -13.6 | -27.7 .. +0.5 | no |
| n8n-io/n8n | +12.0 | -2.0 .. +26.0 | no | +5.6 | -7.4 .. +18.7 | no |
| mastra-ai/mastra | +2.2 | -5.9 .. +10.3 | no | +10.3 | +3.1 .. +18.4 | yes |
| Azure/azure-sdk-tools | -3.4 | -18.0 .. +11.0 | no | +1.0 | -13.2 .. +15.6 | no |
| elizaOS/eliza | +8.6 | -3.8 .. +20.9 | no | -5.4 | -18.6 .. +8.8 | no |
| microsoft/typescript-go | -12.1 | -25.6 .. +2.2 | no | -13.4 | -25.4 .. -1.3 | yes |
| gradio-app/gradio | +15.4 | +0.7 .. +27.7 | yes | +12.7 | +4.0 .. +21.2 | yes |
| microsoft/vscode-copilot-chat | +6.8 | -9.8 .. +22.5 | no | +1.4 | -16.3 .. +19.7 | no |
| denoland/deno | +1.0 | -13.1 .. +15.2 | no | +0.4 | -20.4 .. +22.9 | no |
| temporalio/temporal | +20.7 | +5.2 .. +35.6 | yes | -16.5 | -29.9 .. -4.1 | yes |
A4. Per-path-class agent R1 rework rate, half 1 vs half 2 (classes with n>=15 in both halves)
| Repo | qualifying classes | per-class agent rate h1 -> h2 | Spearman (class ordering) | Kendall |
|---|---|---|---|---|
| microsoft/aspire | 2 | src 79% (n=29) -> 72% (n=18); tests 84% (n=43) -> 68% (n=56) | -1.00 | -1.00 |
| github/spec-kit | 1 | tests 86% (n=29) -> 38% (n=69) | n/a | n/a |
| n8n-io/n8n | 2 | src 48% (n=25) -> 62% (n=32); tests 64% (n=56) -> 65% (n=54) | +1.00 | +1.00 |
| mastra-ai/mastra | 2 | src 93% (n=30) -> 100% (n=42); tests 93% (n=44) -> 100% (n=45) | n/a | n/a |
| Azure/azure-sdk-tools | 1 | tests 34% (n=35) -> 48% (n=21) | n/a | n/a |
| elizaOS/eliza | 2 | src 78% (n=41) -> 61% (n=38); tests 77% (n=39) -> 67% (n=48) | -1.00 | -1.00 |
| microsoft/typescript-go | 3 | src 28% (n=25) -> 23% (n=30); tests 35% (n=17) -> 28% (n=29); other 38% (n=16) -> 18% (n=34) | -0.50 | -0.33 |
| gradio-app/gradio | 0 | - | n/a | n/a |
| microsoft/vscode-copilot-chat | 1 | src 68% (n=25) -> 39% (n=28) | n/a | n/a |
| denoland/deno | 1 | src 49% (n=63) -> 53% (n=15) | n/a | n/a |
| temporalio/temporal | 2 | src 44% (n=25) -> 26% (n=27); tests 69% (n=35) -> 27% (n=70) | +1.00 | +1.00 |
Repos with >=2 qualifying classes: 5. Spearman values: microsoft/aspire -1.00 (k=2), n8n-io/n8n +1.00 (k=2), elizaOS/eliza -1.00 (k=2), microsoft/typescript-go -0.50 (k=3), temporalio/temporal +1.00 (k=2). Mean = -0.10.
A5. Noise floor: what would the split-half correlation be with NO time drift?
Control: for each repo, re-split its own measured commits into two groups of the same sizes as the real halves, at random (ignoring commit date), recompute both gaps, then recompute the across-repo Spearman. Under 'the gap is a stable repo property + binomial sampling noise' this control gives the correlation attainable at these sample sizes. Observed time-split rho is compared against that distribution.
Random-split control (2000 reps): median Spearman rho = +0.482, 5th-95th pct = +0.164 .. +0.764. Observed time-split rho = +0.164; it sits at the 5th percentile of the random-split control.
Per-repo: is the change in gap between halves larger than sampling noise?
| Repo | h1 gap | h2 gap | h1-h2 | 95% CI on (h1-h2) | change beyond noise |
|---|---|---|---|---|---|
| microsoft/aspire | +18.8 | +16.0 | +2.8 | -16.6 .. +21.2 | no |
| github/spec-kit | +9.3 | -13.6 | +22.9 | +4.7 .. +41.3 | yes |
| n8n-io/n8n | +12.0 | +5.6 | +6.4 | -12.7 .. +24.4 | no |
| mastra-ai/mastra | +2.2 | +10.3 | -8.1 | -18.2 .. +3.1 | no |
| Azure/azure-sdk-tools | -3.4 | +1.0 | -4.4 | -24.7 .. +15.7 | no |
| elizaOS/eliza | +8.6 | -5.4 | +14.0 | -2.6 .. +31.7 | no |
| microsoft/typescript-go | -12.1 | -13.4 | +1.3 | -17.4 .. +19.9 | no |
| gradio-app/gradio | +15.4 | +12.7 | +2.7 | -14.3 .. +17.4 | no |
| microsoft/vscode-copilot-chat | +6.8 | +1.4 | +5.5 | -18.4 .. +28.8 | no |
| denoland/deno | +1.0 | +0.4 | +0.6 | -25.0 .. +26.7 | no |
| temporalio/temporal | +20.7 | -16.5 | +37.2 | +17.9 .. +58.4 | yes |
Half-to-half change exceeds sampling noise in 2 of 11 repos.
A6. Plain answer to A
A repo's half-1 gap does not predict its half-2 gap. Spearman rho = +0.164 across the 11 repos, with a repo-clustered 95% CI of [−0.62, +0.90] that comfortably contains zero, negative values, and near-perfect correlation alike. Signs agree in 7 of 11 repos; under a coin-flip null the expected count is 5.5 and a count of 7 or more occurs 27% of the time, so sign agreement on its own is not evidence of stability. Six of the 22 half-gaps are inside ±5 points, where the sign is arbitrary anyway.
The noise-floor control (A5) is the sharper result. If the gap were a fixed repo property observed through binomial sampling noise, splitting each repo's own commits at random would produce a median rho of +0.48. The observed time-split rho of +0.164 sits at the 5th percentile of that control distribution. So the split-half correlation is not merely weak — it is weaker than sampling noise alone can explain, which is the signature of real drift over calendar time on top of the noise, not of a stable repo trait measured imprecisely.
Two repos change gap by more than sampling error can account for: temporalio/temporal (+20.7 → −16.5, CI on the change +17.9 … +58.4) and github/spec-kit (+9.3 → −13.6, CI +4.7 … +41.3). Both flip sign. In the other 9 the change is inside the noise band, which is consistent either with stability or with the sample being too small to see the drift — those CIs are 30–50 points wide.
The per-class ordering question (A4) is close to unanswerable at this sample size. Only 6 of 11 repos have two or more path classes with ≥15 agent commits in both halves, and in mastra-ai/mastra both qualifying classes are pinned at 100% in half 2, so the correlation is undefined. Of the 5 repos with a defined value, k = 2 classes in four of them and k = 3 in one: rho = −1.00, +1.00, −1.00, −0.50, +1.00 (mean −0.10). With k = 2 the statistic can only take the values ±1, so this is a coin flip reported to two decimal places. The class ordering inside a repo is not measurable at 100 agent commits per half.
3. Part B — corrective definitions on bot-free, time-stratified samples
B0. Comparison with the public-map run (same repos, different sample)
| Repo | public-map R1 gap (100/100 most-recent, bots in human class) | this run R1 gap (time-stratified, bots excluded) | change |
|---|---|---|---|
| microsoft/aspire | +5.2 | +17.4 | +12.3 |
| github/spec-kit | -18.2 | -2.2 | +16.0 |
| n8n-io/n8n | -2.0 | +8.8 | +10.8 |
| mastra-ai/mastra | +8.1 | +6.2 | -1.8 |
| Azure/azure-sdk-tools | -2.8 | -1.0 | +1.9 |
| elizaOS/eliza | -5.1 | +1.5 | +6.6 |
| microsoft/typescript-go | -1.2 | -13.0 | -11.8 |
| gradio-app/gradio | +9.2 | +14.4 | +5.2 |
| microsoft/vscode-copilot-chat | +25.2 | +4.4 | -20.8 |
| denoland/deno | +42.8 | +4.0 | -38.7 |
| temporalio/temporal | -19.9 | -1.4 | +18.5 |
| pooled | +2.5 | +3.1 | +0.6 |
Two conclusions from B0. First, the two repos with the largest gaps in the public-map run lose almost all of it once agent and human commits cover the same calendar span: denoland/deno +42.8 → +4.0 and microsoft/vscode-copilot-chat +25.2 → +4.4. Second, the two repos with the largest negative gaps also shrink: temporalio/temporal −19.9 → −1.4 and github/spec-kit −18.2 → −2.2. The pooled figure barely moves (+2.5 → +3.1) because these cancel — the per-repo spread collapses from a 63-point range (−19.9 … +42.8) to a 30-point range (−13.0 … +17.4) while the centre stays put.
B0b. Clause-level rates (union sample): R2 = reworked by a different author, R3 = reworking commit is a fix or touches tests
| Repo | R1 ag | R1 hu | R2 ag | R2 hu | R3 ag | R3 hu | R4 ag | R4 hu | R4s ag | R4s hu |
|---|---|---|---|---|---|---|---|---|---|---|
| microsoft/aspire | 68.7% | 51.3% | 57.1% | 39.5% | 60.1% | 42.1% | 67.2% | 48.7% | 59.6% | 42.6% |
| github/spec-kit | 58.5% | 60.7% | 50.0% | 29.1% | 40.0% | 25.5% | 55.0% | 33.2% | 53.0% | 31.1% |
| n8n-io/n8n | 61.8% | 53.0% | 48.7% | 42.5% | 56.8% | 52.0% | 60.3% | 52.0% | 51.3% | 45.0% |
| mastra-ai/mastra | 94.5% | 88.3% | 92.5% | 79.6% | 58.5% | 48.0% | 94.0% | 84.7% | 93.5% | 81.6% |
| Azure/azure-sdk-tools | 37.4% | 38.4% | 26.3% | 23.2% | 17.5% | 16.2% | 31.0% | 30.3% | 28.1% | 26.5% |
| elizaOS/eliza | 72.5% | 71.1% | 59.1% | 54.8% | 52.3% | 46.7% | 71.0% | 61.9% | 65.8% | 58.9% |
| microsoft/typescript-go | 23.9% | 36.9% | 18.8% | 24.7% | 22.7% | 31.3% | 23.9% | 33.3% | 22.7% | 28.8% |
| gradio-app/gradio | 96.1% | 81.6% | 90.8% | 69.9% | 36.8% | 31.1% | 93.4% | 75.5% | 92.1% | 73.5% |
| microsoft/vscode-copilot-chat | 54.7% | 50.3% | 25.6% | 23.9% | 47.7% | 40.6% | 50.0% | 43.7% | 34.9% | 28.4% |
| denoland/deno | 43.4% | 39.4% | 25.4% | 26.8% | 35.2% | 34.3% | 37.7% | 37.9% | 34.4% | 31.8% |
| temporalio/temporal | 39.1% | 40.5% | 19.9% | 23.6% | 37.3% | 36.4% | 37.9% | 39.5% | 24.8% | 27.7% |
| pooled | 58.8% | 55.6% | 47.2% | 39.9% | 43.3% | 36.9% | 56.3% | 49.2% | 51.1% | 43.3% |
B1. R1 / R4 / R4-strict rates and gaps (union of both half-samples, bots excluded)
| Repo | n agent | n human | R1 ag | R1 hu | R1 gap | R1 95% CI | R4 ag | R4 hu | R4 gap | R4 95% CI | R4s ag | R4s hu | R4s gap | R4s 95% CI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| microsoft/aspire | 198 | 195 | 68.7% | 51.3% | +17.4 | +8.2 .. +26.6 | 67.2% | 48.7% | +18.5 | +8.7 .. +28.1 | 59.6% | 42.6% | +17.0 | +7.4 .. +26.7 |
| github/spec-kit | 200 | 196 | 58.5% | 60.7% | -2.2 | -11.9 .. +7.4 | 55.0% | 33.2% | +21.8 | +12.2 .. +31.4 | 53.0% | 31.1% | +21.9 | +12.4 .. +31.4 |
| n8n-io/n8n | 199 | 200 | 61.8% | 53.0% | +8.8 | -0.7 .. +18.3 | 60.3% | 52.0% | +8.3 | -1.2 .. +17.8 | 51.3% | 45.0% | +6.3 | -3.8 .. +16.3 |
| mastra-ai/mastra | 200 | 196 | 94.5% | 88.3% | +6.2 | +1.2 .. +11.8 | 94.0% | 84.7% | +9.3 | +3.3 .. +15.4 | 93.5% | 81.6% | +11.9 | +5.3 .. +18.5 |
| Azure/azure-sdk-tools | 171 | 185 | 37.4% | 38.4% | -1.0 | -10.9 .. +9.2 | 31.0% | 30.3% | +0.7 | -8.7 .. +10.4 | 28.1% | 26.5% | +1.6 | -7.8 .. +11.0 |
| elizaOS/eliza | 193 | 197 | 72.5% | 71.1% | +1.5 | -7.3 .. +10.7 | 71.0% | 61.9% | +9.1 | -0.2 .. +17.8 | 65.8% | 58.9% | +6.9 | -2.8 .. +16.6 |
| microsoft/typescript-go | 176 | 198 | 23.9% | 36.9% | -13.0 | -22.2 .. -4.1 | 23.9% | 33.3% | -9.5 | -18.5 .. -0.4 | 22.7% | 28.8% | -6.1 | -14.5 .. +2.7 |
| gradio-app/gradio | 76 | 196 | 96.1% | 81.6% | +14.4 | +7.3 .. +21.3 | 93.4% | 75.5% | +17.9 | +9.6 .. +25.9 | 92.1% | 73.5% | +18.6 | +10.0 .. +27.3 |
| microsoft/vscode-copilot-chat | 86 | 197 | 54.7% | 50.3% | +4.4 | -8.3 .. +16.9 | 50.0% | 43.7% | +6.3 | -6.0 .. +19.1 | 34.9% | 28.4% | +6.5 | -5.3 .. +18.7 |
| denoland/deno | 122 | 198 | 43.4% | 39.4% | +4.0 | -7.1 .. +15.3 | 37.7% | 37.9% | -0.2 | -11.1 .. +10.9 | 34.4% | 31.8% | +2.6 | -8.3 .. +13.5 |
| temporalio/temporal | 161 | 195 | 39.1% | 40.5% | -1.4 | -11.6 .. +9.2 | 37.9% | 39.5% | -1.6 | -11.7 .. +8.3 | 24.8% | 27.7% | -2.8 | -11.9 .. +6.4 |
| pooled (commit-level) | 1782 | 2153 | 58.8% | 55.6% | +3.1 | -0.1 .. +6.2 | 56.3% | 49.2% | +7.1 | +3.9 .. +10.2 | 51.1% | 43.3% | +7.7 | +4.6 .. +10.9 |
B2. Verdict counts
| Definition | positive gap, CI excludes 0 | negative gap, CI excludes 0 | indeterminate |
|---|---|---|---|
| R1 | 3 | 1 | 7 |
| R4 | 4 | 1 | 6 |
| R4-strict | 4 | 0 | 7 |
Repo-clustered bootstrap on the pooled gap (resample the 11 repos, then commits within):
- R1: gap +3.1 pts, repo-clustered 95% CI -2.7 .. +8.3
- R4: gap +7.1 pts, repo-clustered 95% CI +0.3 .. +12.6
- R4-strict: gap +7.7 pts, repo-clustered 95% CI +1.3 .. +13.5
B2b. Plain answer to the count question
Of the 11 repos, under R1: 3 print a positive gap with a CI excluding zero (aspire +17.4, gradio +14.4, mastra +6.2), 1 prints a negative gap with a CI excluding zero (typescript-go −13.0), and 7 are indeterminate.
Under R4: 4 positive (aspire, spec-kit, mastra, gradio), 1 negative (typescript-go), 6 indeterminate. Under R4-strict: 4 positive (aspire, spec-kit, mastra, gradio), 0 negative, 7 indeterminate.
The pooled gap under R1 (+3.1) has a commit-level CI that just touches zero (−0.1 … +6.2) and a repo-clustered CI that clearly contains it (−2.7 … +8.3). Under R4 (+7.1) and R4-strict (+7.7) the repo-clustered CIs exclude zero (+0.3 … +12.6 and +1.3 … +13.5), but only barely, and both are driven by the R2 clause (B0b): the "reworked by a different author" rate is where agent and human separate most (pooled 47.2% vs 39.9%), and that clause is confounded — a commit is more likely to be reworked by someone else when its author is not the file's usual owner, which differs systematically between agent-trailer PRs and routine maintainer commits.
github/spec-kit is the clearest case of the definition doing the work: R1 gap −2.2 (agent reworked slightly less), R4 gap +21.8. Its human commits are reworked at 60.7% under R1 but only 33.2% under R4 — most human rework there is the same author touching their own lines again, which R4 discards, while agent rework is more often somebody else's fix.
B3. Are the two worst per-class agent rework rates readable?
Worst = highest agent R1 rework rate. Readable = both classes have n>=25 agent commits AND not both rates >95%.
| Repo | worst class | 2nd worst class | n>=25 both | both >95% | readable |
|---|---|---|---|---|---|
| microsoft/aspire | src 77% (n=47) | tests 75% (n=99) | yes | no | yes |
| github/spec-kit | ci 100% (n=4) | src 68% (n=22) | no | no | no |
| n8n-io/n8n | ci 67% (n=12) | docs 67% (n=3) | no | no | no |
| mastra-ai/mastra | config 100% (n=12) | other 100% (n=1) | no | yes | no |
| Azure/azure-sdk-tools | docs 45% (n=20) | src 44% (n=43) | no | no | no |
| elizaOS/eliza | other 100% (n=4) | docs 89% (n=9) | no | no | no |
| microsoft/typescript-go | config 40% (n=5) | tests 30% (n=46) | no | no | no |
| gradio-app/gradio | tests 100% (n=18) | src 100% (n=44) | no | yes | no |
| microsoft/vscode-copilot-chat | tests 67% (n=24) | src 53% (n=53) | no | no | no |
| denoland/deno | src 50% (n=78) | tests 33% (n=43) | yes | no | yes |
| temporalio/temporal | ci 100% (n=1) | tests 41% (n=105) | no | no | no |
Readable in 2 of 11 repos.
B3b. Plain answer to the readability question
In 9 of 11 repos the two worst per-class agent rework rates are not readable. The failure mode is almost always sample size, not the ceiling: in 9 repos at least one of the top-two classes has fewer than 25 agent commits, and in 4 repos the single worst class has n ≤ 5 (temporalio/temporal reports ci 100% off one commit; elizaOS/eliza reports other 100% off four). Two repos fail on the ceiling as well — mastra-ai/mastra and gradio-app/gradio both have their top two classes pinned at 100%, in a repo where the human baseline is 82–88%, so the ranking carries no information. Only microsoft/aspire (src 77% n=47, tests 75% n=99) and denoland/deno (src 50% n=78, tests 33% n=43) pass both tests, and in both cases the two named classes are simply the two largest classes by volume.
B4. Pooled path-class rates (union sample, R1 / R4-strict)
| class | agent n | agent R1 | human n | human R1 | R1 gap | agent R4s | human R4s | R4s gap |
|---|---|---|---|---|---|---|---|---|
| src | 602 | 61.5% | 806 | 56.5% | +5.0 | 56.0% | 45.7% | +10.3 |
| tests | 775 | 60.8% | 774 | 55.4% | +5.3 | 52.1% | 47.7% | +4.5 |
| docs | 126 | 50.0% | 247 | 64.0% | -14.0 | 43.7% | 37.2% | +6.4 |
| config | 153 | 54.9% | 176 | 48.3% | +6.6 | 41.8% | 31.8% | +10.0 |
| ci | 57 | 63.2% | 67 | 55.2% | +7.9 | 50.9% | 34.3% | +16.5 |
| other | 69 | 33.3% | 83 | 41.0% | -7.6 | 30.4% | 30.1% | +0.3 |
4. Caveats
- Clone artefacts limit two repos.
elizaOS/eliza's shallow clone only reaches 2026-06-19, so its "180-day window" is really 46 days and both halves are ~23 days.microsoft/vscode-copilot-chat's cloned branch tip is 2026-05-20, so its window is 2026-03-07 … 2026-05-20 and every measured commit is at least 105 days old. Neither repo's halves are comparable in calendar length to the other nine. Repos were not re-cloned, per the brief. - One half can be thin in one class.
denoland/denohas 23 agent commits in half 2 (its agent activity is concentrated in March–May),gradio-app/gradio19 in half 1,temporalio/temporal62 in half 1. Those half-gaps carry ±20–25-point CIs, which mechanically pushes the split-half correlation toward zero — part of the low rho is thin cells, not drift. The A5 control accounts for this (it uses the same cell sizes) and still puts the observed correlation at the 5th percentile. - The median-date cut is not a calendar midpoint. Halves have equal commit counts, not equal durations. In steady repos the two are nearly the same (aspire 2026-05-11 vs a midpoint of 2026-05-21); in bursty ones they differ by weeks.
- Bootstrap CIs cover sampling only. They say nothing about attribution error, squash-merge granularity, or repo-level confounding. The repo-clustered pooled CIs additionally cover between-repo variance, which is why they are wider than the commit-level ones.
- Trailer attribution is unchanged and still broad. The public-map run showed that on the three Copilot repos, 84–94% of trailer-flagged commits come from PRs a human opened, and that PR-level attribution flips the sign. Nothing here re-tests that; every number in this report is "an agent was in the room", not "an agent shipped this".
- R2 is a proxy for ownership, not for quality. "Reworked by a different author" depends on how many people touch a file and on whether the original author is still active. R4 and R4-strict inherit that. The restricted-repo report reached the same conclusion on the founder's repos, where R2 was degenerate at 0/351.
- The reworking commit is approximated, as in
measure_restricted.py: blame--reversenames the last commit in which a line survived, and the edit is attributed to the first later commit on the ancestry path touching that file. It is wrong whenever a rename and an edit land in different commits. - Ceiling saturation persists.
mastra-ai/mastra(94.5%/88.3%) andgradio-app/gradio(96.1%/81.6%) still have almost no dynamic range under R1, and R4-strict barely helps (93.5%/81.6% and 92.1%/73.5%). - Random sampling within halves is seeded but single-draw. No repeat draw was taken, so the contribution of sample-selection variance to the per-repo numbers is not separately measured (the bootstrap approximates it).
microsoft/typescript-go's newest eligible commit is 2026-07-31, three days short of the 30-day cutoff, because of a gap in its history; immaterial to the result.- Path classes are heuristic, unchanged from public-map: spec-kit's templates and eliza's generated files land in
config/otherin ways a maintainer might not agree with.
5. Summary of findings
- A. Split-half Spearman rho = +0.164, repo-clustered 95% CI [−0.62, +0.90]; signs agree in 7 of 11 repos; median absolute change in gap between halves is 5.5 points, mean 9.6. Against a random-split control whose median rho is +0.48, the observed value sits at the 5th percentile. A repo's gap in one half does not predict its gap in the other.
- A (per class). Only 6 of 11 repos have ≥2 path classes with n≥15 agent commits in both halves, and 4 of the 5 usable correlations are computed on exactly 2 classes, where the statistic is ±1 by construction. Not measurable at this sample size.
- B. With bots excluded and both classes drawn from the same calendar span: R1 — 3 repos positive with CI excluding zero, 1 negative, 7 indeterminate. R4 — 4 positive, 1 negative, 6 indeterminate. R4-strict — 4 positive, 0 negative, 7 indeterminate.
- B (pooled). R1 +3.1 pts (repo-clustered CI −2.7 … +8.3), R4 +7.1 (+0.3 … +12.6), R4-strict +7.7 (+1.3 … +13.5).
- B (readability). The two worst per-class agent rework rates are readable in 2 of 11 repos (
microsoft/aspire,denoland/deno). Seven fail on cell size, two additionally on the 95% ceiling. - Time-stratifying and dropping bots cuts the per-repo spread of the R1 gap from 63 points to 30 points while leaving the pooled value unchanged (+2.5 → +3.1).