Many larger open source projects are struggling with floods of AI assisted contributions. The FT has a great piece about this by Sam Learner Who cleans up after the vibe coding party?. But miniscule open source projects may fare better. I am now contributing to tiny open source projects while just trying them out.
In the before times, I would often move on or maybe ask a question when I had trouble installing a tool I was trying out. Say it had security issues, or something didn’t work quite right on first try. I might fix it locally and have a play. But by the time I had finished doing the work, I would have no more energy to be social and make pull requests.
Especially if I need to fix more than one thing, and the author might not want to accept both. I am very much a trunk based development person, so I prefer to commit a stream of commits to main. But working asynchronously with people I don’t know, more communication is required to make my changes make sense to the other party.
Example - DeepClause today
I am playing with the DeepClause command line interface , and had to run npm audit fix after installing. After fixing that, building it failed. So I opened Pi and fixed it. 10 minutes work, two candidate Pull Requests (PR). One main branch with two commits.
As mentioned above, it is not something I do often. When working in client projects, the teams I work in can usually choose to stay out of the PR review circus and either just push to main, or pay lip service to the PR process.
Making two pull requests in one go
So how do I make two pull requests out of it? I ask my assistant, learning something in the process:
Now I have two commits. what if I wanted to make a Pull Request on github for each commit separately?
It then explained how to find the changed commits (this I knew, but saved me typing), and made the branches. If you look at the last $, cutting two branches is a one liner for the LLM
1. Find your base commit (the one before both new commits):
$ cd /Users/willem/dev/spikes/llm/deepclause-sdk && git log --oneline -5
a305d5b fix: add missing FS type declaration for Emscripten filesystem interface
8edcaad fix esbuild and other vulnerabilities
8aa9234 v0.86
3f51edf v0.85
ecd708c v0.83
Took 0.0s
Thinking...
You have two commits on main:
a305d5b fix: add missing FS type declaration
8edcaad fix esbuild and other vulnerabilities
8aa9234 v0.86 ← base
To make separate PRs, create a branch from main before each commit, push to GitHub, and open PRs targeting main.
$ cd /Users/willem/dev/spikes/llm/deepclause-sdk && git branch pr/vulnerability-fix 8edcaad && git branch pr/fs-type-fix a305d5b
It then provided instructions, conveniently not knowing that I can not push to ’origin’ but have to fork it on github first. But that is ok.
Here are the steps:
- Push the branches to GitHub
```bash git push origin pr/vulnerability-fix git push origin pr/fs-type-fix ```
- Open the PRs in your browser
```bash
gh pr create –base main –head pr/vulnerability-fix –title “fix: esbuild and other vulnerabilities” –body “Updates esbuild and other dependencies to fix vulnerabilities.”
gh pr create –base main –head pr/fs-type-fix –title "fix: add missing FS type declaration for Emscripten filesystem interface" –body "Defines FS type alias with methods used by swipl-wasm. Fixes TS2304: Cannot find name 'FS'." ```
If you don’t have the gh CLI installed, open these URLs in your browser instead:
Now I can get my agent to solve the actual problem I had after just npm installing it.
Not making the same mistake twice
It did take me two projects to know to ask the question. I had a similar thing with pi-browser, where the dependencies were out of date, and the extension was showing as src on loading, which confused me no end - I thought the extension had not loaded.
So I pushed the dependencies update, waiting for it to be accepted, which happened within a day or so, and then forgot to push the next commit. So this time I paused, asked my agent and pushed to Pull Requests. Although it is mighty tempting to ’just prompt my own fork’ into existing, the ’just’ is doing a lot of heavy lifting there. And from the looks of it, a lot of thought and tinkering has gone into this project over the last year.
So while I do enjoy prompting, I value collaboration more.
Do you contribute more now?
Further reading
I wrote about extracting knowledge and tools from repeating patterns in Stochastig to Deterministic. I find DeepClause interesting, because it uses Symbolic AI (Prolog) to extract e.g. agentic loops into deterministic code. So instead of having an LLM control repetition, we can have code do the looping, e.g. over a number of tasks. Prolog supports backtracking, trying a number of times and falling back out of the box, and DeepClause uses that to reset the context for the LLM and try again.