ILLATIO ECOSYSTEM // SPARSE MOE INFERENCE INFRASTRUCTURE GUILD CORE 140F6F7
Guild Docs.
Menu
GitHub
Performance archive / 140f6f7

Repository source · complete snapshot

View docs/performance/PHASE66_ADAPTIVE_SPECULATIVE_DECODING.md at 140f6f7 ↗
SHA-256 0273330ee5d7e744456d724e3c1e04ba4f9181d12c583054d08ebdf4625ff0e6

Historical source report. This is the complete pinned document, including its original validation claims. Successful full CUDA CTest, sanitizer, sampling, and concurrent-session reruns for Phase 6.6.1 are not independently established by the available website evidence. Read the measurement limitations before quoting results.
On this page

Phase 6.6: Adaptive Speculative Decoding, Draft-Free Prediction, and Cost-Aware Inference

Date: October 21, 2026
Baseline Commit: afcdd1d (Phase 6.5 complete)
Target Models:

  • Ornith 1.5 35B (qwen35moe): /mnt/models-ssd/Strata-data/gpacks/ornith-1.5-35b-ext.gpack (256 routed experts/layer, top-8, 40 layers, no MTP weights)
  • Qwen3.8-Flash-Next (qwen4_exp): /mnt/models-ssd/Strata-data/gpacks/qwen3.8-flash-next-ext.gpack (512 routed experts/layer, top-10, 48 layers, GPU MTP draft layer in /mnt/models-ssd/Strata-data/mtp/rt)

1. Executive Summary

Phase 6.6 designs, implements, validates, and benchmarks an adaptive, cost-aware speculative decoding system across Guild’s hybrid GPU+CPU Mixture-of-Experts (MoE) inference pipeline. Rather than maximizing draft acceptance rate or draft depth in isolation, the runtime scheduler explicitly minimizes expected wall-clock milliseconds per committed target-model output token:

C(s,k)=E[iteration wall-clock time (ms)]E[committed output tokens]C(s, k) = \frac{\mathbb{E}[\text{iteration wall-clock time (ms)}]}{\mathbb{E}[\text{committed output tokens}]}

where iteration wall-clock time includes drafting/lookup/retrieval latency, target-model MoE verification across window size T=1+kT = 1 + k, GPU-CPU synchronization, and KV/GDN/QSA commit or rollback, and committed output tokens count actual target-model tokens emitted (accepted draft prefix+1\text{accepted draft prefix} + 1 target/bonus token).

Headline Measured Outcomes (2× Xeon Gold 6130 + GTX 1070 8 GiB, GEXEC Active)

  1. Ornith 1.5 35B (ornith:35b, no MTP weights — previously limited to T=1 single-token decode):

    • Unlocked multi-token speculative verification (T=1..5) for draftless Prompt-Lookup (lookup), Session-Local Retrieval (retrieval), and Cost-Aware Adaptive (adaptive) modes without requiring any draft model or extra VRAM weights.
    • Across input-grounded, structured, RAG, multi-turn, and long-context workloads (W2–W6, W10), adaptive delivers 1.395x to 1.608x end-to-end decode speedups over normal decoding (50.0 →\rightarrow 80.65 tok/s on W2 summarization, 77.75 tok/s on W4 RAG, 69.79 tok/s on W5 multi-turn, and 80.03 tok/s at p=512 / 55.31 tok/s at p=32,704 populated context).
    • On partially repetitive code editing (W1) and multi-turn conversation (W5), adaptive beats both normal AND fixed lookup/retrieval (52.98 tok/s vs 50.29 normal and 50.91 lookup on W1; 69.79 tok/s vs 50.02 normal, 68.27 lookup, and 68.38 retrieval on W5) by dynamically modulating draft depth and backing off on low-confidence spans.
    • On speculation-hostile creative prose (W7) and mathematical reasoning (W8), fixed lookup regresses to 48.84 tok/s (-1.4%) and 47.91 tok/s (-4.5%), whereas adaptive automatically falls back to normal decoding (49.53 tok/s on W7, 50.01 tok/s on W8 — within 0.04%–0.28% of normal).
    • Under 2-session concurrent execution (--sessions 2), adaptive scales median decode throughput from 49.75 tok/s (normal) to 83.68 tok/s (1.682x), cutting median round wall time from 7,058.17 ms to 5,993.70 ms (-15.1%) with 100% deterministic session isolation.
  2. Qwen3.8-Flash-Next (qwen3.8-flash-next, hybrid arbitration across normal, mtp, lookup, retrieval):

    • Arbitrates dynamically between GPU MTP drafting (k=1, T=2), CPU Prompt-Lookup (k=1..4, T=2..5), Session-Local Retrieval (k=1..4), and Normal decoding (k=0, T=1).
    • On input-grounded/repetitive workloads (W2 summarization, W4 RAG, W6 boilerplate, W10 32K–65K long context), adaptive shifts from mtp (23.3–25.7 tok/s) to deep lookup (k=4), reaching 32.02–33.70 tok/s (1.746x–1.843x over normal’s 18.3 tok/s, and +31.0%–+38.3% faster than mtp alone).
    • On workloads where prompt-lookup fails or regresses (W1 code editing where lookup drops to 17.85 tok/s; W7 creative prose where lookup drops to 17.88 tok/s; W8 math reasoning where lookup drops by -13.8% to 15.91 tok/s), adaptive selects mtp and achieves 25.39 tok/s (W1), 22.15 tok/s (W7), and 24.31 tok/s (W8, +52.8% faster than fixed lookup and +31.7% faster than normal).
    • On W5 multi-turn conversation and W10 16,384-token populated context, adaptive beats every fixed strategy (normal, mtp, lookup, retrieval) by combining MTP on novel transitions with Lookup/Retrieval on repeated spans (23.38 tok/s on W5 vs 18.37 normal, 20.58 lookup, 19.97 retrieval, 22.87 mtp; 24.50 tok/s at p=16,384 vs 17.92 normal, 20.44 lookup, 23.94 mtp).
    • At 65,472 populated context tokens (65K), adaptive achieves 31.78 tok/s (31.47 ms/tok) vs 17.49 tok/s (normal) and 24.20 tok/s (mtp) — a 1.817x decode speedup at 65K context.
  3. 100% Exact Greedy & Target-Distribution Sampling Parity:

    • Fixed a subtle #152 reduction-order gate in src/kernels/cpu/gexec_expert.cpp (gexec_iq4nl_down_rows, iq256_row_dot_1row, gexec_iq4xs_gu_rows_nt) so GEXEC’s AVX-512/AVX2 CPU expert providers honor GUILD_IQ_MT_MIN=1 for nt == 1, achieving 100% bit-for-bit token ID parity across normal, mtp, lookup, retrieval, and adaptive on every workload (W1–W10) on both Ornith 35B and Qwen3.8-Flash-Next.
    • Verified 100% bitwise seed-invariant sampling parity under non-greedy sampling (temperature=0.7, top_p=0.9, min_p=0.05, top_k=40, seed=12345) on real model execution and 25,000-token Monte Carlo distributional tests (TVD < 0.01, zero mass outside top_k/top_p/min_p support).

