Exit code 3 on both test jobs, which is pytest's INTERNALERROR rather than a
test failure. Reproduced in a fresh clone under the CI environment, in WSL.
1. pipeline.py called sys.exit() at import time.
When the optional LLM Workflow Router is absent it exited the process from
module scope. tests/test_pipeline.py imports it at module level, so SystemExit
fired during collection and took down the ENTIRE suite -- all 268 tests, not
the sixteen that need a router. It passed here only because a router checkout
happens to sit beside the repo; any fresh clone hit it.
The router failure is recorded as ROUTER_ERROR and raised by require_router()
where routing actually happens. The message and the exit code a user sees are
unchanged. The topology still builds and validates AT IMPORT when the router is
present, because that declaration is the escalation bound and validating it
late would let a malformed one reach a run.
test_pipeline.py skips rather than fails when the router is missing, and …
failure: turn every way Ollama can fail into a sentence
The open items asked for failure injection around Ollama. The first case
tried was the commonest one there is -- the server not running -- and it
printed this, under the banner, after the banner:
urllib.error.URLError: <urlopen error [WinError 10061] No connection
could be made because the target machine actively refused it>
Thirty lines of stack ending in a Windows error number, from a tool whose
entire argument is that it says what it does and does not know.
endpoint.explain() now converts each failure once, at the single point every
caller reaches the server through, and each conversion carries the next step:
refused which address it tried, and whether that came from
OLLAMA_HOST rather than the default
404 WHICH model is missing, by name, and that nexa build
registers it -- "HTTP Error 404" names nothing
500 Ollama's own words from the body, usually "llama runner
process has terminated"…