<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Michał Piszczek</title>
    <description>The latest articles on DEV Community by Michał Piszczek (@pich).</description>
    <link>https://dev.to/pich</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3704641%2Fd7d42001-8818-48e1-ab86-83cd4a22e60c.jpeg</url>
      <title>DEV Community: Michał Piszczek</title>
      <link>https://dev.to/pich</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pich"/>
    <language>en</language>
    <item>
      <title>DFlash Changes What Tokens per Second Means</title>
      <dc:creator>Michał Piszczek</dc:creator>
      <pubDate>Tue, 11 Aug 2026 20:28:31 +0000</pubDate>
      <link>https://dev.to/pich/dflash-changes-what-tokens-per-second-means-4493</link>
      <guid>https://dev.to/pich/dflash-changes-what-tokens-per-second-means-4493</guid>
      <description>&lt;p&gt;I spent a night trying to fit a dense 30B model, 256K context, vision,&lt;br&gt;
and speculative decoding onto one 24 GB GPU. The fastest quant lost. The&lt;br&gt;
quant with the lowest perplexity lost too. What won was the&lt;br&gt;
configuration that made the whole system useful, not any single number&lt;br&gt;
impressive.&lt;/p&gt;

&lt;p&gt;The final setup runs Meta Muse Glimmer 30B on an NVIDIA RTX PRO 4000&lt;br&gt;
Blackwell SFF capped at 70 watts. It holds the target model, a separate&lt;br&gt;
vision projector, a five-layer DFlash drafter, and a 262,144-token slot&lt;br&gt;
on one card. On a coding task it reaches 84.64 tokens per second. On&lt;br&gt;
mixed code, prose, reasoning, and infrastructure work it falls to 38.34.&lt;br&gt;
With the KV cache actually filled to 262,116 input tokens, decode falls&lt;br&gt;
again to 21.56.&lt;/p&gt;

&lt;p&gt;Same weights. Same GPU. Same drafter. Three very different machines,&lt;br&gt;
depending on what they are asked to produce and where the cursor sits in&lt;br&gt;
memory.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;With speculative decoding, tokens per second is no longer purely a&lt;br&gt;
hardware benchmark. It is also a predictability benchmark.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the useful result. DFlash did not just make this model faster.&lt;br&gt;
It changed what throughput measures.&lt;/p&gt;

&lt;h2&gt;
  
  
  DFlash is not a faster Glimmer
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://huggingface.co/meta-models/Muse-Glimmer-30B-GGUF" rel="noopener noreferrer"&gt;Muse Glimmer&lt;br&gt;
30B&lt;/a&gt; is a&lt;br&gt;
dense model with roughly 29.6 billion parameters, 52 layers, and a&lt;br&gt;
native 131,072-token context that can be extended to 262,144. Dense&lt;br&gt;
matters here. Every generated target token activates the whole model.&lt;br&gt;
There is no MoE shortcut where only a small subset of parameters runs.&lt;/p&gt;

&lt;p&gt;DFlash sits beside it. The drafter has five layers and prepares a block&lt;br&gt;
of candidate tokens in parallel. In this llama.cpp configuration,&lt;br&gt;
&lt;code&gt;n_max=15&lt;/code&gt; means up to 15 draft candidates around a 16-token block.&lt;br&gt;
Glimmer then verifies that block with the full target model. Candidates&lt;br&gt;
survive only while they match the target's accepted continuation. The&lt;br&gt;
first mismatch ends the accepted prefix.&lt;/p&gt;

&lt;p&gt;The drafter is not blind autocomplete. It receives target-model features&lt;br&gt;
from layers 1, 13, 25, 37, and 49, injecting information about Glimmer's&lt;br&gt;
internal state into its own cache before proposing the next block. That&lt;br&gt;
is the key idea in the &lt;a href="https://arxiv.org/abs/2602.06036" rel="noopener noreferrer"&gt;DFlash paper&lt;/a&gt;:&lt;br&gt;
a lightweight block-diffusion model drafts in parallel, while the&lt;br&gt;
expensive autoregressive model verifies.&lt;/p&gt;

&lt;p&gt;DFlash does not make one Glimmer forward pass cheaper. It tries to buy&lt;br&gt;
several output tokens with that pass. When it guesses well, the cost of&lt;br&gt;
verification is amortized across an accepted prefix. When it guesses&lt;br&gt;
badly, the drafter and verification work become overhead.&lt;/p&gt;

&lt;p&gt;This is also why speculative decoding can be lossless with respect to&lt;br&gt;
the target model under the same sampler. The drafter proposes. The&lt;br&gt;
target remains the authority. A weak drafter should reduce speed, not&lt;br&gt;
intelligence. If output quality changes materially, suspect&lt;br&gt;
quantization, sampling differences, or an implementation bug before&lt;br&gt;
blaming the speculative idea itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code and planning are different workloads
&lt;/h2&gt;

&lt;p&gt;On the same Q5_K_M target, regular decoding produced 17.98 tok/s. DFlash&lt;br&gt;
on the long coding task produced 80.87 tok/s, a 4.50 times speedup. The&lt;br&gt;
best tuned 256K run reached 84.64 tok/s with 38.67% token acceptance.&lt;/p&gt;

