0.5.208: after the run-without-AI hand-off the client moves its local node URL to :8080 and polls the dead port forever
First, the good news, because it is most of the story: 0.5.208 fixed the YOU step and the whole no-AI wizard now runs. On Windows, you_step, join_federation, setup_complete, claim_settled and without_ai_recorded all pass — 6/7 — and the agent confirms CIRIS_RUN_WITHOUT_AI=true reached its .env. bb76e51 did exactly what you said it would.
What is left is one client-side bug at the hand-off, and the desktop log names it in a single line.
The smoking gun
ciris_desktop_setup.log, line 7:
[INFO][CIRISApiClient] [setLocalNodeUrl] local node is http://127.0.0.1:8080 (was http://127.0.0.1:4243)
The client started with the node at :4243 and then overwrote it with :8080 — the wrong direction for a run-without-AI session. Everything after that follows from it:
[INFO][StartupViewModel] [STARTUP][STATUS] Restarting your node...
[INFO][CIRISApiClient] [init] CIRISApiClient initialized with baseUrl=http://127.0.0.1:8080
[PythonRuntime.desktop] Health check attempt 102: null
[ERROR][ServerConnectionVM] [checkConnectionStatus] Health check failed: Connection refused
109 CIRISApiClient inits in that log. Every single one at :8080. Not one at :4243.
The node was up the entire time
The node's own output is teed into the same file, so both halves are visible side by side:
[CIRIS] 2026-09-07T17:30:05.294081Z INFO ciris_server::compose: read API up — GET /lens/api/v1/* + GET /v1/identity read_api=0.0.0.0:4243
[CIRIS] 2026-09-07T17:30:05.295577Z INFO ciris_lens_core::role::node: lens read API listening listen_addr=0.0.0.0:4243
And our side did what it promised, 0.12s after the exec:
[RUN-WITHOUT-AI] setup complete; replacing this process (pid=8820) with the ciris-server node.
:8080 goes away and the client moves to :4243
[RUN-WITHOUT-AI] replacing this process (pid=8820) with the node in place:
[python.exe, -m, ciris_server, --headless, --home, …, --key-id, …]
So: agent gone by design, node listening on :4243, client polling :8080. The user sees "Restarting your node…" indefinitely.
Not a crash
Worth stating because our own harness got this wrong first and I have fixed it on our side: the app did not die. No exception, no System.exit, the log simply runs on to health-check attempt 102 and past the node's 17:30:05 lines. Our diagnostic concluded "the app PROCESS IS GONE" because both :9091 and :8080 were unreachable — an inference that is valid normally (two listeners, one process) and invalid here, since :8080 is supposed to be gone. That is CIRISAgent@782963524; the verdict now probes the node before declaring anything dead, and our announce check now authenticates against the node on a no-AI leg rather than against a port that cannot exist.
What we think the fix is, without prescribing it
setLocalNodeUrl appears to be applying a default, or a persisted pre-setup value, over the :4243 the run-without-AI branch had already selected — the log line reads as an overwrite, not a choice. The wizard clearly knows the right answer at question time (0.5.203 shipped exactly that), so the loss looks like it happens at the setup→startup transition rather than in the wizard.
The invariant we would test for: once run_without_ai is recorded, no code path may set the local node URL back to the agent port. Right now the last writer wins and it is the wrong one.
Reproduction
CIRISAgent five-platform gate, run #34147279506, windows job, live-qa-windows artifact → ciris_desktop_setup.log. Agent side: logs/ciris-windows/ciris_agent_20260907_172932.log, grep RUN-WITHOUT-AI. Node side: logs/ciris-windows/ciris-server.log.2026-09-07.
This is the last thing standing between the no-AI leg and green for us. Everything else in that leg passed.
0.5.208: after the run-without-AI hand-off the client moves its local node URL to :8080 and polls the dead port forever
First, the good news, because it is most of the story: 0.5.208 fixed the YOU step and the whole no-AI wizard now runs. On Windows,
you_step,join_federation,setup_complete,claim_settledandwithout_ai_recordedall pass — 6/7 — and the agent confirmsCIRIS_RUN_WITHOUT_AI=truereached its.env.bb76e51did exactly what you said it would.What is left is one client-side bug at the hand-off, and the desktop log names it in a single line.
The smoking gun
ciris_desktop_setup.log, line 7:The client started with the node at
:4243and then overwrote it with:8080— the wrong direction for a run-without-AI session. Everything after that follows from it:109
CIRISApiClientinits in that log. Every single one at:8080. Not one at:4243.The node was up the entire time
The node's own output is teed into the same file, so both halves are visible side by side:
And our side did what it promised, 0.12s after the exec:
So: agent gone by design, node listening on
:4243, client polling:8080. The user sees "Restarting your node…" indefinitely.Not a crash
Worth stating because our own harness got this wrong first and I have fixed it on our side: the app did not die. No exception, no
System.exit, the log simply runs on to health-check attempt 102 and past the node's 17:30:05 lines. Our diagnostic concluded "the app PROCESS IS GONE" because both:9091and:8080were unreachable — an inference that is valid normally (two listeners, one process) and invalid here, since:8080is supposed to be gone. That isCIRISAgent@782963524; the verdict now probes the node before declaring anything dead, and our announce check now authenticates against the node on a no-AI leg rather than against a port that cannot exist.What we think the fix is, without prescribing it
setLocalNodeUrlappears to be applying a default, or a persisted pre-setup value, over the:4243the run-without-AI branch had already selected — the log line reads as an overwrite, not a choice. The wizard clearly knows the right answer at question time (0.5.203 shipped exactly that), so the loss looks like it happens at the setup→startup transition rather than in the wizard.The invariant we would test for: once
run_without_aiis recorded, no code path may set the local node URL back to the agent port. Right now the last writer wins and it is the wrong one.Reproduction
CIRISAgentfive-platform gate, run #34147279506,windowsjob,live-qa-windowsartifact →ciris_desktop_setup.log. Agent side:logs/ciris-windows/ciris_agent_20260907_172932.log, grepRUN-WITHOUT-AI. Node side:logs/ciris-windows/ciris-server.log.2026-09-07.This is the last thing standing between the no-AI leg and green for us. Everything else in that leg passed.