October was the month CKE began to sound like the computer I actually want to use. We merged 347 pull requests, but the number is not the story. The story is that kernels, model state, HTTP serving, speech, and a confirmed voice client started to meet in one testable path. Some parts now work on named artifacts. Some still sound rough, run slowly, or fail at longer boundaries. This is what moved, what we measured, and what I want to fix next.
I build C-Kernel-Engine because I want to see what the machine is doing. A model should not be a mystery hidden behind one framework call. CKE describes operations as circuits, selects explicit kernel contracts, generates C, and lets us compare the intermediate numbers with a pinned reference. In October, that habit of checking the numbers spread into the less glamorous parts of a usable system: tokenizer bytes, cache state, request capacity, process provenance, and speech playback.
347 Pull Requests, But What Changed?
I counted first-parent PR merges on main between October 1 and November 1 in Pacific time. That yields 347 merged PRs, from #637 near the beginning of the month to #997 at the end. This is a merge-history count, not 347 new production-ready features. Several PRs are deliberately small: one kernel boundary, one regression, or one correction to the evidence we use to judge a result.
The full October PR record is there if you want every diff. Here are the threads that matter to me.
| Thread | Representative merged work | Still open |
|---|---|---|
| Speech | Kokoro native sessions and longer text; Qwen3-TTS codec, talker and waveform steps; Whisper word diagnostics | Intelligible long technical answers, measured latency, interruption and recovery |
| Serving | Batch requests, admission, tool framing, context checks, disconnect handling | Repeated real-client journeys on a pinned deployed bundle |
| Numerics | Gemma and vision first-divergence traces, stored-operand replay, tokenizer contracts | Whole-model parity across longer prompts, images, dtypes and machines |
| CPU performance | Flash Next prefill reuse, vision GEMM work, ARM NEON kernels | Matched benchmarks and regression coverage before a general speed claim |
Where CKE Is in the Stack
It helps to see the route before the monthly details. Start with model weights, tokenizer and a circuit describing the operations. The compiler validates shapes, dtypes, layouts and state, uses kernel maps to choose C functions, and emits a model-specific native bundle. The runtime then handles prefill, decode and, for supported audio paths, the waveform. The X-Ray and reference-replay path runs back against that route when the output disagrees. The CKE README's scope table is the current source for which model paths have named evidence.
October strengthened every link, but not all links equally. Text inference already has named end-to-end lanes; vision still needs artifact-specific image and decoder parity; Whisper has generated inference on named fixtures; Kokoro and Qwen3-TTS are progressing through bounded generated speech paths. A native client and server can connect these pieces, but that connection needs its own tests. Think of CKE as a runtime under construction with unusually explicit evidence, not a single universal “supported” switch.
Giving CKE a Voice
My practical motivation is simple: I work with several agents at once and I do not want to read every terminal window to know what happened. I want to ask a question aloud, confirm what the microphone heard, and hear a faithful answer. That requires more than one model writing a WAV file.
Whisper is the listening side. October added word alignment and attention tracing so we can investigate where the transcript's timing came from. Kokoro moved through generated waveform execution, accessible chunks, a native summary session, and whole-text WAV output. Qwen3-TTS was built up in smaller pieces: a baseline, codec and talker stages, a generated waveform, pinned native WAV, and checked prompt capacity.
The most personal PR for me was #995: a confirmed local voice client with correlated replies. It starts connecting a spoken request to the answer from the right session. That is a real step toward accessible agent interaction. It does not mean I can yet rely on CKE to read arbitrary long agent reports accurately. Paths, negative numbers, code identifiers, unknown words, playback controls and device recovery still need a complete listening test.
The Agent Voice Loop I Am Actually Prototyping
My desktop is AwesomeWM, several Terminator windows, and agents working in different repositories. That is useful when I can read every pane. It is a lot less useful when I need to ask, out loud, “What changed on P3?” and hear the answer without hunting for the right terminal. CKE supplies the speech experiments; LinuxUtilities connects them to my Linux desktop. Here is the route I can try today, rather than the polished app I eventually want.
Route one: ask the agent already in Terminator
I can record a note with voice_note.py. It uses a local CKE Whisper run, saves the original WAV and transcript under ~/VoiceNotes, and lets me review what it heard. I can then select a Terminator window ID and explicitly approve typing that transcript. For an update request, I ask the agent to write a short server_summary.txt in its project. On P3, read_server_summary.py fetches that file over SSH and speaks it with the system voice; the separate speak_server_summary_cke.py path tries bounded CKE Kokoro speech. I can use a saved WAV instead of recording live while testing the route.
python3 scripts/voice_note.py --list-windows
python3 scripts/voice_note.py --audio-file /path/to/recording.wav
# Review the saved transcript. The next command needs my explicit SEND confirmation.
python3 scripts/voice_note.py --send-file ~/VoiceNotes/SESSION/transcript.txt --window 0xWINDOW --submit
python3 scripts/read_server_summary.py --host p3 --system-voice
python3 scripts/speak_server_summary_cke.py --host p3 --dry-runThe exact request I would send is: “Give me the latest CKE update. Write a short, plain-language server_summary.txt with what changed, what passed, what is still uncertain, and what you need from me. Replace the file atomically, then tell me it is ready.” That summary is for listening, not a substitute for the agent's original evidence. I want the source, timestamp and request ID beside it so I can tell whether I am hearing today's answer or yesterday's.
There is a sharp limitation here: --window picks a desktop window, not a verified agent session or even necessarily the pane I meant. Focus can move. voice_pane_bridge.py can acknowledge that text reached a selected pane, but it does not prove the coding agent accepted or completed the instruction. I should never automatically resend after an uncertain delivery, because the first request may already be running.
Route two: the newer CKE voice client
The client added around PR #995 is a different experiment. It records or accepts a WAV, asks me to confirm the transcript, assigns a request ID, journals delivery states, calls a CKE Responses server, and supports interruption and repeat of local speech. Later work hardened playback, speech-process exit, and long WAV chunks. That is much closer to a real voice conversation. Its --agent-id and --project-id are labels in the journal, though; this client does not attach to my existing Terminator Codex agent and does not give its model project-file tools. I do not want to call those two paths the same feature yet.
How close is it?
| Part of the loop | What I can demonstrate now | What would make me trust it daily |
|---|---|---|
| Hear my request | CKE Whisper transcribes recorded audio; I review the transcript before sending. | Repeated headset tests with my speech, noise, silence and microphone disconnects. |
| Reach the right agent | LinuxUtilities can type into a selected window; CKE's separate client correlates its own server replies. | A named live-agent adapter with accepted/completed receipts, no focus-based routing and no unsafe automatic retry. |
| Know what happened | An agent can write server_summary.txt; the reader rejects old summaries by age. | Atomic update, source identity, request ID, completion state and a link to the full answer. |
| Hear it faithfully | System speech can read the text. CKE Kokoro can synthesize bounded supported chunks. | Long technical answers with accurate paths, signs and identifiers; pause, repeat and failure recovery on my headset. |
I ran the six focused LinuxUtilities test files while writing this: 34 tests passed. They exercise script orchestration and edge cases, mostly with mocks. I did not record through my headset, listen to a generated answer, or complete a live P3 agent round trip for this article. So this is a usable prototype with a real accessibility goal, not a claim that the whole journey is reliable yet. The next meaningful test is ten consecutive real turns: choose the same named agent, speak, correct one transcript, confirm, receive a correlated answer, stop and repeat speech, then survive a dropped connection without losing or duplicating the request.
The Server Cannot Quietly Change the Experiment
Suppose the same model sees two different prompts because one HTTP bundle trims a long tool schema. The generated response may look like a model failure, but the model never received the same experiment. October's serving work made these boundaries harder to miss: bounded admission, two-request HTTP batching, oversize-request recovery, loaded special-token checks, and queued-disconnect handling.
Tool use added another layer. A model printing a shell-looking string is not the same as a client receiving a declared, authorized tool call and returning its observation. Qwen Code 0.25.1 acceptance and the model-specific serving tests made that distinction more concrete. It is the same discipline we used while looking at Cohere's Qwen trace: exact token IDs and the actual loaded bundle matter before comparing outputs. A generated command was never permission to execute it.
Here is the less glamorous server story. A request arrives while another is running. The server needs to decide whether it can queue that request, how much context it can hold, and what to do if the client disconnects before the model gets a turn. #700 bounded the queue; #798 and #845 made context capacity a checked admission decision instead of silent truncation; #987 stopped queued, disconnected clients from consuming native work. #848 tightened stop scanning and made usage estimates explicit. These changes are about predictable failure as much as successful output.
Batching adds a harder question: can two users share computation without sharing state? A two-slot HTTP path landed in #715, but the correct test is not merely that two requests return text. Each request must keep its own token history, KV or recurrent state, cancellation outcome, and next-turn prompt. That is why the long list of state and replay PRs matters more than a concurrency headline.
Find the First Wrong Number
A decoder can produce plausible words while an image path is numerically wrong. October's Gemma, Qwen vision and Instella work kept narrowing the first bad boundary instead of tuning around a final answer. For example, shared numerical replay and convolution operand capture strengthened the diagnostic machinery. stored attention operand investigation, an independent Gemma decoder, and an independent logit contract pushed the comparison farther.
Those are not claims that every Gemma vision image or every long context now matches the reference. They are ways of making a mismatch actionable: compare identical inputs, record the first divergent tensor, check storage and accumulation, then add a regression at the actual boundary. The current support matrix gives the narrower artifact-level claims.
Take one ordinary operation: y = x + F(x). If x and F(x) are stored in BF16, the result depends on where rounding happens, not just on the algebra on paper. #853 pinned the stored-value contract for BF16 addition. The same issue reappears at larger scale when attention is split across prefill chunks: values, reduction order, cache offsets and position state must preserve the declared arithmetic. #868 addressed that chunk-continuation boundary. A final token match is useful, but it can hide an earlier wrong tensor; X-Ray packets and captured operands let us find that tensor instead.
This is also why an independent comparison matters. If CKE generates both the result and its expected fixture from the same wrong formula, the test can pass beautifully. The Gemma work moved toward independent decoder and logit contracts, and #988 rejects an incomplete logit tensor before anyone calls it a successful comparison. A failed check is valuable when it points to the first measurable mistake.
Performance Without Guessing
We also spent October asking why a generated CPU runtime was slower than it should be. On Qwen3.8 Flash Next, MoE expert-packing reuse reduced repeated work during prefill, while the prefill oracle gate kept the arithmetic comparison attached to the optimization. Vision F16 and BF16 GEMM work landed in #978 and #979; ARM NEON quantized kernels continued through #902 and #910.
The Flash Next evidence is deliberately narrower than “CKE is now fast.” The retained investigation calls for repeated idle-host measurements, cancellation checks and final-head nightly before promoting a serving-speed claim. One fast route on one bundle is useful; it is not a fleet-wide benchmark.
Follow the PRs behind the month
31 selected PRsOpen a track to follow the work in merge order. These are selected changes that explain the article, not a substitute for the complete October PR record. Each entry links the PR and the merge commit.
Server and agent contractsAdmission, capacity, accounting, cancellation and real-client acceptance.8 PRs
- PR #700Bound single-flight serving admission with a FIFO queuefb327dcf
- PR #715Opt in to two-slot generated HTTP decodece70528c
- PR #798Reject context over capacity without native truncationad349677
- PR #845Reject oversized prompts before generatione9a0d69e
- PR #848Bound stop scanning and disclose usage estimates563cabb1
- PR #861Verify loaded special tokens by vocabulary lookupdcc809ba
- PR #987Drop disconnected queued requests before native work4a9edd02
- PR #991Version Qwen Code 0.25.1 acceptance99492f42
Math and first-divergence evidenceCompare stored values, chunk state, operands and complete logits.8 PRs
- PR #822Replay verified operation packetse941c4eb
- PR #853Certify BF16 addition as stored values4bd2bbec
- PR #863Capture full vision-encoder replay operandsdfa8fedc
- PR #864Capture convolution operand constructiond16c1c90
- PR #868Preserve attention arithmetic across prefill chunks46c3ade3
- PR #973Require requested post-store cache captures8690e12b
- PR #982Resolve Gemma Q projection capture from the graph4b0c7a51
- PR #988Reject incomplete logit tensors before comparison590e119b
Speech and accessible controlFrom checked waveform stages to a correlated voice request.10 PRs
- PR #823Compose runtime-length Kokoro diagnostic waveformc9f6e627
- PR #850Plan bounded native Kokoro text requests14c1bf6e
- PR #867Publish one WAV from checked whole-text chunksd84e6c66
- PR #873Pin the Qwen3-TTS 0.6B CustomVoice oracle975daaca
- PR #974Certify a pinned Qwen3-TTS generated waveform346ab783
- PR #980Package a pinned native Qwen WAV session9da3582c
- PR #994Derive Qwen3-TTS prompt storage from capacityfc32d2fc
- PR #995Add confirmed local voice control with correlated repliesc1be5375
- PR #996Add native selected-attention alignment foundationf09638d0
- PR #997Expose Whisper attention for word-timing diagnosis7ca5d5be
Performance with parity gatesKeep reset, state and numerical checks attached to faster code.5 PRs
Source: first-parent merges to CKE main during October 2026, Pacific time. The PRs above are a guided sample of 347, not a completeness claim.
Where Could This Actually Be Useful?
I do not think the right pitch is “another local AI runtime that runs everything faster.” llama.cpp already serves quantized models on CPUs; ONNX Runtime already has a CPU execution provider and a broad hardware-provider system; OpenVINO already targets optimized deployment. CKE has to earn a specific job where its generated C and first-divergence machinery make a difference. The following are product-discovery hypotheses, not proven demand or a market-size estimate.
Model porters and runtime engineers are the nearest fit. If they spend days asking why a new architecture diverges at layer three, an inspectable generated call graph and a reliable first-bad-tensor trace might save real work. To test that, we should invite someone outside the core project to port or debug one bounded model and measure whether CKE's evidence shortens the task. A polished diagram is not validation; an independent user completing the task is.
CPU-first teams are a possible second group: small labs, on-premise environments, or applications with available CPUs and explicit privacy or deployment constraints. Their question is not “Can CKE run on a CPU?” but “Can this exact model serve our workload at acceptable latency, memory and operational cost, including cancellation and recovery?” We need comparisons on the same model, prompt, machine and client path before claiming an advantage over established runtimes.
Accessible local computing is my personal testbed. If Whisper can capture a request and Kokoro or Qwen3-TTS can speak an agent's technical response without losing filenames, signs or meaning, that is a use I can judge every day. It may eventually interest other accessibility builders, but first it must work through a real microphone, headset and named-agent session. The speech model is only one layer; LinuxUtilities owns the controls, history and recovery around it.
Farther out, generated kernels might appeal to edge and embedded teams that need a narrow, inspectable runtime. That is a research direction, not a current product claim. The right order is to win one small repeatable job, learn from it, then widen the hardware and model surface.
November and December: Prepare for More People to Try It
My first goal remains a complete voice journey I can use without staring at the terminal: record, review the transcript, select the right agent, confirm delivery, hear the answer, interrupt it, repeat the important paragraph, and recover if the device or runtime disappears. Kokoro and Qwen3-TTS should be judged on real technical text, timing and intelligibility, not just whether a file has a WAV header.
November and December should turn that and the broader CKE runtime into repeatable experiences for somebody other than me. I want a small set of pinned model bundles, clear CPU and memory requirements, one-command smoke tests, expected outputs, useful error messages, and a way to report exactly which artifact, instruction set, command and input failed. The test should cover a fresh install, not only my already-configured workstation. Speech needs real listening checks; serving needs real client turns; math needs independent numerical oracles; performance needs matched runs on named machines.
If those gates hold, January 2027 is when I would like to invite more users to try CKE: perhaps a small, opt-in test group on different CPUs first, then a broader call once installation, recovery and issue reporting are understandable. I want their failures as much as their success stories. A user should be able to say, “This model stalled after the second turn on this machine,” and give us enough evidence to reproduce it without sending us private prompts or credentials.
That is a target, not a release promise. If the fresh-machine or accessibility path is not dependable by then, we should keep the test narrow and say why. October made CKE more capable; the next two months should make it easier for someone else to verify that capability for themselves.
Comments
Join the conversation. Replies can go three levels deep.