Why
A job that fetches dependencies needs a network; a job that only compiles a tree
does not, and giving it one weakens the only boundary a step has. Today the choice
is made once per machine, by vole runner --container-network, so a runner that
takes one job needing the network gives the network to every job it takes.
docs/runner.md said “add bridge only when a job needs it”, which no workflow
could express: the job had no say, and a job that did need one could be handed to a
machine that had none and fail for a reason the author could not see.
This is §5 of #138 (“a way for a job to declare network and resource needs instead
of making them runner flags”). It is also the first thing an LLM coding-agent
workflow needs from the queue, but the field is general: a deploy, a release, and
any go mod download want the same promise.
Scope
-
network: none | bridgeon a job, validated at push time so a value no runner can satisfy fails the push rather than leaving the job queued forever. - Pin the request with the run, so a workflow edited after enqueue cannot change what a queued job is allowed to reach.
- Lease a
bridgejob only to a runner that advertises it, and to any runner otherwise: a job that asks for nothing keeps the runner’s own default. - Apply the job’s request in the runner, and refuse a
bridgejob on a runner that cannot provide one instead of running it without the network it asked for. - Apply the same rule in
vole workflow run, so a local run either matches CI or says what to change on the command line. - Show it: the workflows page says what a job asks for, the run page says what the run declared, and the runner’s log line names the mode it used.
- Document it in
docs/workflows.md,docs/reference/workflow-reference.md, anddocs/runner.md, including the two places that claimed a job could already ask. - The repository’s own
verifyandreleaseworkflows declarenetwork: bridgeinstead of relying on how their runner was started.
Not in this change: per-job CPU, memory, or PID limits (§5, same shape, separate field), and any queue priority for a bridge job that is waiting for a capable runner.
Acceptance criteria
vole workflow checkacceptsnoneandbridgeand rejects any other value, naming the field.- A
network: bridgejob is never leased to a runner started with--container-network none. It waits, and the runner’s startup line says what that machine can provide. - A
network: nonejob never gets a network, even from a runner that could give one. - A job that declares nothing behaves exactly as it did before this field existed.
vole workflow runof anetwork: bridgejob fails with a message naming--container-networkwhen the run was started without one.
Related
- #138 tracks the rest of the format gaps; this closes the network item.