Panout review packOverviewFinal memoMVPLive outputsJudge roundsAppendicesDecisions

Source: docs/research/2026-09-03-defensibility/appendices/H-split-half-stability.md

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:

Scripts in this directory:

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:

1.2 What changed for this run

  1. Bots excluded from both classes. Any commit whose author name or email matches [bot], dependabot, renovate, or github-actions is 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).
  2. 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), and elizaOS/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.
  3. 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.
  4. 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


2. Part A — split-half stability

A1. Sampling and window split

Repoeligible window (dates in clone)eligible non-merge non-bot nbots droppedcut dateh1 agent pop/samph1 human pop/samph2 agent pop/samph2 human pop/sampmeasured
microsoft/aspire2026-03-07 .. 2026-08-0314461492026-05-11471/100252/100535/100188/100393
github/spec-kit2026-03-09 .. 2026-08-039821262026-06-09152/100339/100314/100177/100396
n8n-io/n8n2026-03-09 .. 2026-08-0340142902026-06-04587/1001420/100819/1001188/100399
mastra-ai/mastra2026-03-07 .. 2026-08-0331629752026-06-01654/100927/100489/1001092/100396
Azure/azure-sdk-tools2026-03-09 .. 2026-08-038422342026-05-13125/100296/100216/100205/100356
elizaOS/eliza2026-06-19 .. 2026-08-039831912026-07-022981/1001934/1002200/1002716/100390
microsoft/typescript-go2026-03-07 .. 2026-07-31766112026-05-1376/76307/100136/100247/100374
gradio-app/gradio2026-03-07 .. 2026-08-0334502026-05-2519/19153/10058/58115/100272
microsoft/vscode-copilot-chat2026-03-07 .. 2026-05-20507202026-03-2344/44209/10042/42212/100283
denoland/deno2026-03-07 .. 2026-08-03205192026-05-27307/100718/10023/231003/100320
temporalio/temporal2026-03-09 .. 2026-08-031008112026-05-2262/62442/10099/99405/100356

A2. R1 gap per half

Repoh1 n agh1 n huh1 agent R1h1 human R1h1 gaph2 n agh2 n huh2 agent R1h2 human R1h2 gapsign agreeh1-h2
microsoft/aspire989773.5%54.6%+18.81009864.0%48.0%+16.0yes2.8
github/spec-kit1009977.0%67.7%+9.31009740.0%53.6%-13.6NO22.9
n8n-io/n8n10010060.0%48.0%+12.09910063.6%58.0%+5.6yes6.4
mastra-ai/mastra1009892.0%89.8%+2.21009897.0%86.7%+10.3yes8.1
Azure/azure-sdk-tools999138.4%41.8%-3.4729436.1%35.1%+1.0NO4.4
elizaOS/eliza959880.0%71.4%+8.6989965.3%70.7%-5.4NO14.0
microsoft/typescript-go769926.3%38.4%-12.11009922.0%35.4%-13.4yes1.3
gradio-app/gradio199794.7%79.4%+15.4579996.5%83.8%+12.7yes2.7
microsoft/vscode-copilot-chat449970.5%63.6%+6.8429838.1%36.7%+1.4yes5.5
denoland/deno999945.5%44.4%+1.0239934.8%34.3%+0.4yes0.6
temporalio/temporal629958.1%37.4%+20.7999627.3%43.8%-16.5NO37.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?

Repoh1 gaph1 95% CIh1 excl. 0h2 gaph2 95% CIh2 excl. 0
microsoft/aspire+18.8+5.5 .. +32.1yes+16.0+2.9 .. +30.1yes
github/spec-kit+9.3-2.8 .. +21.5no-13.6-27.7 .. +0.5no
n8n-io/n8n+12.0-2.0 .. +26.0no+5.6-7.4 .. +18.7no
mastra-ai/mastra+2.2-5.9 .. +10.3no+10.3+3.1 .. +18.4yes
Azure/azure-sdk-tools-3.4-18.0 .. +11.0no+1.0-13.2 .. +15.6no
elizaOS/eliza+8.6-3.8 .. +20.9no-5.4-18.6 .. +8.8no
microsoft/typescript-go-12.1-25.6 .. +2.2no-13.4-25.4 .. -1.3yes
gradio-app/gradio+15.4+0.7 .. +27.7yes+12.7+4.0 .. +21.2yes
microsoft/vscode-copilot-chat+6.8-9.8 .. +22.5no+1.4-16.3 .. +19.7no
denoland/deno+1.0-13.1 .. +15.2no+0.4-20.4 .. +22.9no
temporalio/temporal+20.7+5.2 .. +35.6yes-16.5-29.9 .. -4.1yes