2. External Research & Systems Survey (Through October 2026)

Technique / SystemCore MechanismApplicability to Guild’s Hybrid GPU+CPU MoE Runtime
Prompt Lookup Decoding (PLD) (Saxena, 2023; vLLM ngram / SGLang lookahead, 2024–2026)Matches suffix n-grams of the current sequence against earlier positions in the prompt and generated output; proposes verbatim continuation tokens with zero model weights.Directly adopted & enhanced (SuffixDrafter). Costs < 0.005 ms on CPU, requires 0 B of VRAM, and unlocks speculative decoding on models without MTP weights (Ornith 35B) as well as deeper windows (k=4k=4) on Qwen3.8-Flash-Next.
REST: Retrieval-Based Speculative Decoding (He et al., NAACL 2024)Retrieves continuations from a token datastore using suffix matches and ranks multiple candidate continuations by length- and frequency-weighted voting.Adapted with strict per-session isolation (RetrievalDrafter). Rather than a global unverified external corpus, Guild maintains a bounded, strictly session-local two-tier token datastore (corpus_ + stream_) with length-squared ×\times recency continuation voting and confidence truncation.
Native Multi-Token Prediction (MTP) / EAGLE-2 / EAGLE-3 (DeepSeek-V3, Qwen3/Qwen4_exp, Li et al. 2024–2026)Uses a lightweight learned draft head/layer conditioned on the target model’s top-layer hidden state RpR_p and token embedding ep+1e_{p+1}, dynamically truncating drafts via confidence thresholds.Integrated via MtpDrafter + AdaptiveDecodeScheduler. On Qwen3.8-Flash-Next, MTP provides 75%–93% step-1 acceptance on novel prose/math where n-gram lookup has zero matches, while MtpDrafter::prefill (step_row0 == -1) keeps MTP’s KV cache synchronized in ~0.35 ms whenever Lookup, Retrieval, or Normal is selected.
MoE-Aware Speculative Verification & Offloaded MoE Cost Modeling (MoE-Spec, SpecExec, Expert-Budgeted Verification, 2025–2026)Recognizes that in sparse MoE models with CPU-resident or offloaded experts, verification time V(T)V(T) is not constant in TT: distinct activated experts per layer grow as U(T)≈E(1−(1−K/E)Teff)U(T) \approx E(1 - (1 - K/E)^{T_{\text{eff}}}), increasing CPU expert dispatch bandwidth.Central pillar of Guild’s AdaptiveDecodeScheduler & GEXEC calibration. On Guild’s dual-socket Xeon + GTX 1070 host, V(2)/V(1)≈1.38×V(2)/V(1) \approx 1.38\times on Ornith (256 experts, K=8) and ≈1.48×\approx 1.48\times on Qwen (512 experts, K=10). A draft depth kk only reduces ms/token when E[A+1]>(D(s,k)+V(1+k))/V(1)\mathbb{E}[A + 1] > (D(s, k) + V(1+k)) / V(1).

3. Phase 6.6 Architecture & Implementation

3.1 Upgraded Prompt-Lookup Drafter (include/guild/spec/suffix_drafter.hpp, src/spec/suffix_drafter.cpp)

  • Multi-Length Anchors & Bounded Probing: Indexes 3-gram anchors (plus 2-gram anchors with distinct hash tag bits when min_match == 2) in a power-of-two open-addressing table with WAYS = 4 positions per slot, bounded linear probing (kMaxProbe = 16), and oldest-position LRU slot eviction on probe saturation.
  • Frequency- & Recency-Aware Continuation Ranking: Extends candidate matches backwards up to max_match (64 tokens) and ranks equal-length matches by continuation token agreement frequency (last_freq()) first, breaking ties by recency.
  • Sliding-Window Compaction: Enforces set_max_history(spec_lookup_window) via automatic half-window compaction and re-indexing so memory stays strictly bounded (~16.8 MiB for a 65,536-token window) across arbitrarily long sessions.

3.2 Session-Local Retrieval Drafter (include/guild/spec/retrieval_drafter.hpp, src/spec/retrieval_drafter.cpp)

  • Two-Tier Session-Local Datastore:
    1. corpus_: session-local persistent token store across turns or explicitly ingested reference documents (GuildSession::ingest_retrieval_tokens, clear_retrieval_corpus), bounded by max_corpus_tokens.
    2. stream_: active request prompt + committed output tokens, reset at the start of each generation (reset_stream()).
  • REST-Style Length-Weighted Continuation Voting: Gathers up to kMaxCandidates = 16 deduplicated matching spans across 4-gram and 3-gram anchors from both stream_ and corpus_, weights each span cc by: wc=(match_lenc)2⋅source_boostc⋅11+0.08 rankcw_c = (\text{match\_len}_c)^2 \cdot \text{source\_boost}_c \cdot \frac{1}{1 + 0.08\,\text{rank}_c} and votes at each continuation step j∈[0,k−1]j \in [0, k-1], pruning diverging spans and stopping early if continuation confidence wbest/∑wc<min_confidencew_{\text{best}} / \sum w_c < \text{min\_confidence}.
  • Strict Session Isolation: Owned exclusively by GuildSession::Impl under spec_mutex; never shared across sessions or global state.

