A lifecycle record is not a log line
llama.cpp b11401, published October 5, 2026, is a prerelease. The linked pull request #29895 was created October 3 and merged at 23:59 UTC on October 4. It changes router-mode communication between a parent server and child model server: a child now reserves stdout for state commands and redirects ordinary stdout output to stderr with logs. The router reads the two streams independently, accepts state framing only from the command stream, forwards stderr as logs, and warns about unexpected stdout lines.
Before this change, the PR author says state commands and logs shared one pipe. An unterminated log write or color-reset sequence could precede a command, causing the router to treat the intended lifecycle update as text instead of state. The author reports this could leave a model appearing stuck during download. The merged commit a7fb71f makes the separation explicit in the child lifecycle and replaces a combined-output subprocess option with separate output pipes. This is author-supplied implementation and reproduction evidence, not an independent availability, security, or cross-platform result.
- 1Child state record
- 2reserved stdout
- 3router command reader
- 4lifecycle handler
- 1Child log or progress text
- 2stderr
- 3router log forwarder
- 4operator view
- 1Unexpected text on command stream
- 2warning and no state transition
- 1Wrapper that combines stdout and stderr
- 2framing boundary lost
- 3rejected deployment design
The patch also moves terminal color resets before trailing newlines so one line carries its own ANSI state. On Windows it enables virtual-terminal processing only when colors are enabled and the console can render them. These are implementation-specific display details. They do not prove that every terminal, pipe, process wrapper, or operating system has the same behavior.
POSIX.1-2024's write() specification supplies the older mechanism behind this distinction: a pipe is a byte stream, and it only requires writes no larger than {PIPE_BUF} to avoid interleaving with other writers. It does not make an arbitrary read equal one log line or one record. A buffered stderr writer may still split a line across writes; b11401 removes cross-stream mixing between the router's commands and logs, but the child and parent still need bounded, incremental framing within each stream. The standard page is the 2024 edition, but its exact publication date was not established here.
Preserve the control channel from child creation onward
A process boundary needs a narrow contract. In this change the child reserves stdout before normal server output, emits a framed state notification there, and sends logging to stderr. The parent preserves separate partial-line buffers, waits on both pipes, and treats only the expected command prefix on stdout as a state record. This avoids having a progress message compete with a control record for parsing.
Do not put a wrapper around that child which merges stdout and stderr back into one stream. That would recreate the ambiguity this patch removes. It can also blur sensitive operational logs with machine-readable control data. The source does not claim that download text is adversarial input or that the separation is a complete secret-handling mechanism; treating arbitrary text as a state command is a risk inference. A real deployment still needs its own access control, log redaction, model and artifact provenance, and network isolation.
This is an original, unexecuted N=1 fixture for a local process supervisor:
- Start with one pinned b11401 candidate in an isolated local environment. Record the resolved commit, parent/child command lines, operating system, whether a wrapper is present, and the intended state record prefix. Do not attach credentials, public listeners, tools, or untrusted model downloads.
- Send a synthetic progress line without a newline on stderr, then one syntactically valid state record on reserved stdout, followed by a newline. Capture each pipe separately with bounded buffers and a short timeout. The expected result is one parsed state event and one preserved log fragment; it is not a model download test.
- Reject the fixture if a state record arrives through stderr, an unexpected stdout line changes lifecycle state, either buffer exceeds its declared limit, a pipe closes unexpectedly, or the manifest changes. Keep the failed bytes as non-sensitive diagnostic evidence. Do not merge the streams, retry through another supervisor, or infer state from a log prefix.
The repository's MIT license covers its code, not model files, logs, or a production supervisor. Its security policy says that router and some other server features are not recommended for untrusted environments. That policy is not a security certification of b11401. No process was launched, no fixture was executed, and no Windows, macOS, or Linux behavior was independently tested for this article.
Bound the claim to router mode
This article concerns router child lifecycle framing. It does not change the x86 matrix-shape condition in the K-tail article, and it does not establish model inference performance. The useful decision is simpler: if state drives lifecycle actions, give it a dedicated, bounded, machine-readable channel and preserve that separation through every wrapper.
MENTAL MODEL / REASONING ORDER
From an announcement to your own decision.
Compare the announcement with the conditions in the paper and official documentation.
Sources
Publication dates belong to the source; access dates record when it was checked. Community observations are separate from official statements.