A4. Per-path-class agent R1 rework rate, half 1 vs half 2 (classes with n>=15 in both halves)

Repoqualifying classesper-class agent rate h1 -> h2Spearman (class ordering)Kendall
microsoft/aspire2src 79% (n=29) -> 72% (n=18); tests 84% (n=43) -> 68% (n=56)-1.00-1.00
github/spec-kit1tests 86% (n=29) -> 38% (n=69)n/an/a
n8n-io/n8n2src 48% (n=25) -> 62% (n=32); tests 64% (n=56) -> 65% (n=54)+1.00+1.00
mastra-ai/mastra2src 93% (n=30) -> 100% (n=42); tests 93% (n=44) -> 100% (n=45)n/an/a
Azure/azure-sdk-tools1tests 34% (n=35) -> 48% (n=21)n/an/a
elizaOS/eliza2src 78% (n=41) -> 61% (n=38); tests 77% (n=39) -> 67% (n=48)-1.00-1.00
microsoft/typescript-go3src 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/gradio0-n/an/a
microsoft/vscode-copilot-chat1src 68% (n=25) -> 39% (n=28)n/an/a
denoland/deno1src 49% (n=63) -> 53% (n=15)n/an/a
temporalio/temporal2src 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?

Repoh1 gaph2 gaph1-h295% CI on (h1-h2)change beyond noise
microsoft/aspire+18.8+16.0+2.8-16.6 .. +21.2no
github/spec-kit+9.3-13.6+22.9+4.7 .. +41.3yes
n8n-io/n8n+12.0+5.6+6.4-12.7 .. +24.4no
mastra-ai/mastra+2.2+10.3-8.1-18.2 .. +3.1no
Azure/azure-sdk-tools-3.4+1.0-4.4-24.7 .. +15.7no
elizaOS/eliza+8.6-5.4+14.0-2.6 .. +31.7no
microsoft/typescript-go-12.1-13.4+1.3-17.4 .. +19.9no
gradio-app/gradio+15.4+12.7+2.7-14.3 .. +17.4no
microsoft/vscode-copilot-chat+6.8+1.4+5.5-18.4 .. +28.8no
denoland/deno+1.0+0.4+0.6-25.0 .. +26.7no
temporalio/temporal+20.7-16.5+37.2+17.9 .. +58.4yes

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)

Repopublic-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

RepoR1 agR1 huR2 agR2 huR3 agR3 huR4 agR4 huR4s agR4s hu
microsoft/aspire68.7%51.3%57.1%39.5%60.1%42.1%67.2%48.7%59.6%42.6%
github/spec-kit58.5%60.7%50.0%29.1%40.0%25.5%55.0%33.2%53.0%31.1%
n8n-io/n8n61.8%53.0%48.7%42.5%56.8%52.0%60.3%52.0%51.3%45.0%
mastra-ai/mastra94.5%88.3%92.5%79.6%58.5%48.0%94.0%84.7%93.5%81.6%
Azure/azure-sdk-tools37.4%38.4%26.3%23.2%17.5%16.2%31.0%30.3%28.1%26.5%
elizaOS/eliza72.5%71.1%59.1%54.8%52.3%46.7%71.0%61.9%65.8%58.9%
microsoft/typescript-go23.9%36.9%18.8%24.7%22.7%31.3%23.9%33.3%22.7%28.8%
gradio-app/gradio96.1%81.6%90.8%69.9%36.8%31.1%93.4%75.5%92.1%73.5%
microsoft/vscode-copilot-chat54.7%50.3%25.6%23.9%47.7%40.6%50.0%43.7%34.9%28.4%
denoland/deno43.4%39.4%25.4%26.8%35.2%34.3%37.7%37.9%34.4%31.8%
temporalio/temporal39.1%40.5%19.9%23.6%37.3%36.4%37.9%39.5%24.8%27.7%
pooled58.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)

