v8 Inference and Certified Training Runbook
This is the operator runbook for the current v8 inference lane and its
bounded FP32 training starter: promoted text-family bring-up through the v8
runner surface plus the validated
Qwen3-VL-8B-Instruct multimodal path with the matching
mmproj-Qwen3VL-8B-Instruct encoder projection file.
For an architecture-aware memory and concurrency estimate, see the Model Sizing Lab. Its bandwidth ceiling is theoretical, not a measured v8 runtime result.
For how requests are admitted, decoded and cancelled — including the experimental two-slot batch mode — see Serving & Batching.
v8 now has a credible inference surface for promoted text-family bring-up and the tested Qwen3-VL pair runs encoder -> bridge -> decoder end to end with coherent captions instead of stop-marker or prompt-shell garbage.
What This Runbook Covers
Four things: the promoted text-family v8 bring-up commands, the certified
FP32 training starter, the one multimodal family that is validated today, and the
Whisper Tiny audio lane within its certified scope. It does not claim that unrelated
model families or the complete historical v7 training surface are ready in v8.
Validated Pair
Decoder GGUF:hf://Qwen/Qwen3-VL-8B-Instruct-GGUF/Qwen3VL-8B-Instruct-Q4_K_M.gguf
mmproj GGUF example path:./mmproj-Qwen3VL-8B-Instruct-Q8_0.gguf
Use a matching decoder/mmproj pair. If those drift apart, the bridge result is not meaningful.
v8 owns inference bring-up and one certified FP32 training-to-inference
starter. The wider training circuit matrix, SVG workload, pipeline builder, BF16,
and adapter-training lanes remain in v7 or are not yet certified in v8.
Training: Certified FP32 Starter
These commands exercise production generated runtimes. They do not substitute a Python operation when generated C coverage is missing.
# Fast two-layer forward/backward numerical certification. make v8-training-certify-fp32 # Four-layer English learning, AdamW, restart, export, and visualizer workflow. make v8-training-workflow-fp32 # CKE BPE plus 4-layer dense, 6-layer GQA, and 10-layer GQA full workflows. make v8-training-matrix-fp32 # Two authored 2-layer circuits: dense and unequal-head GQA with width/tail variation. make v8-training-composition-fp32
| Command | What a PASS proves | Primary evidence |
|---|---|---|
v8-training-certify-fp32 |
Identical serialized weights and tokens satisfy the declared PyTorch contracts for generated forward output, loss, every expected parameter gradient, and runtime provenance. Injected gradient, stale-library, and alternate-engine faults are detected. | version/v8/.cache/reports/training_certification_latest.json |
v8-training-workflow-fp32 |
A four-layer reduced Qwen3-style circuit learns a pinned English byte-token fixture through generated C and native AdamW, resumes complete state in a fresh process, and exports weights into an independently built v8 inference runtime. | version/v8/.cache/reports/training_workflow_latest.json |
v8-training-matrix-fp32 |
The same complete contract runs reduced Qwen3-style variants at 4, 6, and 10 layers, including unequal-head GQA. CKE trains a BPE tokenizer from the training split, verifies exact round trips and tokenizer quality, then gives generated C and PyTorch the same serialized token IDs. Nightly schedules the bounded 6-layer 4/2 GQA case; this command runs the complete depth sweep. | version/v8/.cache/reports/training_matrix_latest.json |
v8-training-composition-fp32 |
Two supported Python-authored, two-layer circuits run generated-C forward/backward/AdamW against independent PyTorch at every update using fixed elementwise FP32 tolerances. One has dense 4/4 attention; one has 4/2 GQA, a non-vector-multiple 40-wide feature dimension, 17-token sequences, and a partial final accumulation window. Reports retain each trainable tensor's worst element and reject a synthetic gradient-slot swap. Nightly runs the GQA case. | version/v8/.cache/reports/training_composition_latest.json and each case's identity-bound training_workflow.json |
Training kernel capability ledger
The capability ledger lists public cke.nn authoring modules separately from exact v8 provider-map operations. It groups maps by FP32, BF16, quantized, and unspecified dtype tags and distinguishes declared backward providers from registered tests. These inventories do not establish that an authored module lowers to those providers or that generated training passed numerical certification. In particular, a BF16 or quantized forward map does not establish a trainable backward path or QLoRA support.
python3 version/v8/scripts/build_training_capability_ledger_v8.py make v8-training-capability-ledger-check
For executed evidence, open the current run's training_workflow.json and identity-bound ir_report.html; the ledger does not turn a registered provider into a PASS.
Author the certified workflow from Python or Jupyter
The cke.v8 adapter reuses the established cke.nn model surface.
Python declares the model, frozen dataset, tokenizer, AdamW settings, and numerical
contracts. It lowers the supported semantic graph into the existing CKE template/IR
machinery and launches the generated-C workflow;
it does not execute replacement model arithmetic or silently fall back to PyTorch.
# Validate the supported Python surface and kernel-map candidate inventory. make v8-training-python-authoring-smoke # Inspect the same frozen-English experiment without starting training. .venv/bin/python version/v8/examples/python_authoring_tiny_lm_v8.py \ --run-dir version/v8/.cache/python_authoring/english_fixture # Execute generated forward/backward, native AdamW, parity, restart, and export. .venv/bin/python version/v8/examples/python_authoring_tiny_lm_v8.py \ --run-dir version/v8/.cache/python_authoring/english_fixture --execute # Open the notebook authoring and report-inspection flow. .venv/bin/jupyter lab \ version/v8/notebooks/01_generated_training_quickstart.ipynb
| Python object or artifact | Ownership and evidence |
|---|---|
cke.models.qwen3_tiny(...) | Builds the existing cke.nn semantic module graph. Certified depths are 4, 5, 6, and 10 layers; the five-layer notebook is the graph-lowering fixture. |
cke.v8.DatasetConfig, TokenizerConfig, TrainingConfig | Provide one explicit experiment definition for the generated runtime, independent PyTorch oracle, reporting, and export. |
experiment.preflight() | Inventories candidate forward/backward maps, tensor contracts, implementations, and registered tests. It does not claim provider resolution or executed numerical evidence. Missing candidates fail before training; the generated workflow performs resolution and execution. |
python_training_experiment.json | Records the model graph, dataset hash, tokenizer policy, optimizer, tolerances, and deployment boundary. |
python_training_semantic_model.json | Is the authoritative graph-derived model contract. It records ordered authored identities, the exact supported properties, all trainable parameter mappings, and the CKE template consumed by lowering. Generated forward and backward kernel operations retain those authored identities. |
training_capability_preflight.json | Starts as a candidate inventory with PENDING_GENERATED_WORKFLOW resolution/evidence fields. A successful fresh, identity-bound workflow updates it to RESOLVED_EXECUTION_PASS. Registered tests and executed evidence remain separate. |
training_experiment_manifest.json | Binds the run ID, case, commit, authored experiment, configuration, corpus and serialized token streams to the lowered graphs, executed providers, parity, checkpoint, and export artifacts. The visualizer re-hashes required files and labels the bundle MATCHED, MISMATCH, or MISSING. |
training_batch_preview.json | Shows the actual serialized input IDs, causal labels, attention mask, loss mask, valid-token count, token-stream identity, and label policy for bounded batches. |
training_workflow.json, ir_report.html | Contain the generated execution result, PyTorch discrepancies, checkpoint/resume evidence, inference export, and interactive data/IR views. |
Use the notebook as an experiment controller
- Launch Jupyter from the repository root and open the v8 notebook path shown above.
- Run the model and preflight cells first. Inspect the authored semantic graph, parameter count, forward/backward requirements, and candidate-map rows before allocating a training run.
- Leave
EXECUTE_TRAINING = Falsewhile changing the circuit, corpus, tokenizer, or numerical contract. Set it toTrueonly whencan_launch_generated_workflowis true; only the completed workflow can produce a PASS. The equivalent environment switch isCKE_NOTEBOOK_EXECUTE=1. - Use
DatasetConfigto point at a pinned corpus and bounded train/validation token counts. Keep the model vocabulary equal toTokenizerConfig.vocab_size. - Use 4, 5, 6, or 10 layers and supported dense/GQA head geometry. The graph controls depth, dimensions, ordered block identities, vocabulary, and a finite positive global
rope_theta. In this uniform topology, reordered labels establish authored identity order; they do not claim executable support for nonuniform block reordering. Stage 1 fixes SwiGLU, RMSNorm epsilon 1e-6, bias-free projections,normal_0p02initialization, and FP32; other values fail before weight initialization. - Inspect
python_training_semantic_model.jsonafter preflight. Confirm that its parameter contract, ordered layer trace, and hash match the training report. The workflow rejects missing, changed, or mismatched semantic artifacts. - After execution, inspect the exact tokenizer round trips, training and held-out loss curve, optimizer-step parity curve, worst per-tensor differences, exact restart result, and multi-token inference-export result.
- Open
RUN_DIR / "ir_report.html"from the notebook for the dataset, tokenizer, forward/backward stitching, saved tensors, memory, checkpoint, and export panels. SetEMBED_IR_VISUALIZER = Trueto place that report inside the notebook. - Set
LOAD_EXISTING_REPORT = Trueonly for exploration. This path is read-only: it does not call preflight or replace the original experiment definition. The notebook validates the saved manifest and labels missing or mismatched evidence explicitly. - Use
training_workflow.jsonas the machine-readable verdict. A generated HTML file alone is not a PASS.
The checked-in notebook has no stored outputs. Its code cells execute through capability
preflight in v8-training-python-authoring-smoke, so imports, model authoring,
report rendering, and the no-training default cannot silently drift. Loss and parity plots
use inline SVG and do not require a separate plotting package. A populated render fixture
also checks the experiment-identity and serialized-batch panels, including failed parity,
missing evidence, and mismatched-run states.
The notebook and CI example use the same adapter. The exported generated-C inference
runtime does not require Python, but the underlying workflow still reports a standalone
native executable as NOT_CERTIFIED. Qwen3.5 DeltaNet authoring remains behind
composition-level state and backward certification. RWKV is outside this workstream.
RWKV-7 inference groundwork is not executable-model certification.
The candidate rwkv7.json circuit and FP32 maps describe operation
interfaces; primitive oracle tests do not prove a generated full-model trajectory.
Native rwkv_world_trie tokenization is unsupported and fails before
tokenizer C emission. Weight import, recurrent-state and residual-buffer placement,
layer-zero value sharing, token-serial prefill, and generated multi-token parity
remain bring-up gates. Use the ordinary native host once those contracts are complete,
rather than introducing a separate model-specific CLI or hardcoded prompt formatter.
Frozen SVG training fixture
The second notebook uses the same cke.v8.compile workflow with one complete SVG document in each split. It uses exact byte token IDs, a five-layer FP32 dense/GQA graph, generated-C AdamW, PyTorch parity, fresh-process resume, and independently generated v8 inference. The source XML is checked before weight initialization and appears beside token IDs and loss curves in the identity-bound IR report.
.venv/bin/python version/v8/examples/python_authoring_tiny_lm_v8.py \ --fixture svg --run-dir version/v8/.cache/python_authoring/svg_fixture --execute .venv/bin/jupyter lab version/v8/notebooks/02_frozen_svg_training_fixture.ipynb
The corpus is pinned in version/v8/training/svg_single_document_v1.json. Its train and validation sources are separate, complete SVG files. Token limits that would truncate either tokenized document are rejected before weight initialization. The current target policy is cyclic causal next-token prediction within each document, including a last-to-first token transition. Validation repeats almost all training geometry and changes only colors, so falling validation loss tests the machinery rather than generalization. The report separately marks whether each 48-token generated sample is well-formed SVG and whether it exhausted the probe budget; that diagnostic does not change the numerical certification verdict. Broader SVG quality needs a separate evaluation set.
| Next milestone | Acceptance evidence |
|---|---|
| Frozen SVG fixture | Pinned complete documents, validated XML, exact byte IDs, generated-C/PyTorch parity, falling train and held-out loss, exact resume, inference export, and one manifest-bound SVG panel. |
| Document-aware data path | Explicit EOS, attention boundaries, label masks, token-weighted accumulation, partial batches, and exact fresh-process restart at a document or shard boundary. Cross-document attention leakage must be an injected failure. |
| Tiny code fixture | Separate source projects, pinned tokenizer/data, a compile-and-run evaluation in a sandbox, and the same numerical training-to-export gates. Compilation success and hidden functional tests are reported separately. |
| Qwen3.5 recurrent contract | One specified DeltaNet operation first: independent forward and backward checks, state reset and gradient checks across chunk boundaries, saved-state ownership, and explicit full or truncated backpropagation. Then a mixed five-layer graph, followed by ten layers. |
| Precision and scale | BF16 provider execution and numerical contracts on Ryzen, representative-shape training throughput, then LoRA and quantized-base LoRA as separate certified extensions. |
Each additional supported graph inherits optimizer, checkpoint, parity, and exported-inference gates. The Python surface builds certified CKE graphs; it does not yet compile arbitrary torch.nn programs. RWKV remains outside this workstream.
Artifacts and visual inspection
The full workflow writes its current run under version/v8/.cache/training_workflow/qwen3_4layer_fp32/.
| Path below the run directory | What to inspect |
|---|---|
ir_report.html | Interactive training IR report: Data Lab, tokenizer, forward/backward graph, gradient stitching, learning, parity, checkpoint, and performance panels. |
dataset/, tokenizer.json, tokenizer_roundtrip.json | Exact serialized token IDs, vocabulary, split lineage, and encode/decode round-trip evidence. Matrix runs also retain CKE BPE binary artifacts and tokenizer_quality_gate.json. |
dataset_profile.json, dataset_qc.json | Split counts, hashes, overlap checks, and quality status for the current run. |
checkpoints/latest.json | Pointer to the last atomically published complete checkpoint. The checkpoint owns the resume cursor and binds runtime, configuration, and dataset identities. |
training_parity_latest.json, training_loss_curve_latest.json | Per-tensor PyTorch discrepancies, first-update evidence, and ten-epoch CKE/oracle loss trajectories. |
backprop_stitch_runtime_latest.json | Saved tensors, gradient producers and consumers, accumulation state, and generated backward execution evidence. |
exported_inference/, v8_inference_runtime/ | Independent training-forward rebuild and v8 prefill/decode export used for the generated-token trajectory check. |
RUN=version/v8/.cache/training_workflow/qwen3_4layer_fp32 # The workflow creates this report. Regenerate it after inspecting or moving artifacts. .venv/bin/python version/v8/tools/open_ir_visualizer_v8.py \ --generate --run "$RUN" --html-only --strict-run-artifacts \ --output "$RUN/ir_report.html" # Open locally, or serve the run directory on a headless host. xdg-open "$RUN/ir_report.html" python3 -m http.server 7021 --bind 127.0.0.1 --directory "$RUN"
Annotated certified-run example
A current four-layer run presents 10,000 pinned training tokens for ten epochs. Use the report navigation rather than treating the presence of an HTML file as certification.
| Panel | Expected current-run evidence | Certified example |
|---|---|---|
| Data Lab | Train/validation hashes, token counts, tokenizer lineage, round-trip and QC PASS. | 10,000 training tokens; 2,048 held-out tokens. |
| Training graph | 109 forward and 209 backward operations with no unresolved backward operation; stitching data names every gradient edge. | Training IR invariants PASS. |
| Learning | CKE and PyTorch epoch curves plus held-out measurements from the same serialized batches. | Training loss 5.2214 -> 3.1566; held-out loss 5.5629 -> 4.3848. |
| Restart | Checkpoint-owned cursor and accumulated gradients restore in a fresh PID; incompatible identity controls fail. | Weights and optimizer state match uninterrupted execution with 0.0 maximum difference. |
| Export | Independent v8 runtime provenance, exact generated token sequence, and bounded per-step logit discrepancy. | 12 generation steps match; maximum trajectory-logit difference 0.000353. |
A failed run still writes the JSON report. Read top-level status,
failures, and every entry under checks. Missing evidence is
NOT_CERTIFIED or a failed check; it is never converted to a zero measurement.
v8 owns the command, evidence contract, export, and visualizer integration. It currently imports the proven v7 training IR builder, generated-runtime code generator, and PyTorch oracle through explicit interfaces. Certified coverage is the reduced dense/GQA FP32 circuit, including the bounded unequal-head matrix case. BF16 training, the v7 interactive plan builder, frozen SVG training and gallery, additional model circuits, standalone native executables, LoRA/QLoRA, Muon, and training-state offload require separate executable evidence.
What Full-Model Certification Means
Full-model certification is not defined by an arbitrary answer length. A 100-token response, a 5K context, coherent prose, or one matching top-1 token can establish bring-up evidence, but none certifies the complete model. CKE promotes evidence in three levels:
| Level | Required evidence | What it does not prove |
|---|---|---|
| Bring-up | Real weights convert, compile, and execute coherently through the intended runtime path. | Numerical agreement, advertised capacity, quality, or performance. |
| Full-model numerical | Exact tokenizer or processor inputs; complete tensor inventory; every executed layer kind and persistent-state transition compared with an independent oracle; final-logit agreement; and at least 128 deterministic decode steps under a declared exact or tolerance contract. | Maximum context, broad application quality, every ISA, or competitive speed. |
| Production | Full-model numerical evidence plus the advertised context or media envelope, repeatability, memory-plan safety, supported ISA coverage, application fixtures, and recorded performance. | Unmeasured hardware, quantizations, languages, or workloads. |
The model and kernel matrix records the strongest level reached by each family. The kernel-map guide explains how the selected providers own their arithmetic and call ABI. The X-Ray guide covers layer and operation comparison, and numerical contracts defines exact and tolerance-based provider evidence.
Idle-host local nightly
GitHub and local hardware use the same scripts/nightly_runner.py test and evidence engine. GitHub builds in its workflow; each clean local worktree passes --prepare so build preparation is recorded in the nightly report. The local coordinator only admits a registered profile when measured load, available RAM, and free disk satisfy its tier. The checked schedule runs the portable profile first, then progressively admits full, demo-readiness, and high-capacity evidence on larger hosts.
python3 scripts/idle_nightly_coordinator.py \ --repo /srv/cke/C-Kernel-Engine \ --ref origin/main --fetch \ --state-dir /srv/cke/nightly-state \ --list
Each cron invocation runs at most one due profile. Results are atomic and keyed by the source commit, case contract, compiler, physical-core selection, tracked environment, and registered manifest hashes. A zero process exit becomes PASS only when the fresh report matches the attempt and commit, reconciles its summary, contains its complete declared execution inventory, and has no unexpected skips. On restart, a stale RUNNING attempt becomes INTERRUPTED before another attempt begins. Every child is restricted to one logical CPU per physical core, and the common CKE, OpenMP, OpenBLAS, and MKL thread limits match that physical-core count.
*/10 * * * * cd /srv/cke/C-Kernel-Engine && /usr/bin/python3 scripts/idle_nightly_coordinator.py --repo /srv/cke/C-Kernel-Engine --ref origin/main --fetch --state-dir /srv/cke/nightly-state >>/srv/cke/nightly-state/cron.log 2>&1
Reserve the host before interactive work by creating /srv/cke/nightly-state/PAUSE. The coordinator terminates and reaps only its owned process group, records the profile as INTERRUPTED, and retries it from the profile boundary after the reservation file is removed. Admission checks free swap as well as load, RAM, and disk; a running profile also interrupts on sustained swap activity or loss of its configured memory reserve. Use --rerun only to ignore cadence. The --exclusive option bypasses the idle-load check for a deliberately reserved host, but it does not bypass pause, memory, disk, or swap safety. This is profile-level recovery; it does not claim per-test or mid-inference checkpointing.
touch /srv/cke/nightly-state/PAUSE # use the host, then allow scheduled work again rm /srv/cke/nightly-state/PAUSE
Run only trusted refs such as origin/main. The coordinator creates a detached per-commit worktree, loads the checked schedule from that commit, reuses model caches outside the worktree, retains at most two coordinator-owned worktrees by default, and never resets the operator checkout. Contributor PR code must use an isolated approval path without credentials or writable private corpora.
This coordinator currently owns one host and one local ledger. P3/Ryzen pooling requires bounded runner cases plus an authoritative lease service with host capabilities, attempt fencing, and combined reporting; independently pointing both hosts at one JSON ledger is unsupported.
Modality gates
| Modality | Numerical gate | Capacity and quality gate |
|---|---|---|
| Text | At least three fixed real prompts that exercise every declared layer kind; layer and state checkpoints through the full graph; complete first-step logits; and 128 deterministic decode steps against PyTorch or llama.cpp. | 2K, 8K, and 32K are progression points. A model advertised for 64K, 128K, or 256K is not production-certified until matched runs reach that boundary with identical input IDs, checkpoint logits, KV/recurrent-state evidence, and stop reason. Code and SVG prompts measure application quality separately. |
| Vision | Official image processor and token IDs; encoder-layer checkpoints; projector/bridge output; decoder-layer and logit trajectory; at least one small, one native-resolution, and one multi-image X-Ray case. | The private resumable corpus covers OCR, forms, tables, charts, handwriting, natural images, and varied geometry. Exact fields and visual-question outputs are quality gates, not substitutes for PyTorch numerical comparison. |
| Audio | Waveform decode/resample, frontend features, every encoder block, cross-attention context, decoder state/logits, and transcript tokens compared with an independent implementation. | Short and long public fixtures, silence/noise boundaries, and every claimed language/task mode. Real-time factor, peak memory, and core occupancy are recorded independently. |
Long-context comparison does not require storing every activation from every token. It requires deterministic input hashes, complete provider identity, selected layer/state checkpoints at fixed positions, final logits, and a matched decode trajectory. Any first divergence can then be expanded into a full operation-level X-Ray capture.
Shared Vision Certification
The Qwen3-VL, Qwen3.6-VL, and Gemma4 corpus lanes use
certify_multimodal_llamacpp_corpus_v8.py with versioned
profiles under version/v8/parity_profiles/vision/. A profile
fixes the encoder source, composition circuit, chat template, and
llama.cpp attention mode. Unknown profile fields and incompatible
encoder sources fail before an image is processed.
V8_PRIVATE_VISION_CORPUS_MANIFEST="$CKE_PRIVATE_CORPUS_MANIFEST" \ QWEN3VL_PRIVATE_CORPUS_DECODER="$CKE_QWEN3VL_DECODER_GGUF" \ QWEN3VL_PRIVATE_CORPUS_MMPROJ="$CKE_QWEN3VL_MMPROJ_GGUF" \ QWEN3VL_PRIVATE_CORPUS_LLAMA_ROOT="$CKE_LLAMA_CPP_ROOT" \ make test-qwen3vl-private-corpus-parity-auto
V8_PRIVATE_VISION_CORPUS_MANIFEST="$CKE_PRIVATE_CORPUS_MANIFEST" \ GEMMA4_PRIVATE_CORPUS_DECODER="$CKE_GEMMA4_DECODER_GGUF" \ GEMMA4_PRIVATE_CORPUS_MMPROJ="$CKE_GEMMA4_MMPROJ_GGUF" \ GEMMA4_PRIVATE_CORPUS_LLAMA_ROOT="$CKE_LLAMA_CPP_ROOT" \ make test-gemma4-private-corpus-parity-auto
The report is resumable and redacted by default. Exact decoder rows use the CKE-produced visual prefix in both engines, so this lane does not by itself certify image preprocessing or the vision encoder. Qwen3.6-VL and Gemma4 profiles remain candidate lanes until their pinned artifacts satisfy their declared numerical and corpus gates.
Keep private manifests, images, raw reports, hashes, prompts, token IDs,
and tensor captures outside the checkout and nightly upload paths.
Redacted console output is not a publishable report. The independent
Qwen3-VL encoder suite redacts image paths and IDs by default; use
--show-private-details only in a trusted local terminal.
Private corpus targets require their configured number of selected,
distinct image hashes; partial selections cannot satisfy full coverage.
python version/v8/scripts/export_vision_public_summary_v8.py \ --private-summary /data/cke/vision-certification/RUN/summary.json \ --public-summary /data/cke/vision-certification/RUN/public-summary.json \ --count-free
Publish only the exported file, never its containing private run directory. The count-free exporter accepts encoder-prefix, shared-prefix decoder, and image-fed OCR task-quality summaries. It publishes only the scoped lane and verdict, omitting corpus identity, counts, percentages, timing, sample identities, paths, text, and artifact hashes. Full counts and provenance remain in private reports. OCR quality remains separate from execution completion and does not certify numerical parity.
At source commit 352108874, the Qwen3-VL profile passed
its selected private corpus across P3 AVX2 and Ryzen AVX-512; all
generated full-vocabulary decoder rows were bit-exact to llama.cpp.
This is shared-prefix decoder parity,
not independent vision-encoder parity or OCR-quality certification.
Overnight Demo Readiness
One command before a demo
Run the capacity-aware compatibility sweep before leaving the machine overnight. It exercises the promoted decoder families, compiler and memory-plan contracts, llama.cpp numerical gates, Instella, audio, vision, configured high-memory models, and both Qwen private OCR corpora.
make nightly-demo-readiness
In the morning, open build/demo-readiness/nightly-latest.md. The machine-readable evidence is written to build/demo-readiness/nightly-latest.json. A configured lane that breaks is a failure; an optional model or private corpus that is not configured is shown explicitly as SKIP.
Private OCR output is redacted from the aggregate report. Configure Qwen3-VL with CK_QWEN3VL_OCR_MANIFEST, configure Qwen3.6-VL with CK_QWEN36VL_OCR_MANIFEST, CK_QWEN36VL_DECODER_GGUF, and CK_QWEN36VL_ENCODER_RUNTIME, and point CK_LLAMA_CPP_ROOT at the pinned llama.cpp oracle. Existing completed corpus cases resume instead of being repeated.
Long-context capacity and quality sweep
Run the resumable long-context matrix separately from demo readiness. It visits every configured family at 2K, 8K, 32K, 64K, 128K, and 256K tokens, where supported. The 64K, 128K, and 256K rows are the long-context certification region. Every row records exact consumed-token evidence, input hashes, prefill/decode wall time, average active cores, peak RSS, first-logit repeatability, selected generated providers, and matched llama.cpp performance when a local GGUF oracle is available. By default, a CKE performance row fails when average occupancy is below half of the requested worker count; override --min-active-core-fraction only for a documented topology experiment.
V8_LONG_CONTEXT_ARGS="--allow-download --threads 16" \ make certify-v8-long-context
Run the engineering-quality phase independently when you need reviewable outputs before the multi-day capacity ladder finishes. Every model receives the same complete FP32 RoPE task. Its extracted C source is checked with a strict syntax-only compiler invocation, then passed verbatim back to the model to produce a matching standalone SVG. Generated code is never executed automatically. The gate proves artifact structure, not algorithmic correctness; human review and a numerical oracle remain mandatory before a generated kernel can enter CKE.
V8_ENGINEERING_QUALITY_ARGS="--allow-download --threads 16" \ make certify-v8-engineering-quality
To certify a full 128K generation envelope, allocate the total context explicitly. Here --quality-context 8192 reserves room for the prompt and --quality-total-context 131072 is the exact compiled runtime capacity. Decode receives every remaining token after the reserve and safety margin, and normally stops on the model's EOS signal. The report records the allocated context, effective output budget, consumed tokens, and native stop reason; it does not relabel an 8K+8K run as 128K.
V8_ENGINEERING_QUALITY_ARGS="--allow-download --threads 0 --cpu-policy physical --quality-context 8192 --quality-total-context 131072" \ make certify-v8-engineering-quality
Configure local checkpoints with V8_QWEN36_MODEL, V8_QWEN38_MODEL, V8_QWEN35_MOE_MODEL, V8_GEMMA4_MODEL, V8_GLM4_MODEL, V8_NEMOTRON9_MODEL, V8_INSTELLA_MODEL, V8_KIMI_MODEL, V8_LAGUNA_MODEL, and V8_COHERE2_MODEL. The corresponding V8_*_GGUF variables may identify a separate llama.cpp oracle. Reports are written incrementally to build/v8-long-context-certification/summary.md and summary.json, so an interrupted multi-day run resumes completed rows. Qwen3.6-VL is intentionally excluded from this text matrix and remains covered by make test-qwen36vl-private-corpus-parity-auto, which exercises its encoder, bridge, decoder, and private OCR corpus.
The capacity matrix uses a deterministic fixed-token sequence so exact consumption, hashes, timing, and oracle comparisons remain reproducible. It does not claim that normal prompts should fill every supported context window. The standalone engineering command writes to build/v8-engineering-quality/quality/: open index.html for the readable gallery, or inspect each model's exact prompt, raw response, clean .c/.svg artifact, compiler logs, trace, and validation JSON. Repository, documentation, retrieval, and multi-turn application corpora are the next certification layer.
How The Vision Side Works
If you want the architecture view instead of the operator commands, read v8 Vision Encoder Architecture. That page explains how the encoder graph is derived from GGUF + template + lowering and how the bridge hands the prefix into the decoder.
For parity-specific investigation, see Vision Encoder Parity.
How The Audio Side Works
Whisper Tiny transcription runs through the same circuit and kernel-contract path: generated FP32 encoder and decoder from PCM16 WAV, with nightly audio gates and an opt-in end-to-end artifact test. See Whisper Tiny End-to-End for the pipeline diagram, usage, evidence, and current limitations.
Prerequisites
Supported Host
- Linux host with a working C toolchain and Python 3.
- Repo-local
.venvwithversion/v8/requirements.txt, or letcks-v8-runbootstrap it interactively. - A local Qwen3-VL mmproj file available at a known path.
python3 -m venv .venv . .venv/bin/activate python -m pip install --upgrade pip python -m pip install -r version/v8/requirements.txt
ARM Low-Memory Bring-Up
On Linux ARM, verify that the v8 engine links without unresolved symbols and that mixed BUMP allocation maps complete weight pages read-only. The unaligned weights/activations boundary is copied into one writable anonymous page.
make test-v8-arm-runtime make test-v8-arm-model-smoke CK_ARM_MODEL_DIR=/path/to/generated-v8-model
The model smoke expects an artifact generated at context length 100. It forces file-backed weights and token-ID input with the full tokenizer disabled. This checks native forward execution, not raw-text tokenization, output quality, or performance parity. regression-fast-arm remains the broader family gate.
For low-RAM deployment, set CK_BUMP_FORCE_MIXED=1: Linux overcommit can let an anonymous reservation succeed before the process is OOM-killed. Mapping weights from disk does not prove that the full model will fit or run at useful speed. Page faults, activations and tokenizer memory are separate costs. On TDA4VM, the 2.33 GiB Nanbeige BUMP mapped successfully, but end-to-end Nanbeige inference has not been certified. A full 262k-token Gemma SPM tokenizer was OOM-killed; tokenizer-disabled token-ID inference passed. Test raw-text chat separately.
Canonical Text Bring-Up
Current Large-Model Evidence
Support levels are intentionally separate: coherent execution does not imply bit-exact numerical parity, multimodal support, long-trajectory certification, or competitive performance.
| Family | Real-weight execution | Numerical evidence | Open boundary |
|---|---|---|---|
| Qwen3.8 27B dense Q4_K_M | Coherent long text; six complete 131,072-token engineering-artifact runs on the earlier artifact | Earlier artifact: 4,000/4,000 full-vocabulary rows and 4,011 internal rows bit-exact to llama.cpp. Current ggml-org artifact: regression repair tested with 128 exact full-logit rows at 1024 capacity. | For issue #454, use the repaired compiler and a fresh --run directory with --force-convert --force-compile. File revisions and mixed tensor dtypes matter. Run make test-v8-qwen38-dense-contracts for component checks, not full-model certification. 128K bit-exact parity and matched performance remain separate. Artifact gallery |
| Qwen3.8 Flash Next Q4_K_M | Experimental 120B text runtime on the 160 GB Ryzen | 256 full-vocabulary comparisons exact with a one-token prefix. After shared-expert scheduling and circuit-declared terminal-row selection, a real 40-token batched prompt passes all 64 full-logit comparisons bit-exactly, including initial prefill, at 8192 capacity with 16 threads. | BF16, long-context, and performance certification remain open. Configured 8192 capacity is not 8K consumed input. Longer repository-code/SVG runs must record actual input/output counts and preserve readable artifacts separately from numerical acceptance. Run make test-v8-qwen38-flash-contracts for component gates; use --require-bit-exact with the trajectory harness for full-logit acceptance. |
| Qwen3.5 35B-A3B Q4_K_M | Coherent text E2E | Quantized provider and trajectory gates are available | Continue long-context performance and broader prompt certification |
| Nemotron Nano 9B v2 Q4_K_M | Coherent text E2E | Mamba2/compiler contracts plus runtime smoke | Broader long-trajectory parity and performance |
| GLM4 9B Q4_K_M | Coherent text E2E | Partial-RoPE, FP16-KV, and llama.cpp parity coverage | Keep long-context and ISA regression lanes active |
| Instella-MoE 16B-A3B BF16 | Coherent short text E2E | Top-1 matches PyTorch at the tested checkpoint; full-logit cosine 0.999976927 | Short checkpoint only; quantized GGUF and long trajectories are not certified |
| Kimi-VL A3B BF16 text decoder | Coherent and repeatable text E2E on Intel AVX2 and Ryzen AVX-512 | First token and top-20 ranking match PyTorch; full-logit cosine 0.997696 | Internal drift becomes material near layer 7; MoonViT bridge is not certified |
| Laguna-XS 2.1 Q4_K_M | Coherent text E2E; all 684 mapped entries converted | Embedding and layer-0 RMSNorm are bit-exact; identical-input router replay preserves selected experts and routing weights within one ULP | The current llama.cpp Laguna loader omits the GGUF YaRN beta metadata; after oracle alignment, small attention/projection drift still changes a near-tied MoE route |
| Cohere2 Command R Q4_K_M | GGUF Q4_K_M bring-up — 8-token llama.cpp replay agreement on Command R7B; long-trajectory parity pending | Tokenizer-free replay matches llama.cpp for the first 8 greedy positions | Long-trajectory parity and matched performance sweeps |
| Cohere North Mini Code 30B-A3B Q4_K_M | Coherent and repeatable text; two complete 131,072-token capacity runs | Identical input, first-logit, and output-token hashes across both CKE runs | Matched full-model oracle parity and practical long-code quality |
| Cohere North Micro Vision 2.4B | Real-image encoder, bridge, and decoder bring-up | Portable BF16 provider contracts; official PyTorch layer X-Ray remains follow-up work | Complete encoder/bridge/decoder parity and private OCR quality |
| Cohere Transcribe 2B | Provider and exact 2,104-tensor inventory foundation; CKE conversion fails closed | Independent oracle exports frontend, all 48 encoder blocks, cross-attention, and decoder checkpoints | Assemble and certify the complete CKE audio trajectory |
| Cohere Command A+ 218B/25B-active W4A4 | Experimental native NVFP4 real-weight text runtime; coherent short answer | 675/675 required weights mapped, packed-row and leaf parity, bounded X-Ray | Full-model and long-context parity, vision, quality, and matched performance |
Use this path when you want inference-only runs without training a local model.
These raw CLI examples use the shell wrapper so a first-time user can be prompted to create .venv and install version/v8/requirements.txt if the repo-local environment is missing.
Qwen3.8 27B Dense Q4_K_M
Understand: recurrent + full-attention hybrid · Inspect: how a family earns kernel-map support · Check: Qwen3.8 evidence
Run from the repository root. This command uses the standard GGUF, not an Unsloth UD mixed-quant artifact.
version/v8/scripts/cks-v8-run run \ hf://ggml-org/Qwen3.8-27B-GGUF/Qwen3.8-27B-Q4_K_M.gguf \ --context-len 16384 \ --force-convert --force-compile \ --chat-template auto \ --prompt 'Give me a detailed example of C, Python and SQL code.' \ --max-tokens 256 \ --temperature 0.0
16384 is context capacity, not consumed prompt length. This is a short generation check; allocate only what fits available RAM.
Qwen3.8 Flash Next Q4_K_M
Understand: QSA, hyper-connections, PLE · Inspect: packed expert prefill · Check: evidence table above
Experimental text inference. The example uses the local GGUF path on the 160 GB Ryzen test node. On another machine, replace that path with your matching local artifact. The tested file is 119,150,722,112 bytes; this command does not download it or certify other Flash quantizations.
version/v8/scripts/cks-v8-run run \ "$HOME/.cache/cke-nvme/qwen38-flash-next/gguf/qwen3.8-flash-next-Q4_K_M.gguf" \ --context-len 8192 \ --force-convert --force-compile \ --chat-template auto \ --prompt 'Give me a detailed example of C, Python and SQL code.' \ --max-tokens 256 \ --temperature 0.0
The Flash example is for a high-memory host, not the 64 GB P3. 8192 is capacity, not an 8K-input certification. See the evidence table above for numerical and long-context limits.
Gemma 3 270M
version/v8/scripts/cks-v8-run run \ hf://unsloth/gemma-3-270m-it-GGUF/gemma-3-270m-it-Q5_K_M.gguf \ --context-len 1024 --force-compile --force-convert --chat-template=auto \ --prompt "Give me a concise example of C code." \ --max-tokens 64 --temperature 0.0 \ --generate-visualizer
The smallest promoted text model. --prompt with --max-tokens makes the run non-interactive and bounded; --temperature 0.0 selects deterministic greedy decoding (the default is 0.7). Omit --prompt for an interactive chat session.
Gemma 4 E4B IT
.venv/bin/python version/v8/scripts/ck_run_v8.py run \ hf://unsloth/gemma-4-E4B-it-GGUF/gemma-4-E4B-it-Q4_K_M.gguf \ --context-len 2048 \ --force-convert --force-compile \ --prompt 'Give me a detailed example of C code.' \ --chat-template gemma4 \ --max-tokens 1024 \ --temperature 0.0
Use this as the current Gemma4 GGUF coherence smoke. A healthy run should produce a normal long answer and stop by EOS or --max-tokens, not by prompt-marker echo or language corruption. The tested local Q4_K_M run generated 1024 coherent C-code tokens; performance work remains separate.
Gemma 4 Assistant / MTP Drafter
.venv/bin/python version/v8/scripts/ck_run_v8.py run \ hf://google/gemma-4-E4B-it-assistant \ --run /tmp/ck-gemma4-assistant-runtime \ --context-len 1024 \ --force-convert --force-compile \ --generate-only \ --chat-template none \ --allow-raw-prompt
The assistant artifact is a tiny speculative/MTP drafter, not a standalone chat model. A healthy bring-up converts safetensors directly to BUMP, lowers q-only shared-KV attention, generates C, and compiles libmodel.so. Real chat speedup comes only after pairing this runtime with a compatible Gemma4 backbone via --speculative-draft-model-dir.
Nemotron Nano 9B v2
.venv/bin/python version/v8/scripts/ck_run_v8.py run \ hf://bartowski/nvidia_NVIDIA-Nemotron-Nano-9B-v2-GGUF/nvidia_NVIDIA-Nemotron-Nano-9B-v2-Q4_K_M.gguf \ --context-len 2048 \ --force-convert --force-compile \ --prompt 'Give me a concise example of C code.' \ --chat-template auto \ --max-tokens 256 \ --temperature 0.0
Use this as the current Nemotron-H / Mamba2 GGUF smoke. Native BPE text encode is enabled by default for generated BPE runtimes; set CK_DISABLE_FULL_BPE_TOKENIZER=1 only when you intentionally want token-id prompts plus lightweight token display. A healthy run should produce normal instructional text, not token-zero collapse or repeated punctuation.
GLM4
version/v8/scripts/cks-v8-run run \ hf://unsloth/GLM-4-9B-0414-GGUF/GLM-4-9B-0414-Q4_K_M.gguf \ --context-len 1034 \ --force-convert --force-compile \ --chat-template glm4 \ --prompt 'Give me a detailed example of C, Python and SQL code.' \ --max-tokens 256 \ --temperature 0.0
GLM4 has a real Q4_K_M runtime lane with partial pairwise RoPE, persistent FP16 KV cache, and llama.cpp parity coverage. --force-compile force-builds both libckernel_engine.so and libckernel_tokenizer.so, compiles the generated model into a staging directory, verifies that the complete bundle loads without unresolved symbols, and only then replaces the cached runtime. No manual library copy is required.
Kimi-VL A3B Text Decoder
.venv/bin/python version/v8/scripts/ck_run_v8.py run \ hf://moonshotai/Kimi-VL-A3B-Instruct \ --run /srv/cke/profiles/kimi-vl-a3b-instruct \ --context-len 2048 \ --force-convert --force-compile \ --prompt 'Give me a concise example of safe C code.' \ --chat-template kimi_vl \ --max-tokens 64 \ --temperature 0.0 # Capacity-aware nightly smoke using the same model source: V8_KIMI_MODEL=hf://moonshotai/Kimi-VL-A3B-Instruct \ make test-v8-kimi-highmem
The official 32.8 GB sharded checkpoint now converts all text-decoder tensors, preserves the embedded TikToken protocol, and runs coherently on a 64 GB host. Three repeated Ryzen runs produced the same 32-token response hash. X-Ray matched PyTorch's first token and complete top-20 ranking, but internal BF16 drift becomes material around layer 7, so this is text E2E certification rather than bit-exact internal parity. MoonViT and the multimodal bridge remain outside the certified path. See v8 MLA / Kimi Decode Cache for the architecture notes.
Laguna-XS 2.1
Understand: Laguna architecture variant · Inspect: mixed-quant expert providers · Check: Laguna evidence
.venv/bin/python version/v8/scripts/ck_run_v8.py run \ hf://ggml-org/Laguna-XS-2.1-GGUF/Laguna-XS-2.1-Q4_K_M.gguf \ --run /srv/cke/profiles/laguna-xs-2.1 \ --context-len 2048 \ --force-convert --force-compile \ --prompt 'Write a complete C program that prints the first ten Fibonacci numbers.' \ --chat-template auto \ --thinking-mode suppressed \ --max-tokens 512 \ --temperature 0.0
The tested 20.27 GB Q4_K_M artifact converts all 684 mapped entries and produces coherent text and compilable C on Ryzen. The circuit declares full versus sliding attention, RoPE width, softplus attention gating, and mixed Q4/Q6 expert providers without a Laguna branch in compiler or code generation. Visible thinking is supported but can consume more than 1,024 tokens before the final answer; use a larger output budget when testing that mode. This is coherent E2E bring-up with strong leaf evidence, not long-trajectory bit-exact certification.
Cohere2 Command R
Understand: the Cohere2 reuse map · Inspect: Cohere2 architecture variant · Check: Cohere2 evidence
version/v8/scripts/cks-v8-run run \ hf://bartowski/c4ai-command-r7b-12-2024-GGUF/c4ai-command-r7b-12-2024-Q4_K_M.gguf \ --context-len 2048 --force-compile --force-convert --chat-template=auto \ --max-tokens 64 --temperature 0.0
Cohere2 needs no family-specific flag: the GGUF model map routes it to the cohere2 circuit automatically. Contract test: python -m unittest tests.test_v8_cohere2_contract.
Qwen2 0.5B Instruct
version/v8/scripts/cks-v8-run run \ hf://Qwen/Qwen2-0.5B-Instruct-GGUF/qwen2-0_5b-instruct-q4_k_m.gguf \ --context-len 1024 --force-compile --force-convert \ --generate-visualizer
Qwen3 0.6B
version/v8/scripts/cks-v8-run run \ hf://Qwen/Qwen3-0.6B-GGUF/Qwen3-0.6B-Q8_0.gguf \ --context-len 1024 \ --force-convert --force-compile \ --generate-visualizer
Qwen3.5 0.8B
python3 version/v8/scripts/ck_run_v8.py run \ hf://unsloth/Qwen3.5-0.8B-GGUF/Qwen3.5-0.8B-Q4_K_M.gguf \ --force-convert --force-compile \ --context-len 1034
The canonical v8 bring-up path is the hf://... URI. That materializes the run under ${CK_CACHE_DIR:-$HOME/.cache/ck-engine-v8/models}/unsloth--Qwen3.5-0.8B-GGUF. Local GGUF paths are still supported when you intentionally want an offline or copied artifact.
If the first reply echoes
<|im_start|>assistant or starts with <think>, the prompt is being fed with the wrong chat wrapper or stop markers. For NaanBeige, keep the default --chat-template auto, prefer --python-tokenizer on first bring-up, and do not force --chat-template none unless you are testing raw logits on purpose.
NaanBeige 4.1 3B
version/v8/scripts/cks-v8-run run \ hf://mradermacher/Nanbeige4.1-3B-GGUF/Nanbeige4.1-3B.Q4_K_M.gguf \ --context-len 1024 --force-compile --force-convert \ --chat-template auto \ --generate-visualizer
Current scope: these are the validated v8 text-family operator surfaces. The multimodal Qwen3-VL path remains the promoted vision baseline; Gemma4 vision now has a high-memory bridge smoke lane for second-family coverage.
High-Memory v8 Smoke Targets
Gemma4 text, Gemma4 vision, and Nemotron Nano 9B v2 are intentionally tracked as high-memory smoke lanes. They should appear in nightly/test reports, but skip cleanly on smaller runners instead of pretending the model family is untested.
make test-v8-gemma4-highmem make test-v8-gemma4-vision-smoke make test-v8-nemotron9-highmem # Lower the threshold only when you intentionally want to run locally: V8_GEMMA4_MIN_MEM_GB=24 make test-v8-gemma4-highmem V8_NEMOTRON9_MIN_MEM_GB=24 make test-v8-nemotron9-highmem
These tests are coherence/runtime smokes, not performance gates. They validate that the v8 conversion, compile, tokenizer/chat-template path, and first generated tokens remain sane for large model families.
Text-Family Notes
- Gemma 3: use
--chat-template autofor normal instruction/chat runs.--chat-template noneis raw continuation mode now and needs--allow-raw-promptif you intentionally want it. - Gemma 4: use
--chat-template gemma4. The template uses explicit per-layer/direct split-half RoPE metadata; do not replace it with the older global split-half RoPE path when debugging. - Nemotron Nano 9B v2: use
--chat-template auto. The BPE runtime should encode raw prompts by default; setCK_DISABLE_FULL_BPE_TOKENIZER=1only for token-id fallback/debug runs. - GLM4: the real Q4_K_M path executes coherently and carries partial-RoPE, persistent FP16-KV, and llama.cpp parity coverage. Keep it in long-context and ISA regression sweeps.
- Instella-MoE: BF16 text executes coherently with strong short-checkpoint PyTorch agreement. Do not describe quantized GGUF or long trajectories as certified yet.
- Kimi-VL: the BF16 text decoder is coherent and repeatable; use
--chat-template kimi_vl. Vision remains unimplemented, and the current X-Ray evidence is ranking parity rather than bit-exact internal parity. - Laguna-XS 2.1: Q4_K_M text executes coherently and the mixed global/sliding circuit is map-owned. CKE preserves the GGUF's YaRN
beta_fast=64; the current external llama.cpp Laguna loader defaults that value to 32. Even with a metadata-aligned diagnostic oracle, small attention/projection drift can change a near-tied MoE route, so long-trajectory parity remains open. - Cohere2: pairwise RoPE applies to sliding layers only; the model-declared
logit_scaleruns as afinal_logit_scale_f32footer op. Long-trajectory parity and performance sweeps are not certified yet. - Qwen2 / Qwen3 / Qwen3.5: the
v8runner now reproduces the same public command shapes asv7and clean short prompt smokes succeed on the promoted examples. - NaanBeige / llama-family symptom: if the first reply echoes
<|im_start|>assistantor starts with<think>, keep--chat-template auto, do not forcenone, and treat it as a prompt-wrapper/chat-contract symptom rather than the expected reply.
New Model Compatibility Workflow
- Start with safetensors when available. Convert safetensors to BUMP and compare CK against PyTorch with BF16/FP32 weights. This isolates graph stitching, RoPE placement, activation math, and layer contracts before quantization enters the picture.
- Then bring up GGUF. Convert GGUF to BUMP and compare CK against llama.cpp. This catches tokenizer/template behavior, tied versus untied heads, quantized projection layouts, and stop-token policy.
- Only optimize after parity is understood. Once BF16/FP32 graph parity and GGUF coherence are clean, profile Q4_K/Q5_K/Q6_K/Q8_K kernels and threadpool scheduling separately.
Gemma4 followed this route: BF16 safetensors proved the split-direct RoPE circuit against PyTorch, then the GGUF Q4_K_M path reused the same IR/kernel contract for coherent long-answer smoke testing.
Qwen3.6 Q4_K_M Optimized Prefill
PR #277 landed an exact batched-prefill optimization lane for
Qwen3.6-27B Q4_K_M (merge c0a04690, engineering note
docs/notes/QWEN36_EXACT_BATCHED_PREFILL_2026-07-30.md). It provides two principal optimizations:
- Exact head-parallel DeltaNet prefill. Independent value heads are partitioned across the threadpool once per prompt, and each worker advances its assigned heads through the tokens in order. This preserves CKE's certified serial arithmetic while avoiding serial head execution and repeated per-token dispatch.
- AVX-512 VNNI x16 Q4_K prefill projections. The existing
Q4_K x Q8_KAVX-512 VNNI x16 provider is used for the measured Qwen3.6 prefill projection shapes, and the packed weights are prepared during model loading instead of being charged to the first prompt.
Test The Optimized Lane
CK_V8_COMPILER=icx \ CK_BUMP_FORCE_MIXED=1 \ CK_NUM_THREADS=14 \ CK_V8_FORCE_BATCHED_PREFILL=1 \ CK_DEBUG_Q4K_PREFILL_DISPATCH=1 \ .venv/bin/python \ version/v8/scripts/ck_run_v8.py run \ hf://ggml-org/Qwen3.6-27B-GGUF/Qwen3.6-27B-Q4_K_M.gguf \ --prompt "Give me a detailed explanation with working examples of C, Python, and SQL code." \ --chat-template qwen35 \ --thinking-mode suppressed \ --temperature 0 \ --max-tokens 64 \ --context-len 1034
First test with 64 output tokens. Raising --max-tokens exercises longer decode, not longer prefill — to probe prefill behavior and long-prefix parity, lengthen the input prefix (and --context-len) instead. Set CK_NUM_THREADS to match your host's CPU allocation; the measured host ran inside a 14-CPU cgroup.
Confirm Kernel Dispatch
Startup evidence should include a line similar to:
[CK parallel prefill] Prepared 184 AVX-512 VNNI x16 Q4_K weights at load time
With CK_DEBUG_Q4K_PREFILL_DISPATCH=1, the projection diagnostics should show the x16_mreuse provider for the eligible Q4 prefill shapes.
This does not mean every CPU selects AVX-512: AVX-512/VNNI-capable systems may select the x16 provider, while other systems use a certified AVX2 or reference fallback. Kernel selection is intended to become automatic from CPU capability, model metadata, quantization format, and runtime shape; the debug environment variables are diagnostic overrides, not a public configuration surface.
Measured Result
| Configuration | Prompt time | Prompt rate |
|---|---|---|
| Batched baseline | 6682.61 ms | 4.34 tok/s |
| Exact head-parallel DeltaNet | 4014.20 ms | 7.22 tok/s |
| Exact DeltaNet + measured Q4 x16 shapes | 2588.18 ms | 11.20 tok/s |
Two repeated final runs recorded 2552.64 ms (11.36 tok/s) and 2601.74 ms (11.15 tok/s).
That is approximately 61% less prompt time and approximately 2.6x the previous CKE batched-prefill throughput.
Measurement context: Qwen3.6-27B Q4_K_M, a 29-token templated prompt, an ICX native AVX-512/VNNI build, and a 14-CPU cgroup on the measurement host. Do not generalize these numbers to every CPU, compiler, context length, or model.
Batched prefill is still opt-in:
CK_V8_FORCE_BATCHED_PREFILL=1 is temporarily required and the default sequential_decode policy is unchanged. Short-prompt trajectories pass, and greedy top-1 matched at the tested short, 353-token, and 1K-token checkpoints — but full 1K-context logit parity is not certified. At the 1K first step the recorded comparison was cosine 0.865948879, RMSE 2.014045, maximum absolute difference 19.671235. Matching greedy tokens must not be read as complete numerical parity. This drift predates the scheduling/x16 optimization and was not introduced by PR #277.
Planned Automatic Policy
CK_V8_FORCE_BATCHED_PREFILL is a temporary correctness guard, not a permanent user configuration requirement. The intended user experience is automatic selection:
model metadata + quantization + prompt shape + CPU ISA
|
v
certified kernel map
|
v
optimized provider or safe fallback
After long-context numerical parity is closed: Qwen3.6 should automatically use batched prefill, CK_V8_FORCE_BATCHED_PREFILL should no longer be required for normal use, a disable/debug escape hatch may remain for developers, and nightly tests should verify automatic selection without user flags. Remaining performance targets are tracked in the Prefill Performance Roadmap, and kernel/provider coverage is summarized in the Model + Kernel Matrix.
Canonical Gemma4 Vision Bridge Smoke
Second-Family Vision Bridge
Gemma4 vision uses the Gemma4 text decoder with the matching mmproj-F16.gguf encoder artifact. Use the checked-in PPM test image so the smoke path does not depend on Pillow.
version/v8/scripts/cks-v8-run run \ hf://unsloth/gemma-4-E4B-it-GGUF/gemma-4-E4B-it-Q4_K_M.gguf \ --mmproj hf://unsloth/gemma-4-E4B-it-GGUF/mmproj-F16.gguf \ --image-path version/v8/test_assets/v8_vision_doc_card_72.ppm \ --prompt "Explain this image." \ --context-len 1024 \ --force-compile \ --chat-template gemma4 \ --max-tokens 8 \ --temperature 0.0
A healthy smoke converts or reuses the Gemma4 vision encoder, produces a 196-token vision prefix, completes mixed prefill in the Gemma4 decoder, and writes a bridge report. Current scope is bridge correctness; longer semantic parity remains active work.
Canonical Qwen3-VL Vision Run
Real Image Bring-Up
Replace the --mmproj value below if your local mmproj file lives somewhere else.
version/v8/scripts/cks-v8-run run \ hf://Qwen/Qwen3-VL-8B-Instruct-GGUF/Qwen3VL-8B-Instruct-Q4_K_M.gguf \ --mmproj hf://Qwen/Qwen3-VL-8B-Instruct-GGUF/mmproj-Qwen3VL-8B-Instruct-Q8_0.gguf \ --image-path version/v8/test_assets/v8_vision_doc_card_72.ppm \ --prompt "Explain this image." \ --context-len 1024 \ --force-convert --force-compile \ --thinking-mode suppressed
The first run converts the GGUF, lowers/codegens the runtimes, compiles them, runs the encoder bridge, then generates from the decoder.
For a cleaner caption sanity check, add --max-tokens 48 so the current bridge generation loop does not ramble into a long repetition tail.
Synthetic Prefix Probe
For a seam-only smoke test without a real image file, keep the decoder pair but switch to a synthetic prefix:
version/v8/scripts/cks-v8-run run \ hf://Qwen/Qwen3-VL-8B-Instruct-GGUF/Qwen3VL-8B-Instruct-Q4_K_M.gguf \ --mmproj ./mmproj-Qwen3VL-8B-Instruct-Q8_0.gguf \ --image-mode checker \ --prompt "Describe the image." \ --context-len 1024 \ --force-convert --force-compile
Canonical Whisper Audio Run
Understand: the audio pipeline · Inspect: audio kernels, stage by stage · Check: Whisper evidence
Audio Runbook — WAV To Transcript
The audio lane runs generated FP32 Whisper Tiny, Base, or Small encoder and decoder artifacts — and a generated frontend:
WAV decode through log-Mel is seven circuit ops lowered into ck_model_run_audio_wav, so the
Python layer coordinates lifecycles only. The unified entrypoint
version/v8/scripts/cks-v8-run audio drives both stages and emits a single JSON report.
Codegen contains no Whisper model-name branch — the same v8 lowering path that carries text and vision
carries the audio circuits in version/v8/circuits/.
Step 1 — Select the Hugging Face checkpoint. The runner downloads the checkpoint once, converts it, and builds the generated encoder and decoder runtimes:
export CK_AUDIO_MODEL=hf://openai/whisper-tiny
Step 2 — Prepare the WAV. The frontend expects mono 16 kHz PCM16. Convert any source format first:
ffmpeg -i your-audio.mp3 \ -ac 1 -ar 16000 -c:a pcm_s16le \ /tmp/test-audio.wav
Step 3 — Run the transcription.
version/v8/scripts/cks-v8-run audio "$CK_AUDIO_MODEL" \ --wav recording.wav \ --language en \ --task transcribe \ --max-tokens 128 \ --output build/whisper-test-report.json
Step 4 — Read the output.
The transcript prints on stdout, a per-stage timing line prints on stderr,
and --output carries the full report ("schema": "cke.whisper_e2e") with
frontend/encoder/prefill/decode seconds, generated token count, stop reason, and SHA-256 of the WAV
and both generated runtimes for provenance.
Practical Local CPU Workflow: YouTube Or Teams
Export meeting media through the service's authorized controls, or use
yt-dlp for public or otherwise authorized YouTube content.
Normalize either source to the same PCM16 contract:
sudo apt install ffmpeg python3 -m pip install --user yt-dlp mkdir -p "$HOME/cke-audio/results" yt-dlp -x --audio-format wav \ -o "$HOME/cke-audio/source.%(ext)s" \ "YOUTUBE_URL" ffmpeg -y \ -i "$HOME/cke-audio/source.wav" \ -ac 1 -ar 16000 -c:a pcm_s16le \ "$HOME/cke-audio/input-16k.wav"
For a Teams, Zoom, or local recording, replace
$HOME/cke-audio/source.wav with the exported MP4, M4A,
MP3, FLAC, or WAV file. Transcribe with Whisper Base:
RUN_DIR="$HOME/.cache/ck-engine-v8/models/whisper-base-local" CK_NUM_THREADS=20 OMP_NUM_THREADS=20 \ version/v8/scripts/cks-v8-run audio hf://openai/whisper-base \ --run "$RUN_DIR" \ --wav "$HOME/cke-audio/input-16k.wav" \ --language en \ --task transcribe \ --max-tokens 448 \ --output "$HOME/cke-audio/results/transcript.json" jq -r '.decoder.transcript_text' \ "$HOME/cke-audio/results/transcript.json" \ > "$HOME/cke-audio/results/transcript.txt"
Audio and transcript data stay local unless the operator separately
uploads them. Recordings longer than 30 seconds use sequential source
windows. The 33-second parity fixture is certified; arbitrary
hour-scale recordings remain functional rather than corpus-certified.
Add --timestamps when timestamp tokens are required.
What Success Looks Like (Audio)
stdoutprints the transcript text — the JFK sample matches the Hugging Face reference token for token.stderrprintsfrontend=...s encoder=...s prefill=...s decode=...s tokens=N stop=eos.- The report JSON contains
"status": "ok"with per-stage timings, runtime hashes, and worker-lifecycle counts.
See Whisper Tiny End-to-End for the pipeline diagram, kernel sources, and parity evidence.
Short Exact And Long Nightly Gates
Nightly already covers the log-Mel frontend against PyTorch, the audio transformer primitives, and the portable v8 audio circuit/codegen regression. Run the short public checkpoint path through the same front door:
make test-audio version/v8/scripts/cks-v8-run audio hf://openai/whisper-tiny \ --wav recording.wav \ --output build/whisper-short-report.json
The artifact gate requires the full reference token sequence and EOS without tolerance relaxation.
make test-whisper-long-audio-nightly \ V8_WHISPER_LONG_AUDIO_MODEL=base
Scheduled CI uses a published five-minute MIC1 recording and a human-corrected transcript across Tiny, Base, Small, Medium, and Large-v3. Every model job is fail-closed: it verifies the lossless fixture, builds generated runtimes, requires complete sequential-window progress, bounds timestamps to the recording, and enforces its WER ceiling. The same manifest can add future audio model families without changing the evidence contract.
Canonical Parakeet TDT Audio Run
Understand: the Parakeet pipeline · Inspect: the Parakeet troubleshooting map · Check: Parakeet evidence
Parakeet Runbook — WAV To Transcript
The canonical front door downloads the pinned checkpoint, creates the FP32 BUMP bundle, builds the native libraries, and selects deterministic bounded long-audio execution (180 s windows, 30 s overlap, resume at completed window boundaries):
version/v8/scripts/cks-v8-run audio \ hf://nvidia/parakeet-tdt-0.6b-v3 \ --wav recording.wav \ --output build/parakeet-transcript.json \ --resume
The explicit conversion/build/diagnostic path below is what the front door wraps; use it for fixture certification and debugging. Exact short-fixture parity covers 50/50 token IDs, 50/50 durations, the transcript, and 44/44 timestamp entries against the pinned Transformers reference:
hf download nvidia/parakeet-tdt-0.6b-v3 \ --revision 541d1f99c6b0c3cd0b11a95167540bb8edefd82b \ --local-dir .ck_models/parakeet-tdt-0.6b-v3 python version/v8/scripts/convert_safetensors_to_bump_v8.py \ --checkpoint .ck_models/parakeet-tdt-0.6b-v3 \ --output .ck_build/parakeet-tdt-0.6b-v3/weights.bump \ --config-out .ck_build/parakeet-tdt-0.6b-v3/config.json \ --manifest-out .ck_build/parakeet-tdt-0.6b-v3/weights_manifest.json \ --arch parakeet_tdt --dtype fp32 make build/libckernel_engine.so libckernel_audio.so python version/v8/scripts/run_parakeet_native_v8.py \ --model .ck_build/parakeet-tdt-0.6b-v3 \ --audio version/v8/test_assets/parakeet_tdt_0_6b_v3/2086-149220-0033.wav \ --fixture docs/notes/artifacts/parakeet_tdt_0_6b_v3_2086-149220-0033_fp32.npz \ --decode --output .ck_build/parakeet-tdt-0.6b-v3/native-e2e.json
Success is "status": "pass" in the cke.parakeet.native_e2e report with
sequences_equal and durations_equal true. Download and conversion are one-time
cold costs; the recorded warm short run took 0.069 s frontend + 1.027 s encoder on
Ryzen 9 9950X3D (commit 909a2c164), and the deterministic five-minute
overlapping-window policy runs at RTF 0.771 (WER 7.25%). Ordinary CI covers the kernel oracles
(make test-audio) and the inventory/mapping contracts
(make test-audio-v8-contracts); the full-checkpoint and long-audio runs are cached Ryzen
evidence, not nightly jobs. Multilingual input, real-world resampling quality, concurrent sessions,
generated-circuit execution, and diarization are not claimed.
Full detail: Parakeet TDT runbook.
Canonical Whisper Audio Bridge
Stage-Split Bridge Run
The audio bridge is the encoder.npy handoff: the generated encoder writes the cross-attention
conditioning, the generated decoder consumes it. The parent run command keeps one isolated encoder
worker and one isolated decoder worker alive for the request. It resets generated decoder state and replaces
encoder memory for every window while retaining immutable weights, prepared constants, and thread pools.
Use --worker-lifecycle per-window to reproduce the older process-per-window control. Running the two
hidden worker stages below yourself isolates which side of the bridge a failure lives on.
A clean encoder report with garbage decode means the seam; a failed encoder stage means the frontend or encoder.
python version/v8/scripts/run_whisper_v8.py _encoder \ --encoder-run-dir $CK_WHISPER_ENCODER_RUN_DIR \ --wav /tmp/test-audio.wav \ --encoder-output /tmp/whisper-encoder.npy \ --worker-report /tmp/whisper-encoder-report.json
python version/v8/scripts/run_whisper_v8.py _decoder \ --decoder-run-dir $CK_WHISPER_DECODER_RUN_DIR \ --encoder-output /tmp/whisper-encoder.npy \ --language en \ --task transcribe \ --max-tokens 128 \ --worker-report /tmp/whisper-decoder-report.json
Each worker writes its own JSON report, so the encoder side can be validated for shape, timing, and
"status" before the decoder ever runs.
Encoder X-Ray Parity Probe
For checkpoint-level evidence across the encoder side of the bridge,
compare_whisper_encoder_pytorch_v8.py walks the generated encoder stop by stop —
stem conv1 → GELU → conv2 → token-major transpose → per-layer attention and MLP residuals —
against a PyTorch reference, enforcing max-abs and relative-RMSE tolerances per checkpoint.
It needs torch + transformers. The command below resolves the public Hugging Face
checkpoint to its local snapshot before starting the comparison:
WHISPER_CHECKPOINT=$(hf download openai/whisper-tiny) python version/v8/scripts/compare_whisper_encoder_pytorch_v8.py \ --run-dir $CK_WHISPER_ENCODER_RUN_DIR \ --checkpoint "$WHISPER_CHECKPOINT" \ --stops key \ --output build/whisper-encoder-xray.json
The stop table is derived from the architecture dimensions, not the model name, so the same probe carries
to other audio transformer encoders. CI drives the same script through
tests/test_v8_audio_encoder_contract.py in the nightly audio lane.
Compile Once, Run Natively
Python is the build orchestrator: it downloads or reads the model, converts weights, resolves the template and kernel maps, lowers the circuit, generates C, and compiles the model library. It does not need to remain in the production token loop. Build or refresh a model once with the normal v8 runner:
.venv/bin/python version/v8/scripts/ck_run_v8.py run MODEL.gguf \ --force-convert --force-compile \ --prompt "Hello" --max-tokens 1
Then run the generated library, native tokenizer, and generated chat contract directly through the C CLI:
make ck-cli-v8 ./build/ck-cli-v8 \ --lib "$RUN_DIR/ck-kernel-inference.so" \ --weights "$RUN_DIR/weights.bump" \ --manifest "$RUN_DIR/weights_manifest.map" \ --require-generated-abi \ --prompt "Give me a detailed example of C, Python, and SQL code." \ --temperature 0 --top-p 1 --max-tokens 256
The generated model selects the tokenizer implementation, chat formatting, stop-token policy, and
modality capabilities from its compiled contract. temperature and top-p are
request-time sampling parameters; they do not select or alter the tokenizer.
Native Server And FFI Boundary
See the circuit-derived serving coverage inventory for declared profiles and the artifact-level evidence still missing for each circuit.
External Python, Rust, or C hosts should bind include/ck_session_v8.h through
build/libck_session_v8.so. The session loads the generated model once and exposes native
chat formatting, encode, decode, generation, streaming token callbacks, cancellation, reset, timings,
and a versioned capability descriptor.
make ck-session-v8 make test-native-session-v8
Independent requests reset KV and recurrent state by default. Continuation is explicit. A generated runtime missing the required tokenizer or chat capability fails closed instead of guessing from its filename.
Localhost Serve E2E
The Server Protocol and Lifecycle nightly row runs the
model-free make test-server-schema suite. It includes real
localhost socket checks for disconnects and an unread stream, plus
deterministic native-failure and cancellation-timeout recovery tests.
A busy response uses a positive Retry-After; a cancellation
timeout means native execution may still own the session. These checks
establish request ownership, not completed Qwen Code tasks.
Streaming responses send bounded keep-alive comments during silent prefill, including requests without tools. This lets the HTTP transport detect a disconnected reader before a long native call finishes. The native worker records a cancelled or failed stored response only after it returns, then releases the session lease. The socket regression closes a stream during active silent prefill, checks its stored status, and serves another request.
Bounded localhost integration for ck_serve_v8.py serves Qwen3-0.6B with Q8_0 quantizations
on context length of 1024 on an ephemeral 127.0.0.1 port, waits for
GET /v1/health under one monotonic deadline, streams one
POST /v1/responses request, validates every event against the
Responses schema, and requires streamed, terminal, and stored text to agree.
A budget-limited greeting is reported as response.incomplete,
not as a completed answer. A separate one-token request must explicitly
report max_output_tokens. The model-generated tool round trip
is an opt-in diagnostic with --require-model-tool-roundtrip;
passing the required smoke does not certify Qwen3-0.6B tool-use quality.
Process-group shutdown and port cleanup complete before the lane reports success.
Failures preserve the server log and partial SSE transcript.
make test-v8-serve-localhost-e2e
Nightly row: v8 Serve Localhost E2E (10 min total limit, including reserved cleanup time). The target first runs model-free validator regressions, then the real localhost path. Failure artifacts are uploaded from build/v8_serve_e2e_last_failure/.
Converted Jinja Serving Contract
GGUF conversion writes chat_template.jinja beside the generated runtime;
safetensors conversion stages its tokenizer template assets. The live server loads the
selected sidecar, renders the conversation with Jinja, and passes that raw prompt to
the native tokenizer. A separate tool_protocol.json declares how tool output
is parsed and binds the protocol to the selected template's SHA-256. An unreadable
sidecar, empty render, or stale hash is an error, not a reason to silently switch
prompt formats.
A cached GGUF conversion can recover a missing native sidecar by reading only GGUF
metadata. It rejects a sidecar whose bytes differ from the source. Serving a complete
converted bundle with --no-build needs no source GGUF, download, or conversion.
Keep the generated libraries, BUMP weights, tokenizer, template sidecars, and manifest
together when moving the bundle.
Normal serving requires a nonempty chat_template.jinja before opening the
native session. To intentionally serve untemplated raw prompts, set both
--no-chat-template and --allow-raw-prompt. Serving overrides use
--chat-template-file PATH or --chat-template-inline SOURCE;
the ambiguous --chat-template option is rejected by the serve command.
An override replaces the native template and all tool variants. An existing
tool_protocol.json must match that effective template or startup fails.
String tool arguments preserve their payload whitespace; the native Qwen XML form
removes only one paired framing newline. Unsupported tool-schema forms fail before
generation, while supported arguments are checked against their declared schema.
The cached Qwen3.8 Q4_K_M runtime has a known native-template tokenizer mismatch:
its tool delimiter is split into ordinary CKE tokens while the upstream tokenizer uses
one special token. That numerical gap remains open. A separate Ryzen probe with the
publisher Jinja and native qwen_xml output protocol nevertheless completed
a Qwen Code read_file continuation and an HTML read_file →
edit task using the harness's ordinary system prompt. The compatibility
template installation path has therefore been retired; its bytes are retained only as
a legacy protocol test fixture. The qwen38.json circuit owns
an explicit serving.profile_ref to this reusable profile. Bundle construction
resolves the selected variant together with imported publisher assets, then packages
content-addressed templates and circuit/profile snapshots in the deployment bundle.
The server reads only that bundle's serving.json and assets; it never searches
repository profiles or server/templates/ at request time.
Publisher templates are the shipped profile's only variant. Task success does not
certify exact native token IDs, cancellation recovery, or compatibility with other artifacts.
A separate native-BPE input limit once reduced a 33,379-byte Qwen Code tool prompt
to 304 CKE tokens instead of the independent GGUF tokenizer's 7,773 tokens. A rebuilt
model, engine, and tokenizer matched all 7,773 IDs and completed a cached
read_file and tool-result continuation. Rebuild those three libraries
together; replacing only the tokenizer under an older generated model is unsafe.
The declared qwen_code_xml_raw_v2 protocol accepts a short plain-text
introduction followed by one terminal XML envelope. It still rejects inline
examples, fenced XML, trailing text, and unadvertised tools. If a request sets
parallel_tool_calls=false, multiple invokes fail atomically; the server
does not forward the first call while dropping the rest.
Its delimited
parameter bodies preserve raw HTML and code for edit arguments; a literal
closing </parameter> inside a value is outside this
compatibility protocol. The older qwen_code_xml protocol keeps its
strict whole-response XML/entity interpretation for existing bundles; opt in to v2
only for existing explicitly configured compatibility bundles. Legacy bundles without
serving.json retain their hash-bound tool_protocol.json path.
One cached Qwen Code run recovered from a
read-before-edit rejection, read the file, and applied a bounded HTML
edit in a disposable worktree. That does not certify general edit-and-test
reliability, cancellation recovery, or 262K actual input.
RUN_DIR=/path/to/dedicated/qwen38-generated-runtime # Explicit metadata upgrade of an existing, complete generated bundle. # Publisher assets are the default; no repository template installation is needed. python3 version/v8/scripts/resolve_serving_bundle_v8.py \ --run "$RUN_DIR" --circuit version/v8/circuits/qwen38.json version/v8/scripts/ck_serve_v8.py "$RUN_DIR" --run "$RUN_DIR" \ --no-build --model-name qwen38-27b-q4km --host 127.0.0.1 --port 8080
For a new chat bundle, ck_run_v8.py run ... --generate-only --resolve-serving
resolves the circuit profile after compilation. Normal chat serving requests this automatically.
Raw/token-ID builds do not require publisher chat assets; omit --resolve-serving
or build with --no-chat-template. Unsupported selections
fail explicitly. The circuit's publisher variant is the default. Safetensors
tokenizer configuration can supply embedded or named publisher templates; conflicts with
colocated Jinja files fail instead of choosing one silently. Startup validates template,
tokenizer, weights, configuration, layout, and generated-library hashes, so hashing large
weights is part of setup time. Rebuilding these assets requires explicit re-resolution.
Explicit upgrades verify the retained manifest → IR → generated C → runtime stamp chain
against the current bundle bytes. A matching model name alone is insufficient. Missing build
provenance requires a rebuild. Computational circuit changes are rejected; only changes confined
to the serving section may be allowed with --allow-serving-update.
A missing or invalid resolved asset never falls back to a legacy template. Raw serving skips
formatting but still validates a present resolved bundle and actual loaded libraries. Runtime template
overrides are rejected for resolved bundles. The sidecar marks certification
NOT_TESTED; dependency resolution alone is not a model/tool certification.
Freshly compiled bundles also bind selected kernel runtime dependencies to the compiled
kernel registry. If a selected provider needs Sleef_expf16_u10, startup
checks CK_SLEEF_LIBRARY (or an already loaded process symbol) before
opening HTTP traffic. Rebuild and re-resolve older bundles to gain this check;
changing an existing server process does not upgrade its loaded runtime.
Run make test-v8-serve-native-jinja for the deterministic sidecar-loader,
Jinja-renderer, request/continuation, hash, and render-failure contract. The nightly
v8 Serve Localhost E2E also requires the converted Jinja sidecar in a real
Qwen3-0.6B generated-model request. The pinned Qwen3.8 contract uses scripted model
output; its green result does not certify Qwen3.8 token IDs or generated tool calls.
Cached Ryzen Qwen Code 0.24.6 runs completed server-issued read_file and
bounded read_file → edit calls through this variant. A
write_file request was rejected because that tool was absent from the
client's advertised tool set. File creation and native-template prompt-token parity
remain open.
The generated decoder now has an optional, serialized sequence-state switch ABI for
layouts whose compiled activation lifetimes declare only KV as persistent mutable
sequence state. It permits two additional generation-tagged state IDs backed by
caller-owned, 64-byte-aligned KV arenas. The ABI reports the exact bytes required;
the caller budgets and retains each arena through retirement. KV contents and
positions survive switches. Recurrent, encoder, and multimodal layouts do not advertise this
capability. The server does not use these handles yet. An additional generated
ck_model_decode_batch2 entry now admits two one-token rows only when
the KV-only compiled layout and kernel map declare compatible Q5_1/Q8_1
projections. The first layer's Q and K projections share one M=2 weight traversal;
the remaining layers and attention execute with separate sequence state. This is
actual shared generated projection work, but not a full-layer batched decoder,
a server scheduler, mixed prefill/decode, or continuous batching.
For a non-default handle, named KV pointer lookup resolves to that handle; a bump-arena
offset is unavailable and returns -1.
Run python3 version/v8/scripts/certify_sequence_state_v8.py --run RUN_DIR
against a freshly generated eligible bundle. A 128-token Gemma3-270M Q5_K_M build
passed eight exact finite-logit comparisons, including reset isolation and slot reuse; the retained JSON
report records the library, weights, layout, and config hashes. This bounded result
does not cover concurrent calls, recurrent models, cancellation, or throughput.
Run python3 version/v8/scripts/certify_batch_decode_v8.py --bundle BUNDLE --generated-source MODEL_C
against a freshly generated eligible bundle. The retained Gemma3-270M Q5_K_M
report compares full finite logits and complete KV bytes with isolated prefill/decode:
seven continuations matched exactly across unequal prompts, swapped row order,
one-row continuation, retired-slot reuse, pre-step cancellation, capacity rejection,
and rejected buffer aliases, including a third live sequence arena. Admission now checks
the split's crossing values and exact base-pointer expressions, and binds the M=2 provider
to the selected decode kernel map. The report identifies actual loaded model, engine, and
tokenizer mappings and checks the generated source against the loaded model's source digest.
CI compiles and executes a tiny generated-entry fixture and tests rejection after a loaded
library pathname is replaced. Its timings are diagnostic workloads, not a speedup measurement. Recurrent
Qwen, larger artifacts, simultaneous API calls, and HTTP request scheduling remain
uncertified for this batch entry.
The next generated step shares the first layer's MLP gate/up Q5_1 projection as a
second two-row weight traversal after sequence-local attention and KV writes. The
compiler derives both cutpoints' live values from lowered IR without depending on
argument order. Only validated full decode-row writes retire earlier values; unknown
or partial writes prevent the extension. It checks the gate/up provider and GeGLU
consumption contract, and retains the Q/K-only entry for layouts
that do not qualify. The separate
batch_decode_gemma3_270m_two_row_layer_20261003.json report records
seven exact full-logit and KV comparisons from a freshly rebuilt local bundle and
requires both shared projection groups. A compiled fixture also compares the actual
emitted split functions with isolated execution. In that earlier two-group build,
V, output and down projections remained sequence-local; it made no full-layer or
throughput claim.
The next bounded generated entry derives four projection groups and their
crossing tensors from the first layer's lowered graph. Q/K/V, attention
output, gate/up and MLP down use map-selected two-row providers; attention,
KV writes, normalization and all later layers remain sequence-local. The
planner rejects unsupported provider bindings, pointer offsets, new live
values and persistent state outside the declared KV contract. The generated
batch entry validates both handles, positions, capacity, cancellation and
buffer ownership before work starts; a rejected step advances neither
sequence. Once admitted, both rows finish the forward pass. Cancellation
is observed at the next step boundary, not inside a running kernel. The retained
batch_decode_gemma3_270m_full_layer_20261007.json report requires
four groups and records seven exact full-vocabulary logit and complete-KV
comparisons on a newly generated Gemma3-270M Q5_K_M bundle. On the local
i7-14700T, three artifact-identical diagnostic repetitions of six matched
decode tokens took 183.1–184.3 ms as isolated sequential calls and
57.8–65.5 ms in three two-row steps. The base report and its
_run2 and _run3 siblings preserve each attempt.
These tiny samples are not an overnight-task or generalized
speedup claim. The ordinary server path still uses
single-flight execution; later layers, recurrent Qwen state, dynamic
admission and mixed prefill/decode remain separate milestones.
The subsequent two-row generated entry extends the checked graph-derived plan across consecutive complete decoder layers. On the identified Gemma3-270M Q5_K_M artifact, all 18 supported layers execute four shared map-selected projection groups per layer (72 total); attention, KV writes and positions remain sequence-local. The plan checks values live across every split against the complete remaining graph. It rejects an unsupported layer and leaves the rest of the decode path local rather than assuming an unproven buffer extent or provider binding. Compact row packing is required where a selected provider stride differs from the live activation extent.
Run certify_batch_decode_v8.py with
--expected-shared-layers 18 --expected-projection-groups 72
against the identified local bundle and matching generated source. The retained
batch_decode_gemma3_270m_multi_layer_20261008.json report
compares complete finite logits, KV bytes and positions after each of
seven continuations: unequal prefixes, swapped rows, retirement and
slot reuse, cancellation, capacity rejection and recovery. A small
compiled two-layer regression runs in the standard test suite and
includes deliberately broken restoration and cache-ownership controls.
On the local i7-14700T, three artifact-identical repetitions measured
six isolated native decode calls at 59.4–62.1 ms versus three two-row
native calls at 70.6–76.8 ms. Python validation and output copying are
outside both timing boundaries. Thus this small-artifact batch path was
slower on the matched workload; it is a correctness milestone, not a
speedup claim. The reports record workspace and copy volume. An optional
monotonic-clock copy profile measured 0.748 ms of copying across three
instrumented steps; its instrumentation perturbs full-step timing.
Ordinary HTTP serving remains single-flight; recurrent Qwen state, request
scheduling and mixed prefill/decode still need their own contracts.
Experimental two-request HTTP decode
--batch-http-extra-bytes BYTES --batch-http-prompt-cap TOKENS
--request-output-cap TOKENS opts into a separate two-slot Responses
path for a generated KV-only batch-capable model. It uses the loaded
bundle's selected Jinja, tokenizer and declared tool parser. One worker
owns native prefill and decode while each request has separate
cancellation, detokenization, events and output. A third active slot
receives HTTP 429; the ordinary single-flight path remains the default.
--batch-http-decode-replay-chunk-tokens N additionally opts into
staged prefill. The owner computes at most N prompt tokens through
generated single-token decode, then gives ready requests a decode turn
before the next chunk. Cancellation has a ticket before prompt work
starts. This prevents a whole prompt from monopolizing the owner, but
one slow token operation still sets the cancellation/latency granularity.
Decode replay can differ numerically from the artifact's ordinary
batched prefill and requires artifact-specific parity testing. The
effective serving record names the selected prefill strategy and chunk
budget. Add --batch-http-mixed-one-row to allow one ready
decode token and one staged prompt token to enter the same generated
two-row decode call. This is a two-slot, one-prompt-row bridge, not
variable-size chunk execution or a general batch-N contract. Both
options remain opt-in; the mixed flag requires staged prefill.
The local Gemma3-270M Q5_K_M generated-runtime check compares finite
full logits at every step, complete KV bytes and positions against
serialized decode replay for either prefill slot. It covers consecutive
mixed steps, continuation after prompt completion and a 32-token
session-capacity boundary. A separate optional comparison against the
ordinary generated prefill entry fails on the pinned artifact: 9
tokens match exactly, but 10 tokens change both full logits and KV
bytes; at 28 tokens, the top predicted token also changes. The
--compare-ordinary flag records this as a failing,
artifact-bound diagnostic in
version/v8/reports/batch_prefill_gemma3_270m_20261011.json.
The cause and which path matches the publisher reference remain
unverified. Mixed-step parity against decode replay does not certify
ordinary-prefill parity or a resolved serving deployment.
The optional --compare-ordinary --oracle-gguf GGUF_PATH
diagnostic compares complete logits using the same token IDs. The
retained result is version/v8/reports/batch_prefill_gemma3_oracle_20261012.json.
It verifies the helper's actual loaded llama.cpp library mappings,
records their backing-file hashes and effective settings, and repeats
each llama.cpp mode twice. Seven selected GGUF/BUMP tensors match at
beginning, middle and end samples; nine model metadata fields match.
Full conversion and build provenance remain unverified.
The comparison has an earlier boundary than the CKE prefill split: at one token, CKE and llama.cpp select different top tokens. At 10 tokens, llama.cpp batched and sequential evaluation themselves select different top tokens (107 versus 1018), with 1.248 full-logit RMSE; repeated runs of each mode are exact. The one-token llama top token is unchanged with one or four threads and with repacking on or off. The helper requested 64 context tokens but used 256 after runtime adjustment, while CKE's session capacity was 32. These differences prevent treating either llama.cpp mode as a numerical arbiter. CKE ordinary and staged prefill first diverge at 10 tokens; an internal hidden-tensor inspection places that CKE-only difference after matching layer-16 Q/K/V inputs. The cross-runtime one-token mismatch is not explained by that later difference. No numerical path is promoted, and batching remains experimental on this artifact.
A separate resolved Gemma3-270M Q5_K_M chat-only HTTP acceptance is
available through server/batch_http_acceptance.py. It
checks expected serving and loaded session hashes before generation,
compares two simultaneous greedy streams with their isolated outputs,
requires mixed-step evidence attributed to both response IDs, then
cancels one request while its peer continues and serves a follow-up on
the same instance. The bounded
/v1/cke/batch-observation/{response_id} endpoint identifies
the exact peer sharing each generated step; global counters alone are
diagnostic. The probe requires an idle owner, records synthetic prompts,
settings, output hashes and terminal reasons, and cancels outstanding
requests on failure. The retained local run observed 27 attributed mixed
steps with matching outputs, peer continuation and recovery. The tested
artifact exhausted its output limit, so model-generated normal EOS is
explicitly not certified; deterministic stream tests cover normal EOS
and duplicate-terminal rejection. This certifies the tested HTTP/native
boundary only; Gemma3's
profile declares chat without tools, so it is not a completed agent
harness task or an ordinary-prefill parity result. Keep a full
tokenizer.json beside this GGUF-derived artifact when its
publisher template requires bos_token; the resolved bundle
hashes that asset and otherwise fails closed at rendering.
Native slot budgeting does not bound HTTP delivery by itself. The
opt-in path also limits undelivered response consumers (default 4),
output token events (default 4096),
decoded output bytes per response (default 1 MiB), and time for each
stream write (default 30 seconds). Configure these with
--batch-http-delivery-consumers,
--batch-http-output-token-cap,
--batch-http-output-byte-cap and
--batch-http-delivery-timeout. A stalled stream is cancelled
without blocking the shared native owner; an exceeded output-byte cap
fails that response. Token event queues are bounded and terminal
failure notification cannot wait behind a full queue. An owner failure
poisons the owner, wakes active
and queued consumers, and rejects new submissions rather than leaving
a request waiting forever.
This is a bounded experimental integration, not certified overnight concurrency. Without the staged flag, prefill remains synchronous and cannot be interrupted inside one slow native operation; a prompt-token cap is not a time bound. Native per-request phase timing is reported unavailable. A local generated Gemma3-270M diagnostic matched isolated and concurrent output with 11 shared decode steps, but it did not use a resolved deployment bundle or an external harness. Certify two real harness tasks and certify staged prefill on the deployed artifact before promoting this path. Recurrent Qwen state is outside this KV-only capability.
Qwen3.5 publisher templates and request ownership
The Qwen3.5 circuit references the shared qwen-tools-v1 serving profile.
Conversion packages the publisher Jinja and tokenizer assets into the resolved BUMP
serving bundle. The declared qwen_xml parser handles native tool envelopes;
it does not constrain the model's next-token sampling. Grammar-constrained generation
remains a separate capability. Template rendering, token-ID agreement and actual tool
completion each require their own evidence.
Reasoning starts from the generation suffix isolated by rendering the selected template
with and without add_generation_prompt. Literal reasoning tags in user
messages or tool results cannot choose the initial parser state. Tool-bearing streams
expose reasoning while withholding tool calls until validation. Over-limit calls are
rejected together; the server never silently executes a retained subset.
The Responses API's usage.output_tokens_details.reasoning_tokens is
currently an estimate: the server divides visible reasoning text length by four and
rounds down. It is not an exact count of generated reasoning token IDs and should not
be used for billing or context admission. reasoning.effort=none selects
the server's suppressed reasoning mode; actual model behavior remains artifact-specific.
Other accepted effort labels do not select different compute budgets.
Accepted service_tier values are echoed in the response but do not change
native scheduling priority or model speed.
Typed images, files, audio and video are rejected before rendering or native execution in this text-only session ABI, including media returned by tools. Publisher image-marker rendering tests are render-only evidence. Plain paths remain text. Enabling vision requires a connected preprocessing → generated encoder → bridge → decoder path, not positive layout dimensions or template words.
429 Session busy means the single-flight native slot is occupied. Native worker
completion now releases its request-owned slot independently of HTTP stream consumption.
Disconnects request cancellation but retain ownership until native work finishes; an old
response cannot cancel a newer request. A legitimate active request can still produce 429.
Long-prefill cancellation may exceed its acknowledgement deadline: a cancellation timeout
must not release buffers still in use or be described as successful bounded cancellation.
Newly generated text runtimes can accept a request-owned cancellation flag and poll it between lowered prefill operations or sequential prompt tokens. The native session reports cancellation before sampling and resets partial model state before reuse. Older generated libraries do not have this hook. A slow individual kernel can still delay acknowledgement, so a real-model prefill cancellation result is required before claiming bounded latency for a deployed bundle.
Black-box HTTP lifecycle acceptance
Run this probe against the intended live endpoint after deployment. It uses only HTTP: cancel a long-input request after its in-progress event and a decoding request after observing an output delta, close a stream, close a client after its read deadline, then serve a follow-up request after each case. It checks the loaded bundle, native session library and server instance before and after the run. A mismatched identity fails before generation; a missing run leaves no PASS report. The JSON records whether follow-up generation completed or exhausted its output allowance. The long-input cancellation is a timing inference, not native prefill-phase proof; the report labels its trigger and phase evidence explicitly.
python3 server/http_lifecycle_acceptance.py \ --endpoint http://127.0.0.1:8080/v1 \ --model <advertised-model-id> \ --expected-serving-identity <serving.json identity> \ --expected-session-library-sha256 <loaded session-library SHA-256> \ --output /path/to/new-http-lifecycle-report.json
The probe is a transport and ownership check, not a tool-use or
answer-quality certification. It requires a generated runtime with the cancellation
hook and a local plain-HTTP endpoint; use the separate Qwen Code acceptance runner
to test model-generated tool calls and task completion. Schedule the two on a local
runner at separate times so the single-flight endpoint is not deliberately contended;
retain each dated report and show a missing run as NOT_TESTED, never PASS.
The versioned native session ABI borrows request buffers and callback
data only while a synchronous call is active. Cancellation requests a stop; generation
returning acknowledges that native work has stopped. The current generated-model state
is not certified for concurrent sessions in one process, so another HTTP host must
preserve single-flight ownership until a separate sequence-state contract is proven.
See include/ck_session_v8.h for the buffer and thread rules.
In an isolated Ryzen native-session probe on 2026-09-30, regenerated Qwen3.8-27B
Q4_K_M code acknowledged a long-prefill cancellation in 0.55 seconds and completed
a one-token follow-up in 3.24 seconds without reopening the session. Its uncancelled
64-token logits matched the previous generated library byte-for-byte. The retained
report is /srv/cke/profiles/qwen38-prefill-cancel-20260930/probe.json.
This probe does not certify HTTP disconnect timing, all prompt lengths, or other
model/provider combinations.
The 2026-09-28 Qwen3.8 overnight documentation trial failed after approximately five hours and eighteen successful inspection calls with repeated busy responses. It produced no HTML/SVG outputs. This is retained failure evidence; short read/edit acceptance does not establish unattended reliability. Cheap lifecycle, media rejection and pinned-template tests run in the existing serving suite; real-model acceptance is recorded separately.
A separately rebuilt Qwen3.5-0.8B Q4_K_M bundle exposed an imported tokenizer-type
mismatch: its tool delimiters were split into ordinary BPE pieces. Registering the
publisher's CONTROL and USER_DEFINED token types produced exact generated-runtime
agreement with the reference tokenizer for the tested tool prompts (327/327 and
325/325 token IDs). That bundle completed a bounded read_file request and
tool-result continuation on both Responses and Chat Completions routes, with thinking
suppressed and visible. A real Qwen Code 0.24.6
run received the correct file contents but repeated the read until its three-call budget
stopped it; this is not a completed harness-task certification. These results apply to
the tested 0.8B artifact, not every Qwen3.5 variant.
Qwen Code Interactive And Overnight Profiles
On ARM, an explicit CK_ARM_ARCH used to build the engine is
retained by ordinary cks-v8-run run and serve
invocations in the same build tree. The runner checks compiler support,
rebuilds with that profile, and records it with the bundled library
hashes. Set a new CK_ARM_ARCH to change the target, or set
CK_ARM_NATIVE=0 explicitly to request baseline ARM. If an
existing engine has no valid build-flag record, choose a profile
explicitly before rebuilding; do not infer its ISA from its filename.
A cached Qwen Code 0.24.6 read_file task passed through the Responses server
using the circuit-resolved publisher Jinja bundle. The earlier 0.21.5 pilot used the
Chat Completions compatibility route. Both use the pinned Qwen3.8 27B Q4_K_M artifact and a
generated runtime with at least 16K context. Repository-owned settings separate short
interactive work from large overnight artifact generation without replacing the user's
~/.qwen/settings.json.
CK_NUM_THREADS=16 OMP_NUM_THREADS=1 \ version/v8/scripts/cks-v8-run serve \ hf://ggml-org/Qwen3.8-27B-GGUF/Qwen3.8-27B-Q4_K_M.gguf \ --run /path/to/qwen38-agent-runtime \ --context-len 16384 \ --force-compile \ --model-name qwen38-27b-q4km
OPENAI_API_KEY=cke-local-only \ OPENAI_BASE_URL=http://127.0.0.1:8080/v1 \ OPENAI_MODEL=qwen38-27b-q4km \ QWEN_CODE_MAX_OUTPUT_TOKENS=2048 \ QWEN_CODE_SYSTEM_SETTINGS_PATH="$PWD/server/qwen-code/interactive.settings.json" \ qwen --bare \ --auth-type openai-responses \ --system-prompt 'Use read_file exactly once when asked, then answer without another tool call.' \ --allowed-tools read_file \ --exclude-tools edit,notebook_edit,run_shell_command,get_goal,update_goal \ --max-tool-calls 1 \ --model qwen38-27b-q4km
OPENAI_API_KEY=cke-local-only \ OPENAI_BASE_URL=http://127.0.0.1:8080/v1 \ OPENAI_MODEL=qwen38-27b-q4km \ QWEN_CODE_MAX_OUTPUT_TOKENS=32768 \ QWEN_CODE_SYSTEM_SETTINGS_PATH="$PWD/server/qwen-code/overnight.settings.json" \ qwen --bare \ --auth-type openai-responses \ --allowed-tools read_file \ --exclude-tools edit,notebook_edit,run_shell_command,get_goal,update_goal \ --max-wall-time 18h \ --model qwen38-27b-q4km \ --output-format stream-json \ --prompt "$(cat /path/to/reviewed-task.txt)" \ > /path/to/task-events.jsonl
The circuit-linked serving profile resolves the imported publisher Jinja, tokenizer
assets and declared tool-output protocol into the BUMP bundle. The server consumes
that resolved contract and rejects stale hashes; it does not install a repository
compatibility template at request time. Tool-bearing streams publish parsed calls
only after validation. A complete bundle can serve with --no-build without
the source GGUF or a server-owned template copy.
Publisher special-token variables such as bos_token come from the
bundle's hashed tokenizer metadata. Missing variables remain undefined and
conflicting metadata fails; the renderer does not invent model delimiters.
The standard strftime_now helper uses the host's current date
when a publisher template requests it.
This supports publisher text-chat rendering. Scripted Muse ATEM parsing and
pinned prompt-token comparisons are covered separately; they do not certify
Muse-generated tool calls or a completed harness task on a current bundle.
Gemma4 references gemma4-v1, with a chat-only
default variant and an explicit tools variant. The default output
protocol is none: ordinary text chat can
resolve the publisher Jinja asset, while tool-bearing requests fail before generation.
When HF token sidecars are absent, verified GGUF special-token IDs are matched to
bundled tokenizer.json text; conflicting definitions fail at startup.
GGUF configs may carry model_type and model_name without a
model key; bundle resolution then checks the stamped manifest's circuit identity.
This declaration alone does not certify a Gemma4 artifact. Keep rendered-byte
parity, token-ID parity, generated chat, tool protocol and recovery as separate
artifact-specific results.
A fresh isolated Gemma4 E4B GGUF build exposed two native BPE
differences from the bundled publisher tokenizer: its Jinja prompt already contains
<bos>, and its tokenizer declares
add_space_prefix=false. Generated tokenization now honors both contracts.
Exact IDs matched the bundled tokenizer.json for single-turn,
multi-turn, and Unicode/multiline rendered prompts in the isolated Ryzen run.
The same isolated artifact passed short generated chat through Chat Completions
and streaming Responses. The repeatable HTTP probe also checks multi-turn recall,
a deliberately exhausted one-token output budget, undeclared-tool rejection and
a successful request afterward. The existing lifecycle probe passed cancellation,
disconnect, client timeout and follow-up recovery against this 2,048-token build.
The timing-only prefill trigger proves an in-progress request, not the exact native
phase at cancellation. These are bounded text-serving checks, not a harness task.
The imported publisher template contains Gemma4's
<|tool_call>, <tool_call|> and
<|tool_response> syntax, as described in
Google's Gemma4 prompt format.
The optional gemma4_dsl_v1 variant selects a strict parser,
adapts function declarations to the publisher's nested Jinja input,
and declares <|tool_response> and <eos>
output stops in the resolved bundle. One isolated Gemma4 E4B Q4_K_M
artifact completed real generated tool-call/result continuations through
both HTTP routes. The circuit default remains chat-only; selecting the
tools variant and testing one artifact does not certify every Gemma4 build.
For clients such as the pinned Antigravity SDK 0.1.20 that
send a very large max_completion_tokens upper bound, an operator
may explicitly start this bounded Gemma server with
--request-output-cap 256. The normal policy still rejects
requests whose declared allowance exceeds the loaded context. With the
cap enabled, the effective allowance is recorded in the response and
/v1/cke/loaded-identity; exhausting it remains an incomplete
response. The SDK's external OpenAI-compatible configuration must name
this local endpoint and the loaded model. No cloud fallback or model-name
substitution is part of this test.
# Run an already resolved, self-contained Gemma tools bundle on Ryzen. # Verify serving.json selects the tools variant before starting; do not # silently replace the publisher template at request time. GEMMA_RUN_DIR=/path/to/identified/gemma4-tools-bundle python3 version/v8/scripts/ck_serve_v8.py "$GEMMA_RUN_DIR" \ --run "$GEMMA_RUN_DIR" --no-build --model-name gemma4-e4b-q4km-tools \ --host 127.0.0.1 --port 18205 --request-output-cap 256 \ --request-prompt-byte-cap 32768 # On the harness machine, tunnel the localhost-only endpoint from Ryzen. ssh -N -L 127.0.0.1:18215:127.0.0.1:18205 ryzen # GET http://127.0.0.1:18215/v1/cke/loaded-identity and confirm the expected # model, gemma4_dsl_v1 protocol, effective cap and artifact hashes.
On the isolated 2,048-token tools bundle, Antigravity SDK
0.1.20 connected directly to CKE with --request-output-cap 256
and completed a file read, two-file answer, exact HTML edit plus validator,
and retry after a transient tool error in two consecutive four-case runs.
Both reports and disposable workspace archives are retained under
/srv/cke/profiles/gemma4-tools-20261003/. Two earlier runs
failed the single-file answer despite a correct tool call and result;
those failed reports are retained too. The passing runs used a more
specific task prompt. This establishes a bounded successful workflow,
not repeated overnight reliability or larger-context capacity.
The HTTP cancellation/disconnect suite passed on the same server instance;
a fresh SDK read then succeeded without restart.
# Read both SHA-256 values from /v1/cke/loaded-identity first. python3 server/http_lifecycle_acceptance.py \ --suite plain-chat --endpoint http://127.0.0.1:18204/v1 \ --model gemma4-e4b-q4km-test \ --expected-serving-identity "$SERVING_SHA" \ --expected-session-library-sha256 "$SESSION_SHA" \ --output /path/to/new-plain-chat-report.json # The same artifact can run the existing cancellation/recovery suite. python3 server/http_lifecycle_acceptance.py \ --suite lifecycle --prefill-lines 100 \ --endpoint http://127.0.0.1:18204/v1 \ --model gemma4-e4b-q4km-test \ --expected-serving-identity "$SERVING_SHA" \ --expected-session-library-sha256 "$SESSION_SHA" \ --output /path/to/new-lifecycle-report.json
# Against the explicit Gemma tools variant, with the endpoint's output cap set to 256. # Install google-antigravity==0.1.20 in an isolated environment on the client. python3 server/gemma_antigravity_acceptance.py \ --endpoint http://127.0.0.1:18215/v1 \ --model gemma4-e4b-q4km-tools \ --expected-serving-identity "$SERVING_SHA" \ --expected-session-library-sha256 "$SESSION_SHA" \ --case-timeout-seconds 300 \ --workspace /path/to/new-disposable-workspace \ --output /path/to/new-gemma-antigravity-report.json
Bounded local Qwen Code acceptance
Use the same Qwen Code client as a real contributor task in a new disposable directory. This command reads a small HTML file, edits one heading, runs its Python validator and asks for a summary. The runner checks tool IDs, arguments and results against both the event stream and retained Qwen Code conversation, requires terminal success after tool completion, and checks the exact file content. Extra reads of the two fixture files are allowed; unexpected file paths or validation commands fail the retrospective acceptance check. These checks do not sandbox tool execution. Use a restricted account or container when the harness must be isolated.
python3 server/qwen_harness_acceptance.py \ --endpoint http://127.0.0.1:8080/v1 \ --model qwen38-27b-q4km \ --expected-serving-identity <serving.json identity> \ --expected-session-library-sha256 <libck_session_v8.so SHA-256> \ --settings server/qwen-code/interactive.settings.json \ --run-dir /tmp/cke-qwen-acceptance-001
The runner requires an empty run directory and writes
events.jsonl, stderr.log, the edited fixture and
report.json. A PASS proves this bounded harness task on the named
endpoint. For a resolved bundle, read the intended identity field from
its serving.json and pass it with
--expected-serving-identity. The runner checks
GET /v1/cke/loaded-identity before launching Qwen Code and again after
the task. That endpoint reports the verified bundle identity, asset hashes,
native session-library hash and server-instance ID without filesystem paths.
The session hash comes from the backing file of the loaded native session symbol;
deleted, replaced or ambiguous mappings are rejected at startup. Supply the
expected session-library hash to certify that runtime ABI as well. Every
supplied hash is checked independently: a mismatch prevents task launch or
fails certification, while an absent expectation leaves certification incomplete.
The endpoint reports effective_serving separately from the bundle:
configured raw or templated mode, selected output protocol, active context limit,
default output allowance, and stop behavior. The runner requires that snapshot
to remain stable across its task.
A legacy endpoint with no
loaded identity, or a run without both expected hashes, remains
INCOMPLETE even if its bounded task passes. The acceptance command exits
successfully only when both the task and artifact certification report PASS.
The endpoint is a startup verification snapshot, not continuous file-integrity
monitoring. A cached 191335eba Qwen3.8 27B Q4_K_M
run completed read → edit → test → summary on Ryzen at 16K compiled capacity;
it does not establish 256K-input execution or other model-family tool support.
Qwen Code bare mode ignores --core-tools, so these commands explicitly
remove unused bare-mode tools. The interactive profile uses 16K context and a 2K output
allowance. The overnight profile requires a 256K generated runtime, advertises that capacity
to the client, and reserves up to 32K output tokens. It does not add mid-generation resume,
automatic publication, commits, or deployment. On later --no-build starts, the
server reads the compiled capacity from layout_decode.json.
Qwen Code 0.24.6 needs the explicit QWEN_CODE_MAX_OUTPUT_TOKENS
environment value in these examples; the older settings profile alone did not
constrain its output request in a bounded local probe.
Repeated Qwen and Gemma harness acceptance
Run server/harness_repeatability.py from a client machine that can
reach both endpoints through localhost tunnels. It invokes the existing
black-box HTTP suites, Qwen Code runner, and Antigravity SDK runner; it
does not select templates or execute model arithmetic. Pin each entry to
the intended loaded serving and session-library SHA-256 values. Use a Python
environment with the server test dependencies for the coordinator, and name
a separate Python environment containing google-antigravity==0.1.20
for the Gemma client. The Qwen executable must report version 0.24.6.
{
"schema": "cke.harness_repeatability.v1",
"attempts": 3,
"clients": [
{
"name": "qwen-control", "adapter": "qwen_code",
"endpoint": "http://127.0.0.1:18103/v1",
"model": "qwen38-27b-q4km-262k",
"serving_identity": "<64 lowercase hex characters>",
"session_library_sha256": "<64 lowercase hex characters>",
"qwen_bin": "qwen", "qwen_version": "0.24.6",
"task_timeout_seconds": 1800, "prefill_lines": 100
},
{
"name": "gemma-control", "adapter": "antigravity_gemma",
"endpoint": "http://127.0.0.1:18215/v1",
"model": "gemma4-e4b-q4km-tools",
"serving_identity": "<64 lowercase hex characters>",
"session_library_sha256": "<64 lowercase hex characters>",
"python": "/path/to/pinned-antigravity-venv/bin/python",
"case_timeout_seconds": 300, "prefill_lines": 100
}
]
}
# Save the JSON above as /path/to/local-serving-matrix.json and replace both # placeholder hashes with the intended bundle/session identities. python3 server/harness_repeatability.py \ --config /path/to/local-serving-matrix.json \ --output-dir /path/to/new-matrix-run # If reporting logic changes, reassess completed retained reports without # repeating any harness tool or native generation: python3 server/harness_repeatability.py \ --reassess-dir /path/to/completed-matrix-run
The output directory must be new. It retains the exact
configuration, stdout/stderr, every individual HTTP and harness report,
disposable workspaces, and an incrementally written summary. A failed
task remains failed even when the loaded identity matched; a passed task
does not inherit a missing protocol or recovery result. The matrix also
rejects a changed server-instance ID between attempts, even if the same
bundle is reloaded. The HTTP suites
test multi-turn and output-limit behavior, bounded-input rejection with
a successful follow-up, cancellation, disconnect, and timeout recovery.
For an uncapped runtime, the context probe tests an oversized output
reservation. The 2,048-token Gemma deployment also declares an explicit
32,768-byte rendered-input cap; its probe tests that separate byte limit
and a successful follow-up. It does not infer a token count from the
input's byte length. Native tokenization failures without a proven
capacity cause remain structured server errors, while native busy
responses remain HTTP 429.
The probe records whether an exact token-count exceedance was proven.
It records which boundary was exercised and does not claim that
the Qwen probe consumed 262K input. After a runner
timeout, the matrix stops submitting work to that endpoint because native
completion is not yet proven. The suite records failures without silently
retrying edits or commands. It checks outcomes after execution; a fresh
directory alone does not sandbox the client. Use a restricted account or
container when tool execution needs isolation. Reassessment writes a separate immutable
reassessment.json, pins the original summary and each child
report hash, and never replays a task. Older reports without child hashes
remain integrity-unverified. The small Gemma artifact has only 2,048 tokens
of compiled context and uses an explicit 256-token output cap; this matrix
is bounded workflow evidence, not a larger-context or unattended-reliability
claim. Repeat with a separately built and identified larger-context artifact
before advertising practical prompt/tool-schema capacity.
GET /v1/models/{model} reports the loaded CKE context capacity. The server uses
the native tokenizer to validate the fully rendered prompt plus requested output before
generation and rejects an oversized request with the exact token counts. The selected Qwen
profile must not advertise more context than the generated runtime.
Each non-streaming completion and terminal streaming chunk includes
cke_performance. It reports prompt/output token counts, native prefill and decode
time, complete server request time, and time outside native generation. Client tool execution
occurs between requests and must be timed separately.
Profile The Native Token Loop
Use the C CLI directly so Python startup and orchestration do not contaminate the profile:
perf stat -d -- \ ./build/ck-cli-v8 --lib "$MODEL_SO" --weights "$WEIGHTS" \ --manifest "$MANIFEST" --require-generated-abi \ --prompt "Hello" --max-tokens 64 --quiet-output --no-timing perf record -g --call-graph dwarf -- \ ./build/ck-cli-v8 --lib "$MODEL_SO" --weights "$WEIGHTS" \ --manifest "$MANIFEST" --require-generated-abi \ --prompt "Hello" --max-tokens 64 --quiet-output --no-timing vtune -collect hotspots -result-dir build/vtune-v8-native -- \ ./build/ck-cli-v8 --lib "$MODEL_SO" --weights "$WEIGHTS" \ --manifest "$MANIFEST" --require-generated-abi \ --prompt "Hello" --max-tokens 64 --quiet-output --no-timing
What End-to-End Certification Means
- Tokenizer parity: generated C encode/decode agrees with the declared Hugging Face or reference tokenizer.
- Model parity: identical token IDs produce the required logits or generated token trajectory against the numerical oracle.
- Native product parity:
ck-cli-v8performs generated chat formatting, C tokenization, model execution, generated stop policy, and C detokenization without Python in the request path.
What Success Looks Like
- The bridge logs reach
[v8-bridge] done report=.... - A bridge report exists under the model cache and contains
"status": "ok". - The generated caption is coherent natural language, not raw stop tokens,
/no_think, or an empty assistant turn.
A healthy prompt shell uses the GGUF chat template in auto mode and preserves the vision markers around <image_embeds>.
IR Hub Quick Launch
Generate and open the parent dashboard for all v8 runs under $HOME/.cache/ck-engine-v8/models.
.venv/bin/python version/v8/tools/open_ir_hub_v8.py --open
Cache-backed inference, training, profiling, and multimodal runs appear automatically when their artifacts use the canonical v8 model root.
Headless Server Access
When the server has no window manager, serve the canonical model root and use an SSH tunnel. Keeping the HTTP server on loopback avoids exposing unauthenticated reports to the surrounding network.
# Run on the headless CKE server.
cd "${CK_CACHE_DIR:-$HOME/.cache/ck-engine-v8/models}"
python3 -m http.server 7021 --bind 127.0.0.1
# Run on the workstation that has a browser.
ssh -L 7021:127.0.0.1:7021 USER@SERVER
# Then open:
http://127.0.0.1:7021/ir_hub.html
On a trusted LAN or Tailscale network, binding with --bind 0.0.0.0 makes the hub reachable at
http://SERVER_IP:7021/ir_hub.html. Python's development server provides no authentication or TLS;
do not expose it directly to the public internet.
Artifacts To Inspect
v8 has its own operator artifact surface. It is not only a decoder dump:
text runs can emit an ir_report.html, the v8 hub indexes run directories,
and multimodal runs carry encoder → bridge → decoder artifacts that the visualizer can render as a single circuit.
ir_report.html shows lowered ops, memory layout, kernel flow, profile artifacts, parity notes, and generated commands for a single v8 run.
ir_hub_v8.html indexes cache-backed v8 runs and links reports, bridge outputs, dataset viewers, embeddings, attention exports, and probe reports.
Qwen3-VL/Gemma4V bridge reports expose encoder runtime, projected visual prefix, decoder mixed prefill, generated text, and profiler summaries.
The v8 viewer reuses the contract-tested tab model for staged data, tokenizer, vocabulary, quality, embeddings, and attention inspection.
| Artifact | Purpose |
|---|---|
~/.cache/ck-engine-v8/models/.../ir_report.html |
Single-run v8 IR visualizer report. Generated automatically by --generate-visualizer or explicitly with open_ir_visualizer_v8.py. |
~/.cache/ck-engine-v8/models/ir_hub_v8.html |
v8 run hub for scanning all cache-backed inference, bridge, probe, and viewer artifacts. |
~/.cache/ck-engine-v8/models/.../multimodal_bridge/bridge_report.json |
Final bridge status, prompt accounting, prefix grid, and generated text. |
~/.cache/ck-engine-v8/models/.../multimodal_bridge/encoder/ |
Encoder-side lowered IR, compiled runtime, and bridge artifacts. |
~/.cache/ck-engine-v8/models/.../multimodal_bridge/decoder/ |
Decoder lowered IR, generated C, compiled shared library, and decode bridge artifacts. |
# Generate or refresh a v8 IR visualizer report for one run.
.venv/bin/python version/v8/tools/open_ir_visualizer_v8.py \
--generate --run "$RUN" --html-only --strict-run-artifacts \
--output "$RUN/ir_report.html"
# Refresh the v8 run hub.
.venv/bin/python version/v8/tools/open_ir_hub_v8.py \
--models-root "${CK_CACHE_DIR:-$HOME/.cache/ck-engine-v8/models}" \
--output "${CK_CACHE_DIR:-$HOME/.cache/ck-engine-v8/models}/ir_hub_v8.html"
# List local v8 runtimes.
./build/ck-cli-v8 --list
Visualizer And Hub Gates
Use these gates when changing v8 visualizer tabs, embedded JSON, run-hub discovery, dataset viewer contracts, or multimodal bridge artifacts. They are intentionally fast enough to run locally before a PR.
# Source-level tab/function/DOM contracts plus pure JS utility checks. make v8-visualizer-health # Generate and validate ir_report.html, dataset_viewer.html, and ir_hub_v8.html. make v8-visualizer-generated-e2e # Validate encoder + bridge + decoder visualizer rendering for a synthetic vision run. make v8-visualizer-vision-artifacts
v8 owns the certified FP32 starter's training/backprop report and continues to own inference and multimodal observability. v7 remains the reference for the broader training visualizer, interactive builder, SVG workload, and training circuit matrix until each path has v8 evidence.
Troubleshooting
- If you omit
--image-path, the bridge uses a synthetic image path. That is useful for seam probes, not for validating real-image captioning. - If the bridge report is missing, check disk space first. The first compile path writes large intermediate artifacts.
- If output starts echoing raw chat markers or thinking-control strings, keep
--chat-template autoand do not force a manual template override on this model. - If captions are incoherent again, verify that the decoder GGUF and mmproj GGUF are the matching Qwen3-VL pair.
Support Statement
The tested Qwen3-VL artifact pair works in
v8 for end-to-end multimodal inference bring-up. That does not automatically extend to unrelated model families or future multimodal templates that need kernels the engine does not have yet.