Saphan StudioDocs
Troubleshooting

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 seeit meanswhat to do
the seat is busythat exact seat is running somethingwait, or name another seat
the lane is exhaustedthe vendor's budget ran out during the runthe run is lost; wait for the window to reset
the seat is spent and an alternative is namedthis seat's budget is nearly gone and a healthier one existsdispatch onto the named seat
the seat is spent and it was admitted with a warningbudget nearly gone, and no healthier seat of that backend existsproceed knowingly, or wait for the reset
usage is unknownno reading is available for this seatnot a fault — the check abstains rather than guessing
trust is not stampedthis host has not been granted trust for this workspacea one-time setup act, per host and per workspace. This is a human act.
the repository is not freshthe host's copy of the code is behindupdate the host
an owner blocka human deliberately blocked thisask 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.

classwhat its name indicates
routing-refusalWork was not routed anywhere. ⚠ If your refusal also carries a rule number, that number is the diagnosis — see the table above.
toolchain-unavailableA 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-largeA result exceeded the size the transport will carry.
serverd-already-runningThe background service is already running.
listen-ambiguousMore than one listening address was implied and the product will not choose between them.
detach-kernel-portDetaching stumbled on the port the service listens on.
detach-stdio-conflictDetaching stumbled on a conflict over the standard input and output streams.
tunnel-needs-listenerA tunnel was asked for with nothing listening at the far end of it.

On this page