Repon agentn humanR1 agR1 huR1 gapR1 95% CIR4 agR4 huR4 gapR4 95% CIR4s agR4s huR4s gapR4s 95% CI
microsoft/aspire19819568.7%51.3%+17.4+8.2 .. +26.667.2%48.7%+18.5+8.7 .. +28.159.6%42.6%+17.0+7.4 .. +26.7
github/spec-kit20019658.5%60.7%-2.2-11.9 .. +7.455.0%33.2%+21.8+12.2 .. +31.453.0%31.1%+21.9+12.4 .. +31.4
n8n-io/n8n19920061.8%53.0%+8.8-0.7 .. +18.360.3%52.0%+8.3-1.2 .. +17.851.3%45.0%+6.3-3.8 .. +16.3
mastra-ai/mastra20019694.5%88.3%+6.2+1.2 .. +11.894.0%84.7%+9.3+3.3 .. +15.493.5%81.6%+11.9+5.3 .. +18.5
Azure/azure-sdk-tools17118537.4%38.4%-1.0-10.9 .. +9.231.0%30.3%+0.7-8.7 .. +10.428.1%26.5%+1.6-7.8 .. +11.0
elizaOS/eliza19319772.5%71.1%+1.5-7.3 .. +10.771.0%61.9%+9.1-0.2 .. +17.865.8%58.9%+6.9-2.8 .. +16.6
microsoft/typescript-go17619823.9%36.9%-13.0-22.2 .. -4.123.9%33.3%-9.5-18.5 .. -0.422.7%28.8%-6.1-14.5 .. +2.7
gradio-app/gradio7619696.1%81.6%+14.4+7.3 .. +21.393.4%75.5%+17.9+9.6 .. +25.992.1%73.5%+18.6+10.0 .. +27.3
microsoft/vscode-copilot-chat8619754.7%50.3%+4.4-8.3 .. +16.950.0%43.7%+6.3-6.0 .. +19.134.9%28.4%+6.5-5.3 .. +18.7
denoland/deno12219843.4%39.4%+4.0-7.1 .. +15.337.7%37.9%-0.2-11.1 .. +10.934.4%31.8%+2.6-8.3 .. +13.5
temporalio/temporal16119539.1%40.5%-1.4-11.6 .. +9.237.9%39.5%-1.6-11.7 .. +8.324.8%27.7%-2.8-11.9 .. +6.4
pooled (commit-level)1782215358.8%55.6%+3.1-0.1 .. +6.256.3%49.2%+7.1+3.9 .. +10.251.1%43.3%+7.7+4.6 .. +10.9

B2. Verdict counts

Definitionpositive gap, CI excludes 0negative gap, CI excludes 0indeterminate
R1317
R4416
R4-strict407

Repo-clustered bootstrap on the pooled gap (resample the 11 repos, then commits within):

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%.

Repoworst class2nd worst classn>=25 bothboth >95%readable
microsoft/aspiresrc 77% (n=47)tests 75% (n=99)yesnoyes
github/spec-kitci 100% (n=4)src 68% (n=22)nonono
n8n-io/n8nci 67% (n=12)docs 67% (n=3)nonono
mastra-ai/mastraconfig 100% (n=12)other 100% (n=1)noyesno
Azure/azure-sdk-toolsdocs 45% (n=20)src 44% (n=43)nonono
elizaOS/elizaother 100% (n=4)docs 89% (n=9)nonono
microsoft/typescript-goconfig 40% (n=5)tests 30% (n=46)nonono
gradio-app/gradiotests 100% (n=18)src 100% (n=44)noyesno
microsoft/vscode-copilot-chattests 67% (n=24)src 53% (n=53)nonono
denoland/denosrc 50% (n=78)tests 33% (n=43)yesnoyes
temporalio/temporalci 100% (n=1)tests 41% (n=105)nonono

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)

classagent nagent R1human nhuman R1R1 gapagent R4shuman R4sR4s gap
src60261.5%80656.5%+5.056.0%45.7%+10.3
tests77560.8%77455.4%+5.352.1%47.7%+4.5
docs12650.0%24764.0%-14.043.7%37.2%+6.4
config15354.9%17648.3%+6.641.8%31.8%+10.0
ci5763.2%6755.2%+7.950.9%34.3%+16.5
other6933.3%8341.0%-7.630.4%30.1%+0.3

4. Caveats

  1. 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.
  2. One half can be thin in one class. denoland/deno has 23 agent commits in half 2 (its agent activity is concentrated in March–May), gradio-app/gradio 19 in half 1, temporalio/temporal 62 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.
  3. 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.
  4. 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.
  5. 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".
  6. 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.
  7. The reworking commit is approximated, as in measure_restricted.py: blame --reverse names 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.
  8. Ceiling saturation persists. mastra-ai/mastra (94.5%/88.3%) and gradio-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%).
  9. 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).
  10. 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.
  11. Path classes are heuristic, unchanged from public-map: spec-kit's templates and eliza's generated files land in config/other in ways a maintainer might not agree with.

5. Summary of findings