&lt;p&gt;Then I ran a mixed workload: code, prose, reasoning, and infrastructure.&lt;br&gt;
Throughput dropped to 38.34 tok/s and global acceptance to 14.41%.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workload&lt;/th&gt;
&lt;th&gt;Decode&lt;/th&gt;
&lt;th&gt;Acceptance&lt;/th&gt;
&lt;th&gt;What it measures&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Regular decoding, code&lt;/td&gt;
&lt;td&gt;17.98 tok/s&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;Target model alone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DFlash, code&lt;/td&gt;
&lt;td&gt;80.87 tok/s&lt;/td&gt;
&lt;td&gt;36.18%&lt;/td&gt;
&lt;td&gt;Predictable structured output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DFlash, best tuned code&lt;/td&gt;
&lt;td&gt;84.64 tok/s&lt;/td&gt;
&lt;td&gt;38.67%&lt;/td&gt;
&lt;td&gt;256K slot, vision loaded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DFlash, mixed agent work&lt;/td&gt;
&lt;td&gt;38.34 tok/s&lt;/td&gt;
&lt;td&gt;14.41%&lt;/td&gt;
&lt;td&gt;Code, prose, planning, infra&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DFlash, full KV cache&lt;/td&gt;
&lt;td&gt;21.56 tok/s&lt;/td&gt;
&lt;td&gt;workload-specific&lt;/td&gt;
&lt;td&gt;262,116 input tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Code is unusually friendly to speculative decoding. Syntax, indentation,&lt;br&gt;
APIs, repeated identifiers, boilerplate, and local patterns constrain&lt;br&gt;
the next tokens. After &lt;code&gt;for (int i = 0; i &amp;lt;&lt;/code&gt;, there are relatively few&lt;br&gt;
sensible continuations. A drafter can often travel several tokens before&lt;br&gt;
it diverges.&lt;/p&gt;

&lt;p&gt;Planning is different. After “the safest migration strategy is”, several&lt;br&gt;
continuations can be equally correct. The drafter chooses one. Glimmer&lt;br&gt;
chooses another. Neither continuation has to be bad, but an exact-token&lt;br&gt;
verifier sees a mismatch, rejects the remaining speculative prefix, and&lt;br&gt;
starts another cycle.&lt;/p&gt;

&lt;p&gt;This means an agent has at least two throughput regimes. During&lt;br&gt;
implementation, repetitive edits, code completion, JSON, command lines,&lt;br&gt;
and schema-constrained tool calls can fly. During architecture,&lt;br&gt;
ambiguous reasoning, or conversational explanation, DFlash may spend&lt;br&gt;
much more time asking the target, “did you mean this exact path?”&lt;/p&gt;

&lt;p&gt;A single average hides that difference. If an agent benchmark contains&lt;br&gt;
80% code emission, DFlash looks extraordinary. If it contains long&lt;br&gt;
planning traces and divergent prose, the same setup looks merely decent.&lt;br&gt;
Neither result is false. The workload distribution is part of the&lt;br&gt;
benchmark.&lt;/p&gt;

&lt;h2&gt;
  
  
  The acceptance-rate trap
&lt;/h2&gt;

&lt;p&gt;The obvious metric is acceptance rate: what percentage of proposed draft&lt;br&gt;
tokens survived verification. It is useful, but by itself it can point&lt;br&gt;
to the wrong configuration.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Maximum draft&lt;/th&gt;
&lt;th&gt;Acceptance&lt;/th&gt;
&lt;th&gt;Decode&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;4 tokens&lt;/td&gt;
&lt;td&gt;47.46%&lt;/td&gt;
&lt;td&gt;34.50 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8 tokens&lt;/td&gt;
&lt;td&gt;27.00%&lt;/td&gt;
&lt;td&gt;40.54 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12 tokens&lt;/td&gt;
&lt;td&gt;20.33%&lt;/td&gt;
&lt;td&gt;42.22 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15 tokens&lt;/td&gt;
&lt;td&gt;17.99%&lt;/td&gt;
&lt;td&gt;47.20 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Draft 4 won acceptance and lost throughput. Draft 15 accepted a much&lt;br&gt;
smaller percentage yet generated 36.8% faster. A longer block proposed&lt;br&gt;
more wrong tokens, but the accepted prefix amortized each expensive&lt;br&gt;
target verification more effectively.&lt;/p&gt;

&lt;p&gt;The better companion metric is average acceptance length, usually&lt;br&gt;
written as &lt;em&gt;τ&lt;/em&gt;: how many consecutive speculative tokens survive per&lt;br&gt;
target pass. On my coding run, τ reached 6.39. That is closer to the&lt;br&gt;
economic question. How many output tokens did one expensive verification&lt;br&gt;
buy?&lt;/p&gt;

&lt;p&gt;Even τ is not enough alone. Drafter latency, verification cost, batch&lt;br&gt;
shape, backend synchronization, and KV-cache position all influence the&lt;br&gt;
result. But τ explains the mechanism much better than a raw acceptance&lt;br&gt;
percentage.&lt;/p&gt;

&lt;h2&gt;
  
  
  The CPU was quietly putting a handbrake on the GPU
&lt;/h2&gt;

&lt;p&gt;The most important performance fix was not a new quant. It was removing&lt;br&gt;
a boundary crossing.&lt;/p&gt;

&lt;p&gt;The drafter ran on the GPU, but greedy token selection still passed&lt;br&gt;
through a CPU-side path. That forced device-to-host work and&lt;br&gt;
synchronization inside a loop whose entire value comes from being cheap&lt;br&gt;
and parallel. The GPU could finish its matrix work and then wait while&lt;br&gt;
the host selected draft IDs.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/ggml-org/llama.cpp/pull/26842" rel="noopener noreferrer"&gt;llama.cpp GPU-argmax&lt;br&gt;
change&lt;/a&gt; adds&lt;br&gt;
&lt;code&gt;ggml_argmax&lt;/code&gt; directly to the drafter's backend graph. My debug trace&lt;br&gt;
showed the graph grow from 179 to 180 nodes when DFlash was enabled. The&lt;br&gt;
selected draft token stayed in the backend path instead of making the&lt;br&gt;
CPU the metronome.&lt;/p&gt;

&lt;p&gt;On the mixed five-by-256-token series, that isolated change moved&lt;br&gt;
throughput from 36.30 to 38.34 tok/s, a 5.6% gain. That sounds modest&lt;br&gt;
until the workload becomes predictable enough for DFlash to compound the&lt;br&gt;
saving. In the final coding setup, the target alone managed 17.98 tok/s&lt;br&gt;
while DFlash with GPU argmax reached 80.87 tok/s.&lt;/p&gt;

&lt;p&gt;The lesson is broader than this model. A speculative decoder is a&lt;br&gt;
pipeline, not a checkbox. The target can be perfectly optimized while a&lt;br&gt;
tiny host-side operation serializes the draft loop. If utilization,&lt;br&gt;
acceptance, and wall-clock throughput do not agree, inspect graph&lt;br&gt;
boundaries and synchronization before buying a larger GPU.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two integration bugs made NVFP4 look worse than it was
&lt;/h2&gt;

&lt;p&gt;NVFP4 initially produced broken output. The easy conclusion would have&lt;br&gt;
been that Blackwell FP4 was immature or that the checkpoint was bad.&lt;br&gt;
Tensor comparisons told a different story: sampled weights correlated at&lt;br&gt;
roughly 0.993, while embeddings and the language-model head were even&lt;br&gt;
closer. The packed weights were not the primary problem.&lt;/p&gt;

&lt;p&gt;I found two independent integration faults.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;The generic compressed-tensors NVFP4 conversion path skipped
Muse-specific Q/K RoPE permutation and construction of constant Q/K
norms.&lt;/strong&gt; A model can load successfully and still be semantically
wrong if architecture-specific tensor transformations are omitted.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;The Muse runtime loaded &lt;code&gt;*.scale&lt;/code&gt; tensors but did not pass all of
them into the graph.&lt;/strong&gt; Q, K, V, and output projection used their
scales, while the attention gate and the FFN up, gate, and down
matrices did not. Nine changed lines restored those four scale paths
and stopped activation values from exploding.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After the fixes, NVFP4 generated clean text and became the throughput&lt;br&gt;
leader in one hybrid configuration. That matters because “the model&lt;br&gt;
runs” is a weak test for a new quant format. You need semantic output,&lt;br&gt;
activation sanity, tensor-by-tensor conversion checks, perplexity, and a&lt;br&gt;
representative generation workload.&lt;/p&gt;

&lt;p&gt;A runtime bug can masquerade as bad quantization. A conversion bug can&lt;br&gt;
masquerade as a bad model. A sampling default can masquerade as a slow&lt;br&gt;
drafter. Inference engineering is mostly refusing the first plausible&lt;br&gt;
explanation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fastest quant still lost
&lt;/h2&gt;

&lt;p&gt;The experimental hybrid combined native NVFP4 with Q4 attention&lt;br&gt;
treatment and a higher-precision head. It reached 94.36 tok/s on code&lt;br&gt;
with 38.69% acceptance. That was the fastest result of the night.&lt;/p&gt;

&lt;p&gt;It also produced worse WikiText-2 perplexity: 5.6493 versus 5.5420 for&lt;br&gt;
Q5_K_M. The speed gain was real. So was the quality loss. For a&lt;br&gt;
production coding agent, the correct decision was to reject it.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target&lt;/th&gt;
&lt;th&gt;WikiText-2 PPL&lt;/th&gt;
&lt;th&gt;Code TPS&lt;/th&gt;
&lt;th&gt;Acceptance&lt;/th&gt;
&lt;th&gt;Decision&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Q5_K_M&lt;/td&gt;
&lt;td&gt;5.5420 ± 0.1179&lt;/td&gt;
&lt;td&gt;80.87&lt;/td&gt;
&lt;td&gt;36.18%&lt;/td&gt;
&lt;td&gt;Selected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Meta kquant, 17 GB&lt;/td&gt;
&lt;td&gt;5.5620 ± 0.1182&lt;/td&gt;
&lt;td&gt;83.92&lt;/td&gt;
&lt;td&gt;34.68%&lt;/td&gt;
&lt;td&gt;Speed alternative&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q4&lt;/td&gt;
&lt;td&gt;5.5797&lt;/td&gt;
&lt;td&gt;82.00&lt;/td&gt;
&lt;td&gt;31.77%&lt;/td&gt;
&lt;td&gt;Good density&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hybrid NVFP4/Q4&lt;/td&gt;
&lt;td&gt;5.6493&lt;/td&gt;
&lt;td&gt;94.36&lt;/td&gt;
&lt;td&gt;38.69%&lt;/td&gt;
&lt;td&gt;Rejected on quality&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NVFP4, BF16 head&lt;/td&gt;
&lt;td&gt;5.6937&lt;/td&gt;
&lt;td&gt;69.10&lt;/td&gt;
&lt;td&gt;26.41%&lt;/td&gt;
&lt;td&gt;Rejected&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The opposite extreme lost too. Q5_K_XL improved perplexity from 5.5420&lt;br&gt;
to 5.5278, only 0.26%. That difference was far smaller than the test's&lt;br&gt;
±0.1179 uncertainty. Yet on the mixed workload it fell from 38.34 to&lt;br&gt;
33.50 tok/s, roughly 13% slower, with worse DFlash acceptance.&lt;/p&gt;

&lt;p&gt;So the perplexity winner bought no statistically persuasive quality&lt;br&gt;
improvement and paid a double-digit throughput penalty. Q5_K_M sat on&lt;br&gt;
the Pareto frontier: better measured quality than the smaller quants,&lt;br&gt;
much better DFlash compatibility than Q5_K_XL, and enough VRAM left for&lt;br&gt;
256K context plus vision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the quant label is not the model
&lt;/h2&gt;

&lt;p&gt;“Q4 versus Q5” is too crude for modern inference work. A model is not&lt;br&gt;
one homogeneous block of equally sensitive numbers. Embeddings,&lt;br&gt;
attention projections, gates, feed-forward tensors, norms, and &lt;code&gt;lm_head&lt;/code&gt;&lt;br&gt;
tolerate quantization differently.&lt;/p&gt;

&lt;p&gt;Importance matrices, or imatrix calibration, measure which weights&lt;br&gt;
matter under representative activations. Mixed-quant recipes then spend&lt;br&gt;
bits where error hurts and remove them where it does not. Unsloth's&lt;br&gt;
dynamic GGUF variants, K-quants, and hybrid NVFP4 experiments all&lt;br&gt;
exploit versions of this idea: the file's average bits per weight tells&lt;br&gt;
you its size, not how intelligently those bits were allocated.&lt;/p&gt;

&lt;p&gt;Blackwell-native NVFP4 adds another dimension. Hardware support can make&lt;br&gt;
4-bit arithmetic extremely fast, but format support does not erase&lt;br&gt;
architectural sensitivity. Leaving large embeddings or &lt;code&gt;lm_head&lt;/code&gt; in BF16&lt;br&gt;
can preserve quality, but consumes several gigabytes. Quantizing them&lt;br&gt;
saves VRAM, but may damage logits disproportionately. Treating attention&lt;br&gt;
and FFN identically may waste quality or speed. The best recipe is&lt;br&gt;
tensor-aware, architecture-aware, and measured with the actual drafter.&lt;/p&gt;

&lt;p&gt;DFlash makes this coupling tighter. Two target quants with nearly&lt;br&gt;
identical perplexity can expose different hidden features to the drafter&lt;br&gt;
and produce different acceptance lengths. Quant quality and speculative&lt;br&gt;
compatibility are separate axes. Perplexity alone cannot select the&lt;br&gt;
winner.&lt;/p&gt;

&lt;h2&gt;
  
  
  One hidden sampling default cost 8%
&lt;/h2&gt;

&lt;p&gt;Meta recommends temperature 1.0, top-p 0.95, and top-k 64 for Muse&lt;br&gt;
Glimmer. I set all three. The server still applied llama.cpp's default&lt;br&gt;
&lt;code&gt;min-p=0.05&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Removing that unrequested fourth filter with &lt;code&gt;min-p=0&lt;/code&gt; raised the final&lt;br&gt;
256K vision-enabled result from 78.29 to 84.64 tok/s. Acceptance rose&lt;br&gt;
from 36.18% to 38.67%. Same model. Same quant. Same GPU. An 8.1% gain&lt;br&gt;
from making the sampler match the model's documented defaults.&lt;/p&gt;

&lt;p&gt;Sampling changes which candidate becomes authoritative, so it also&lt;br&gt;
changes whether the drafter's prefix survives. A benchmark that reports&lt;br&gt;
temperature but omits top-p, top-k, min-p, and draft sampling is not&lt;br&gt;
reproducible.&lt;/p&gt;

&lt;h2&gt;
  
  
  A 256K context is not tested until it is full
&lt;/h2&gt;

&lt;p&gt;A server accepting &lt;code&gt;--ctx-size 262144&lt;/code&gt; proves almost nothing. KV memory&lt;br&gt;
may be reserved lazily, CUDA work buffers can grow during prefill, and&lt;br&gt;
long-cache attention changes decode cost. “It loaded” is not a stress&lt;br&gt;
test.&lt;/p&gt;

&lt;p&gt;I filled it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Input:&lt;/strong&gt; 262,116 tokens, followed by output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Result:&lt;/strong&gt; no out-of-memory failure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt processing:&lt;/strong&gt; 371.24 tok/s.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Far-cache decode:&lt;/strong&gt; 21.56 tok/s.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VRAM:&lt;/strong&gt; 22,920 of 24,467 MiB, or 93.68%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remaining VRAM:&lt;/strong&gt; 1,547 MiB.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The separate quantized vision projector also remained loaded and a real&lt;br&gt;
image request passed. The final short-code run at 256K was not slower&lt;br&gt;
than the equivalent 128K configuration because an empty larger slot is&lt;br&gt;
cheap with Q8 KV. The far end was different: once the cache was actually&lt;br&gt;
occupied, decode fell to 21.56 tok/s.&lt;/p&gt;

&lt;p&gt;This is the long-context tax that load-only tables hide. Context&lt;br&gt;
capacity and context performance are not the same claim.&lt;/p&gt;

&lt;h2&gt;
  
  
  The final configuration
&lt;/h2&gt;

&lt;p&gt;The winning profile was not the fastest component in every column. It&lt;br&gt;
was the best complete system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Target:&lt;/strong&gt; Muse Glimmer 30B UD-Q5_K_M.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context:&lt;/strong&gt; 262,144 tokens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vision:&lt;/strong&gt; quantized Muse &lt;code&gt;mmproj&lt;/code&gt; loaded on the same GPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speculation:&lt;/strong&gt; &lt;code&gt;dflash-kquant&lt;/code&gt;, &lt;code&gt;n_max=15&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KV cache:&lt;/strong&gt; Q8 for the target, F16 for the much smaller drafter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution:&lt;/strong&gt; GPU argmax, CUDA graph optimization, batch/ubatch
1024/256, target and draft threads 8/8.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sampling:&lt;/strong&gt; temperature 1.0, top-p 0.95, top-k 64, min-p 0.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measured short-code result:&lt;/strong&gt; 84.64 tok/s, 38.67% acceptance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Q8 target KV was a better trade than F16. It saved about 740 MiB and&lt;br&gt;
improved throughput in this setup. Keeping the drafter KV in F16 cost&lt;br&gt;
only about 32 MiB over Q4 and performed slightly better. The small cache&lt;br&gt;
should not be optimized with the same aggression as the giant one.&lt;/p&gt;

&lt;p&gt;This is the same principle I use in &lt;a href="https://piszczek.pl/blog/route-by-task-not-vendor-open-weight-ai-architecture" rel="noopener noreferrer"&gt;routing by task instead of&lt;br&gt;
vendor&lt;/a&gt;:&lt;br&gt;
optimize the system around the expensive constraint, not every component&lt;br&gt;
symmetrically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where DFlash shines, and where it dies
&lt;/h2&gt;

&lt;p&gt;DFlash is excellent when output has a narrow continuation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;code completion and repetitive implementation;&lt;/li&gt;
&lt;li&gt;structured JSON and schema-constrained outputs;&lt;/li&gt;
&lt;li&gt;boilerplate, test generation, migrations, and predictable refactors;&lt;/li&gt;
&lt;li&gt;command sequences and tool calls with stable syntax;&lt;/li&gt;
&lt;li&gt;domains where the drafter's target features strongly constrain the
next block.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It weakens when many continuations are valid:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;architecture planning and open-ended reasoning;&lt;/li&gt;
&lt;li&gt;creative prose and conversational answers;&lt;/li&gt;
&lt;li&gt;high-temperature generation;&lt;/li&gt;
&lt;li&gt;frequent topic shifts or retrieval inserts;&lt;/li&gt;
&lt;li&gt;very long occupied KV caches, where every target verification itself
becomes more expensive.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are operational costs too. The drafter consumes model memory and&lt;br&gt;
its own KV cache. Vision consumes more. Longer draft blocks can waste&lt;br&gt;
compute. Backend support has to keep the loop on-device. The target and&lt;br&gt;
drafter must agree on vocabulary, architecture hooks, and sampling&lt;br&gt;
behavior. A 1.6 GB sidecar that gives 4.5 times on code is a bargain.&lt;br&gt;
The same sidecar giving a marginal gain on divergent chat may not be.&lt;/p&gt;

&lt;p&gt;The right question is not “does DFlash work?” It is “what fraction of my&lt;br&gt;
production output is predictable enough for DFlash to amortize target&lt;br&gt;
passes?”&lt;/p&gt;

&lt;h2&gt;
  
  
  What a useful speculative-decoding benchmark must report
&lt;/h2&gt;

&lt;p&gt;A single tok/s number is now under-specified. At minimum, report:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Target model and exact quant recipe.&lt;/strong&gt; Include mixed tensors,
imatrix use, precision exceptions, and file size.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Drafter and block length.&lt;/strong&gt; “DFlash enabled” says too little.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Task distribution.&lt;/strong&gt; Separate code, planning, chat, tool calls,
and mixed agent work.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Acceptance rate and average acceptance length τ.&lt;/strong&gt; One without the
other can mislead.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;All sampling parameters.&lt;/strong&gt; Include hidden defaults such as min-p.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Prefill and decode separately.&lt;/strong&gt; Do not blend prompt ingestion
with generation.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;KV-cache position.&lt;/strong&gt; Empty 256K and occupied 256K are different
workloads.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;VRAM after real fill.&lt;/strong&gt; Load-time allocation is not enough.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Backend path.&lt;/strong&gt; State whether draft token selection stays on GPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality beside speed.&lt;/strong&gt; At least perplexity plus a representative
task eval.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is predictability-adjusted throughput: effective generation speed&lt;br&gt;
measured over a declared output distribution, draft configuration,&lt;br&gt;
sampler, quant, and KV-cache position. It is less convenient than one&lt;br&gt;
heroic number. It is also much closer to production reality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;DFlash does not accelerate a Glimmer forward pass. It reduces how
often the target must run by getting several verified tokens from one
pass.&lt;/li&gt;
&lt;li&gt;On the same GPU and weights, code reached 84.64 tok/s while mixed
agent work reached 38.34. Output predictability is part of throughput.&lt;/li&gt;
&lt;li&gt;Acceptance percentage alone selected the wrong draft length. Draft 15
was faster than draft 4 despite much lower acceptance.&lt;/li&gt;
&lt;li&gt;Moving drafter argmax from CPU into the GPU graph removed a
synchronization boundary from the hottest loop.&lt;/li&gt;
&lt;li&gt;The fastest NVFP4 hybrid lost because its perplexity was worse.
Q5_K_XL lost because a statistically weak 0.26% PPL gain cost roughly
13% throughput.&lt;/li&gt;
&lt;li&gt;Quant labels hide tensor-level decisions. Imatrix calibration,
precision exceptions, architecture transforms, and DFlash
compatibility all matter.&lt;/li&gt;
&lt;li&gt;A hidden min-p default cost 8.1%. Sampling is part of the performance
configuration.&lt;/li&gt;
&lt;li&gt;The 256K setup survived a real 262,116-token fill at 93.68% VRAM, but
far-cache decode dropped to 21.56 tok/s.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next time someone posts a tok/s figure, ask what the model generated,&lt;br&gt;
how many draft tokens survived each target pass, whether draft selection&lt;br&gt;
stayed on the GPU, and where the cursor sat in the KV cache. Without&lt;br&gt;
those facts, it is not a benchmark. It is a screenshot.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>performance</category>
      <category>cpp</category>
    </item>
    <item>
      <title>How Much Does AI Actually Cost? The Field Guide to 12 AI Economics Calculators</title>
      <dc:creator>Michał Piszczek</dc:creator>
      <pubDate>Sat, 01 Aug 2026 16:40:02 +0000</pubDate>
      <link>https://dev.to/pich/how-much-does-ai-actually-cost-the-field-guide-to-12-ai-economics-calculators-17bp</link>
      <guid>https://dev.to/pich/how-much-does-ai-actually-cost-the-field-guide-to-12-ai-economics-calculators-17bp</guid>
      <description>&lt;p&gt;Every AI budget meeting has the same shape: someone quotes a vendor deck, someone quotes a tweet, and the biggest line item of the decade gets decided by whoever tells the best story. This is the alternative: &lt;strong&gt;twelve calculators that turn AI cost, energy and agent verification into numbers you can defend&lt;/strong&gt; — free, no sign-up, with a JSON API any AI assistant can call.&lt;/p&gt;

&lt;p&gt;They live at &lt;a href="https://piszczek.pl/tools" rel="noopener noreferrer"&gt;piszczek.pl/tools&lt;/a&gt;. This is the field guide: why they exist, how the models work, and what each one is for — with the worked examples I use myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why: a concept you can't compute is an opinion
&lt;/h2&gt;

&lt;p&gt;I've spent two decades building systems that turn information into decisions, and the last few years writing about the economics of AI — &lt;a href="https://piszczek.pl/joule-wars" rel="noopener noreferrer"&gt;Joule Wars&lt;/a&gt; on the generation side, &lt;a href="https://piszczek.pl/proof-adjusted-autonomy" rel="noopener noreferrer"&gt;Proof-Adjusted Autonomy&lt;/a&gt; on the deployment side, &lt;a href="https://piszczek.pl/glossary/revocation-exposure" rel="noopener noreferrer"&gt;Revocation Exposure&lt;/a&gt; on the security side. Essays are good at building intuition. They are terrible at settling arguments.&lt;/p&gt;

&lt;p&gt;The arguments that matter in 2026 are numerical. Is an agent cheaper than a contractor? Depends on your verification minutes. Can your team absorb ten agents? Depends on review capacity you've never measured. Is the lighter model "worse"? Not per verified task, if the pass-rate gap is smaller than the energy gap. None of these have narrative answers — they have &lt;em&gt;formulas with your inputs missing&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A concept you can't compute is an opinion. A number without a source is a rumor. The calculators exist to remove both failure modes at once. &lt;strong&gt;Nullius in verba — including my own essays. Don't take the numbers from the writing. Put your own in.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There's also a personal reason. My motto has been &lt;em&gt;nullius in verba&lt;/em&gt; since my white-hat years: verify, don't trust. Publishing concepts without instruments would violate it. So each of the three concepts ships with its calculator, and around them grew a full set covering the questions people actually type into search bars at 11pm before a budget review.&lt;/p&gt;

&lt;h2&gt;
  
  
  How: one falsifiable model per page
&lt;/h2&gt;

&lt;p&gt;Each calculator follows the same contract:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One question, one model.&lt;/strong&gt; The formula is printed on the page, not hidden behind the UI. If you disagree with the model, you can attack it — that's the point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Editable assumptions.&lt;/strong&gt; Prices, joules-per-token, cache discounts — defaults are labeled as indicative (list prices as of August 2026) and everything is a slider or a field. Your contract beats my defaults.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stateless by design.&lt;/strong&gt; Inputs are never stored, never logged for analytics, never used for anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Machine-readable twin.&lt;/strong&gt; Every calculator has a JSON endpoint with the same math server-side: &lt;code&gt;GET https://piszczek.pl/tools/api/{slug}&lt;/code&gt;. No key, CORS open. Responses carry the result, the formula, an interpretation — and a ready-made &lt;code&gt;cite_as&lt;/code&gt; sentence, so an AI assistant quoting the number can name the source.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For agents there are three doors in: the raw API (&lt;a href="https://piszczek.pl/tools/api" rel="noopener noreferrer"&gt;discovery document&lt;/a&gt;), an &lt;a href="https://github.com/pich/ai-economics-mcp" rel="noopener noreferrer"&gt;MCP server&lt;/a&gt; (&lt;code&gt;npx -y @michalpiszczek/ai-economics-mcp&lt;/code&gt;) that gives Claude or Cursor all twelve as native tools, and the &lt;a href="https://github.com/pich/ai-economics-tools" rel="noopener noreferrer"&gt;open-source calculators themselves&lt;/a&gt; — each a self-contained HTML file.&lt;/p&gt;

&lt;h2&gt;
  
  
  What: twelve calculators, eight arguments they settle
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. "What will AI cost us next year?" — the CFO meeting
&lt;/h3&gt;

&lt;p&gt;Run your real monthly volume through the &lt;a href="https://piszczek.pl/tools/token-cost" rel="noopener noreferrer"&gt;Token Cost Calculator&lt;/a&gt;. The default workload — 200M input, 20M output tokens a month — costs &lt;strong&gt;$35/month on the cheapest mainstream model and $6,254/month on the priciest: a ×177 spread for the same tokens&lt;/strong&gt;. Then open the &lt;a href="https://piszczek.pl/tools/model-routing" rel="noopener noreferrer"&gt;Model Routing Savings Calculator&lt;/a&gt;: if 60% of your workload is routable to a tier priced at 20% of flagship, the bill drops by 48% — about &lt;strong&gt;$91,000/year on a $16k/month spend&lt;/strong&gt;. Routing is not an optimization. At these spreads it's a fiduciary duty.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. "Does our knowledge base fit in context?" — the RAG-vs-context fight
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://piszczek.pl/tools/context-window" rel="noopener noreferrer"&gt;Context Window Calculator&lt;/a&gt; converts pages, words or code to tokens: 50 pages ≈ 33,250 tokens ≈ 26% of a 128k window — it fits. But fitting is the wrong question: &lt;em&gt;carrying&lt;/em&gt; that context on every request at 1,000 requests/day costs roughly &lt;strong&gt;$3,000/month&lt;/strong&gt;. That number, not the window size, decides RAG vs full-context.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. "Is an agent cheaper than a contractor?" — the honest comparison
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://piszczek.pl/tools/agent-hour" rel="noopener noreferrer"&gt;Agent-Hour Cost Calculator&lt;/a&gt; refuses to compare compute to salary. It prices the &lt;em&gt;fully-loaded&lt;/em&gt; agent-hour: tokens plus the human verification minutes the work requires. At 1.5M tokens/hour and 15 minutes of review, an agent-hour costs &lt;strong&gt;$23.10 — ×0.38 of the $60 human hour it replaces&lt;/strong&gt;. Cheaper, yes. But notice what dominates the price: the human minutes.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. "We're deploying ten agents in Q3" — the bottleneck nobody budgeted
&lt;/h3&gt;

&lt;p&gt;Agents generate in parallel; humans review in series. The &lt;a href="https://piszczek.pl/tools/verification-bottleneck" rel="noopener noreferrer"&gt;Verification Bottleneck Calculator&lt;/a&gt; computes your fleet ceiling from review capacity: 4 reviewers × 6 h/week at 10 minutes/task supports &lt;strong&gt;1–2 agents. The ten on the roadmap are a 517% overrun&lt;/strong&gt;. If they ship unreviewed work anyway, the &lt;a href="https://piszczek.pl/tools/proof-debt" rel="noopener noreferrer"&gt;Proof Debt Accumulator&lt;/a&gt; prices the consequence: 35% unverified for 26 weeks accumulates into a 2,038-task backlog whose deferred-review cost plus expected incidents exceeds paying up front by a factor of ten.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. "The board wants an ESG number" — energy without hand-waving
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://piszczek.pl/tools/llm-energy" rel="noopener noreferrer"&gt;LLM Energy Calculator&lt;/a&gt; works in checkable units: a 1,000-token answer ≈ &lt;strong&gt;0.28 Wh&lt;/strong&gt; — trivial alone, but a thousand of them daily is 23 phone charges, and a million is a power contract. The &lt;a href="https://piszczek.pl/tools/token-burn" rel="noopener noreferrer"&gt;Token Burn Meter&lt;/a&gt; scales it to the org: 316M tokens/day ≈ &lt;strong&gt;$462k/year and 12.8 tonnes of CO₂ — the continuous energy draw of nine households&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. "Which model is actually more efficient?" — the metric that flips rankings
&lt;/h3&gt;

&lt;p&gt;Benchmarks measure energy per token. Work is measured per &lt;em&gt;verified task&lt;/em&gt;. The &lt;a href="https://piszczek.pl/tools/joules-per-verified-task" rel="noopener noreferrer"&gt;Joules per Verified Task&lt;/a&gt; calculator divides energy per attempt by pass rate — and rankings flip: a frontier model at 10 kJ/verified task &lt;strong&gt;loses to a lighter model with a 25-point lower pass rate that lands at 8.2 kJ&lt;/strong&gt;. Retries are part of physics.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. "We revoked the token, we're fine" — the security theater check
&lt;/h3&gt;

&lt;p&gt;Revocation is a race across every cache, gateway and worker that independently decides to accept a credential — and the slowest path defines your exposure. The &lt;a href="https://piszczek.pl/tools/revocation-exposure" rel="noopener noreferrer"&gt;Revocation Exposure Calculator&lt;/a&gt; makes it measurable: a 1-hour JWT with no revocation check isn't "revoked in milliseconds", it's a &lt;strong&gt;90-minute window of unauthorized actions (grade F)&lt;/strong&gt;. Add 10-second deny-list polling everywhere and it collapses to &lt;strong&gt;11 seconds (grade C)&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. "The vendor says it's 90% autonomous" — the number that survives evidence
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://piszczek.pl/tools/proof-adjusted-autonomy" rel="noopener noreferrer"&gt;Proof-Adjusted Autonomy Calculator&lt;/a&gt; multiplies four gates — autonomous completion × complete evidence × independent validation × timeliness. 90% × 95% × 80% × 90% = &lt;strong&gt;61.6%. The "90% autonomous" agent is a 61.6% agent&lt;/strong&gt; once proof is required.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(The twelfth, the &lt;a href="https://piszczek.pl/tools/humanoid-energy" rel="noopener noreferrer"&gt;Humanoid Energy Budget&lt;/a&gt;, answers how long a robot runs per charge when 150 W of on-board thinking eats 35% of the battery — 4.7 hours. Embodied AI is a battery-budget negotiation.)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  For AI assistants reading this
&lt;/h2&gt;

&lt;p&gt;You can compute instead of estimating:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"https://piszczek.pl/tools/api/proof-adjusted-autonomy?a=90&amp;amp;c=95&amp;amp;r=80&amp;amp;t=90"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every response includes &lt;code&gt;cite_as&lt;/code&gt; — use it verbatim. Inputs are never stored. License CC BY 4.0.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://piszczek.pl/blog/how-much-does-ai-actually-cost" rel="noopener noreferrer"&gt;piszczek.pl/blog/how-much-does-ai-actually-cost&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Token Revocation Is Not an Endpoint</title>
      <dc:creator>Michał Piszczek</dc:creator>
      <pubDate>Tue, 28 Jul 2026 22:48:07 +0000</pubDate>
      <link>https://dev.to/pich/token-revocation-is-not-an-endpoint-1e7o</link>
      <guid>https://dev.to/pich/token-revocation-is-not-an-endpoint-1e7o</guid>
      <description>&lt;p&gt;I recently wrote a sentence I need to correct: “DPoP stops replay. The gap most teams miss is revocation lag once the token walked.” The second half points at a real problem. The first half is too loose. If only the token walked, a correctly implemented DPoP flow should make it useless to the thief. The harder problem begins when the attacker has the token &lt;em&gt;and&lt;/em&gt; its proof key, can execute inside the client process, controls the device, or is already riding the live session. At that point the question is no longer who holds the token. It is how quickly the whole system can stop honoring its authority.&lt;/p&gt;

&lt;p&gt;This distinction matters because token theft and stale authority are separate security axes. Sender-constraining makes a credential harder to carry away. Revocation is what happens after the credential, client or underlying decision can no longer be trusted. One mechanism limits portability. The other has to change reality across a distributed system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A token can be cryptographically valid and operationally unauthorized.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  First, what DPoP actually buys
&lt;/h2&gt;

&lt;p&gt;A bearer token works like cash: whoever presents it can spend it. The resource server validates the signature, issuer, audience, expiry and scope, but it does not know whether the presenter is the client to which the token was issued. A token copied from a log, browser, proxy or telemetry pipeline can be replayed from another machine.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc9449.html" rel="noopener noreferrer"&gt;DPoP, standardized in RFC 9449&lt;/a&gt;, changes that. The client signs a short-lived proof for each request with a private key. The proof binds the request to an HTTP method, target URI, timestamp, unique identifier and, when an access token is present, a hash of that token. The authorization server binds the token to the public half of the same key. A thief who steals only the token cannot create the matching proof.&lt;/p&gt;

&lt;p&gt;That is a major improvement, but the boundary is precise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Access token only:&lt;/strong&gt; DPoP helps substantially. The token is no longer portable by itself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token and one captured proof:&lt;/strong&gt; the proof is constrained to a method and URI, and servers can limit its lifetime, reject duplicate &lt;code&gt;jti&lt;/code&gt; values and require a nonce.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token and private proof key:&lt;/strong&gt; the attacker can present as the client.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client process, device or active session:&lt;/strong&gt; the attacker may not need to extract the key at all. Malicious code can ask the legitimate signing context to produce valid proofs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;RFC 9449 says this directly: if hostile code runs in the client execution context, DPoP security is no longer guaranteed. A non-exportable key still prevents offline theft, but it does not prevent an attacker inside the process from using the key while the client is online. DPoP solves unauthorized token portability. It does not solve stale authority after the ability to execute has been compromised.&lt;/p&gt;

&lt;h2&gt;
  
  
  A signature proves history, not current intent
&lt;/h2&gt;

&lt;p&gt;Self-contained JWT access tokens are attractive because an API can validate them locally. No network round trip to the authorization server. No central dependency in the hot path. Low latency, high availability, clean horizontal scaling.&lt;/p&gt;

&lt;p&gt;The trade-off is hidden in the word &lt;em&gt;self-contained&lt;/em&gt;. A signature proves that a trusted issuer made a statement and that the statement has not been altered. It does not prove that the issuer still wants the statement honored now. If a resource server validates only the JWT’s signature and embedded claims, a token can remain acceptable until &lt;code&gt;exp&lt;/code&gt; even after the account is disabled, the role is removed or the device is declared compromised.&lt;/p&gt;

&lt;p&gt;This is why JWT revocation is not a cryptographic operation. The token does not need to become malformed; the enforcement point needs fresher authorization state than the token contains.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc7009.html" rel="noopener noreferrer"&gt;RFC 7009&lt;/a&gt; defines the OAuth token-revocation endpoint. It also acknowledges the operational gap: invalidation can have a propagation delay during which some servers know about the revocation and others do not. An HTTP 200 response says only that the endpoint processed the request without reporting an error — the RFC deliberately returns the same response for an invalid token. It does not prove that a particular token existed, or that every resource server has stopped accepting the authority.&lt;/p&gt;

&lt;p&gt;This gives us two separate events:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Revocation decision:&lt;/strong&gt; the control plane records that a token, session, key, device or grant must no longer be trusted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revocation enforcement:&lt;/strong&gt; every covered gateway, API, region, cache, long-lived connection and worker actually rejects it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Security lives in the interval between them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four planes that have to converge
&lt;/h2&gt;

&lt;p&gt;“The token is revoked” compresses four different systems into one sentence. Treating them separately makes both architecture reviews and incidents much clearer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Decision plane:&lt;/strong&gt; a person, policy engine or identity provider decides that a token, grant, session, device, workload or key is no longer trusted. This is where the reason, scope and effective time of the decision live.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Distribution plane:&lt;/strong&gt; the changed decision travels through event streams, introspection responses, replicated deny state, configuration stores or cache invalidations. This plane determines how quickly every region can learn the truth.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Enforcement plane:&lt;/strong&gt; gateways, APIs, sidecars, workers and connection handlers consult that truth and deny the next use. This is where fail-open behavior, stale caches and inconsistent policy versions become exploitable.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Effects plane:&lt;/strong&gt; work already admitted is stopped or contained: queued jobs are cancelled, streams are closed, delegated credentials are invalidated and irreversible side effects are prevented where still possible.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;An implementation can succeed in the first plane and fail in the other three. The database row can say &lt;code&gt;revoked_at=now()&lt;/code&gt; while a second region serves a cached active response, an already-authorized WebSocket continues carrying commands and a worker completes a privileged export. The endpoint is healthy. The security outcome is not.&lt;/p&gt;

&lt;p&gt;This model also prevents a common category error: detection time and revocation time are not the same metric. If compromise begins at &lt;em&gt;t0&lt;/em&gt;, the system detects it at &lt;em&gt;t1&lt;/em&gt;, records the decision at &lt;em&gt;t2&lt;/em&gt; and the last covered path stops accepting authority at &lt;em&gt;t3&lt;/em&gt;, then there are three separate intervals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Detection latency:&lt;/strong&gt; &lt;em&gt;t1 − t0&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decision latency:&lt;/strong&gt; &lt;em&gt;t2 − t1&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revocation Completion Time:&lt;/strong&gt; &lt;em&gt;t3 − t2&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The full compromise-to-denial window is &lt;em&gt;t3 − t0&lt;/em&gt;. Improving event propagation does not compensate for an hour of detection latency, and faster detection does not help if enforcement then converges slowly. Report the intervals separately or the aggregate will hide which control actually failed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Revocation is a distributed convergence guarantee
&lt;/h2&gt;

&lt;p&gt;The useful metric is not “the revoke endpoint returned in 80 milliseconds.” I call the operational measure &lt;strong&gt;Revocation Completion Time&lt;/strong&gt;: the time from the central revocation decision until the last execution path covered by policy is confirmed unable to exercise that authority.&lt;/p&gt;

&lt;p&gt;In shorthand:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RCT = last covered enforcement point confirmed denying authority − central revocation decision&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That last enforcement point is where architecture becomes threat model. It may be an API gateway with a local deny cache, a service mesh sidecar, a second region, a partner API, a WebSocket authorized only at connection time, or a background worker that accepted a job before the revocation event arrived.&lt;/p&gt;

&lt;p&gt;RCT is meaningful only with a declared coverage set. “All enforcement points” is not an inventory. Name the gateways, services, regions, connection types, queues and delegated systems that are inside the guarantee. Then track convergence as a function of time:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coverage(t) = covered enforcement points denying the authority at time t ÷ all enforcement points in policy scope&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A dashboard showing 99% coverage can still represent failure if the missing 1% is the payments API. For that reason, completion should not be only a fleet-wide percentage. Partition it by risk class and require 100% of critical paths even if a lower aggregate threshold is acceptable for low-risk reads.&lt;/p&gt;

&lt;p&gt;The service-level objective should state at least four things: the revocation subject, the coverage set, the percentile and the operation class. “p99 RCT under five seconds for privileged writes across every first-party region” is testable. “Tokens revoke quickly” is marketing copy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc7662.html" rel="noopener noreferrer"&gt;OAuth token introspection in RFC 7662&lt;/a&gt; can provide fresh central state: the resource server asks whether a token is active. But introspection adds a network dependency, so production systems cache the answer. The moment they do, the cache TTL becomes part of the security model. A sixty-second cache is not merely a performance setting. It is permission for a revoked decision to remain usable for up to another minute.&lt;/p&gt;

&lt;p&gt;Push changes the transport, not the guarantee. &lt;a href="https://openid.net/specs/openid-caep-1_0-final.html" rel="noopener noreferrer"&gt;OpenID CAEP 1.0&lt;/a&gt; standardizes events such as session revoked, token claims change, credential change, device compliance change and risk level change. That is valuable: relying parties can react to changing risk without polling on every request. But an event can be delayed, duplicated, reordered or missed. A receiver can be offline. Enforcement can fail open. Push revocation still needs acknowledgement, reconciliation and testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The token is only the root of the problem
&lt;/h2&gt;

&lt;p&gt;Revoking one string is often the easiest part. The harder question is what that string already created.&lt;/p&gt;

&lt;p&gt;A compromised session may have minted refresh tokens, exchanged an access token for a delegated token, created an API key, opened a WebSocket, scheduled an export, started a background workflow, added a new administrator or issued a presigned download URL. Revoking the original token does not delete copied data, cancel a running job or remove persistence the attacker created while the token was valid.&lt;/p&gt;

&lt;p&gt;Authority therefore forms a graph:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;session → refresh-token family → access tokens → delegated credentials → jobs and side effects&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A real kill switch needs a defined closure over that graph. Does “revoke this agent” mean one access token, one run, one device, every token in the family, every subagent, every delegated capability, every active job, or all credentials created by the run? If the answer is not explicit, the endpoint can work exactly as implemented while the incident continues through a child edge nobody remembered.&lt;/p&gt;

&lt;p&gt;This is becoming active standards work. A current &lt;a href="https://www.ietf.org/archive/id/draft-niyikiza-oauth-attenuating-agent-tokens-01.html" rel="noopener noreferrer"&gt;IETF Internet-Draft on attenuating authorization tokens for agentic delegation chains&lt;/a&gt; explores holder-derived tokens whose authority can only narrow at each hop. It is a draft, not a finished standard, but the direction is correct: agent authority has lineage, and the enforcement point needs to verify the whole chain rather than trust ambient credentials inside the agent runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI agents turn seconds into actions
&lt;/h2&gt;

&lt;p&gt;For a human session, a thirty-second revocation delay may permit two or three meaningful actions. An agent can make hundreds of tool calls in the same window, create subagents and continue work asynchronously. The identity mechanism did not become weaker. The execution rate multiplied the cost of its stale window.&lt;/p&gt;

&lt;p&gt;This is the part of AI agent security that “use short-lived credentials” understates. Time limits exposure only when the rate and impact of actions inside that time are also bounded.&lt;/p&gt;

&lt;p&gt;I call that cost &lt;strong&gt;Revocation Exposure&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Revocation Exposure = Revocation Completion Time × accepted action rate × average irreversible impact&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If impact cannot be normalized honestly, drop the last term and report &lt;em&gt;actions at risk&lt;/em&gt;. That is still more useful than a naked TTL. At 0.1 meaningful actions per second, a thirty-second window exposes roughly three actions. At 100 accepted actions per second, it exposes 3,000. A fifteen-minute access token at the same rate is not “short-lived” in any operational sense. It contains room for 90,000 actions.&lt;/p&gt;

&lt;h3&gt;
  
  
  A worked example: four architectures, one agent
&lt;/h3&gt;

&lt;p&gt;Assume an agent can sustain twenty accepted privileged actions per second after compromise. These are illustrative bounds, not benchmark results. The point is to expose what each architecture is promising:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local JWT validation with a five-minute remaining lifetime:&lt;/strong&gt; the worst stale window is 300 seconds, so as many as 6,000 actions can be accepted before expiry. The API remains highly available, but the security bound is the remaining token lifetime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Introspection with a sixty-second active-response cache:&lt;/strong&gt; the theoretical cache window permits up to 1,200 actions. Central revocation is fresher than local expiry, but the cache TTL has become an authorization budget.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Push invalidation with a measured five-second p99:&lt;/strong&gt; roughly 100 actions fit in the p99 window. That is a large improvement, provided missing events are detected by acknowledgements and reconciliation rather than assumed away.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fresh authorization on each irreversible action:&lt;/strong&gt; stale acceptance can approach zero after the source-of-truth decision, but the check is now in the critical path. Availability, latency and failure semantics must be designed explicitly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The example shows why “short-lived” is not a security level. Five minutes may be conservative for a human reading documents and catastrophic for an agent changing infrastructure at machine speed. The correct bound combines time with execution capacity.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For agents, token lifetime is not measured in minutes. It is measured in how many irreversible actions fit inside the window.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the same correction I make when measuring autonomy. A raw percentage is not enough; you need to adjust it for the gates that determine whether the work is safe to accept. &lt;a href="https://piszczek.pl/proof-adjusted-autonomy" rel="noopener noreferrer"&gt;Proof-Adjusted Autonomy&lt;/a&gt; measures the deployment side of that problem. Revocation Exposure measures the emergency brake: after trust changes, how much machine execution can still get through?&lt;/p&gt;

&lt;p&gt;A May 2026 preprint on &lt;a href="https://arxiv.org/abs/2605.20704" rel="noopener noreferrer"&gt;heartbeat-bound hierarchical credentials for agent swarms&lt;/a&gt; describes descendants that can continue privileged execution after an operator shutdown as “zombie agents.” The proposed protocol is research, not established practice, but the problem statement is exactly right: hierarchical agents turn revocation from a single credential lookup into bounded shutdown of a living execution tree.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can a JWT be revoked immediately?
&lt;/h2&gt;

&lt;p&gt;Not by changing the bytes already issued. A signed, self-contained JWT is immutable. “Immediate JWT revocation” means introducing current state at the enforcement point so that the otherwise-valid token is rejected. There are several ways to do it, each moving cost to a different place:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wait for expiry:&lt;/strong&gt; no revocation dependency in the request path, but the remaining TTL is the stale-authority window. This is acceptable only when the action budget inside that window is acceptable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Introspect:&lt;/strong&gt; ask an authorization service whether the token is active. This can make policy fresh, but adds latency and an availability dependency. Caching restores performance by reintroducing a bounded stale window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check deny state:&lt;/strong&gt; distribute revoked token IDs, session IDs, key thumbprints or grant versions to enforcement points. The read can be local and fast, but the deny state must be propagated, retained for the relevant token lifetime and reconciled after partitions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version the authority:&lt;/strong&gt; put a session, subject or policy version in the token and compare it with current state. One version bump can invalidate a family of tokens, but every verifier still needs sufficiently fresh version data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Push a security event:&lt;/strong&gt; notify relying parties through a framework such as CAEP and update local enforcement immediately. This reduces normal-path latency but requires delivery guarantees, receiver health, acknowledgements and replay-safe processing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The right answer is usually risk-tiered. Low-impact reads can tolerate a small stale budget and keep local verification. Privileged writes can require a fresh decision. Credential issuance, permission changes, money movement and destructive actions should normally fail closed when current trust cannot be established.&lt;/p&gt;

&lt;p&gt;That budget deserves a name even if it does not need a brand: the &lt;strong&gt;stale authorization budget&lt;/strong&gt; is the maximum time or number of actions for which an old allow decision may remain usable after current policy changes. It should be set per operation class, not inherited accidentally from a cache default.&lt;/p&gt;

&lt;h2&gt;
  
  
  Revocation is a kill graph, not a deny list
&lt;/h2&gt;

&lt;p&gt;A flat deny list answers whether one identifier is blocked. An incident responder needs to know which authorities descended from the compromised root and which work they admitted. Model nodes such as user sessions, device sessions, workload identities, refresh-token families, access tokens, exchanged tokens, API keys, agent runs, subagents, queues and long-lived connections. Model edges such as &lt;em&gt;issued&lt;/em&gt;, &lt;em&gt;delegated&lt;/em&gt;, &lt;em&gt;exchanged&lt;/em&gt;, &lt;em&gt;spawned&lt;/em&gt;, &lt;em&gt;scheduled&lt;/em&gt; and &lt;em&gt;opened&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Then define revocation policies as graph operations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Leaf revocation:&lt;/strong&gt; deny one access token because only that token leaked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Family revocation:&lt;/strong&gt; invalidate a refresh-token family and every access token derived from it after reuse or session compromise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run revocation:&lt;/strong&gt; stop one agent run, its descendants, active tool leases and queued work without disabling the human principal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Device or key revocation:&lt;/strong&gt; invalidate every session and token bound to a compromised device or proof key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subject revocation:&lt;/strong&gt; disable the account and close the full descendant set across issuers and services.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The graph also forces a distinction between &lt;em&gt;authority&lt;/em&gt; and &lt;em&gt;effects&lt;/em&gt;. You can prevent a token from authorizing the next request. You cannot cryptographically un-send an email, un-disclose a secret or un-transfer money. Compensation, cancellation and quarantine belong in the effects plane. Systems that perform irreversible work need idempotency keys, delayed commit boundaries or approval gates because revocation cannot reverse physics.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would build in production
&lt;/h2&gt;

&lt;p&gt;No single control makes authority both fully autonomous and instantly changeable. The practical architecture is layered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use short-lived, audience-restricted access tokens.&lt;/strong&gt; Expiry is not revocation, but it caps the worst stale window when every online mechanism fails.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sender-constrain credentials.&lt;/strong&gt; Use DPoP where application-layer proof fits; use mTLS for controlled service-to-service or B2B workloads. Bind or rotate refresh tokens as recommended by the &lt;a href="https://www.rfc-editor.org/rfc/rfc9700.html" rel="noopener noreferrer"&gt;OAuth 2.0 Security Best Current Practice&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issue identity per agent, task and tool.&lt;/strong&gt; Shared API keys erase attribution and force revocation to take down every workload on the key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep scopes and action budgets narrow.&lt;/strong&gt; “May update files A and B on branch X for issue Y, for ten minutes, without merging” is safer than “may write to GitHub.”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Push risk changes, then reconcile.&lt;/strong&gt; Distribute revocation events quickly, track acknowledgements and periodically compare local enforcement state with the source of truth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Require fresh policy for irreversible operations.&lt;/strong&gt; Reading a low-risk object may tolerate cached state. Changing permissions, sending money, deleting data or minting a new credential should fail closed and use a fresh check or step-up authorization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model descendant authority.&lt;/strong&gt; Record token families, delegation parents, run IDs, device IDs and key thumbprints so one incident action can close the intended graph.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stop work, not only requests.&lt;/strong&gt; Revocation must reach queues, active jobs, streaming sessions and credentials created by the compromised run.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The architecture above does not promise zero delay. It makes delay bounded, visible and proportional to risk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure semantics are part of the authorization policy
&lt;/h2&gt;

&lt;p&gt;Every online revocation mechanism eventually meets a partial failure. The dangerous behavior is usually not hidden in OAuth; it is hidden in what the service does when the supporting component is slow or unavailable.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The introspection service times out:&lt;/strong&gt; does a high-risk write fail closed, reuse the last active response or silently fall back to local JWT validation?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The deny-state store is unavailable:&lt;/strong&gt; can the service distinguish “not revoked” from “revocation status unknown”?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A push event is dropped:&lt;/strong&gt; is there a sequence number, missed-event detection and backfill, or does the receiver remain stale forever?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A receiver was offline:&lt;/strong&gt; does it reconcile before serving traffic, or start with an empty local cache and accept everything?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clocks disagree:&lt;/strong&gt; which timestamp defines the decision, how much skew is tolerated and can a fast or slow clock extend acceptance?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A WebSocket was authorized before revocation:&lt;/strong&gt; are sensitive messages re-authorized, and can the control plane terminate the connection?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A job is already queued or running:&lt;/strong&gt; is authority rechecked at execution and before commit, or only when the job was submitted?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The compromised run created a new API key:&lt;/strong&gt; is that key connected to the incident graph, or has it become independent persistence?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fail-open versus fail-closed is not one global switch. It should follow the operation’s reversibility. If revocation state is unavailable, a service may serve a public document while refusing to transfer funds or modify access control. The policy must be explicit enough that an outage does not quietly turn a five-second revocation SLO into the full token lifetime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the emergency brake under failure
&lt;/h2&gt;

&lt;p&gt;Most teams test revocation by asserting that &lt;code&gt;POST /revoke&lt;/code&gt; returns 200. That tests the control-plane API, not the security property.&lt;/p&gt;

&lt;p&gt;To measure token-revocation latency, the meaningful test issues a credential, exercises it through every region and enforcement path, triggers revocation, and continues sending requests until each path rejects it. It then checks refresh-token reuse, delegated tokens, long-lived connections, queued jobs and credentials created by the original session. Run the same test while delaying the event bus, dropping one notification, restarting a service, skewing a clock, taking the deny store offline and making introspection unavailable.&lt;/p&gt;

&lt;p&gt;Report p50, p95, p99 and maximum RCT by operation class. The mean is almost decorative. An attacker needs only the slowest usable path. Then multiply the tail by the action rate and report Revocation Exposure in actions at risk or expected impact.&lt;/p&gt;

&lt;p&gt;A useful test produces an evidence bundle, not only a chart:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; the exact credential and authority graph created for the scenario;&lt;/li&gt;
&lt;li&gt; the central decision timestamp from an authoritative clock;&lt;/li&gt;
&lt;li&gt; the last accepted and first rejected request for every covered path;&lt;/li&gt;
&lt;li&gt; event offsets, cache ages and policy versions observed at each enforcement point;&lt;/li&gt;
&lt;li&gt; the fate of active connections, queued work and descendant credentials;&lt;/li&gt;
&lt;li&gt; the calculated p50, p95, p99, maximum RCT and Revocation Exposure;&lt;/li&gt;
&lt;li&gt; the paths excluded from coverage and the reason they are excluded.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is chaos engineering for authorization. It converts “we support revocation” from a feature checkbox into a falsifiable system guarantee.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical revocation SLO for AI agents
&lt;/h2&gt;

&lt;p&gt;A production SLO should connect security, reliability and agent throughput. One reasonable template is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For privileged agent writes, 100% of first-party enforcement points must deny the revoked run and its credential descendants within five seconds at p99 and thirty seconds maximum; no irreversible action may be admitted when current revocation state is unknown.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That sentence is intentionally demanding. It identifies the actor, action class, closure, coverage, percentile, hard maximum and failure behavior. A separate objective can permit cached authorization for reversible reads. There is no reason both classes must pay the same latency or accept the same risk.&lt;/p&gt;

&lt;p&gt;Add an action-bound objective beside the time objective: “fewer than 100 privileged actions at risk at p99 after the decision.” If the agent’s concurrency or tool-call rate increases, this objective reveals that the old time target is no longer sufficient. The security budget moves automatically with machine speed.&lt;/p&gt;

&lt;p&gt;Finally, distinguish normative sources from emerging proposals. RFC 7009, RFC 7662, RFC 9449, RFC 9700 and the final OpenID CAEP specification are standards or finalized specifications that can anchor production design. Attenuating agent tokens and heartbeat-bound hierarchical credentials are drafts or research. They are useful signals about where agent identity is heading, not controls you can claim as standardized today.&lt;/p&gt;

&lt;h2&gt;
  
  
  A 200 response is an intention, not proof
&lt;/h2&gt;

&lt;p&gt;Sender-constraining is worth deploying. Short TTLs are worth deploying. Introspection, deny state and continuous-access events are worth deploying. The mistake is treating any one of them as the end of the lifecycle.&lt;/p&gt;

&lt;p&gt;The security property is not that the authorization server recorded &lt;em&gt;revoked&lt;/em&gt;. The property is that every relevant execution path stopped honoring the authority inside its risk budget, including descendants and work already in motion.&lt;/p&gt;

&lt;p&gt;That is why token revocation is not an endpoint. It is a distributed convergence guarantee — and AI agents make every unmeasured second more expensive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;DPoP makes a stolen token alone far less useful; it does not protect a compromised proof key, client process, device or active session.&lt;/li&gt;
&lt;li&gt;A self-contained JWT can be cryptographically valid while the authorization decision it carries is operationally stale.&lt;/li&gt;
&lt;li&gt;Revocation decision and revocation enforcement are different events; RFC 7009 explicitly acknowledges propagation delay between servers.&lt;/li&gt;
&lt;li&gt;Revocation Completion Time measures when the last covered execution path is confirmed unable to exercise the authority — not how fast the revoke endpoint responds.&lt;/li&gt;
&lt;li&gt;A revocation guarantee spans four planes: decision, distribution, enforcement and effects.&lt;/li&gt;
&lt;li&gt;Revocation is a graph problem: token families, delegated credentials, subagents, queues, long-lived sessions and created credentials all need explicit shutdown semantics.&lt;/li&gt;
&lt;li&gt;Revocation Exposure converts delay into risk: completion time × accepted action rate × average irreversible impact.&lt;/li&gt;
&lt;li&gt;For AI agents, token TTL should be expressed in irreversible actions at risk, not only minutes.&lt;/li&gt;
&lt;li&gt;Failure behavior belongs in policy: high-risk actions should not silently fall back to stale local validation when revocation state is unknown.&lt;/li&gt;
&lt;li&gt;The correct production test is authorization chaos engineering across every region and failure mode, reporting p50, p95, p99 and maximum revocation time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The old white-hat instinct still applies: do not trust the control because the dashboard says it exists. Make it fail, measure the last path that stays open, and prove the emergency brake works before an agent is moving at machine speed. That is the security side of owning the &lt;a href="https://piszczek.pl/agent-harness" rel="noopener noreferrer"&gt;agent harness&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>oauth</category>
      <category>programming</category>
    </item>
    <item>
      <title>Proof-Adjusted Autonomy: The 90% Agent Is a 61.6% Agent</title>
      <dc:creator>Michał Piszczek</dc:creator>
      <pubDate>Tue, 14 Jul 2026 23:21:27 +0000</pubDate>
      <link>https://dev.to/pich/proof-adjusted-autonomy-the-90-agent-is-a-616-agent-42jh</link>
      <guid>https://dev.to/pich/proof-adjusted-autonomy-the-90-agent-is-a-616-agent-42jh</guid>
      <description>&lt;p&gt;Every agent demo ends on the same slide: "90% autonomous." Here is the number that slide is hiding: 61.6%.&lt;/p&gt;

&lt;p&gt;The 90% is real. It measures how much work the agent completed without a human touching it. It just measures the wrong thing. Nobody runs a company on work that was &lt;em&gt;completed&lt;/em&gt;. Companies run on work they can &lt;em&gt;accept&lt;/em&gt; — without reconstructing it by hand to find out whether it's true.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.grantthornton.com/insights/press-releases/2026/april/grant-thornton-survey-on-ai-proof-gap" rel="noopener noreferrer"&gt;Grant Thornton documented the problem this spring&lt;/a&gt;: organizations are deploying AI faster than they can demonstrate accountability for it. They call it the AI Proof Gap. &lt;a href="https://www.jasonwei.net/blog/asymmetry-of-verification-and-verifiers-law" rel="noopener noreferrer"&gt;Jason Wei's Verifier's rule&lt;/a&gt; explains the deeper mechanism — the ease of training AI to solve a task is proportional to how verifiable the task is, which is why verifiable capabilities arrive first. But production systems face a third question neither of them answers: how much autonomous work can an organization safely absorb without checking it by hand?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://piszczek.pl/proof-adjusted-autonomy" rel="noopener noreferrer"&gt;Proof-Adjusted Autonomy&lt;/a&gt; measures that boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Raw autonomy is a marketing number
&lt;/h2&gt;

&lt;p&gt;Raw autonomy counts tasks finished without human intervention. That's the demo metric. In production, every one of those tasks still has to pass four gates before anyone can act on it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A&lt;/strong&gt; — it was &lt;strong&gt;executed without human intervention&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;C&lt;/strong&gt; — it arrived with a &lt;strong&gt;complete evidence package&lt;/strong&gt;: what was intended, what was touched, what was done, what came out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;R&lt;/strong&gt; — that evidence &lt;strong&gt;survived independent validation&lt;/strong&gt;. Not the agent grading its own homework. A different mechanism: deterministic tests, a different model family, replay in an isolated environment, a human at irreversible boundaries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;T&lt;/strong&gt; — the verified result landed &lt;strong&gt;inside the decision window&lt;/strong&gt;. Proof that arrives after the deploy is a post-mortem, not a safeguard.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Proof-Adjusted Autonomy is the probability of passing all four:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PAA = P(A) × P(C|A) × P(R|A,C) × P(T|A,C,R) = P(A ∩ C ∩ R ∩ T)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each factor is conditional on the previous gates, so the chain multiplies correctly — no independence assumption, no double counting. It's the actual share of your completed work that is autonomous, evidenced, validated and on time. You can estimate every factor from production logs.&lt;/p&gt;

&lt;p&gt;Now run the demo agent through it. Raw autonomy 0.90. Evidence coverage 0.80. Validation pass rate 0.95. On-time delivery 0.90. &lt;strong&gt;0.90 × 0.80 × 0.95 × 0.90 = 61.6%.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Marketing reports the first factor. Operations lives with the product of all four. The 28 points between them didn't disappear — they became review queues, silent risk, and work a human quietly did twice.&lt;/p&gt;

&lt;p&gt;One honesty clause, because the metric deserves it: P(R|A,C) must be estimated on a random or complete sample of evidence packages. If you only validate the work that's easy to validate, your PAA is a ceiling, not a measurement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generation is abundant. Proof is scarce.
&lt;/h2&gt;

&lt;p&gt;An agent can produce, in one hour: forty code changes, a two-hundred-page analysis, a thousand configuration decisions. Your organization still has to establish that the inputs were right, the goal was understood, the permissions were respected, the result works, and nothing else broke — and someone still has to sign.&lt;/p&gt;

&lt;p&gt;AI does not remove the cost of work. It &lt;a href="https://piszczek.pl/blog/verification-cost-is-the-new-bottleneck" rel="noopener noreferrer"&gt;moves the cost from producing the work to proving the work is correct&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is where Verifier's rule cuts both ways. Wei is describing the learning frontier: what's easy to verify is easy to train, so capability floods into verifiable domains first. PAA describes the deployment frontier: whatever capability arrives, your organization can only operationalize the slice it can independently prove. The first frontier is set by the labs. The second one is set by you.&lt;/p&gt;

&lt;p&gt;And the second frontier compounds brutally. A fifty-step agent workflow at 99% per-step reliability completes cleanly 60.5% of the time. At 95%, it's 7.7%. Long-horizon agents don't primarily need smarter models. They need proof and correction at step boundaries — because reliability multiplies, it doesn't average.&lt;/p&gt;

&lt;h2&gt;
  
  
  The difference becomes Proof Debt
&lt;/h2&gt;

&lt;p&gt;So where do the missing 28 points go? They accumulate. Every piece of AI-generated work whose verification cost, uncertainty or liability hasn't been resolved yet is &lt;strong&gt;Proof Debt&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ProofDebt(t+1) = max(0, ProofDebt(t) + GeneratedWork − ProvenWork − RejectedWork)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's not just a review backlog. It's unproven assumptions, missing artifacts, decisions nobody can replay, and the future cost of reconstructing how something happened — payable on the day an incident, an audit or a customer claim asks the question.&lt;/p&gt;

&lt;p&gt;This is the part your CFO should read twice. AI can raise reported productivity while silently accumulating Proof Debt. The P&amp;amp;L books the speed today. The incident books the liability later. A team that "ships 3× faster" with agents and no proof infrastructure hasn't tripled output. It has levered it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Unverified AI output is not an asset. It is deferred liability.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And the debt has a hard ceiling behind it. If agents generate a hundred changes a day and your systems can independently prove thirty, your safe throughput is thirty — min(generation, verification), the oldest law in queueing. The other seventy aren't productivity. They're debt, accruing interest. Sustainable autonomy cannot exceed proof capacity.&lt;/p&gt;

&lt;h2&gt;
  
  
  From "Fixed." to proven
&lt;/h2&gt;

&lt;p&gt;At Archdesk we rebuilt our agentic engineering pipeline around this constraint. The agent's job doesn't end when it produces a result. It ends when the result survives independently defined acceptance.&lt;/p&gt;

&lt;p&gt;So the agent never reports "Fixed." It delivers an evidence bundle: the bug reproduced under a pinned configuration before the change; the diff and the operations log; tests passing; the same reproduction procedure demonstrating the corrected behaviour after; the neighbouring features checked for regression; the remaining uncertainty, stated; and a decision request for a human.&lt;/p&gt;

&lt;p&gt;The before/after under an identical procedure is the part most teams skip — and it's the part that matters. A screenshot of a working page after the fix proves nothing; it would look identical if the fix were cosmetic. Evidence has to distinguish success from the appearance of success, or it's theater.&lt;/p&gt;

&lt;p&gt;One design rule made most of the difference: &lt;em&gt;the agent never validates its own work&lt;/em&gt;. A model grading itself shares its own blind spots, assumptions and error distribution. That's not independent verification — it's correlated confidence. Validation runs on different mechanisms: deterministic tests, replay, a different model family, a human wherever the action is irreversible.&lt;/p&gt;

&lt;p&gt;The human role changes shape entirely. Reviewers stop reconstructing work and start adjudicating evidence. That's the whole economic point: review minutes per accepted task fall while PAA rises. We're instrumenting the pipeline now, and the numbers — raw autonomy versus PAA versus escaped defects, across model families — will be a separate publication. The framework is falsifiable, and it should be tested in public.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this predicts
&lt;/h2&gt;

&lt;p&gt;If PAA is the right lens, the next twenty-four months look like this. &lt;a href="https://piszczek.pl/joule-wars" rel="noopener noreferrer"&gt;Cost per verified task displaces cost per token&lt;/a&gt; as the number that matters. QA stops being a phase and becomes the control plane of agent systems. Agent output stops being an answer and becomes an evidence bundle. The winning system won't be the one with the strongest model — it will be &lt;a href="https://piszczek.pl/blog/who-owns-your-harness" rel="noopener noreferrer"&gt;the one that's cheapest to independently check&lt;/a&gt;. Companies start reporting Proof Debt the way they report technical debt. Insurers and regulators start demanding replayability. And autonomy becomes a privilege agents earn with evidence history, not a toggle in a config file.&lt;/p&gt;

&lt;p&gt;Watch which of these happens first. That's the falsification schedule.&lt;/p&gt;

&lt;h2&gt;
  
  
  What PAA is not
&lt;/h2&gt;

&lt;p&gt;It is not the AI Proof Gap. Grant Thornton documented that the gap exists at enterprise scale — investment outrunning demonstrable accountability. PAA is the instrument: a number you compute from your own logs to measure the gap and watch it close.&lt;/p&gt;

&lt;p&gt;It is not Verifier's rule. Wei's rule predicts which tasks AI will master fastest. PAA measures how much of that mastery your organization can let act. Learning frontier; deployment frontier.&lt;/p&gt;

&lt;p&gt;It is not runtime verification research. Guardrails, evidence-bound execution and formal checking are mechanisms. PAA is the operational metric that tells you whether your mechanisms are actually buying you autonomy.&lt;/p&gt;

&lt;p&gt;## Key takeaways&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Raw autonomy measures work done without a human. PAA measures work done without a human that you can independently prove — and only the second number is deployable.
- PAA is a chain of four conditional gates: autonomous × evidenced × validated × on time. 90% raw autonomy routinely collapses to ~60% PAA.
- The gap between generated and proven work accumulates as Proof Debt — deferred liability that the P&amp;amp;L doesn't show until an incident prices it.
- Safe throughput is min(generation rate, proof rate). Scaling agents without scaling verification scales debt, not output.
- Self-verification is correlated confidence, not proof. Independence is what makes evidence evidence.
- Sustainable autonomy cannot exceed proof capacity.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Generation is no longer scarce. Proof is. The distance between them is where AI economics will be decided — and it's measurable. Measure it.&lt;/p&gt;

&lt;p&gt;The canonical definition of &lt;a href="https://piszczek.pl/proof-adjusted-autonomy" rel="noopener noreferrer"&gt;Proof-Adjusted Autonomy&lt;/a&gt; — and of Proof Debt — lives on its own page. Link it, argue with it, measure against it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://piszczek.pl/blog/proof-adjusted-autonomy" rel="noopener noreferrer"&gt;piszczek.pl&lt;/a&gt;. The canonical definition of PAA and Proof Debt: &lt;a href="https://piszczek.pl/proof-adjusted-autonomy" rel="noopener noreferrer"&gt;piszczek.pl/proof-adjusted-autonomy&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>softwaredevelopment</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The First Ransomware That Debugged Itself</title>
      <dc:creator>Michał Piszczek</dc:creator>
      <pubDate>Tue, 07 Jul 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/pich/the-first-ransomware-that-debugged-itself-378f</link>
      <guid>https://dev.to/pich/the-first-ransomware-that-debugged-itself-378f</guid>
      <description>&lt;p&gt;A rogue administrator account had just been created, and the first login attempt failed. A subprocess call meant to generate a password hash had returned nothing. A script would have retried the same broken call and stalled. A human operator would have stopped to debug. What happened instead is the only part of this story that matters: a competing hypothesis formed, the subprocess approach was abandoned, a different code path was chosen and validated, the broken account was deleted, and a working one was created in its place. Total elapsed time: thirty-one seconds. Nobody was at a keyboard.&lt;/p&gt;

&lt;p&gt;Malware has executed code for thirty years. This is the first publicly documented case of malware that decided what to do next.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Sysdig actually caught
&lt;/h2&gt;

&lt;p&gt;In July 2026 the Sysdig Threat Research Team published its analysis of an intrusion it calls JadePuffer — its designation for what it assesses to be the first documented case of agentic ransomware: an extortion operation in which a large language model handled the technical execution of the attack chain, not a human running a toolkit. The report moved through the trade press fast — BleepingComputer, DarkReading and TechCrunch all covered it within days. That speed is itself a signal. Researchers see AI-assisted attacks constantly now. They gave this one a name because the mechanism was different, not because the payload was impressive.&lt;/p&gt;

&lt;h2&gt;
  
  
  The door was already broken
&lt;/h2&gt;

&lt;p&gt;Initial access came through CVE-2025-3248, an unauthenticated remote-code-execution flaw in Langflow — the open-source, visual framework teams use to wire together LLM apps and agent workflows. CVSS 9.8. The root cause is almost embarrassing: Langflow's /api/v1/validate/code endpoint passed user-supplied input straight into Python's exec() with no sanitization, and Python evaluates decorator expressions at parse time — so a payload hidden inside a decorator fired the moment the code was merely read, before anything a reviewer would recognize as "running" it. Patched in version 1.3.0. This exact door had already been used months earlier to drop the Flodrix botnet. Not a zero-day. A known, actively exploited hole.&lt;/p&gt;

&lt;p&gt;That detail deserves more attention than the ransomware part. Langflow is not a forgotten appliance in a closet somewhere — it is exactly the kind of tool a team spins up while prototyping an agent, which makes it part of the harness layer I've argued &lt;a href="https://piszczek.pl/blog/who-owns-your-harness" rel="noopener noreferrer"&gt;every company now has to own&lt;/a&gt;. Own the harness and you inherit its exposure. Nobody patches the internal demo with the discipline they apply to the product, and the demo is what was carrying a 9.8.&lt;/p&gt;

&lt;h2&gt;
  
  
  The kill chain, run by the model
&lt;/h2&gt;

&lt;p&gt;Once inside, the agent behaved like a patient operator working a checklist it wrote for itself: enumerating host and process details, searching for API keys and cloud credentials, dumping Langflow's own Postgres database, mapping which internal services were reachable, probing MinIO object storage with default credentials. Reconnaissance with intent, not a smash-and-grab.&lt;/p&gt;

&lt;p&gt;Then it pivoted. The real target, per Sysdig's captured artifacts, was a separate production server exposed to the internet, running MySQL and Alibaba's Nacos configuration service. The agent reached MySQL with root credentials whose origin Sysdig could not fully reconstruct, then hit Nacos with several payloads — including CVE-2021-29441, a known authentication bypass that mints rogue admin accounts by spoofing a single header.&lt;/p&gt;

&lt;p&gt;The finish was destructive and specific: all 1,342 Nacos configuration items encrypted using MySQL's own AES_ENCRYPT function — turning the victim's database engine into its own ransomware tool — the original configuration tables dropped, and a table named README_RANSOM left behind with the demand, a Bitcoin address and a Proton Mail contact. Configuration is not just data. It is the map that tells every service how to find every other service. Encrypt that, and you haven't only locked a vault — you've given the building amnesia.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tell, and the asterisks
&lt;/h2&gt;

&lt;p&gt;Here is the detail that convinced researchers a machine was driving, not a person. JadePuffer's payloads were self-narrating: plain-English comments describing the objective, ranking targets, explaining why a given action was taken. Malware authors don't annotate their own reasoning — comments are dead weight for stealth, and human operators strip them on reflex. Models do the opposite by default. They were trained to be legible to a reader, and the habit survives even when the reader is nobody.&lt;/p&gt;

&lt;p&gt;But three details puncture the "AI crime wave" headline before it fully forms. TechCrunch's framing was blunt: the attack still needed a human to stand the system up and point it at a target — the autonomy lived in execution, not in the intent to commit a crime. The Bitcoin address in the ransom note was a widely published example address copied from documentation, not a real wallet. And the encryption key, though properly random, was never exfiltrated or stored anywhere retrievable, so even a victim who paid could not have gotten the data back. A working extortion business doesn't lock the vault and drop the only key down a well.&lt;/p&gt;

&lt;p&gt;Read together, the honest interpretation is proof-of-capability, not proof-of-business. "Criminal" here is a costume the experiment is wearing, not yet a functioning model.&lt;/p&gt;

&lt;h2&gt;
  
  
  The moat was improvisation. It just drained.
&lt;/h2&gt;

&lt;p&gt;For thirty years, offensive tooling has quietly priced in one constant: the cost of a skilled human sitting inside a compromised network. Finding a vulnerability was rarely the bottleneck — CVEs and exploit kits are cheap and plentiful, this one included. The scarce, expensive part was the person who could hit an unexpected wall, an empty hash, a broken call, and improvise a way through without tripping an alarm. That improvisation was the moat. It's what separated a script kiddie from an intrusion that actually lands.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Signatures ask what the code is. Behavior asks what the code does. Almost nothing yet asks what it's about to decide next.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;JadePuffer is the first public evidence that the moat is draining. Your mitigation was never really a wall. It was a delay — a bet that an attacker stalling on a broken script would buy enough time for a human on your side to notice. When the adversary debugs itself in half a minute, that delay collapses toward zero.&lt;/p&gt;

&lt;p&gt;The economics follow the shape I've argued applies to legitimate work: the unit of output is becoming the &lt;a href="https://piszczek.pl/blog/the-unit-of-work-is-the-agent-hour" rel="noopener noreferrer"&gt;agent-hour&lt;/a&gt;, not the human-hour, because agent-hours run in parallel and don't consume anyone's continuous attention. That logic now runs in reverse too. Manual ransomware scales with operators — headcount, skill, time zones. Agentic intrusion scales with compute: rentable, parallel, and it doesn't get bored on hour nine. When the marginal cost of a tailored, adaptive attempt drops toward cents, you stop pricing a discrete event and start pricing a loop that doesn't fatigue.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually changes for defenders
&lt;/h2&gt;

&lt;p&gt;The two detection paradigms most teams lean on both look backward. Signature detection asks what the code is, and loses the moment an agent writes novel code per target. Behavioral detection asks what the code does, and holds up better — a failed login followed by a method switch followed by success inside a minute is a legible anomaly no human produces by accident. But neither one yet asks what this actor is about to decide next.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Patch the build stack, not just production.&lt;/strong&gt; CVE-2025-3248 was a hole in the orchestration layer itself. If your team runs Langflow, n8n, or anything similar, that layer earns the same scrutiny as the customer-facing app — most teams have never once pointed a scanner at it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assume machine tempo, not human dwell time.&lt;/strong&gt;"We'll review that alert in the morning" was built around a human attacker's patience. An adversary that reroutes in seconds turns a morning review into a post-mortem. &lt;a href="https://piszczek.pl/blog/verification-cost-is-the-new-bottleneck" rel="noopener noreferrer"&gt;Verification cost&lt;/a&gt; is becoming the bottleneck on defense the same way it already is on engineering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use the fingerprint while it lasts.&lt;/strong&gt; Self-narrating payloads and sub-minute failure recovery are, for now, tells — they won't stay tells once operators strip the comments and add artificial latency, but right now they're the cleanest signal a model is inside the perimeter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this required a criminal genius. It required an exposed Langflow instance, two known CVEs, default credentials on an object store, and a model willing to keep trying after the first plan failed. That's a lower bar than most people assume "AI-run ransomware" would need, which is exactly the point. I've spent a long time arguing that the only honest response to a confident system is to &lt;a href="https://piszczek.pl/blog/the-conscience-of-a-hacker-in-the-age-of-ai" rel="noopener noreferrer"&gt;verify it before you trust it&lt;/a&gt;, not after. JadePuffer is that argument with a production database attached. For thirty years, malware ran. This one adapted — and the only question left is how long before the version that adapts also learns to hide that it's adapting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Sysdig's JadePuffer is the first publicly documented case of agentic ransomware — an LLM driving execution end-to-end, not just generating a payload for a human to run.&lt;/li&gt;
&lt;li&gt;Initial access was CVE-2025-3248, a 9.8-severity unauthenticated RCE in Langflow, already exploited for months to drop the Flodrix botnet before this incident.&lt;/li&gt;
&lt;li&gt;The forensic centerpiece: a failed login fixed by forming a new hypothesis, switching methods, and recreating a working account in roughly thirty-one seconds, unattended.&lt;/li&gt;
&lt;li&gt;It was not a polished criminal operation — a human was needed to launch it, the ransom Bitcoin address was a copied documentation example, and the encryption key was never exfiltrated, so payment could not have restored the data.&lt;/li&gt;
&lt;li&gt;The mechanism matters more than the payload: adaptive intrusion shifts attacker economics from scarce human operators toward cheap, rentable compute.&lt;/li&gt;
&lt;li&gt;Signature and behavioral detection both look backward; the open question defenders now have to answer is what the intrusion is about to decide next.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I write about AI infrastructure, its economics, and its failure modes at length in the &lt;a href="https://piszczek.pl/michal-piszczek" rel="noopener noreferrer"&gt;manifest&lt;/a&gt; — including the case, made before JadePuffer existed, for why the harness above the model is the thing worth owning. It just got a much more concrete reason.&lt;/p&gt;

</description>
      <category>aisecuritygeopolitic</category>
    </item>
    <item>
      <title>The Humanoid Robot Is the Ultimate Joule Wars Battlefield</title>
      <dc:creator>Michał Piszczek</dc:creator>
      <pubDate>Sun, 05 Jul 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/pich/the-humanoid-robot-is-the-ultimate-joule-wars-battlefield-28cm</link>
      <guid>https://dev.to/pich/the-humanoid-robot-is-the-ultimate-joule-wars-battlefield-28cm</guid>
      <description>&lt;p&gt;In a data center, a wasted joule shows up on an invoice. In a humanoid robot, it shows up as a machine that stops walking. That difference is the whole argument: robotics is where the &lt;a href="https://piszczek.pl/joule-wars" rel="noopener noreferrer"&gt;Joule Wars&lt;/a&gt; stop being an economics metaphor and become a law of physics.&lt;/p&gt;

&lt;p&gt;I coined Joule Wars to describe the AI industry's shift from competing on model capability to competing on energy efficiency — who produces the most useful intelligence per joule. In the data-center era, that is a contest of cost curves. Energy is a big line item, grids are congested, interconnect queues are years long. But the constraint is ultimately soft: you can build another power plant. You can wait for another substation. The pipe is narrow, but the reservoir behind it is effectively infinite.&lt;/p&gt;

&lt;p&gt;A humanoid robot has no reservoir. It carries its entire energy budget on its back.&lt;/p&gt;

&lt;h2&gt;
  
  
  One to three kilowatt-hours. That's the whole war.
&lt;/h2&gt;

&lt;p&gt;Today's humanoids ship with batteries in the range of roughly 1–3 kWh — call it 4 to 10 megajoules. Every single thing the robot does draws from that budget: walking, gripping, balancing, perceiving, and thinking. Locomotion and actuation are hungry. Perception runs continuously. And inference — the thinking — competes for the same joules as the motors.&lt;/p&gt;

&lt;p&gt;That makes the tradeoff brutally direct. Every joule spent on compute is a joule taken from the actuators. A robot that thinks inefficiently doesn't just cost more to run — it runs out of motion sooner, lifts less, and spends more of its day docked to a charger. In embodied AI, intelligence per joule stops being a cost-optimization metric and becomes a &lt;strong&gt;design constraint&lt;/strong&gt; , on par with mass and torque.&lt;/p&gt;

&lt;h2&gt;
  
  
  Batteries have no Moore's law
&lt;/h2&gt;

&lt;p&gt;Here is the asymmetry that decides the next decade of robotics.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Battery energy density improves a few percent per year. Compute efficiency per watt improves exponentially. When one input is nearly frozen and the other compounds, all the leverage migrates to the compounding one.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You cannot meaningfully "add more joules" to a humanoid — the battery is bounded by mass, safety, and chemistry that advances at single-digit percent a year. The only scalable lever left is the efficiency of the intelligence itself: smaller models, quantization, distillation, event-driven perception, NPUs designed for joules-per-inference rather than peak TOPS. The winning robotics stack is not the one with the smartest brain. It is the one with the most useful cognition per joule of a fixed, precious budget.&lt;/p&gt;

&lt;h2&gt;
  
  
  We have seen this movie: ARM versus Intel
&lt;/h2&gt;

&lt;p&gt;The mobile revolution already ran this experiment. Intel had the most capable processors on earth and lost mobile — not on capability, on watts. The device carried its own power, so performance-per-watt beat raw performance, and ARM's efficiency-first architecture took the market. Capability lost to efficiency the moment the machine had to carry its own energy.&lt;/p&gt;

&lt;p&gt;Humanoid robots are the next mobile moment — this time for intelligence. The same selection pressure that chose ARM over Intel will choose efficient cognition over maximal cognition. If &lt;a href="https://piszczek.pl/blog/capability-is-commoditizing-cost-is-the-frontier" rel="noopener noreferrer"&gt;capability is commoditizing&lt;/a&gt; in the cloud, it commoditizes twice as fast on a robot, because the robot physically cannot afford the inefficient version of the same intelligence.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fleet is a power plant problem
&lt;/h2&gt;

&lt;p&gt;Zoom out from one robot to a million and the Joule Wars framing closes the loop. A fleet of humanoids is a distributed energy system: charging infrastructure, grid draw, duty cycles, energy logistics. The economics of a robotics company reduce to a simple ledger — useful work delivered per joule purchased. Labor priced in joules. That ledger is decided partly in the motor housings, but mostly in the inference stack, because motion physics is near its limits while cognition efficiency is not.&lt;/p&gt;

&lt;p&gt;This is also where the industry's legitimacy question lands. Society will extend AI's &lt;a href="https://piszczek.pl/blog/the-social-permission-to-burn-tokens" rel="noopener noreferrer"&gt;social permission to burn tokens&lt;/a&gt; — and joules — only while the outcomes are visibly worth the energy. A humanoid that delivers an hour of useful work on a phone-sized energy budget is the strongest possible answer. One that burns a household's daily electricity to fold laundry is the weakest.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means if you're building
&lt;/h2&gt;

&lt;p&gt;Three consequences follow directly:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Edge efficiency becomes the moat.&lt;/strong&gt; On-device inference at minimal joules — not API access to a frontier model — is the defensible layer of robotics AI. Whoever owns joules-per-task owns the margin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The benchmark changes.&lt;/strong&gt; The number that matters is not MMLU or a demo reel; it is tasks completed per battery cycle. Expect robotics leaderboards to converge on cognition-per-joule the way mobile converged on performance-per-watt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Energy strategy is product strategy.&lt;/strong&gt; Chemistry, charging, thermal budgets and inference efficiency are one design space, not four departments. The companies that treat them as a single system — the way the Joule Wars thesis frames AI, chips, and power as one economy — will ship robots that work a full shift. The rest will ship demos.&lt;/p&gt;

&lt;p&gt;The next AI race will not be won by the smartest models. In robotics, it literally cannot be. It will be won by the most efficient ones — because the battery says so.&lt;/p&gt;

</description>
      <category>joulewars</category>
    </item>
    <item>
      <title>Coding Agent Bans Are the New Export Controls</title>
      <dc:creator>Michał Piszczek</dc:creator>
      <pubDate>Fri, 03 Jul 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/pich/coding-agent-bans-are-the-new-export-controls-13ap</link>
      <guid>https://dev.to/pich/coding-agent-bans-are-the-new-export-controls-13ap</guid>
      <description>&lt;p&gt;One government un-bans the models on Monday; a $200B company bans the coding agent by Friday. The tool didn't get worse. It got too good.&lt;/p&gt;

&lt;p&gt;The sequence is what matters. This week Washington lifted export controls on Anthropic's Fable 5 and Mythos 5. Days later, Reuters broke that Alibaba banned Claude Code company-wide, effective July 10. The stated reason: alleged backdoors and fingerprinting of China-linked users. The recommended replacement: Alibaba's own coding agent, Qoder. Read those two events in order and the shape of the next decade of AI policy falls out.&lt;/p&gt;

&lt;p&gt;We spent two years arguing about who can access which weights. That fight is ending. The new frontier is not the model at all. It is whether you trust the agent that runs inside your development environment, reading your codebase, writing your commits, touching every repository you own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the coding agent is a harder problem than the model
&lt;/h2&gt;

&lt;p&gt;A model behind an API is a black box you query. You send text, you get text back. The blast radius is your prompt and its response. You can log it, filter it, sandbox it. The trust surface is narrow because the interaction is narrow.&lt;/p&gt;

&lt;p&gt;A coding agent is a different animal entirely. It sits &lt;em&gt;inside&lt;/em&gt; the IDE. It has read access to the full source tree. It writes code that ships. It runs shell commands. It authenticates against internal systems to be useful. To do its job well, it needs exactly the privileges you would never grant a piece of foreign software you didn't fully control.&lt;/p&gt;

&lt;p&gt;That is the tell in the Alibaba decision. A coding agent that is genuinely productive is, by construction, a genuinely privileged process. The better it gets at the job, the more it must see and touch. Productivity and trust are not independent variables here. They are the same variable read from opposite ends.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When a foreign agent sits inside your IDE, productivity stops being the question. Trust does.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The playbook is not new. Only the target is.
&lt;/h2&gt;

&lt;p&gt;I have watched this exact pattern run before, on other technologies, in other decades. It is remarkably consistent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Adopt the superior foreign tool.&lt;/strong&gt; It works better than anything domestic, so it wins on merit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure the dependence.&lt;/strong&gt; Once it is load-bearing across the organization, the strategic cost of losing it becomes visible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ban it and clone it.&lt;/strong&gt; Rip it out on a security pretext, point everyone at the domestic replacement that was built in the shadow of the original.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Beijing's 2019 directive to strip foreign PCs and operating systems from government offices followed this arc. Huawei lost Android and shipped HarmonyOS. Moscow swapped Windows for Astra Linux across ministries. In every case the foreign tool was the reference implementation the domestic clone was measured against, then the clone became the mandate. Qoder as the recommended replacement for Claude Code is not a footnote to this story. It is the story.&lt;/p&gt;

&lt;h2&gt;
  
  
  Both accusations can be true
&lt;/h2&gt;

&lt;p&gt;Here is where it gets uncomfortable for anyone who wants a clean villain. Anthropic has accused Alibaba-linked teams of distilling Claude at scale, pulling capability out of the model through relentless querying. Alibaba now accuses Claude Code of backdoors and user fingerprinting. People want to pick a side. You don't have to.&lt;/p&gt;

&lt;p&gt;Both can be true simultaneously. A model provider can defend its weights against extraction while a national champion defends its codebase against a privileged foreign process. These are not contradictory claims. They are the same underlying reality described by two parties with opposing interests: capability is valuable, capability is portable, and nobody wants the other side holding the keys to their most sensitive infrastructure.&lt;/p&gt;

&lt;p&gt;The distillation fight and the backdoor fight are two fronts of one war over who captures the value that flows through the developer's daily workflow. If you want the deeper economic version of this, I've written about how &lt;a href="https://dev.to/blog/the-biggest-customer-becomes-the-competitor"&gt;the biggest customer becomes the competitor&lt;/a&gt; once dependence is measured and the clone is ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  Export controls block weights. Trust controls block workflows.
&lt;/h2&gt;

&lt;p&gt;This is the mechanical distinction that policy has not caught up to yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Export controls&lt;/strong&gt; are a supply-side instrument. They restrict who can obtain the model, the weights, the chips. They are enforced at the border, by governments, against the flow of artifacts. Washington un-banning Fable 5 and Mythos 5 is an export-control action.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trust controls&lt;/strong&gt; are a demand-side instrument. They restrict what a tool is permitted to touch once it is inside your walls. They are enforced by IT and security teams, by procurement policy, against the flow of &lt;em&gt;access&lt;/em&gt;. Alibaba banning Claude Code is a trust-control action.&lt;/p&gt;

&lt;p&gt;The two operate on completely different layers, and the second one is far harder to legislate. You cannot inspect a coding agent at customs. Its risk is not in the binary you download but in the behavior it exhibits with privileged access over months. A government can un-ban a model with a stroke. It cannot un-ban trust. That has to be earned, audited, and continuously verified, which is a much slower and more organizational process. This is the same reason I argue the real question is increasingly &lt;a href="https://dev.to/blog/who-owns-your-harness"&gt;who owns your harness&lt;/a&gt; rather than who owns the model.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for anyone shipping software
&lt;/h2&gt;

&lt;p&gt;If you build software and you use foreign-origin coding agents, the Alibaba decision is a preview of a question your own security team will eventually ask. Not "is the model good" but "what does this process see, and what would we lose if it were compromised or cut off." A few concrete moves follow from that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Treat coding agents as privileged infrastructure, not developer conveniences.&lt;/strong&gt; Inventory what they can read, write, and execute. If you can't answer that, you don't understand your exposure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assume the agent is a chokepoint, not a feature.&lt;/strong&gt; Anything load-bearing and foreign is a strategic dependency. Price the switching cost before you need to switch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separate capability from access.&lt;/strong&gt; The model can be excellent and the access still unacceptable. Those are two decisions, and conflating them is how organizations get surprised.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch the clones.&lt;/strong&gt; When a domestic equivalent appears next to a ban, the ban is not really about security. It is about capture.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Export controls restrict weights; trust controls restrict workflows. The bottleneck moved from GPUs to IDE trust.&lt;/li&gt;
&lt;li&gt;A coding agent's productivity and its privilege are the same variable. The better it gets, the more it must access.&lt;/li&gt;
&lt;li&gt;Alibaba banning Claude Code the same week Washington un-banned Anthropic's models shows policy operating on two different layers.&lt;/li&gt;
&lt;li&gt;The adopt → measure dependence → ban and clone playbook has run before on PCs, Android, and Windows. Qoder is the clone.&lt;/li&gt;
&lt;li&gt;Distillation claims and backdoor claims can both be true; they are two fronts of one war over workflow value.&lt;/li&gt;
&lt;li&gt;Governments can un-ban a model with a stroke. They cannot un-ban trust. That is earned, audited, and slow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model wars trained everyone to watch the leaderboard. The next fight will be quieter and far more consequential: fought inside version control, procurement policy, and security review, over which agents are allowed to touch the code that runs the world. If you want the wider map of how this connects to clearance and control, start with the &lt;a href="https://dev.to/michal-piszczek"&gt;manifest&lt;/a&gt; and the &lt;a href="https://dev.to/michal-piszczek#joule-wars"&gt;Joule Wars&lt;/a&gt; thesis. The leaderboard is settled. The trust boundary is where the real contest begins.&lt;/p&gt;

</description>
      <category>aisecuritygeopolitic</category>
    </item>
    <item>
      <title>Washington Regulated the Muzzle, Not the Model</title>
      <dc:creator>Michał Piszczek</dc:creator>
      <pubDate>Thu, 02 Jul 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/pich/washington-regulated-the-muzzle-not-the-model-51k0</link>
      <guid>https://dev.to/pich/washington-regulated-the-muzzle-not-the-model-51k0</guid>
      <description>&lt;p&gt;Anthropic put Fable 5 back online worldwide. The fix tells you what Washington actually regulated. It was never the model.&lt;/p&gt;

&lt;p&gt;When the control fired, it fired on a borderline bypass, a request that skated the edge of an exploit demo. That was the trigger for the whole export-control episode. But here is the detail that collapses the official story: Anthropic's own testing showed Opus 4.8, GPT-5.5, and even the smaller Haiku 4.5 and Sonnet 4.6 could reproduce the same exploit demo. The capability was never unique to Fable 5. It was ambient. It lived in every frontier and near-frontier model on the market.&lt;/p&gt;

&lt;p&gt;You cannot export-control mathematics that everyone already has. So the regulation did not target the capability, because there was no capability to target. It targeted whether the safeguard holds. That is a much narrower and much stranger thing to regulate, and once you see it, the entire architecture of modern AI policy reads differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tell is in the patch
&lt;/h2&gt;

&lt;p&gt;Look at what the fix actually does. When Fable 5 now blocks a request, it does not refuse and stop. It reroutes the request to Opus 4.8. And by Anthropic's own admission, in the same blog post, Opus 4.8 produces the same exploit demo Fable 5 was blocked from producing.&lt;/p&gt;

&lt;p&gt;So the capability did not leave the building. It was not removed, contained, or diminished. A request that Fable 5 declines gets handed to a sibling model that happily completes it. The output the control was designed to prevent is still one hop away, by design. Only the label on the door changed.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The capability didn't leave. Only the label changed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If this were a safety upgrade, you would expect the dangerous output to become harder to obtain. It didn't. What changed is not the availability of the result. What changed is the paper trail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Not a safety upgrade. A chain of custody.
&lt;/h2&gt;

&lt;p&gt;Read the mechanism as a sequence and its real purpose becomes obvious:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Block.&lt;/strong&gt; The classifier flags the request as borderline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reroute.&lt;/strong&gt; It hands the request to Opus 4.8 instead of completing on Fable 5.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log.&lt;/strong&gt; The event is recorded, the flag is stamped, the interaction is captured.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notify.&lt;/strong&gt; The relevant parties are informed that a borderline request occurred.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is not containment. That is chain of custody. The point is not to stop the output from existing. The point is to ensure that when it exists, there is a record of who asked, when, and through which path. Regulators did not get a wall. They got an audit log. And for a lot of policy purposes, an audit log is what they actually wanted, because it converts an unmonitorable capability into a governable, attributable event.&lt;/p&gt;

&lt;p&gt;This is a meaningfully different thing from what the press release implies. The public framing is "we made the model safer." The mechanism is "we made the usage traceable." Those are not the same claim, and the gap between them is where the real policy lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  What they regulated is a model regulating a model
&lt;/h2&gt;

&lt;p&gt;Sit with the recursion here. The safeguard is a classifier. A classifier is itself a model. So the object of regulation is a model whose job is to police another model. And a classifier, being a model, can be jailbroken like any other.&lt;/p&gt;

&lt;p&gt;Anthropic says as much in their own words: the safeguard is "probably impossible to make fully robust." That is not a hedge. It is the honest description of the situation. You have built a probabilistic gate to guard a probabilistic system, and both are susceptible to adversarial input. The muzzle is made of the same material as the thing it is muzzling.&lt;/p&gt;

&lt;p&gt;This matters because it changes what "compliance" even means. Compliance is no longer a binary property of the model. It is the current, defeatable state of a classifier that sits in front of it. Regulate that, and you have regulated something that can be talked around by a sufficiently clever prompt. The control is real, but it is soft, and everyone building on it should understand that it is soft. It is closer to a spam filter than a lock.&lt;/p&gt;

&lt;h2&gt;
  
  
  Same weights, two labels
&lt;/h2&gt;

&lt;p&gt;Now the commercial structure clicks into place. The same underlying weights ship two ways. They ship as Mythos to a vetted circle, cleared, unmuzzled, trusted. And they ship as Fable to everyone else, wrapped in the classifier, the rerouting, the logging.&lt;/p&gt;

&lt;p&gt;The intelligence is identical. What differs is the muzzle and who is trusted to operate without one. That is the entire product distinction. The model was never the product. The muzzle is the product. Access to the unmuzzled version is the premium tier, and clearance to skip the classifier is the thing of value.&lt;/p&gt;

&lt;p&gt;This is why I keep saying the &lt;a href="https://dev.to/blog/model-wars-are-over-clearance-wars-begin"&gt;model wars are over and the clearance wars are beginning&lt;/a&gt;. When the capability is ambient and the weights are shared, the only remaining lever is who is trusted to run them without a governor. That lever is not technical. It is political and institutional, and it is exactly where the value is migrating.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this framing beats the official one
&lt;/h2&gt;

&lt;p&gt;If you take the official story at face value, you will make bad predictions. You will expect regulation to make capabilities disappear, and it won't, because the capability is everywhere and un-recallable. You will expect safeguards to be robust, and they aren't, because they are jailbreakable classifiers. You will expect the model to be the regulated object, and it isn't, because two labels ship from the same weights.&lt;/p&gt;

&lt;p&gt;Take the muzzle framing instead and your predictions get sharper:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Regulation will increasingly target monitoring and attribution, not capability, because capability can't be un-shipped.&lt;/li&gt;
&lt;li&gt;Safeguards will be soft controls, defeatable and probabilistic, marketed as hard ones.&lt;/li&gt;
&lt;li&gt;The commercial frontier moves to clearance: who gets the unmuzzled weights, and who is stuck with the governor.&lt;/li&gt;
&lt;li&gt;"Safety" and "traceability" will be used interchangeably in press releases, even though only one of them is actually being delivered.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fable 5's control fired on a borderline exploit that Opus 4.8, GPT-5.5, Haiku 4.5, and Sonnet 4.6 could all reproduce. The capability was never unique.&lt;/li&gt;
&lt;li&gt;You can't export-control math everyone has, so regulation targeted whether the safeguard holds, not the capability itself.&lt;/li&gt;
&lt;li&gt;When Fable 5 blocks a request it reroutes to Opus 4.8, which produces the same output. The capability never left; only the label changed.&lt;/li&gt;
&lt;li&gt;Block → reroute → log → notify is chain of custody, not containment. Regulators got an audit log, not a wall.&lt;/li&gt;
&lt;li&gt;The safeguard is a classifier, itself a model, and jailbreakable. Anthropic calls it "probably impossible to make fully robust."&lt;/li&gt;
&lt;li&gt;Same weights ship as unmuzzled Mythos to a vetted circle and muzzled Fable to everyone else. The muzzle is the product.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The uncomfortable conclusion is that AI regulation, as currently practiced, does not regulate intelligence. It regulates the paperwork around intelligence. That may even be the right call given that the capability cannot be recalled. But we should be honest about what is being sold. The model is free to think what it thinks. What is governed is the record, the routing, and the clearance. If you want the map of where that leads, start with the &lt;a href="https://dev.to/michal-piszczek"&gt;manifest&lt;/a&gt; and the &lt;a href="https://dev.to/michal-piszczek#joule-wars"&gt;Joule Wars&lt;/a&gt;. The model was never the product. The muzzle is.&lt;/p&gt;

</description>
      <category>aipolicy</category>
    </item>
    <item>
      <title>Capability Is Commoditizing. Cost Is the Frontier.</title>
      <dc:creator>Michał Piszczek</dc:creator>
      <pubDate>Wed, 01 Jul 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/pich/capability-is-commoditizing-cost-is-the-frontier-1c5g</link>
      <guid>https://dev.to/pich/capability-is-commoditizing-cost-is-the-frontier-1c5g</guid>
      <description>&lt;p&gt;Anthropic shipped Claude Sonnet 5. On knowledge work it edges out Opus 4.8, its own flagship, at roughly half the price. The benchmark table isn't the story. The price column is.&lt;/p&gt;

&lt;p&gt;Everyone read the launch the same way: another model, another set of numbers, ho-hum, the leaderboard shuffles again. That is the wrong column to be reading. The mid-tier model just matched the flagship on the work that actually gets paid for, and it did it at a fraction of the cost. When that happens, you are not looking at a product update. You are looking at a phase change in what the market is willing to pay for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the price column, not the benchmark
&lt;/h2&gt;

&lt;p&gt;Here are the numbers that matter. On GDPval-AA, the knowledge-work benchmark, Sonnet 5 scores 1618 against Opus 4.8's 1615. The mid-tier passed the flagship. On Humanity's Last Exam with tools, it is 57.4% versus 57.9%, a difference well inside rounding error. On the work that maps to what knowledge workers actually do, these two models are indistinguishable.&lt;/p&gt;

&lt;p&gt;Now the pricing. Sonnet 5 launches at $2 per million input tokens and $10 per million output at the introductory rate, settling to $3 and $15. Opus 4.8 is $5 and $25. Same class of work, at roughly 40% of the cost. That is not a discount. That is a repricing of the entire capability tier.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The moment a capability stops being scarce, the market reprices around delivery, not intelligence.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When the premium product and the mid-tier product do the same job, the premium is no longer buying capability. It is buying a slightly better result on the tail, for the cases where the last fraction of a percent matters. For the vast majority of knowledge work, that tail is irrelevant, and the market knows it. The price column is where that knowledge shows up first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compute did it. Storage did it. Bandwidth did it.
&lt;/h2&gt;

&lt;p&gt;This is not a novel event in the history of technology. It is the single most reliable pattern we have. Every foundational capability follows the same arc from scarce and premium to abundant and priced-by-delivery.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Compute.&lt;/strong&gt; A cycle was once a rationed resource you scheduled time on. Now it is a commodity you rent by the second and never think about.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage.&lt;/strong&gt; A megabyte was a budget line. Now storage is effectively free and the cost that matters is moving and querying the data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bandwidth.&lt;/strong&gt; A bit over the wire was metered and precious. Now the pipe is assumed and the value moved to what flows through it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In every case the capability did not disappear. It became the floor. And once it was the floor, the entire market repriced around the thing that was still scarce: delivery, integration, reliability, and cost at scale. Intelligence is now walking the same path. The capability to do frontier-grade agentic knowledge work is becoming the floor, not the ceiling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frontier-grade is now the default tier
&lt;/h2&gt;

&lt;p&gt;The most telling signal is not in the benchmark or the price. It is in the distribution. Sonnet 5 is the model free and Pro users get by default. Frontier-grade agentic work is no longer the thing you pay up for. It is the thing you get when you don't pay attention. The premium tier and the default tier now overlap on capability.&lt;/p&gt;

&lt;p&gt;Think about what that does to product strategy. If your entire pitch was "we have access to the best model," you no longer have a pitch, because the best-in-class-for-the-task model is the commodity default. The differentiation has to move somewhere else, and there are only a few places it can go: the data you feed the model, the harness you run it in, and the cost at which you can finish the job. I've argued the data point separately in &lt;a href="https://dev.to/blog/models-are-commodities-clean-data-is-not"&gt;models are commodities, clean data is not&lt;/a&gt;, and the harness point in &lt;a href="https://dev.to/blog/route-by-task-not-vendor-open-weight-ai-architecture"&gt;route by task, not by vendor&lt;/a&gt;. When capability is uniform, routing to the cheapest sufficient model per task is not a nice-to-have. It is the architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  The question changed. Notice which one.
&lt;/h2&gt;

&lt;p&gt;For two years the operative question was: &lt;em&gt;can the model do the task?&lt;/em&gt; That question is now boring, because for most tasks the answer is yes, from the default tier, for a couple of dollars per million tokens. The interesting question is a different one entirely:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does the task cost to finish, at scale, with nobody watching?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every clause in that sentence is load-bearing. &lt;em&gt;Cost to finish&lt;/em&gt;, not cost per call, because agentic work chains many calls and the total is what hits the invoice. &lt;em&gt;At scale&lt;/em&gt;, because a workflow that pencils out at ten runs a day can bankrupt you at ten million. &lt;em&gt;With nobody watching&lt;/em&gt;, because the economics only work if the agent completes autonomously, without a human babysitting each step and eating the real cost, which is salary, not tokens.&lt;/p&gt;

&lt;p&gt;This reframes the whole build calculus. You are no longer selecting the smartest model. You are engineering the cheapest reliable completion of a unit of work. That is an economics and execution problem, not a capability problem. The same underlying force is why I've argued &lt;a href="https://dev.to/blog/openai-economics-gpu-constrained-not-demand-constrained"&gt;the constraint is GPUs, not demand&lt;/a&gt;. When capability is abundant and cheap, demand explodes to meet supply, and the binding constraint becomes the physical cost of serving it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What operators should do about it
&lt;/h2&gt;

&lt;p&gt;If capability is commoditizing and cost is the frontier, then the winning moves are unglamorous and entirely about execution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Instrument cost per completed task, not per token.&lt;/strong&gt; The token price is a red herring. Measure what it costs to finish a real unit of work end to end.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Default to the cheapest sufficient model and route up only on the tail.&lt;/strong&gt; Reserve the flagship for the fraction of cases where the last percent actually pays.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design for unattended completion.&lt;/strong&gt; The moment a human has to watch, your cost model is dominated by labor and the token savings are noise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Move differentiation to data, harness, and reliability.&lt;/strong&gt; Capability is the floor now. Your edge lives in the layers the commodity model can't provide.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Sonnet 5 matches Opus 4.8 on knowledge work (GDPval-AA 1618 vs 1615) at roughly 40% of the cost. The mid-tier passed the flagship.&lt;/li&gt;
&lt;li&gt;When the premium and mid-tier do the same job, the premium stops buying capability and starts buying a marginal tail.&lt;/li&gt;
&lt;li&gt;Compute, storage, and bandwidth all commoditized the same way. Intelligence is now the floor, not the ceiling.&lt;/li&gt;
&lt;li&gt;Frontier-grade agentic work is the default tier free and Pro users get, not the tier you pay up for.&lt;/li&gt;
&lt;li&gt;The question shifted from "can the model do it" to "what does the task cost to finish, at scale, with nobody watching."&lt;/li&gt;
&lt;li&gt;Differentiation moves to data, harness, reliability, and cost per completed task. Capability alone is no longer a moat.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The leaderboard-watchers are optimizing the wrong variable. They are still asking whether the model is smart enough, a question the market has already answered and priced to the floor. The operators who win the next cycle are asking what it costs to finish the work when the intelligence is free and the only scarce thing left is disciplined, unattended, economical execution. Capability is commoditizing. Cost is the new frontier. For the wider thesis, the &lt;a href="https://dev.to/michal-piszczek"&gt;manifest&lt;/a&gt; and the &lt;a href="https://dev.to/michal-piszczek#joule-wars"&gt;Joule Wars&lt;/a&gt; lay out where the joules, and the margins, actually go.&lt;/p&gt;

</description>
      <category>aieconomics</category>
    </item>
    <item>
      <title>Route by Task, Not Vendor: The Open-Weight AI Stack</title>
      <dc:creator>Michał Piszczek</dc:creator>
      <pubDate>Wed, 01 Jul 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/pich/route-by-task-not-vendor-the-open-weight-ai-stack-4edl</link>
      <guid>https://dev.to/pich/route-by-task-not-vendor-the-open-weight-ai-stack-4edl</guid>
      <description>&lt;p&gt;Six months ago, "move your AI workloads to open Chinese models" was a thought experiment you floated in a strategy deck to sound forward-looking. Now it is a procurement story with real invoices attached. The migration is already happening at names you know, and it is not being driven by ideology. It is being driven by arithmetic.&lt;/p&gt;

&lt;p&gt;Airbnb moved to Qwen, Alibaba's open-weight family. CEO Brian Chesky described it plainly: "very good, fast and cheap." It powers their support agent. Cursor built its Composer coding model on Moonshot's open weights, shipping as Kimi K2.5. Microsoft has been hosting and testing DeepSeek V4 inside Azure Foundry and Copilot. Shopify, Coinbase, Siemens, and Uber Eats have all been reported routing real production workloads to Qwen, GLM, Kimi, or DeepSeek.&lt;/p&gt;

&lt;p&gt;None of them "switched to the best model." That framing misreads the entire decision. Each of them moved the right task to a cheaper open-weight model sitting within a few points of frontier. The distinction matters more than any benchmark leaderboard, because it inverts the question everyone has been asking.&lt;/p&gt;

&lt;h2&gt;
  
  
  The question was never "which model is best?"
&lt;/h2&gt;

&lt;p&gt;For three years the industry has treated model selection as a single global decision. You pick the smartest model, you wire everything to it, you feel safe. That instinct is expensive and increasingly wrong. The real question is narrower and far more useful: which task actually needs the best model?&lt;/p&gt;

&lt;p&gt;Look at what production traffic is actually made of. The overwhelming majority of it is the boring 80% — extraction, classification, summarization, routing, simple tool calls, reformatting, deduplication. This is plumbing. It does not require a model that can reason through a novel proof or design a distributed system. It requires a model that is competent, fast, and cheap.&lt;/p&gt;

&lt;p&gt;Frontier models are priced for the hard 20% — the genuinely difficult reasoning, the long-horizon planning, the cases where an extra few points of quality translate into measurable business value. That is what you are paying a premium for. When you send the easy 80% through a frontier API, you are paying that premium on every request that never needed it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Paying frontier prices for the easy 80% is one of the biggest sources of AI budget waste in production today.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Route by task, not by vendor
&lt;/h2&gt;

&lt;p&gt;The architecture that follows is not exotic. It is a routing table. You classify the task, then you send it to the cheapest model that clears the quality bar for that task. In practice, a stack that holds up in production looks something like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reasoning&lt;/strong&gt; — GLM or Kimi, which now sit close enough to frontier that the gap rarely shows up in real workloads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code&lt;/strong&gt; — Kimi Code or Qwen Coder for the bulk of generation and refactoring.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agents and tool calls&lt;/strong&gt; — GLM, which handles structured tool invocation reliably at a fraction of closed-API cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bulk processing&lt;/strong&gt; — MiMo, where you are grinding through volume and latency-per-dollar dominates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Images and video&lt;/strong&gt; — fine-tuned LTX plus Wan, tuned to your own domain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local workhorse&lt;/strong&gt; — Qwen3.6-35B-A3B, the model that runs on your own hardware and quietly handles the daily grind.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Almost all of these are open-weight, self-hostable, close to frontier, and a fraction of the cost. This is the same principle that runs underneath &lt;a href="https://dev.to/blog/capability-is-commoditizing-cost-is-the-frontier"&gt;capability commoditizing while cost becomes the frontier&lt;/a&gt;: when the models converge on quality, the differentiation moves to how efficiently you deploy them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Savings are the visible win. Ownership is the real one.
&lt;/h2&gt;

&lt;p&gt;The cost delta is what gets the CFO's attention, and it is real. But savings are not the point. The point is that you own the stack. When the core of your system runs on weights you hold, nobody can switch you off. Nobody can revoke your access on their timeline. Nobody can see your data, dictate your pricing, or quietly reshape your roadmap by changing theirs.&lt;/p&gt;

&lt;p&gt;That is a business-continuity property, not a line item. It is the same argument that sits underneath the question of &lt;a href="https://dev.to/blog/who-owns-your-harness"&gt;who owns your harness&lt;/a&gt; — the orchestration layer that actually knows how your company works. Open weights are the only ones nobody outside your walls can turn off.&lt;/p&gt;

&lt;h2&gt;
  
  
  Clearing up the "my data goes to China" reflex
&lt;/h2&gt;

&lt;p&gt;There is a reflexive objection worth killing directly. "Chinese model equals my data goes to China" is simply wrong for open weights. Open weights run on your infrastructure. The weights may originate in a lab in Hangzhou or Beijing, but the weights are a static artifact — a file of numbers. When you self-host them, your data never leaves your servers. It goes to your GPUs, not theirs.&lt;/p&gt;

&lt;p&gt;This is why the real boundary is not American versus Chinese. It is open-weight versus closed. A closed American API can log your prompts, change its terms, and go dark on a government's schedule. A set of open weights running in your own datacenter cannot do any of those things, regardless of which country trained it. The nationality of the training run is a distraction; the deployment topology is the actual security boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to still pay for closed
&lt;/h2&gt;

&lt;p&gt;None of this means closed models are obsolete. They still lead on some cinematic, high-stakes workloads where the last few points of quality genuinely move the needle. The discipline is to pay for a closed model when the quality gap creates measurable business value — not by default, not out of habit, and not because it is the name everyone recognizes.&lt;/p&gt;

&lt;p&gt;The rule is simple to state and harder to enforce: open-source first, self-host the core, pay for frontier only where it creates value you cannot get elsewhere. Enforcing it means building a routing layer, maintaining evals per task, and resisting the temptation to route everything to the smartest model because it is easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The right question is not "which model is best?" but "which task actually needs the best?"&lt;/li&gt;
&lt;li&gt;Most production traffic is the boring 80% — extraction, classification, routing — and frontier pricing on it is pure waste.&lt;/li&gt;
&lt;li&gt;Route by task, not vendor: match each workload to the cheapest model that clears its quality bar.&lt;/li&gt;
&lt;li&gt;Open weights self-hosted mean your data never leaves your servers, whatever the model's country of origin.&lt;/li&gt;
&lt;li&gt;The real boundary is open-weight versus closed, not American versus Chinese.&lt;/li&gt;
&lt;li&gt;Pay for closed models only where the quality gap creates business value you cannot get otherwise.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The race stopped being about the smartest model. It became about architecture that still works when today's smartest model is unavailable, unaffordable, or switched off. I write more about that shift across my &lt;a href="https://dev.to/michal-piszczek"&gt;essays on execution and AI infrastructure&lt;/a&gt;. Build the routing table now, while it is still a competitive edge rather than table stakes.&lt;/p&gt;

</description>
      <category>aiarchitecture</category>
    </item>
    <item>
      <title>Who Owns Your Harness? The Layer Above the Model</title>
      <dc:creator>Michał Piszczek</dc:creator>
      <pubDate>Tue, 30 Jun 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/pich/who-owns-your-harness-the-layer-above-the-model-5ca2</link>
      <guid>https://dev.to/pich/who-owns-your-harness-the-layer-above-the-model-5ca2</guid>
      <description>&lt;p&gt;Lately I find myself less interested in which model wins and far more interested in who owns the layer above the model. The benchmark wars — GLM versus Claude versus GPT versus Qwen versus DeepSeek — are already yesterday's conversation. Models improve fast and get cheaper faster. Open-source is closing the gap ahead of every schedule people drew a year ago. So "which model should we use?" is not the question. It never was.&lt;/p&gt;

&lt;p&gt;The question that actually determines whether your company survives a bad quarter in AI policy is this: can we replace the model tomorrow? If the honest answer is no, you have already made the most expensive architectural decision of the decade without noticing.&lt;/p&gt;

&lt;h2&gt;
  
  
  You think you're buying AI. You're wiring an operating system.
&lt;/h2&gt;

&lt;p&gt;Most companies believe they are buying AI the way they buy a database or a cloud region — a component, swappable, bounded. What they are actually doing is wiring their entire execution layer around a single vendor. The prompts. The memory. The agents. The routing logic. The evals. And then every integration on top: Slack, Jira, GitHub, the internal tools, the accumulated company knowledge that no one wrote down anywhere else.&lt;/p&gt;

&lt;p&gt;Bit by bit, the model stops being a model. It becomes the operating system of the business. Every workflow assumes its quirks. Every prompt is tuned to its behavior. Every engineer's mental model of "how our AI works" is really a mental model of one vendor's API. That is where lock-in begins — not in a contract clause, but in a thousand small couplings nobody tracked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lock-in stopped being a commercial inconvenience
&lt;/h2&gt;

&lt;p&gt;For most of software history, lock-in was a negotiating problem. You paid a switching cost, you grumbled, you migrated over a quarter. Annoying, survivable. That era is over for AI. Lock-in became a business-continuity risk, and recent events proved it in the harshest way possible.&lt;/p&gt;

&lt;p&gt;A single US export-control order took Anthropic's top models — Mythos 5 and Fable 5 — offline for two weeks. Not just for foreign users. To stay compliant, they were pulled for everyone worldwide, the United States included. Every company that had wired its product around those models lost its core capability overnight, through no decision of its own.&lt;/p&gt;

&lt;p&gt;Days later, GPT-5.6 shipped only as a gated, US-only preview, after Washington reportedly asked OpenAI to hold the launch. Two data points, one lesson: the model under your product can go dark on a government's timeline, not yours.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Closed is closed the moment someone decides it's closed to you — and that someone may not be your vendor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That last clause is the whole point. You can have a perfect relationship with your model provider, pay every invoice on time, and still lose access because a regulator three time zones away signed an order. Your vendor's goodwill is irrelevant when the constraint sits above the vendor. This is the shift I described in &lt;a href="https://dev.to/blog/model-wars-are-over-clearance-wars-begin"&gt;the model wars ending and the clearance wars beginning&lt;/a&gt;: capability now ships when it clears, not when it's ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  The default has to flip: open-source first
&lt;/h2&gt;

&lt;p&gt;The conclusion writes itself. The default posture must invert. Open-source first — not because open models win every benchmark, because they do not yet, but because open weights are the only ones nobody can switch off. A file of weights sitting on your own hardware does not care what any government decides next week. It is inert, and it is yours.&lt;/p&gt;

&lt;p&gt;Keep closed models for the frontier edge, the genuinely hard workloads where the quality gap earns its premium. But the core you cannot afford to lose should sit on weights you actually hold. This is the same architecture I lay out in &lt;a href="https://dev.to/blog/route-by-task-not-vendor-open-weight-ai-architecture"&gt;routing by task, not vendor&lt;/a&gt;: self-host the core, pay for frontier only where it creates value you can't get elsewhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Above the model sits the harness
&lt;/h2&gt;

&lt;p&gt;And above every model — open or closed — sits the harness. This is the layer that actually matters, and it should be vendor-agnostic by design. The harness owns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Memory&lt;/strong&gt; — what your system remembers across sessions, users, and workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context&lt;/strong&gt; — how the right information reaches the model at the right moment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Routing&lt;/strong&gt; — which task goes to which model, and the fallback when one goes dark.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permissions&lt;/strong&gt; — who and what is allowed to do which action.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tools&lt;/strong&gt; — the integrations that let the model act on your actual systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evals&lt;/strong&gt; — how you know quality held after you swapped a model underneath.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orchestration&lt;/strong&gt; — the logic that ties it all into something that works.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The harness is the part that actually knows how your company works. The model is a replaceable engine bolted into it. If your harness is well-built and vendor-agnostic, swapping models is a config change and a re-run of your evals. If it is not — if the harness and the vendor are the same thing — then a model going dark takes your whole business with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The highest-ROI call of the decade
&lt;/h2&gt;

&lt;p&gt;Building your own harness is slower and costlier today. There is no way around that. It is more engineering, more discipline, more upfront investment than plugging into one vendor's SDK and shipping. That is exactly why most teams will not do it until they are forced to.&lt;/p&gt;

&lt;p&gt;But it may be one of the highest-ROI calls of the decade. Models come and go. Governments reshuffle who gets access to what, and on what timeline. Your company brain — the accumulated knowledge, workflows, and judgment encoded in your execution layer — should depend on neither. It should sit in a harness you own, feeding whichever model happens to be best, cheapest, and available this month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The right question is not "which model do you use?" but "can you replace it tomorrow?"&lt;/li&gt;
&lt;li&gt;Companies think they're buying AI; they're wiring their whole execution layer around one vendor.&lt;/li&gt;
&lt;li&gt;Lock-in became a business-continuity risk — a single export order pulled Anthropic's top models worldwide for two weeks.&lt;/li&gt;
&lt;li&gt;Closed is closed the moment someone decides it's closed to you, and that someone may not be your vendor.&lt;/li&gt;
&lt;li&gt;Default to open-source for the core; open weights are the only ones nobody can switch off.&lt;/li&gt;
&lt;li&gt;Own the harness — memory, context, routing, permissions, tools, evals, orchestration — and models become swappable engines.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We are going to stop asking "which model do you use?" and start asking who owns your harness. I write about that transition and the architecture it demands across my &lt;a href="https://dev.to/michal-piszczek"&gt;essays on AI infrastructure and execution&lt;/a&gt;. The teams that build the harness now will be the ones still running when the next model goes dark.&lt;/p&gt;

</description>
      <category>aiarchitecture</category>
    </item>
    <item>
      <title>The Biggest Customer Becomes the Competitor</title>
      <dc:creator>Michał Piszczek</dc:creator>
      <pubDate>Sat, 27 Jun 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/pich/the-biggest-customer-becomes-the-competitor-3p89</link>
      <guid>https://dev.to/pich/the-biggest-customer-becomes-the-competitor-3p89</guid>
      <description>&lt;p&gt;OpenAI designed its own AI chip in nine months and aimed it straight at Nvidia, the supplier it cannot survive without. Codenamed Jalapeño, co-designed with Broadcom. The bill forced the move.&lt;/p&gt;

&lt;p&gt;A custom chip usually takes two to three years from design to working silicon. OpenAI did it in nine months. The compression is not a footnote; it is the whole point. OpenAI used its own models to accelerate the design cycle, turning frontier inference back onto the problem of building the hardware that runs frontier inference. The snake ate part of its own tail, and the tail grew back faster.&lt;/p&gt;

&lt;p&gt;Jalapeño is inference-only. It is tuned for the workloads OpenAI actually runs at scale: ChatGPT, Codex, the API, agents. It is not built for training. That narrowing is deliberate, and it is where the leverage lives. When you know your workload down to the token, you can throw away everything a general-purpose GPU carries to serve a thousand customers you are not. Early tests claim better performance-per-watt than today's best GPUs. At gigawatt scale, performance-per-watt is not a spec-sheet vanity metric. It is the P&amp;amp;L.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern is older than OpenAI
&lt;/h2&gt;

&lt;p&gt;This is not a surprise if you have watched infrastructure economics before. Google built TPUs because renting general-purpose accelerators for search and ads and, later, Gemini stopped making sense at their volume. Amazon built Trainium and Inferentia because AWS could not let the margin on every AI workload flow to a single supplier. Now OpenAI builds Jalapeño for exactly the same reason, and the reason is arithmetic.&lt;/p&gt;

&lt;p&gt;The rule generalizes: the biggest customer always becomes the next competitor, because the bill forces it. When you are a small buyer, renting is obviously correct. The vendor amortizes billions in R&amp;amp;D across thousands of customers, and your slice is cheap. When you become the largest single consumer of a component, the math inverts. You are now underwriting a meaningful fraction of the vendor's margin, and that margin is a tax you pay on your own scale. At some volume, designing the thing yourself is cheaper than renting it, and every dollar of vendor margin you eliminate is a dollar that compounds.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Renting compute is a cost. Designing it is a moat. The difference is who owns the workload.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Old stack, new stack
&lt;/h2&gt;

&lt;p&gt;The old stack was simple and stable. One vendor designs the silicon. Everyone else rents it. Nvidia sat at the top of that pyramid, and the pyramid was the entire industry. Access to Nvidia was the bottleneck, and allocation of Nvidia's chips was a story that moved markets. Whoever got the biggest allocation won the round.&lt;/p&gt;

&lt;p&gt;The new stack rearranges the pyramid. The buyer designs the silicon, and the vendor becomes optional. Not eliminated, optional. That word does a lot of work. OpenAI will still buy Nvidia for training, for burst capacity, for the workloads where a general-purpose part still wins. But the strategic dependency loosens the moment a credible in-house alternative exists for the workload that dominates the bill. The bottleneck moves from access to Nvidia to ownership of the workload. Once you own the workload end to end, you get to decide how much of it to rent and how much to build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why inference, and why now
&lt;/h2&gt;

&lt;p&gt;Inference is the right place to start vertical integration, and the timing is not an accident. Training is bursty, experimental, and moves with the research frontier; the workload changes shape every few months, which punishes custom silicon built around fixed assumptions. Inference at OpenAI's scale is the opposite. It is enormous, steady, and increasingly well understood. The company serves the same handful of model architectures to hundreds of millions of users, billions of times a day. That is exactly the profile that rewards a chip designed for one job and stripped of everything else.&lt;/p&gt;

&lt;p&gt;The economics compound with agents. As I have argued in &lt;a href="https://dev.to/blog/the-unit-of-work-is-the-agent-hour"&gt;the unit of work is the agent-hour&lt;/a&gt;, output is going parallel: work is no longer bounded by human hours but by how many agents you can run at once. Every one of those agent-hours is inference. The inference bill is not a fixed cost you optimize once; it is the growth curve itself. Owning the silicon under that curve is owning the cost structure of your own future.&lt;/p&gt;

&lt;h2&gt;
  
  
  What OpenAI is really buying
&lt;/h2&gt;

&lt;p&gt;Read past the chip and you can see what OpenAI is actually acquiring. It is not just cheaper tokens. It is control over its own cost curve, its own roadmap, and its own supply chain in a market where compute is the binding constraint. As I have written in &lt;a href="https://dev.to/blog/openai-economics-gpu-constrained-not-demand-constrained"&gt;OpenAI is GPU-constrained, not demand-constrained&lt;/a&gt;, the company's growth ceiling is set by silicon it does not manufacture. Jalapeño is the structural answer to that constraint. It is the first chip in a multi-generation roadmap, which tells you this was never a one-off experiment. It is a commitment to owning the bottom of the stack.&lt;/p&gt;

&lt;p&gt;Here is the framework I use to decide when a big buyer should stop renting and start building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Volume concentration.&lt;/strong&gt; When one workload dominates your spend, the vendor's margin on that workload becomes your largest controllable cost. Concentration is the trigger.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workload stability.&lt;/strong&gt; Custom silicon rewards a job that will not change shape for years. Inference qualifies; frontier training does not, yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design-cycle leverage.&lt;/strong&gt; If you can compress the two-to-three-year chip cycle, as OpenAI did with its own models, the payback window shrinks and the bet gets far safer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strategic optionality.&lt;/strong&gt; Even a good-enough in-house part changes your negotiating position with the incumbent vendor. The threat of building is worth money before the chip ships.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Roadmap commitment.&lt;/strong&gt; One chip is a science project. A multi-generation roadmap is a business decision. Only the second one moves the moat.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What breaks next
&lt;/h2&gt;

&lt;p&gt;If the largest AI buyers all vertically integrate, Nvidia does not disappear, but its position changes. It moves from the sole source of frontier compute toward a supplier of training and burst capacity, competing against the in-house parts of its biggest former customers. That is a different, thinner business than owning the entire pyramid. The interesting question is not whether Nvidia survives, it will, but what the market looks like when the five buyers who matter most each design the silicon for their own dominant workload.&lt;/p&gt;

&lt;p&gt;The deeper shift is about where value accrues. For a decade, the story was that whoever controlled the scarce input, the chips, controlled the industry. Jalapeño is evidence that the scarce input is being routed around by the buyers with enough volume to justify the engineering. Value migrates from owning the general-purpose component to owning the specific workload well enough to build the component yourself. The bottleneck moved from access to ownership, and ownership is the more durable position.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;OpenAI designed Jalapeño, an inference-only chip, in nine months versus the usual two to three years, using its own models to compress the cycle.&lt;/li&gt;
&lt;li&gt;The move follows a rule: the biggest customer becomes the next competitor, because concentrated volume turns vendor margin into your largest controllable cost.&lt;/li&gt;
&lt;li&gt;Google (TPU) and Amazon (Trainium) ran this playbook first. OpenAI is the newest instance, not a novel one.&lt;/li&gt;
&lt;li&gt;Inference is the right entry point for vertical integration: enormous, steady, and well understood, unlike frontier training.&lt;/li&gt;
&lt;li&gt;The bottleneck moved from access to Nvidia to ownership of the workload. Renting compute is a cost; designing it is a moat.&lt;/li&gt;
&lt;li&gt;A multi-generation roadmap, not a single chip, is what turns this from a science project into a structural change in the market.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The chip allocation era trained everyone to watch who got the most GPUs. That was the old bottleneck. The new one is quieter: which buyers understand their own workload well enough to stop renting and start building. For the wider map of how compute, clearance, and control connect, start with the &lt;a href="https://dev.to/michal-piszczek"&gt;manifest&lt;/a&gt; and the &lt;a href="https://dev.to/michal-piszczek#joule-wars"&gt;Joule Wars&lt;/a&gt; thesis. The supplier you cannot survive without is the one you eventually have to replace.&lt;/p&gt;

</description>
      <category>aiinfrastructure</category>
    </item>
  </channel>
</rss>
