A merge gate for coding agents cannot be a boolean

fskroes_is_me2 pts0 comments

A merge gate for coding agents cannot be a boolean · GitHub

/" data-turbo-transient="true" />

Skip to content

-->

Search Gists

Search Gists

Sign in

Sign up

You signed in with another tab or window. Reload to refresh your session.<br>You signed out in another tab or window. Reload to refresh your session.<br>You switched accounts on another tab or window. Reload to refresh your session.

Dismiss alert

{{ message }}

Instantly share code, notes, and snippets.

fskroes/a-merge-gate-for-coding-agents-cannot-be-a-boolean.md

Created<br>August 19, 2026 13:24

Show Gist options

Download ZIP

Star

(0)

You must be signed in to star a gist

Fork

(0)

You must be signed in to fork a gist

Embed

Select an option

Embed<br>Embed this gist in your website.

Share<br>Copy sharable link for this gist.

Clone via HTTPS<br>Clone using the web URL.

No results found

Learn more about clone URLs

Clone this repository at &lt;script src=&quot;https://gist.github.com/fskroes/9061fc1c4284146561b1ede1c1e7fea2.js&quot;&gt;&lt;/script&gt;

" readonly="readonly" data-autoselect="true" data-target="primer-text-field.inputElement " aria-describedby="validation-7ad2c55d-cb24-44bb-81a3-046227c82574" class="form-control FormControl-monospace FormControl-input FormControl-small rounded-left-0 rounded-right-0 border-right-0" type="text" name="gist-share-url-sized-down" />

Save fskroes/9061fc1c4284146561b1ede1c1e7fea2 to your computer and use it in GitHub Desktop.

Embed

Select an option

Embed<br>Embed this gist in your website.

Share<br>Copy sharable link for this gist.

Clone via HTTPS<br>Clone using the web URL.

No results found

Learn more about clone URLs

Clone this repository at &lt;script src=&quot;https://gist.github.com/fskroes/9061fc1c4284146561b1ede1c1e7fea2.js&quot;&gt;&lt;/script&gt;

" readonly="readonly" data-autoselect="true" data-target="primer-text-field.inputElement " aria-describedby="validation-a10e4b9c-068a-4fa7-9771-6accc302be04" class="form-control FormControl-monospace FormControl-input FormControl-small rounded-left-0 rounded-right-0 border-right-0" type="text" name="gist-share-url-original" />

Save fskroes/9061fc1c4284146561b1ede1c1e7fea2 to your computer and use it in GitHub Desktop.

Download ZIP

A merge gate for coding agents cannot be a boolean

Raw

a-merge-gate-for-coding-agents-cannot-be-a-boolean.md

A merge gate for coding agents cannot be a boolean

I run background coding agents against my own private repos. They edit files in a cage, a runner does everything else, and each run ends in a PR that I co-sign after a spot check. Not a full review. A spot check.

That only works if I can trust a green check on work I did not watch. So the most important design decision in the whole system turned out to be a small one: what type the verification result is.

It is not a boolean. It cannot be a boolean. Here is why.

A boolean has to lie in one direction

Verification asks: what checks does this repo offer, and did they pass? Sometimes the answer is "no checks ran at all." A fresh target with no test harness. A check that was detected but never reached. A mandated check that does not exist on this host.

A boolean has two values, and "nothing ran" is a third case. So a boolean gate must round it to one side, and both roundings are bad:

Round to true , and a repo with no detectable checks renders as green. That is a "verified" badge over a run nothing checked. It is also invisible exactly where the risk is highest: a new repo, first run, no tests yet. This is the single worst output the system can produce, because it spends trust the system never earned.

Round to false , and every unverifiable repo is a permanent failure. That blocks the exact tasks whose job is to build the test harness in the first place. The system can never bootstrap.

Most CI-shaped gates round to true, quietly. If the test job did not run, the required check is simply absent, and an absent check does not turn the merge button red.

So the result is a tri-state: passed, failed, inconclusive. Inconclusive means nothing proved anything. It costs one extra branch on every screen that renders a run. That is cheap against a false green.

Gates assert, they do not instruct

Each task can declare gates: [test]. The tempting reading is an instruction: make sure a test check exists and run it. I rejected that. What checks can run depends on the repo's shape and the host it runs on, which you only know at detection time, not when you write the task. A task cannot summon xcodebuild-test onto a Linux box.

So a gate is an assertion about evidence: my verification does not count unless a check with this name actually ran. The vocabulary is open. Any string is legal. That means a typo and a deliberately impossible mandate look identical, and I accepted that on purpose, because both produce the same safe outcome: a loud unmet gate and an inconclusive result. Neither can produce a false green, and that was the only property that had to hold.

One more...

boolean gist gate check cannot clone

Related Articles