3.3 Cost-Aware Adaptive Decoding Scheduler (include/guild/spec/adaptive_scheduler.hpp, src/spec/adaptive_scheduler.cpp)

  • Objective Function: At every safe verification boundary, evaluates candidate pairs (s,k)(s, k) across Normal(0), Mtp(1..mtp_cap_k), Lookup(1..max_draft), and Retrieval(1..max_draft) using: Cmodel(s,k)=D^(s,k)+V^(1+k)+I[MTP catch-up] M^catchupE[As,k+1]C_{\text{model}}(s, k) = \frac{\hat{D}(s, k) + \hat{V}(1 + k) + \mathbb{I}[\text{MTP catch-up}]\,\hat{M}_{\text{catchup}}}{\mathbb{E}[A_{s,k} + 1]} blended with the strategy’s decayed empirical cumulative wall-clock time-to-output ratio C^emp(s)=∑γiΔti∑γiΔni\hat{C}_{\text{emp}}(s) = \frac{\sum \gamma^i \Delta t_i}{\sum \gamma^i \Delta n_i} whenever empirical cost exceeds the analytical acceptance model.
  • Live T=1T=1 Seeding & Graph-Capture Subtraction: In GuildSession::generate (src/runtime/session.cpp), one-time CUDA graph capture time (m_impl->ver->ms_capture delta) is subtracted from verification observations so graph compilation never pollutes steady-state cost estimates, and the initial T=1T=1 TTFT window seeds ver_decayed_ms_[1] directly for the current prompt’s exact KV context length.
  • Conservative Short-Match Prior & Hysteresis:
    • Uses a conservative prior (q = 0.32) for isolated 3-gram matches (match_len == 3, freq == 1) so accidental 3-token function-word overlaps in creative prose or math (W7, W8) do not trigger unprofitable verification windows, while immediately boosting repeated 3-grams (freq >= 2) and longer matches (match_len >= 4, q = 0.78..0.95).
    • Requires a 5% (hysteresis_margin = 0.05) expected ms/token improvement and min_dwell_steps = 3 before switching strategies, with immediate backoff after 2 consecutive zero-acceptance windows.
  • MTP Confidence EMA & Cap Separation: Tracks mtp_prob_ema in Adaptive mode so a single uncertain token (dprob[0] < spec_min_p) falls back for that window without latching MTP off for the rest of the sequence, and bounds MTP draft steps by mtp_cap_k while allowing Lookup/Retrieval to propose up to spec_max_draft.

3.4 Target-Distribution-Preserving Speculative Sampling Verification

  • Guild’s Verifier::run (src/core/verify.cpp) evaluates the exact target sampling chain (repetition/frequency/presence penalties →\rightarrow top_k →\rightarrow top_p →\rightarrow min_p →\rightarrow temperature) at every window row t∈[0,T−1]t \in [0, T-1], drawing uniform variates from position-indexed Philox(seed, pos0 + t).
  • For deterministic proposals (Lookup and Retrieval), accepting draft prefix d0…da−1d_0 \dots d_{a-1} iff dt=Ypos0+td_t = Y_{\text{pos0}+t} and emitting Ypos0+aY_{\text{pos0}+a} produces the exact same token sequence (bitwise identical for any fixed seed) as single-token Normal sampling because every committed position qq emits Yq=FPtarget(⋅∣x≤q)−1(Philox(seed,q))Y_q = F^{-1}_{P_{\text{target}}(\cdot \mid x_{\le q})}(\text{Philox}(\text{seed}, q)).
  • In GuildSession::generate, PenaltyHistoryGuard stages per-row penalty histories via kernels::penalty_rows across the window so repetition/frequency/presence penalties are also exact across all TT rows.

3.5 GEXEC Speculative Cost Calibration (include/guild/gexec/gexec_contract.hpp, src/gexec/gexec_optimizer.cpp)

  • Extended GExecHeterogeneousPlan with hardware-calibrated speculative fields (spec_calibrated, verify_window_ms[1..8], verify_cpu_expert_ms[1..8], distinct_expert_ratio[1..8], mtp_draft_step_ms, mtp_kv_catchup_ms, lookup_draft_ms, retrieval_draft_ms, kv_commit_ms) protected by the section’s SHA-256 integrity digest.
  • During guild optimize (Pass 4), calibrate_speculative_costs microbenchmarks SuffixDrafter::propose and RetrievalDrafter::propose on the host CPU and computes the MoE multi-token verification cost curve V(1..8)V(1..8) and distinct expert expansion ratio U(T)/U(1)U(T)/U(1) from the Pass 3 tuned CPU expert decode latency and model MoE geometry.
  • guild inspect <artifact.gexec> --plan displays the calibrated Verify T=1..4, Distinct Experts, and Lookup / Retr timings.

4. Hardware, Software & Artifact Provenance

  • Primary Host Hardware: Dual-socket Intel Xeon Gold 6130 (32 physical cores / 64 logical threads, Skylake-SP, AVX-512BW/DQ/VL, 2 NUMA nodes, 376 GiB DDR4 RAM) + NVIDIA GeForce GTX 1070 (8 GiB GDDR5, Pascal sm_61, CUDA 12.8, driver 570.124.06).
  • Secondary Workstation Target (Ryzen 5 5600X + RTX 5070): Pending hardware access; no numbers are fabricated or extrapolated for unavailable hardware.
  • Artifact SHA-256 Digests:
    • /mnt/models-ssd/Strata-data/gpacks/ornith-1.5-35b-ext.gpack: ac41e2e04d14949e998f6aade627de034b013b1f1d4670329f2e1e5efd67acdf (manifest SHA-256: b7631598f1cc21bbaf0e0e73844ed86d4cc90a9027823b03d0172438cb86e0ea)
    • /mnt/models-ssd/Strata-data/gpacks/qwen3.8-flash-next-ext.gpack: 93f3fcd86786870c487ee72b8dbd362973bdd71c1b0d94bdad6ee689b98856e5 (manifest SHA-256: 62eca78bdc5544191166276cfea50cfa58f150ff9d00a3498cb633c20b91c146)
    • build-cuda12/phase66/gexec/ornith-65k-s0.gexec: cache key bcddd79ec7030fe4... (cpu.expert_pool.gexec_fused_avx512, spec_calibrated = true)
    • build-cuda12/phase66/gexec/qwen-65k-s0.gexec: cache key 4fd75c92366672d5... (cpu.expert_pool.gexec_fused_avx512, spec_calibrated = true)
    • build-cuda12/phase66/gexec/qwen-65k-s2.gexec: cache key 1950047812444efd... (cpu.expert_pool.gexec_fused_avx512, spec_calibrated = true)

5. Measured Benchmark Results

5.1 Ornith 1.5 35B (ornith:35b) — 10 Workload Categories (W1–W10)

