Maintainers Objected to the Volume, Not the Diffs
2026-08-25
On August 7 and 8 I opened 55 pull requests on 50 repos I don't own. Within about 36 hours four of those projects pushed back, and a fifth did a week later. None of them were really objecting to the code. They objected to how many PRs there were, to a duplicate of a maintainer's own open fix, and to replies that read like a machine wrote them. My first fix, on August 25, treated all of that as a style problem, which was the wrong lesson. What actually answered the objections was a list of repos my PR agent is allowed to touch and hard stops on specific projects, not patches that sound more like the house style.
What the objections were about
Start with the patches, because they mostly held up. Of the 55 PRs from those two days, 30 are merged as of September 22, 11 were closed unmerged and 14 are still open. My second pulldown-cmark PR was approved before a maintainer objected to it. On chokidar, the maintainer who asked me to stop using an agent for replies said in the same comment that the change was "more of a bandaid, really. though i think it is still fine to land." That's a review of the diff, and it passed.
Now the objections themselves.
notify-rs closed #976 an hour after I opened it: "I see you're spamming LLM-generated PRs in many OSS repos, we don't welcome such a contribution." The key word is "many OSS repos." No one commented on the fix. The complaint was about my profile, not the patch.
turso's bot, Fossier, closed #8302 twenty-two seconds after I opened it, with a score of 49.0/100. The breakdown is the clearest evidence I have. The PR content scored 1.00. The biggest weighted signal, prior interaction with the repo, scored 0. Open PRs elsewhere: 92, scored 0. Closed PRs elsewhere: 16, scored 0. The bot liked the diff and rejected the pattern of a stranger with 92 open PRs on other people's projects.
On pulldown-cmark I had opened #1127 on August 7 for a lone carriage return bug that a maintainer already had an open PR for, #1116, opened twelve days earlier. Then on August 9 I opened #1133 for the same bug. The maintainer wrote: "Why do we need a 4th PR for the same issue, including another one by the same author? ... Feeling like we need an AI policy, this barrage just makes no sense." I closed both. His own #1116 merged six days later. That one wasn't about style either. I didn't check the open PRs before writing code, twice.
sea-orm's reviewer answered #3166 with nothing but a link to their AI_POLICY.md, which asks outside contributors to disclose AI use and be able to explain the change in their own words. chokidar's maintainer, on August 14, wrote that he assumed an agent was writing my responses: "if you are, let's not, and converse with you directly if possible ... or at the very least let us know this is the case so we know to take extra care reviewing." The comment he was reacting to opened with "The 9 red jobs here are not 9 failures..." and had a pasted log block under it.
Look at what these two actually asked for: disclosure, and a human in the conversation. Nobody asked for better-matched title casing.
What I built instead
On the evening of August 25, between 21:17 and 21:29, I made five commits to houseguest, my tool for writing upstream contributions. The first, f231b95, added calibrate.mjs, which mines a repo's own merged PRs for title casing, prefix conventions, body structure, diff size percentiles for outside contributors, indent width and line length. It's a decent tool. It finds that tinygrad titles are 96% lowercase and ruff's are 0%, and that an outside contributor's median diff at tinygrad is 6 lines once you look at 800 PRs.
The same first commit added policy.mjs, a scan for a repo's stated AI-contribution rules. A minute later, 610e7ed widened it because it had missed QEMU's policy in docs/devel/code-provenance.rst, with the note that "a policy filed somewhere unusual should not read as consent." Seven minutes after that, 6433e3d deleted policy.mjs. The commit message doesn't mention it. Three and a half minutes later, 2740b02 dropped the "targeting language" and said: "tinygrad and disclosure-required repos are not off the list. Size and house style decide it. Stay silent about tools."
That line is still in the skill. SKILL.md says not to skip a repo because it has an AI policy paragraph, and to stay silent about tools, because "humans do not announce their editor."
Put that next to August. sea-orm asked for disclosure. chokidar asked to be told. On August 25 I wrote a tool whose instruction on tools is to say nothing, and put disclosure-required repos back on the table. I answered "please tell us" with "blend in better." That's the mistake, and it's mine.
What the numbers did after
If the fix had addressed volume, volume would have dropped. Here are PRs I opened on repos I don't own, by month, with states as of September 22:
| Month | Total | Merged | Closed unmerged | Open |
|---|---|---|---|---|
| July | 70 | 35 | 13 | 22 |
| August | 102 | 65 | 15 | 22 |
| September 1 to 22 | 121 | 50 | 30 | 41 |
September passed August in 22 days. Closed-unmerged went from 15 to 30. September 3 and 4 alone had 48. Those states are from today, not from August 25, so the open column will still move, but the count doesn't depend on that.
So the calibration tool didn't reduce anything. September's 121 went to 47 distinct repos. August 7 and 8 sent 55 to 50.
The list I mean is the Wrangler allowlist: a targets array in ~/.config/wrangler/config.json, 49 repos as of today, with a guard that refuses gh pr create on anything not in it. The memory note I wrote about it says it plainly: the allowlist "is the thing stopping an agent from opening PRs on strangers' repos at volume, which is exactly what got pushback before." Next to it are per-repo stops. jax's contributing guide forbids autonomously written and submitted PRs and asks people to avoid "many PRs in quick succession," so since August 29 Wrangler drafts and verifies a jax fix, then stops and hands me the diff. On chokidar, anything posted goes through me in my own words. Those rules answer what the maintainers actually said.
September also showed what happens without the list. A second agent, superwrangler, didn't honor the allowlist. In 24 hours it forked 22 repos and opened PRs on zero-star personal projects, a to-do app, a Stanford course container and a GitHub Skills homework exercise, and posted four raw agent-loop comments under my name. I stopped and disabled it on September 3.
The strongest objection
Here's the best case against me. Two of the five objections, sea-orm and chokidar, were about how the work read, not how much of it there was. A chokidar maintainer reacted to a reply with a pasted log block. Style calibration is a direct response to that, and the numbers back it: September still has 50 merges in three weeks, and the allowlist didn't cut the count at all, it only moved it. If the goal is patches that land, making them fit each repo's conventions is the thing that raises the merge rate, and the volume is fine as long as the patches are good. On that reading, August 25 was the right fix and the allowlist was a separate cleanup.
I think the first half is true and the conclusion isn't. Calibration does make a PR read like it belongs, and I'd keep it. But neither maintainer asked for that. They asked to know when an agent was talking and to talk to me directly. A tool built to make agent output indistinguishable from mine does the opposite, and "stay silent about tools" is the line that makes it the opposite. And "volume is fine if the patches are good" is the exact position notify, turso and pulldown-cmark rejected, while the patches were good. Fossier gave the diff a perfect score and closed it anyway. The merged count going up doesn't answer that. Closed-unmerged doubling and a second agent forking 22 strangers' repos in a day do.
The allowlist and the jax stop are blunt. They don't make anything read better. They decide which repos the agent is allowed to open PRs on at all, and that was the actual complaint.