MTPLX 2.10.2

Honest memory refusals, a correct and resilient Anthropic bridge for Claude Code, and sharper stop diagnostics.

Memory admission answers before it wedges (#415)

Large prompts used to be admitted optimistically. A request that could not fit prefilled until the allocator hit the wall, the stream died mid-flight, and the failure was logged as a client cancellation.

2.10.2 projects the prefill footprint before admission. Superseded SessionBank entries are cleared proactively, and a request that genuinely cannot fit is answered upfront with a structured HTTP 507 naming the shortfall. When a stream does fail, the wire and the request log now carry an honest error receipt (stream_error, error_kind) instead of a cancellation entry.

Anthropic bridge: correct usage, resilient streams

Two fixes for Claude Code and any other Anthropic-dialect client.

Usage math (PR #417 by @amichaelblock-lgtm). Anthropic's input_tokens and cache_read_input_tokens are disjoint fields; OpenAI's prompt_tokens is a cumulative total. The bridge copied the cumulative total into input_tokens while also reporting cache_read_input_tokens, double-counting the cached prefix on every session-cache hit. That inflated Claude Code's context meter and triggered premature auto-compaction. Wire-validated on the 27B: warm turns now report the true delta (input_tokens 56 vs 1,891 cold) and the two fields sum exactly to the server-side prompt total.

Long prefills survive Claude Code's watchdog. Claude Code's stream watchdog resets only on real message events. It ignores SSE comment keep-alives and discards protocol ping frames before the watchdog sees them, so a first turn that outlived its 300-second idle window died with "Stream idle timeout - no chunks received" while the engine was still prefilling. Large MCP toolsets reach 137k to 165k tokens on the first turn, which is exactly that regime. The bridge now emits prefill keep-alives as empty thinking_delta events inside the thinking block the model was about to open anyway. A measured 165k-token Claude Code first turn on the 27B now survives a multi-minute prefill, completes its tool calls, and every follow-up turn rides the SessionBank: 165,165 of 165,502 tokens served from cache, 3.9 seconds to first token.

Compile kill-switch precedence (PR #395 by @maceip)

An explicit MTPLX_COMPILED_GDN=0, or the new alias MTPLX_QWEN4EXP_COMPILE=0, now wins over profile auto-arming everywhere, including the set_ar_pipeline_mode path that used to silently re-arm the compiled GDN lane over an operator's explicit off.

Stop-cause telemetry (#414)

Generation stats now record finish_stop_origin, distinguishing model EOS, stop-sequence matches, length caps, and repetition stops, so "the model stopped early" reports are diagnosable from request logs alone.

Onboarding respects your terminal install

Running the app from a source checkout no longer upgrades or repoints the global terminal mtplx installation during onboarding, and QA builds resolve their explicitly allowed source wrapper ahead of stale app-managed or Homebrew runtimes. The production bundle's runtime precedence is unchanged. The --kv-quant help text now correctly describes the shipped packed-quant q4 kernel.

Dark lanes

Two measured techniques ship dark (off by default), with receipts in-tree: double-buffered AR decode via mx.async_eval (MTPLX_ASYNC_AR=1, ported from PR #396 by @maceip, measured flat at product cells on Flash-Next) and M-batched fused MoE GLU verify kernels (MTPLX_FUSED_MOE_VERIFY=1, bit-identical per token, measured slower at the verify widths on the shipped g64 pack).