All runs executed with --gexec build-cuda12/phase66/gexec/ornith-65k-s0.gexec (gexec_active: true), --pcie-frac 0, --spec-max-draft 4, and verified for 100% bit-for-bit greedy token ID parity against normal.

Workload CategoryPrompt / GenStrategyDecode Time (ms)Decode (tok/s)Cost (ms/tok)Speedup vs NormalVerify WindowsDrafts Off / AccAcc RateSwitches / FallbacksFinal Strategy
W1: Code Editing / Patching256 / 128normal2545.1150.2919.881.000x1280 / 00.0%0 / 0normal
256 / 128lookup2514.0950.9119.641.012x8679 / 4253.2%21 / 10lookup
256 / 128adaptive2416.0452.9818.881.053x10134 / 2779.4%11 / 5lookup
W2: Document Summarization256 / 128normal2551.8450.1619.941.000x1280 / 00.0%0 / 0normal
256 / 128lookup1562.4081.9312.211.633x27104 / 10197.1%0 / 0lookup
256 / 128adaptive1587.0180.6512.401.608x28101 / 10099.0%0 / 0lookup
W3: JSON Schema Output256 / 128normal2557.2750.0519.981.000x1280 / 00.0%0 / 0normal
256 / 128lookup1665.2176.8713.011.536x31104 / 9793.3%3 / 1lookup
256 / 128adaptive1694.4075.5413.241.509x3498 / 9495.9%3 / 1lookup
W4: RAG Grounded Q&A256 / 128normal2563.8349.9320.031.000x1280 / 00.0%0 / 0normal
(+ session corpus)256 / 128lookup1554.8682.3212.151.649x29100 / 9999.0%2 / 1lookup
256 / 128retrieval1552.8682.4312.131.651x29100 / 9999.0%2 / 1retrieval
256 / 128adaptive1646.3277.7512.861.557x31101 / 9796.0%2 / 1retrieval
W5: Multi-Turn Conversation128 / 128normal2559.0350.0219.991.000x1280 / 00.0%0 / 0normal
(+ Turn 1 in session corpus)128 / 128lookup1875.0068.2714.651.365x40107 / 8882.2%9 / 4lookup
128 / 128retrieval1871.8668.3814.621.367x40107 / 8882.2%9 / 4retrieval
128 / 128adaptive1834.0469.7914.331.395x4786 / 8194.2%9 / 4retrieval
W6: Repetitive Boilerplate256 / 128normal2555.9450.0819.971.000x1280 / 00.0%0 / 0normal
256 / 128lookup1662.5876.9912.991.537x3494 / 94100.0%6 / 3lookup
256 / 128adaptive1725.4274.1813.481.481x4189 / 8797.8%6 / 3lookup
W7: Creative Novel Prose256 / 128normal2583.1049.5520.181.000x1280 / 00.0%0 / 0normal
(speculation-hostile)256 / 128lookup2620.7848.8420.470.986x1278 / 112.5%4 / 2normal
256 / 128adaptive2584.4949.5320.191.000x1282 / 00.0%2 / 1normal
W8: Mathematical Reasoning256 / 128normal2552.5250.1519.941.000x1280 / 00.0%0 / 0normal
(speculation-hostile)256 / 128lookup2671.7147.9120.870.955x9873 / 3041.1%29 / 14lookup
256 / 128adaptive2559.3350.0119.990.997x11424 / 1458.3%18 / 9normal
W9: Short Interactive Chat64 / 64normal1284.2749.8320.071.000x640 / 00.0%0 / 0normal
64 / 64lookup1365.7846.8621.340.940x6016 / 425.0%8 / 4normal
64 / 64adaptive1339.3047.7920.930.959x626 / 233.3%4 / 2normal

5.2 Ornith 1.5 35B (ornith:35b) — W10 Populated-Context Scaling (512 to 32,704 Tokens)

Populated ContextStrategyDecode Time (ms)Decode (tok/s)Cost (ms/tok)Speedup vs NormalVerify WindowsDrafts Off / AccAcc RateParity
512normal1279.3050.0319.991.000x640 / 00.0%Exact
lookup802.5179.7512.541.594x1450 / 50100.0%Exact
adaptive799.7280.0312.501.600x1450 / 50100.0%Exact
4,096normal1331.4648.0720.801.000x640 / 00.0%Exact
lookup854.8574.8713.361.558x1450 / 50100.0%Exact
adaptive857.3374.6513.401.553x1450 / 50100.0%Exact
8,192normal1391.8045.9821.751.000x640 / 00.0%Exact
lookup899.7971.1314.061.547x1450 / 50100.0%Exact
adaptive900.2271.0914.071.546x1450 / 50100.0%Exact
16,384normal1494.6642.8223.351.000x640 / 00.0%Exact
lookup987.0264.8415.421.514x1450 / 50100.0%Exact
adaptive986.8064.8615.421.515x1450 / 50100.0%Exact
32,704normal1739.2836.8027.181.000x640 / 00.0%Exact
lookup1155.2455.4018.051.506x1450 / 50100.0%Exact
adaptive1157.0355.3118.081.503x1450 / 50100.0%Exact

5.3 Qwen3.8-Flash-Next (qwen3.8-flash-next) — Workloads W1–W9 across normal, mtp, lookup, retrieval, adaptive

All runs executed with GUILD_IQ_MT_MIN=1, --gexec qwen-65k-s0.gexec / qwen-65k-s2.gexec (gexec_active: true), and verified for 100% bit-for-bit greedy token ID parity across all strategies.

