Dispatch and capacity
Why work went to one place and not another, or nowhere — and the eight refusal classes in this family.
8 classes. 0 explained, 8 named only.
⚠ Read this first, because it is the part of the section most likely to mislead you. Dispatch refusals — the ones that decide where a piece of work runs, or that it will not run — are the refusals an operator meets most often, and they are not identified by a class from this list. They are identified by a rule number, a short token such as R8c or R53, and the rule number is the whole diagnosis. The eight classes on this page are a different, narrower set: they are about getting a process up and reachable, not about choosing where work lands.
So there are two different things to look up, and knowing which one you are holding saves the search.
If your refusal carries a rule number
Every dispatch refusal names its rule and says what it saw. A refusal costs nothing — no budget is spent, no work is lost, nothing is left half-written. When in doubt, attempt it and read the answer; that is cheaper and more reliable than reasoning about whether it would have worked.
The ones an operator meets most:
| you see | it means | what to do |
|---|---|---|
| the seat is busy | that exact seat is running something | wait, or name another seat |
| the lane is exhausted | the vendor's budget ran out during the run | the run is lost; wait for the window to reset |
| the seat is spent and an alternative is named | this seat's budget is nearly gone and a healthier one exists | dispatch onto the named seat |
| the seat is spent and it was admitted with a warning | budget nearly gone, and no healthier seat of that backend exists | proceed knowingly, or wait for the reset |
| usage is unknown | no reading is available for this seat | not a fault — the check abstains rather than guessing |
| trust is not stamped | this host has not been granted trust for this workspace | a one-time setup act, per host and per workspace. This is a human act. |
| the repository is not fresh | the host's copy of the code is behind | update the host |
| an owner block | a human deliberately blocked this | ask the human |
⚠ Absence of a measurement is not a refusal. A seat with no reading is admitted with a note. And a row that reads unmeasured is not a row that reads refused — the first means nobody has looked, the second means someone looked and said no.
Four things that surprise operators
- "It refused, but the seat looks free." Busy is measured at the moment of dispatch, and several things can hold a seat besides a visible run: a lock from a sibling attempt, a host ceiling reached by other seats, a role already out.
- "It picked a tired seat over a fresh one." The redirect only applies when the fresh seat shares the tired one's backend. A fresh seat of a different vendor is not an alternative.
- "The same work refused on three different seats in a row." Then the objection is probably not about seats at all. Trust and workspace conditions are bound to the host and workspace, so changing seats does not clear them.
- "Two identical requests behaved differently an hour apart." Readings age. A seat measured as healthy at nine may be spent by ten, and the check reads the latest reading, not the one you saw.
⛔ Read the refusal before you change anything. Every refusal in this system is written to name what it saw; changing a setting to make a sentence go away is how a correct refusal becomes an incorrect configuration.
The eight classes in this family
These classes are real, deliberate and named. This section does not yet carry their resolution.
| class | what its name indicates |
|---|---|
routing-refusal | Work was not routed anywhere. ⚠ If your refusal also carries a rule number, that number is the diagnosis — see the table above. |
toolchain-unavailable | A toolchain the work needs is not available where it would run. ⚠ Worth knowing on sight: this is a property of the host, not of your request, so re-running the same work unchanged elsewhere may succeed. |
result-too-large | A result exceeded the size the transport will carry. |
serverd-already-running | The background service is already running. |
listen-ambiguous | More than one listening address was implied and the product will not choose between them. |
detach-kernel-port | Detaching stumbled on the port the service listens on. |
detach-stdio-conflict | Detaching stumbled on a conflict over the standard input and output streams. |
tunnel-needs-listener | A tunnel was asked for with nothing listening at the far end of it. |