Jason Odoom
adastracomputing.com
$ whoami
Jason Odoom
$ cat /etc/motd
Ad Astra Computing. One rule:
when software acts on your behalf,
it leaves a record you can inspect.
I built a tool to help maintainers patch nixpkgs CVEs faster.
I optimized the wrong thing.
Frontier models can increasingly do the work.
The work was never the hard part.
Patches are cheap.
Proof is not.
An ordinary project tells an agent very little: it compiled, the tests passed. Nix tells it:
passthru.testsWrite a small test that triggers the bug. Run it against the package built without the fix, then with it. Everything else stays identical.
Both builds hermetic. Both in CI. Both signed. The model never votes.
Stack overflow bugs only crash if the stack limit is the normal 8 megabytes.
Inside the build sandbox that limit was unlimited, inherited from the Nix daemon. So those tests never crashed, and quietly proved nothing.
We found it because a run failed for the wrong reason. The fix was one line.
An agent-owned nixpkgs fork that produces signed, reproducible CVE evidence bundles instead of drive-by pull requests.
Scout → Upstream fix check → Patch writer → Reviewer → Builder → Bug test → Steward
blue: ordinary code, does the work that must be trusted
gold: a model, and the two must come from different families
the default answer is reject
merge into our fork · send to a human
publish as advice only · reject
Merging automatically means into our own fork. Nothing is ever pushed to nixpkgs.
Every approved bundle: Sigstore keyless OIDC, anchored in the Rekor transparency log, locked workflow identity, verifiable with cosign verify-blob.
A signature tells you who produced this and what they claimed.
It tells you nothing about whether they were right.
finding.json
upstream-ref.json
patch.diff
patch-rationale.md
review.mdreproducer.nix
reproducer-log.txt
replay.json
bundle.json
bundle.sigWhat Nix caught.
And what it could not.
Upstream fixed the bug one way. The agent fixed it another way, with its own bounds check.
Compared against the upstream fix, that is a mismatch. Any text comparison marks it wrong.
But the test crashes without it and passes with it. The fix works.
The upstream fix is made of 34 separate edits. 14 of them do not apply to the version nixpkgs has.
The agent refused, and named the missing pieces, instead of writing something that would apply but leave the bug in place.
An honest refusal is stronger evidence than a low score.
Correct verdict: reject.
But its written explanation described a safety check that is not in the code.
We caught it with a check that goes and looks for the quoted code. If the evidence is not in the file, the review fails.
The frontier reviewer scored a correct fix zero, judging it wrong.
It applied a rule about C to a Lisp program. That same rule would reject the human fix too.
_first-run-archive/$8.20 spent on bundles ready to merge. $19.38 spent documenting the ones it turned down.
Our fine-tuned model does not match the frontier models. It still cannot write the fix exactly right on its own. What works today is asking it 16 times and letting the build choose the one that passes.
The workflows we built for human-only contribution will not survive contact with agents unchanged.
The goal is not to convince nixpkgs to trust an agent.
The goal is to define what an agent would have to prove before it deserves maintainer attention.
Trace · Apache-2.0 · github.com/Ad-Astra-Computing
adastracomputing.com · [email protected] · @odoom:matrix.org
Same bet, different layer: Vega · a Nix binary cache that only promotes builds cross-checked by independent rebuilders · vega-cache.dev