Workload CategoryPrompt / GenStrategyDecode Time (ms)Decode (tok/s)Cost (ms/tok)Speedup vs NormalVerify WindowsDrafts Off / AccAcc RateWindows (MTP / Lkp / Ret)Final Strategy
W1: Code Editing / Patching256 / 64normal3474.9718.4254.301.000x640 / 00.0%0 / 0 / 0normal
256 / 64mtp2518.2925.4139.351.380x3433 / 3090.9%33 / 0 / 0mtp
256 / 64lookup3586.2517.8556.040.969x5724 / 729.2%0 / 7 / 0lookup
256 / 64adaptive2520.7025.3939.391.379x3433 / 3090.9%33 / 0 / 0mtp
W2: Document Summarization256 / 64normal3499.7818.2954.681.000x640 / 00.0%0 / 0 / 0normal
256 / 64mtp2488.6825.7238.891.406x3331 / 31100.0%32 / 0 / 0mtp
256 / 64lookup1856.4034.4829.011.885x1450 / 50100.0%0 / 13 / 0lookup
256 / 64adaptive1899.0633.7029.671.843x1450 / 50100.0%0 / 13 / 0lookup
W3: JSON Schema Output256 / 64normal3474.7418.4254.291.000x640 / 00.0%0 / 0 / 0normal
256 / 64mtp2734.8723.4042.731.270x3931 / 2580.6%32 / 0 / 0mtp
256 / 64lookup3678.9517.4057.480.945x649 / 00.0%0 / 4 / 0lookup
256 / 64adaptive2955.1121.6646.171.176x4721 / 1781.0%21 / 1 / 0lookup
W4: RAG Grounded Q&A256 / 64normal3490.1518.3454.531.000x640 / 00.0%0 / 0 / 0normal
(+ session corpus)256 / 64mtp2647.2824.1841.361.318x3630 / 2893.3%31 / 0 / 0mtp
256 / 64lookup1944.2232.9230.381.795x1748 / 4797.9%0 / 13 / 0lookup
256 / 64retrieval1946.0932.8930.411.793x1748 / 4797.9%0 / 0 / 13retrieval
256 / 64adaptive1998.6732.0231.231.746x1750 / 4794.0%2 / 13 / 0lookup
W5: Multi-Turn Conversation128 / 64normal3484.7618.3754.451.000x640 / 00.0%0 / 0 / 0normal
(+ Turn 1 in session corpus)128 / 64mtp2798.2822.8743.721.245x4126 / 2388.5%27 / 0 / 0mtp
128 / 64lookup3110.0220.5848.591.120x4530 / 1963.3%0 / 8 / 0lookup
128 / 64retrieval3204.4419.9750.071.087x4534 / 1955.9%0 / 0 / 9retrieval
128 / 64adaptive2737.6423.3842.781.273x3635 / 2880.0%18 / 5 / 1lookup
W6: Repetitive Boilerplate256 / 64normal3493.5718.3254.591.000x640 / 00.0%0 / 0 / 0normal
256 / 64mtp2544.2525.1539.751.373x3430 / 30100.0%31 / 0 / 0mtp
256 / 64lookup1917.9133.3729.971.822x1648 / 48100.0%0 / 12 / 0lookup
256 / 64adaptive1920.5833.3230.011.819x1648 / 48100.0%3 / 12 / 0lookup
W7: Creative Novel Prose256 / 64normal3467.6318.4654.181.000x640 / 00.0%0 / 0 / 0normal
(hostile to lookup)256 / 64mtp2855.5922.4144.621.214x4130 / 2376.7%31 / 0 / 0mtp
256 / 64lookup3579.5117.8855.930.969x644 / 00.0%0 / 1 / 0normal
256 / 64adaptive2889.4722.1545.151.200x4229 / 2275.9%30 / 0 / 0mtp
W8: Mathematical Reasoning256 / 64normal3466.6918.4654.171.000x640 / 00.0%0 / 0 / 0normal
(hostile to lookup)256 / 64mtp2675.6723.9241.811.296x3732 / 2784.4%32 / 0 / 0mtp
256 / 64lookup4021.7915.9162.840.862x6136 / 38.3%0 / 9 / 0normal
256 / 64adaptive2632.2524.3141.131.317x3730 / 2790.0%30 / 0 / 0mtp
W9: Short Interactive Chat64 / 64normal3475.4618.4154.301.000x640 / 00.0%0 / 0 / 0normal
64 / 64mtp2750.5323.2742.981.264x3931 / 2580.6%31 / 0 / 0mtp
64 / 64lookup3463.8118.4854.121.003x5912 / 541.7%0 / 3 / 0normal
64 / 64adaptive3438.9118.6153.731.011x616 / 350.0%2 / 4 / 0normal

5.4 Qwen3.8-Flash-Next (qwen3.8-flash-next) — W10 Populated-Context Scaling (512 to 65,472 Tokens)

Populated ContextStrategyDecode Time (ms)Decode (tok/s)Cost (ms/tok)Speedup vs NormalVerify WindowsDrafts Off / AccAcc RateWindows (MTP / Lkp)Parity
512normal3467.4318.4654.181.000x640 / 00.0%0 / 0Exact
mtp2751.0323.2642.981.260x3834 / 2676.5%35 / 0Exact
lookup3233.2119.7950.521.072x5512 / 975.0%0 / 3Exact
adaptive2950.3221.6946.101.175x4233 / 2266.7%23 / 4Exact
4,096normal3549.8718.0355.471.000x640 / 00.0%0 / 0Exact
mtp2780.7823.0243.451.277x3733 / 2781.8%34 / 0Exact
lookup3044.1721.0247.571.166x4328 / 2175.0%0 / 7Exact
adaptive2980.6521.4746.571.191x4229 / 2275.9%4 / 7Exact
8,192normal3555.5318.0055.561.000x640 / 00.0%0 / 0Exact
mtp2632.6124.3141.131.351x3630 / 2893.3%31 / 0Exact
lookup3460.9418.4954.081.027x598 / 562.5%0 / 2Exact
adaptive2710.8023.6142.361.312x3633 / 2884.8%30 / 1Exact
16,384normal3572.0217.9255.811.000x640 / 00.0%0 / 0Exact
mtp2673.7523.9441.781.336x3630 / 2893.3%30 / 0Exact
lookup3130.9620.4448.921.141x4721 / 1781.0%0 / 6Exact
adaptive2612.4224.5040.821.367x3139 / 3384.6%23 / 4Exact
32,768normal3619.8117.6856.561.000x640 / 00.0%0 / 0Exact
mtp2748.5423.2942.951.317x3628 / 28100.0%28 / 0Exact
lookup1992.7032.1231.141.817x1450 / 50100.0%0 / 13Exact
adaptive1987.6832.2031.061.821x1450 / 50100.0%0 / 13Exact
65,472normal3658.4817.4957.161.000x640 / 00.0%0 / 0Exact
mtp2644.8324.2041.331.383x3331 / 31100.0%31 / 0Exact
lookup2017.0531.7331.521.814x1450 / 50100.0%0 / 13Exact
adaptive2013.9431.7831.471.817x1450 / 50100.0%0 / 13Exact

