Four things have to line up for a pool to be scoped, each written by a different command at a different time: the pools file says which set and bridge are its, docker owns the network, iptables owns the rules, and the runner project says which network its jobs land on.
Three of them agreeing is not scoping. And every way of getting it wrong looks like it worked: the runners register, the jobs pass, and the allowlist in force is somebody else's. So the check has to be run deliberately, and until now it was three commands and an eyeball over an iptables -S listing.
acme/one
ok set ci-allow-1 exists
ok network dejima-ci-1 is on dejima-ci1
FAIL dejima-ci1 matches ci-allow-2, which is another pool's
ok acme/one runners are on dejima-ci-1
It reports per pool, and also names bridges carrying rules that no pool claims, which is what a pool removed from the file while its runners kept going leaves behind.
It never passes what it could not check
Missing docker, missing iptables, or no privilege is exit 2 with UNKNOWN lines, not a clean report. A verifier that reports success when it did not look is worse than none, because it is the one that gets believed. Exit 0 means they agree, 1 means they do not, 2 means something could not be determined.
Found while writing it
grep answers "nothing matched" with a non-zero status, so a bridge with no rules, which is a finding, aborted the whole command under pipefail. The one pool that needed reporting took every check after it down with it, and the report simply looked short. That is the fourth bug of this shape this week, and it has its own test rather than a comment.
Tested: 212 passing, up from 204. Eight new tests covering each failure mode, a host that agrees, and the indeterminate path.
**Summary generated by LLM agent**
Four things have to line up for a pool to be scoped, each written by a different command at a different time: the pools file says which set and bridge are its, docker owns the network, iptables owns the rules, and the runner project says which network its jobs land on.
Three of them agreeing is not scoping. And **every way of getting it wrong looks like it worked**: the runners register, the jobs pass, and the allowlist in force is somebody else's. So the check has to be run deliberately, and until now it was three commands and an eyeball over an `iptables -S` listing.
```
acme/one
ok set ci-allow-1 exists
ok network dejima-ci-1 is on dejima-ci1
FAIL dejima-ci1 matches ci-allow-2, which is another pool's
ok acme/one runners are on dejima-ci-1
```
It reports per pool, and also names bridges carrying rules that no pool claims, which is what a pool removed from the file while its runners kept going leaves behind.
## It never passes what it could not check
Missing docker, missing iptables, or no privilege is exit 2 with `UNKNOWN` lines, not a clean report. A verifier that reports success when it did not look is worse than none, because it is the one that gets believed. Exit 0 means they agree, 1 means they do not, 2 means something could not be determined.
## Found while writing it
`grep` answers "nothing matched" with a non-zero status, so a bridge with **no** rules, which is a finding, aborted the whole command under `pipefail`. The one pool that needed reporting took every check after it down with it, and the report simply looked short. That is the fourth bug of this shape this week, and it has its own test rather than a comment.
Tested: 212 passing, up from 204. Eight new tests covering each failure mode, a host that agrees, and the indeterminate path.
Four things have to line up for a pool to be scoped, each written by a different
command at a different time: the pools file says which set and bridge are its,
docker owns the network, iptables owns the rules, and the runner project says
which network its jobs land on. Three of them agreeing is not scoping.
Every way of getting it wrong looks like it worked. The runners register, the
jobs pass, and the allowlist in force is somebody else's - so the check that
finds it has to be run deliberately, and until now it was three commands and an
eyeball over an iptables listing.
`verify` reports per pool: the set exists, the network exists and is on the
bridge the rules name, the rules name that pool's set and the base set and
nothing else, and the runners are on that pool's network. Plus bridges carrying
rules that no pool claims, which is what a pool removed from the file while its
runners kept going leaves behind.
IT NEVER PASSES WHAT IT COULD NOT CHECK. Missing docker, missing iptables or no
privilege is exit 2 and an UNKNOWN line, not a clean report. A verifier that
reports success when it did not look is worse than none, because it is the one
that gets believed.
Found while writing it, and the same shape as three other bugs this week: grep
answers "nothing matched" with a non-zero status, so a bridge with no rules -
which is a finding - aborted the whole command under pipefail. The pool that
needed reporting took every check after it down with it, leaving a report that
looked merely short. There is a test for that specifically.
branderson
approved these changes 2026-09-02 00:43:00 -07:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary generated by LLM agent
Four things have to line up for a pool to be scoped, each written by a different command at a different time: the pools file says which set and bridge are its, docker owns the network, iptables owns the rules, and the runner project says which network its jobs land on.
Three of them agreeing is not scoping. And every way of getting it wrong looks like it worked: the runners register, the jobs pass, and the allowlist in force is somebody else's. So the check has to be run deliberately, and until now it was three commands and an eyeball over an
iptables -Slisting.It reports per pool, and also names bridges carrying rules that no pool claims, which is what a pool removed from the file while its runners kept going leaves behind.
It never passes what it could not check
Missing docker, missing iptables, or no privilege is exit 2 with
UNKNOWNlines, not a clean report. A verifier that reports success when it did not look is worse than none, because it is the one that gets believed. Exit 0 means they agree, 1 means they do not, 2 means something could not be determined.Found while writing it
grepanswers "nothing matched" with a non-zero status, so a bridge with no rules, which is a finding, aborted the whole command underpipefail. The one pool that needed reporting took every check after it down with it, and the report simply looked short. That is the fourth bug of this shape this week, and it has its own test rather than a comment.Tested: 212 passing, up from 204. Eight new tests covering each failure mode, a host that agrees, and the indeterminate path.