You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Other] managed runtime host husks forever after its server child exits — no child watcher, no reap, no self-heal; profile stays locked until manual kill (0.1.49.2, verified present in 0.1.51) #4574
A managed runtime host supervises its server child not at all. If the child exits for any reason — clean or not — the host process keeps running as a husk: it stays in its accept loop, keeps the state lock and the control socket, and the profile is unusable until a human kills the host PID.
Host.serve() is an accept loop with a 1 s timeout. There is no join(), no waitpid(), no SIGCHLD handling, no poll of self._child anywhere in the host loop.
_status() correctly reports the child as failed (it polls), but nothing consumes that: no restart, no exit, no log line on child death.
--shutdown-timeout only bounds _stop_child() on deliberate stop/restart paths; it never applies to an unexpected child death.
Verified still present in strata-control 0.1.51 (code read 2026-10-28): serve() accept loop never polls the child; reap happens only in the finally/signal paths.
Impact: any local client (agent harness, benchmark, GUI) sees a wedged runtime with a live-looking lock and no self-heal; recovery requires knowing to kill a PID that status does not point at as the problem.
Smallest steps or command that reproduce it
strata runtime start <profile>; note the host PID and the server child PID (strata runtime status).
kill <server-child-pid> (any signal; also observed with the child exiting cleanly on its own).
Observe: the host process is still alive, strata runtime status reports failed, every strata runtime start/launch for the profile refuses with "this profile already has a live managed runtime" (exit 6), and the HTTP port stays dead. The husk never exits on its own; only kill <host-pid> + strata runtime start recovers.
Expected: the host should watch its child — on child exit, log it and either restart (bounded, like the engine auto-restart in serve, issue #27) or tear down cleanly (close owner pipe, release state lock, exit non-zero) so the next runtime start recovers without manual kill.
Reproduction status
Observed in the field (one real occurrence, 2026-10-27 ~11:02 local; not a controlled re-run). The code path was additionally confirmed by reading 0.1.49.2 and 0.1.51. A controlled kill <child> repro would confirm the full matrix but was not run.
Arch Linux x86_64, single GPU with 24 GiB VRAM, 64 GiB DRAM.
Model, size and settings
Profile launch-iq3_s-128k (IQ3_S quantization, 128k context), single profile.
Logs
Watchdog blocks from the 2026-10-27 incident recorded: strata runtime status = child failed while the host PID stayed alive, and repeated strata runtime start attempts returning exit 6 ("this profile already has a live managed runtime"). The in-flight generation was severed at the transport level when the child exited. Recovery was kill <host-pid> + runtime start. Sanitized excerpt available on request.
Thanks for the issue. To keep the tracker readable, every item needs an area prefix in the title and the parts of the issue form filled in. This one is missing:
Start the title with its area: [Engine], [GUI], [TUI], [Benchmark], [Docs] or [Other], then a short description. Example: "[Engine] decode stops after 2 minutes".
Edit the issue (title and description) and this note goes away on its own. If it is still missing parts in 5 days it will be closed, which is not a rejection: fix it and comment /reopen.
changed the title [-][Host] host keeps running forever after its server child exits — no child watcher, no reap, no self-heal; the profile stays locked until a manual kill (0.1.49.2, Linux)[/-][+][Other] managed runtime host husks forever after its server child exits — no child watcher, no reap, no self-heal; profile stays locked until manual kill (0.1.49.2, verified present in 0.1.51)[/+]on Oct 29, 2026
Additional data point. Two husk events in a single boot session (2026-10-29 to 30).
Hardware: RTX 3090 24GB, 64GB DDR5 CL26, Ryzen 7 7800X3D, CachyOS, kernel 7.3.0-5-cachyos.
Strata: engine 0.1.50, control 0.1.51, app 0.2.6. Model: Qwen3.8-Flash-Next IQ3_S GGUF, 128K context.
Profile: tune field set to null (removed from launch preset). tuned_preset still pinned.
Husk 1 (Oct 27, 11:02): tune-reload triggered cancel=True, child exited, host wedged in join().
Husk 2 (Oct 30, post-reboot): No tune-reload. Process found wedged (1050 MiB VRAM, no model, curl empty, thread count 1). Child had died at unknown time between boot and discovery. No "stopping" line preceding the death. No cancel=True. The child simply stopped and the host did not reap it.
This confirms the husk is not exclusively a tune-reload artifact. The serve() accept loop never polls the child process. A child death from any cause produces the same wedged host. The fix is the reap, not the trigger elimination.
Recovery: kill host PID, runtime start. 2-3 min cold reload. No data loss.
Activity
github-actions commentedon Oct 29, 2026
Thanks for the issue. To keep the tracker readable, every item needs an area prefix in the title and the parts of the issue form filled in. This one is missing:
Edit the issue (title and description) and this note goes away on its own. If it is still missing parts in 5 days it will be closed, which is not a rejection: fix it and comment
/reopen.Details: CONTRIBUTING.md
[-][Host] host keeps running forever after its server child exits — no child watcher, no reap, no self-heal; the profile stays locked until a manual kill (0.1.49.2, Linux)[/-][+][Other] managed runtime host husks forever after its server child exits — no child watcher, no reap, no self-heal; profile stays locked until manual kill (0.1.49.2, verified present in 0.1.51)[/+]github-actions commentedon Oct 29, 2026
Thanks, this follows the format now.
l473n79c618e commentedon Oct 30, 2026
Additional data point. Two husk events in a single boot session (2026-10-29 to 30).
Hardware: RTX 3090 24GB, 64GB DDR5 CL26, Ryzen 7 7800X3D, CachyOS, kernel 7.3.0-5-cachyos.
Strata: engine 0.1.50, control 0.1.51, app 0.2.6. Model: Qwen3.8-Flash-Next IQ3_S GGUF, 128K context.
Profile: tune field set to null (removed from launch preset). tuned_preset still pinned.
Husk 1 (Oct 27, 11:02): tune-reload triggered cancel=True, child exited, host wedged in join().
Husk 2 (Oct 30, post-reboot): No tune-reload. Process found wedged (1050 MiB VRAM, no model, curl empty, thread count 1). Child had died at unknown time between boot and discovery. No "stopping" line preceding the death. No cancel=True. The child simply stopped and the host did not reap it.
This confirms the husk is not exclusively a tune-reload artifact. The serve() accept loop never polls the child process. A child death from any cause produces the same wedged host. The fix is the reap, not the trigger elimination.
Recovery: kill host PID, runtime start. 2-3 min cold reload. No data loss.