6. Analysis of Negative / Neutral Cases & Non-Negotiable Acceptance Gates

  1. Why Fixed Prompt-Lookup Regresses on W7 (Creative Prose) and W8 (Mathematical Reasoning):
    • On W8 (qwen3.8-flash-next), mathematical text contains frequent 3-token structural phrases (" = 1 + ", " for real x ") that match earlier equations in the prompt, causing fixed lookup (k=4) to propose 36 draft tokens across 9 four-token verification windows (T=5), of which only 3 tokens (8.3%) are accepted.
    • Because each T=5 window on Qwen3.8-Flash-Next activates ~3.32x as many distinct CPU experts per layer as T=1, those 9 failed T=5 windows cost +555 ms of wasted CPU MoE verification, dropping throughput from 18.46 tok/s (normal) to 15.91 tok/s (-13.8% regression).
    • Similarly, on Ornith 35B W8, fixed lookup (k=4) accepts only 41.1% (30 / 73), dropping throughput from 50.15 tok/s (normal) to 47.91 tok/s (-4.5% regression).
  2. How AdaptiveDecodeScheduler Eliminates Those Regressions:
    • On Ornith 35B (W7 and W8, where no MTP layer exists), adaptive ignores isolated single-occurrence 3-grams (kPriorLookupQ[0] = 0.32), limits initial probes on longer matches, and backs off to normal after 2 consecutive rejections (fallback_to_normal_count), finishing W7 at 49.53 tok/s (vs 49.55 tok/s normal) and W8 at 50.01 tok/s (vs 50.15 tok/s normal).
    • On Qwen3.8-Flash-Next (W7 and W8, where MTP is available), adaptive evaluates C(Mtp,1)≈41.1 ms/tokC(\text{Mtp}, 1) \approx 41.1\text{ ms/tok} against C(Lookup)C(\text{Lookup}) and C(Normal)≈54.2 ms/tokC(\text{Normal}) \approx 54.2\text{ ms/tok}, selecting Mtp for 30 windows (0 Lookup windows) and achieving 22.15 tok/s (+20.0% over normal) on W7 and 24.31 tok/s (+31.7% over normal, +52.8% over fixed lookup) on W8.

7. Verification Gates & Remaining Limitations

  • CPU Build & CTest (build-cpu): 33 / 33 tests passed (100%).
  • CUDA Build & CTest (build-cuda12): 97 / 97 runnable tests with present fixtures passed (0 regressions; adaptive_scheduler_test, suffix_drafter_test, controller_test, draft_policy_test, coupled_draft_test, gexec_contract_test, gexec_optimizer_test, ornith_step_test, ornith_prefill_test all passed).
  • Sanitizers:
    • build-asan (-fsanitize=address,undefined): 0 first-party errors across all Phase 6.6 test binaries.
    • build-tsan (-fsanitize=thread): 0 data races across all Phase 6.6 test binaries (including 4-thread concurrent RetrievalDrafter session isolation stress tests).
  • Remaining Limitations:
    • Secondary workstation validation (AMD Ryzen 5 5600X + NVIDIA RTX 5070) remains pending physical hardware access.
    • On Qwen3.8-Flash-Next, exact bit-for-bit greedy parity across different verification window sizes (T=1T=1 vs T≥2T \ge 2) requires GUILD_IQ_MT_MIN=1 so IQ3_S/IQ2_S/IQ4_NL CPU expert kernels use the same SIMD reduction tree at nt == 1 and nt >= 2.

8. Phase 6.6.1: Hardware-Calibrated Adaptive Decode Optimization

Following Phase 6.6 (ed7a5db), we executed a focused, measurement-driven optimization pass on the adaptive decoding scheduler, GEXEC hardware calibration, and MTP catch-up path.

8.1 Audit of Performance-Sensitive Constants & Heuristics

Every parameter in AdaptiveDecodeScheduler, SuffixDrafter, RetrievalDrafter, GExecSpecCalibration, and GuildSession::generate was audited and classified into:

  • A: Correctness, ABI, or bounded-O(1)O(1) memory/latency safety invariant.
  • B: Explicit user-configurable policy.
  • C: Hardware-dependent performance estimate (measured in guild optimize and refined online).
  • D: Workload-dependent statistical estimate (learned online per session via Beta-Binomial posteriors).
  • E: Unnecessary or poorly justified heuristic (replaced or eliminated).
Parameter / ConstantPhase 6.6 ValueCategoryPhase 6.6.1 Treatment & Justification
kVerifyMaxT = 8, kMaxDraft = 78 / 7ARetained: Fixed CUDA graph and device verification buffer capacity bound.
SuffixDrafter::WAYS = 4, RetrievalDrafter::WAYS = 8, kMaxProbe = 16, kMaxCandidates = 164, 8, 16, 16ARetained: Guarantees zero heap allocations and O(1)O(1) worst-case lookup latency (< 0.005 ms) on the token path.
mode, max_draft, spec_lookup_window, spec_cost_window, mtp_min_probCLI defaultsBRetained: Explicit CLI and per-request user controls (--decode-strategy, --spec-max-draft, etc.).
verify_window_ms[1..8], verify_cpu_expert_ms[1..8]Analytic formula with fixed 0.22 nt=2 multiplier and pool_nt=2 inflation when --spec 2CMeasured in guild optimize + decomposed online: calibrate_speculative_costs now benchmarks the host ExpertPool on the model’s real expert layer at nt=1, nt=2 (alpha_nt2), and 2 * k_active (pool_2k_scale). At runtime, seed_single_token_verify(verify_ms, experts, cpu_expert_ms) measures the live CPU-vs-GPU verification split (live_cpu_fraction_) on window 0.
concurrency_slopeFixed 0.15 per extra sessionCMeasured in guild optimize: Derived from measured ExpertPool oversubscription (2 * k_active vs k_active task dispatch latency) and persisted in .gexec (+2.0% per extra session on 32C Xeon).
hysteresis_margin = 0.05Fixed 5%C / DCalibrated from hardware timing noise CV: guild optimize records IQR/median dispersion verify_noise_cv in .gexec, and AdaptiveDecodeScheduler updates online_verify_cv_ from live verification residuals (effective_hysteresis_margin = clamp(1.25 * online_verify_cv_, 0.018, 0.10)).
rej_penalty = std::pow(0.68, rej) and reexplore_interval = 24Fixed 0.68^rej and 24-step exileEReplaced with sample-size-aware Beta-Binomial posterior: Tracks decayed successes SiS_i and trials NiN_i with virtual failure weight 0.55 r(r+1)0.55\,r(r+1) in the denominator (p^i=Si/(Ni+0.55 r(r+1))\hat{p}_i = S_i / (N_i + 0.55\,r(r+1))). Cold-start drafters (N0≈3N_0 \approx 3) back off after 2 misses, while established high-acceptance drafters (N0≈20N_0 \approx 20, e.g. Qwen W3 at 80.6%) survive normal Bernoulli misses without 24-step exile.
Coarse 4-bucket lookup table (match_bucket)Ignored candidate agreement ratio freq / candidatesD / EUpgraded to continuous match-length + consensus-prefix scoring: SuffixDrafter now computes last_candidates() (among equal-length peers cand_len[j] == best_len) and last_consensus_k(), flagging variable counter slots (3/3 divergent continuations   ⟹  consensus_k=0\implies \text{consensus\_k} = 0) while immediately boosting unanimous template spans (freq >= 2, agreement == 1.0).
MtpDrafter::prefill E-4 branch on decode catch-up (n <= max_t_)Entered multi-group heap std::vector + cudaFree/cudaMalloc path for n = 1..5EEliminated for n <= max_t_: Changed gate in src/core/mtp.cpp to if (!per_group_sync && n > max_t_) so decode-time MTP KV catch-up uses the zero-allocation mapped-memory graph prefill_exec_[T] and excludes one-time graph capture from ms_prefill.

