{"version":"2.1.309","anchor":"remote-runner-stream-emits-turn-began-before-init-and-alive","canonical_anchor":"remote-runner-stream-emits-turn-began-before-init-and-alive","heading":"Runner output now signals life while a session's start-up is delayed","tier":"internal","area":"Self-Hosted Runners","scope":"org","heads_up":false,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.309\/e\/remote-runner-stream-emits-turn-began-before-init-and-alive","release_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.309","markdown":"### Runner output now signals life while a session's start-up is delayed\n\nRunner sessions now print a notice when a turn starts before the session's start-up message, with optional heartbeats via `CLAUDE_RUNNER_ALIVE_EVERY_MS`\n\n**What**\n\nA runner is a machine that carries out Claude Code sessions for another program, such as an orchestrator that watches the runner's output. Normally a session first writes an init message, which announces that it has started. When it writes its output straight to standard output with no bridge connection, Claude Code now covers the case where a turn begins before that init message:\n\n- It writes a system message of type `turn_began_before_init`.\n\n- If `CLAUDE_RUNNER_ALIVE_EVERY_MS` is set, it also writes `alive_before_init` heartbeat lines at that interval, in milliseconds.\n\nThe system message is always written in this case. The heartbeat lines appear only when the variable is set.\n\n**Why**\n\nAn orchestrator that judges whether a runner is alive by watching its output can now tell that the runner is still working while the init message is delayed, instead of treating the silence as a hang.\n\n- Area: Self-Hosted Runners\n- Tier: Under the hood\n- Useful: 2\/5\n- Signal: 2\/5\n- Scope: org\n- Heads-up: no"}