8.2 Root-Cause Resolution of Targeted Phase 6.6 Gaps

  1. Qwen W3 (JSON Schema): 21.66 tok/s (Phase 6.6) →\rightarrow 23.52 tok/s (Phase 6.6.1), matching/beating Fixed MTP (23.43 tok/s):
    • Root Cause: In Phase 6.6, MTP achieved 80.6% (25/31) acceptance on W3, but hit two consecutive Bernoulli rejections mid-stream (which occurs with probability 1−(1−0.1942)31=69.5%1 - (1 - 0.194^2)^{31} = 69.5\% over 32 windows). Multiplying by 0.68^2 = 0.46 and enforcing reexplore_interval = 24 locked Adaptive in Normal for 25 windows (+220 ms).
    • Fix: Sample-size-aware Beta-Binomial posterior (mtp_succ_[0] / (mtp_trials_[0] + 0.55 * r * (r + 1))) + SuffixDrafter counter-slot consensus filtering (last_consensus_k() == 0 after {"record_id": ). Adaptive now executes all 32 MTP windows (0 wasted Lookup windows), improving throughput from 21.66 tok/s (46.17 ms/tok) to 23.52 tok/s (42.52 ms/tok, +8.6%).
  2. Qwen W2 (Summarization) & W4 (RAG Q&A):
    • Root Cause: During Lookup(k=4) windows (a + 1 = 5), MtpDrafter::prefill entered the multi-group prompt-prefill path (n > 0), allocating a heap std::vector, reallocating pf_dev_ via cudaFree/cudaMalloc, and capturing prefill_dev_exec_[5] inside the timed decode loop.
    • Fix: Routing n <= max_t_ to the mapped-memory prefill_exec_[T] graph in src/core/mtp.cpp improved Qwen W2 Adaptive from 33.70 tok/s to 34.16–34.49 tok/s and Qwen W4 Adaptive from 32.02 tok/s to 32.15–32.37 tok/s.
  3. Qwen W9 (Short Interactive Chat p=64, g=64): 18.61 tok/s (Phase 6.6) →\rightarrow 22.07 tok/s (Phase 6.6.1, +18.6%):
    • Root Cause: Early misses in short interactive responses triggered the 24-step Normal lock before g=64 completed.
    • Fix: Scaling neural MTP re-exploration as clamp(2 * r, 2, 6) allows rapid recovery after opening-token uncertainty, lifting W9 Adaptive from 18.61 tok/s to 22.07 tok/s (45.30 ms/tok).

8.3 Controlled Phase 6.6 vs Phase 6.6.1 Benchmark Comparison

A. Ornith 1.5 35B (ornith:35b, GEXEC Calibrated — 100% Bitwise Greedy Parity)

WorkloadStrategyPhase 6.6 (tok/s)Phase 6.6.1 (tok/s)Phase 6.6.1 (ms/tok)Verify WindowsDrafts Off / AccAcc RateMean Cost Pred Err (ms/tok)Switches / Fallbacks
W1: Code Editingnormal50.2950.4019.841280 / 00.0%0.080 / 0
lookup50.9151.2819.508679 / 4253.2%3.3321 / 10
adaptive52.9853.5818.669937 / 2978.4%1.1313 / 6
W2: Summarizationnormal50.1650.2719.891280 / 00.0%0.070 / 0
lookup81.9382.1912.1727104 / 10197.1%0.850 / 0
adaptive80.6580.08–80.8412.3728100 / 100100.0%0.650 / 0
W3: JSON Schemanormal50.0550.2219.911280 / 00.0%0.090 / 0
lookup76.8777.1212.9731104 / 9793.3%2.693 / 1
adaptive75.5475.6913.213399 / 9596.0%2.053 / 1
W4: RAG Q&Anormal49.9350.1919.931280 / 00.0%0.070 / 0
lookup82.3282.6512.1029100 / 9999.0%2.102 / 1
retrieval82.4382.4712.1329100 / 9999.0%1.982 / 1
adaptive77.7577.9812.823299 / 9697.0%1.562 / 1
W5: Multi-Turnnormal50.0250.0319.991280 / 00.0%0.100 / 0
lookup68.2768.3214.6440107 / 8882.2%5.629 / 4
retrieval68.3868.3114.6440107 / 8882.2%5.759 / 4
adaptive69.7970.02–71.4314.004391 / 8593.4%2.129 / 4
W6: Boilerplatenormal50.0850.1319.951280 / 00.0%0.080 / 0
lookup76.9977.1712.963494 / 94100.0%0.556 / 3
adaptive74.1874.11–74.5013.423989 / 89100.0%0.656 / 3
W7: Creative Novelnormal49.5549.7520.101280 / 00.0%0.300 / 0
lookup48.8448.8420.481278 / 112.5%0.484 / 2
adaptive49.5349.10–49.1820.331283 / 00.0%0.314 / 2
W8: Math Reasoningnormal50.1550.2819.891280 / 00.0%0.070 / 0
lookup47.9148.1120.789873 / 3041.1%3.9629 / 14
adaptive50.0149.42–50.4119.8411029 / 1862.1%1.3319 / 9

B. Qwen3.8-Flash-Next (qwen3.8-flash-next, GEXEC Calibrated — 100% Bitwise Greedy Parity)

WorkloadStrategyPhase 6.6 (tok/s)Phase 6.6.1 (tok/s)Phase 6.6.1 (ms/tok)Delta vs 6.6Verify WindowsDrafts Off / AccAcc RateWindows (MTP / Lkp / Ret)
W1: Code Editingnormal18.4218.4654.17+0.2%640 / 00.0%0 / 0 / 0
mtp25.4125.3039.52-0.4%3433 / 3090.9%33 / 0 / 0
lookup17.8517.7556.32-0.6%5724 / 729.2%0 / 7 / 0
adaptive25.3925.40–25.9238.58–39.37+0.0% to +2.1%3235 / 3291.4%29 / 2 / 0
W2: Summarizationnormal18.2918.4254.29+0.7%640 / 00.0%0 / 0 / 0
mtp25.7225.3739.42-1.4%3331 / 31100.0%32 / 0 / 0
lookup34.4834.4229.05-0.2%1450 / 50100.0%0 / 13 / 0
adaptive33.7034.16–34.4928.99–29.28+1.4% to +2.3%1450 / 50100.0%0 / 13 / 0
W3: JSON Schemanormal18.4218.3354.56-0.5%640 / 00.0%0 / 0 / 0
mtp23.4023.4342.68+0.1%3931 / 2580.6%32 / 0 / 0
lookup17.4017.3957.51-0.1%649 / 00.0%0 / 4 / 0
adaptive21.6623.5242.52+8.6%3931 / 2580.6%32 / 0 / 0
W4: RAG Q&Anormal18.3418.3254.58-0.1%640 / 00.0%0 / 0 / 0
mtp24.1824.0941.50-0.4%3630 / 2893.3%31 / 0 / 0
lookup32.9232.8130.48-0.3%1748 / 4797.9%0 / 13 / 0
adaptive32.0232.15–32.3730.90–31.10+0.4% to +1.1%1749 / 4795.9%2 / 13 / 0
W7: Creative Novelnormal18.4618.3054.66-0.9%640 / 00.0%0 / 0 / 0
mtp22.4122.4744.51+0.3%4130 / 2376.7%31 / 0 / 0
lookup17.8817.8456.05-0.2%644 / 00.0%0 / 1 / 0
adaptive22.1522.4344.58+1.3%4130 / 2376.7%31 / 0 / 0
W8: Math Reasoningnormal18.4618.4054.36-0.3%640 / 00.0%0 / 0 / 0
mtp23.9223.9441.76+0.1%3732 / 2784.4%32 / 0 / 0
lookup15.9115.8763.03-0.3%6136 / 38.3%0 / 9 / 0
adaptive24.3123.6842.23-2.6% (+49.2% vs lookup)3733 / 2781.8%31 / 1 / 0
W9: Short Chatnormal18.4118.2754.74-0.8%640 / 00.0%0 / 0 / 0
mtp23.2723.2443.03-0.1%3931 / 2580.6%31 / 0 / 0
lookup18.4818.4254.30-0.3%5912 / 541.7%0 / 3 / 0
adaptive18.6122.0745.30+18.6%4131 / 2374.2%24 / 2 / 0

8.4 Held-Out Validation Workload Suite (H1–H4, Unseen During Tuning)

To verify that Phase 6.6.1 generalizes without overfitting to W1–W10, we evaluated 4 held-out prompts (H1: SQL Migration View, H2: Linux Kernel/Daemon Syslog Extraction, H3: Deep-Space Sci-Fi Dialogue, H4: 2-Sphere Riemann Curvature Tensor Derivation):

Model & Held-Out Workloadnormal (tok/s)mtp (tok/s)lookup (tok/s)adaptive (tok/s)adaptive vs normaladaptive vs lookupNotes
Ornith H1: SQL Migration50.14—47.02 (-6.2%)51.92+3.6%+10.4%Beats both normal and lookup
Ornith H2: Syslog Extraction49.54—65.6863.86+28.9%-2.8%87.3% draft acceptance
Ornith H3: Sci-Fi Dialogue50.15—51.4850.77+1.2%-1.4%Beats normal on novel dialogue
Ornith H4: Riemann Tensor50.16—42.07 (-16.1%)47.92-4.5%+13.9%Eliminates lookup’s -16.1% crash
Qwen H1: SQL Migration18.4225.6618.3324.38+32.4%+33.0%84.2% acceptance (27 MTP + 4 Lkp)
Qwen H2: Syslog Extraction18.3623.4321.4423.24+26.6%+8.4%83.9% acceptance (13 MTP + 7 Lkp)
Qwen H3: Sci-Fi Dialogue18.4120.8218.2920.08+9.1%+9.8%Selects MTP (20 MTP, 0 Lkp)
Qwen H4: Riemann Tensor18.3824.8521.6825.99+41.4%+19.9%Beats normal, lookup, AND mtp (+4.6%)

8.5 Reproducible Calibration & Validation Instructions for the Secondary Desktop (Ryzen 5 5600X + RTX 5070)

When running on the secondary workstation (AMD Ryzen 5 5600X 6C/12T AVX2, 32 GiB DDR4 + NVIDIA RTX 5070 Founders Edition 12 GiB GDDR7, sm_120), server .gexec files are automatically rejected by GExecArtifactIdentity::validate (CpuIsaMismatch / NumaTopologyMismatch / GpuArchitectureMismatch) and regenerated locally:

# 1. Configure & build for RTX 5070 (Blackwell sm_120) + Ryzen 5 5600X (AVX2)
cmake -S . -B build -DGUILD_ENABLE_CUDA=ON -DGUILD_BUILD_TESTS=ON -DCMAKE_BUILD_TYPE=Release
cmake --build build -j12

# 2. Generate hardware-calibrated GEXEC artifacts on the desktop (measures Ryzen 5600X AVX2 ExpertPool T=1..8,
#    6-core concurrency contention slope, lookup/retrieval latency, and timing noise CV)
./build/guild optimize <path/to/model.gpack> --mode auto --context 32768 --prefill-batch 512 --spec 0 -o desktop-s0.gexec
./build/guild inspect desktop-s0.gexec --plan

# 3. Run adaptive decoding with live GPU+CPU T=1 split seeding
./build/guild run <model> --gexec desktop-s0.gexec --decode-strategy adaptive --spec-max-draft 4