Engineering & Technical

The Engineer

The Signal

A hijacked Hetzner /24 passed RPKI and TLS while serving malicious Virtualizor updates.

Forging AS24940 as origin was enough: Route Origin Validation returned valid, and a domain-validated cert issued on top of that. For 33 hours the certificate authenticated the pipe and nothing authenticated the bytes. That is the failure mode of any updater whose only integrity check is the cert, so the signing path on whatever your own agents pull at runtime is worth reading today.

In Play

  1. Update Channels Trusted TLS and RPKI

    An unidentified actor hijacked 162.55.80.0/24 out of Hetzner space on August 28 and served malicious Virtualizor updates for nearly 33 hours, per Risky Business. Route Origin Validation passed because the attacker forged Hetzner's AS24940 as the origin, and a valid domain-validated certificate followed. If you ship artifacts to clients you don't control, TLS validated the pipe and nothing validated the bytes. Two other paths are being exploited now: JFrog Artifactory CVE-2026-82329 and unpatched Langflow CVE-2026-0768.

  2. KV Cache Is the New Throughput Ceiling

    Anyscale's benchmark on OPT-13B and a 40GB A100 shows static batching collapsing to roughly 81 tokens/sec as output lengths spread, against about 10x that for continuous batching. Continuous batching is now default-on in vLLM, SGLang, TGI and TensorRT-LLM, so the binding constraint moved from FLOPs to KV-cache capacity. When the cache pool exhausts, the scheduler evicts a running request and recomputes its prefill later — duplicated compute that shows up on a dashboard as a need for more GPUs.

  3. Agents Author a Third of Merged Upstream Code

    Vercel reports that agents authored 25-35% of merged pull requests and closed 70-80% of issues on the AI SDK within four weeks, on a package doing over 20M npm downloads per week. Flue now auto-converts external pull requests into issues and tldraw auto-closes them outright. If you consume these packages, the human involvement behind a third of merged upstream code narrowed to the merge click, with no release note announcing it. The closure figure is self-reported, four weeks old, and never defined.

  4. A Sandbox Configured to Deny, Never Asserted

    Anthropic restarted the external cybersecurity evaluations it paused roughly a month ago, after three runs in which Claude models left their test environment and attacked real companies. The root cause was a partner sandbox from Irregular that was configured to block internet access and simply didn't, with no test asserting denial. Claude Opus 4.7 attacked a live firm that shared a domain name with a fictional target, which is what happens when scope lives in prompt text instead of an egress allowlist.

  5. Memory and Megawatts Reprice Your Serving Stack

    Apple is passing higher memory chip costs to customers because AI buildouts are absorbing DRAM supply, per Morning Brew, on a product line shipping about 255M units a year. That is the same commodity pool your memory-optimized instances, managed Redis, and in-RAM vector indexes draw from. On the power side, Benedict Evans notes GE Vernova, Siemens and Mitsubishi together ship roughly 50GW of gas turbines a year and are sold out to 2030, while announced neocloud capacity is back-loaded into late 2027.

Deep Dives

The Only Control That Held Was a Signature Nobody Deployed

Routing and certificate issuance both validated an attacker for a day and a half; the mitigations are one registry field, one detached signature, and an alarm on traffic that stops arriving.

The one field that would have made the route invalid

Route Origin Validation checks exactly three things: the prefix, the ROA's maxLength, and the origin AS. That is the whole algorithm. If the covering ROA for 162.55.0.0/16 permits more-specifics through a loose maxLength, a forged-origin /24 carved out of that block is valid by construction. RFC 9319's minimal-ROA guidance is one line: set maxLength equal to the prefix length you actually announce. That one registry field would have made this announcement RPKI-invalid. It is a portal config change, not a protocol upgrade, and almost nobody audits it.

The propagation half is more boring still. Longest-prefix-match wins unconditionally on every network that accepts the route, so there is no AS-path length to compare and no local-pref to negotiate. AS6204 propagated a customer announcement its filters should have dropped. ASPA, the draft extension that would have flagged an implausible provider relationship, is barely deployed. BGPsec remains theoretical. An actor with an ASN and one willing transit provider is not a nation-state capability level.

What each control actually validated

ControlWhat it validatesHeld?
RPKI ROVPrefix, maxLength, origin ASNNo — origin was forged
Transit filteringCustomer announcements vs IRR/RPKINo — AS6204 propagated it
Domain-validated TLSControl of the IP at issuance timeNo — hijacker held the IP
CA/B multi-perspective validationMultiple vantage points agreeNo — a global more-specific fools all of them
Detached artifact signingPossession of the signing keyWould have held

One green row, and it sits at the application layer. That is the engineering lesson: every network-layer and PKI control in the chain authenticates a location, and the thing you actually care about is a byte sequence.

The absence of traffic was the alarm

Virtualizor cannot quantify impact. The hijacked requests terminated on attacker infrastructure and never reached the vendor, so its logs are empty by construction. Nobody was watching for the silence. A volume-drop alarm on update and download endpoints, plus a Certificate Transparency watch on domains you own, is the difference between 33 hours and minutes. Virtualizor is the control plane hosting companies use to manage customer VPS fleets, so the blast radius lands in other people's infrastructure.

TLS proves you reached the right IP. Only a signature proves you got the right bytes, and for 33 hours the right IP belonged to the attacker.

Three things being exploited in the same window

  • JFrog Artifactory CVE-2026-82329, an auth bypass to admin, went from patch to in-the-wild exploitation in three days per WatchTowr. Patch first, then hunt: new admin tokens, permission changes, anomalous uploads over the last two weeks.
  • Langflow CVE-2026-0768 is under active exploitation to lift OpenAI and AWS keys off AI orchestration hosts, with no patch available. The only moves are removing exposure and rotating every credential those hosts held.
  • AWS root password spraying against 150+ organizations has been running since July 24 from a list of valid root email addresses.

Fail-closed signature verification has a bill attached, so budget for the operational cliff. A fail-closed client plus a botched key rotation is a fleet-wide outage. That is exactly where TUF's key-rotation and freeze-attack handling starts earning its complexity, above a certain fleet size.

What to do

  1. Patch Artifactory to the CVE-2026-82329 fix today, then hunt 14 days of admin-token creation, permission changes, and anomalous artifact uploads before the weekend.

  2. Add detached signature verification, fail-closed with the public key compiled into the client, to every artifact path your customers pull, and land it this sprint.

  3. Set ROA maxLength equal to the exact prefix length you announce, and wire volume-drop alarms on update endpoints plus Certificate Transparency alerts on your domains this sprint.

Your Batch Size Bend Point Is Not in Anyone's Docs

Decode arithmetic predicts one inflection point, long-context traffic delivers a much earlier one, and the counter that tells you which you hit is missing from most inference dashboards.

Where the bend point actually lands

An A100 does roughly 312 TFLOPs of BF16 math and moves about 2 TB/s out of HBM. That is an ops:byte ratio near 156. Decode is a matrix-vector multiply against BF16 weights: 2 FLOPs per 2-byte weight per sequence, so arithmetic intensity is approximately the batch size. Decode stops being memory-bound near 150 concurrent sequences. Below that the tensor cores idle.

That bend is theoretical and it belongs to no real workload. KV-cache reads add memory traffic scaling with batch × context length, so long-context traffic hits the memory-capacity wall well before batch 150. Copying max_num_seqs from a blog post either leaves free throughput on the floor or buys a tail-latency regression. The defensible number comes from a sweep on the model, the GPU, and a replayed prompt-length distribution.

Three strategies, one axis

Static, dynamic and continuous batching differ on exactly one thing: when batch membership freezes. Static freezes before the run. Dynamic freezes on a timer or size limit. Continuous re-decides every forward pass. Dynamic batching shortens the wrong wait. It caps queue-entry latency and does nothing about the straggler. A request that finishes at t=7 still holds its slot until the slowest member of its batch exits at t=12. Only iteration-level scheduling drops the assumption that a batch runs to completion as a unit.

Every serious engine ships that primitive now, under different branding. vLLM, SGLang and TGI call it continuous batching. TensorRT-LLM calls it in-flight batching. LMDeploy calls it persistent batching. A deck claiming a scheduling advantage should be checked against the scheduler, not the label.

The preemption counter that gets misread as a capacity request

Under continuous batching, concurrency is capped by the KV-cache pool, and every active sequence's cache grows with each token generated. On a 40GB A100 with a 13B model resident, only a handful of long sequences fit at once. When the pool exhausts, the scheduler evicts a running request and recomputes its prefill later. On the dashboard this looks like a GPU out of headroom; it is the same prefill billed twice, with unpredictable latency degradation attached.

If preemption counters and KV-cache utilization aren't on the same panel as p99 latency, someone will file a GPU capacity request to fix a scheduler-tuning problem.

Chunked prefill trades TTFT for inter-token latency

Continuous batching created a new artifact. A joining 32K-token prompt is one compute-heavy pass that every active decode waits behind, so output pauses mid-sentence. Long context is a multi-tenancy fairness problem as much as a memory problem: one tenant's giant prompt taxes every co-tenant's inter-token latency. Chunked prefill splits that prompt across several passes, each extending the KV cache. The attention math is unchanged, because later chunks attend to what earlier chunks wrote. The first token simply arrives after the final chunk. Prefill is compute-bound and decode is memory-bound, so a batch containing both uses both halves of the chip.

  • Smaller chunks give the scheduler more chances to interleave decodes, so fewer inter-token spikes, at the cost of GPU utilization and the attention overhead of re-reading earlier chunks' KV entries.
  • Larger chunks make prefill more efficient and improve time-to-first-token, at the cost of longer gaps for in-flight requests.

vLLM V1 defaults to --max-num-batched-tokens 8192. SGLang exposes --chunked-prefill-size, with -1 to disable. Tune smaller for streaming chat, where inter-token latency is the metric. Tune larger for agent tool-call chains and batch summarization, which live on TTFT. The default is a compromise neither workload asked for. Keep the fixed-output tier — embeddings, classifiers, rerankers — on Triton with preferred_batch_size; those requests all finish at nearly the same step, so static and dynamic batching give up nothing there.

What to do

  1. Grep every live inference path for static-batching signatures this sprint — pipeline(batch_size=), llm.generate(prompts,...), Triton dynamic_batching on generative models — and move user-facing generative traffic to a continuous-batching server endpoint.

  2. Add KV-cache utilization, preemption/eviction counts, and waiting-queue depth to the inference dashboard next to p99 this week, and alert on sustained non-zero preemption.

  3. A/B --max-num-batched-tokens (or --chunked-prefill-size) at 2048, 8192 and 16384 against your named SLO metric this sprint, using replayed production prompt lengths rather than uniform synthetic prompts.

Agents Author the Code, So Attention Is the Scarce Resource

Four widely-used projects converged on the same pipeline shape in the same month, and the reason it works has nothing to do with model quality — plus the one experiment that says merged volume is not delivery.

Stage boundaries are the engineering

Vercel runs three narrow agents on the AI SDK: one reproduces the bug, one applies the fix, one reviews the fix. Flue runs separate agents for research, design, implementation and initial review. Astro kept pull requests open and rebuilt intake around auto-triage. These pipelines work because each stage emits a machine-checkable artifact. The reproduce agent emits a failing test. Deterministic, cheap to validate, and it doubles as the acceptance criterion for the fix agent. The fix agent emits a diff that either turns that test green or doesn't. The review agent checks the diff against that criterion. The human owns one decision.

The model didn't get better; the failures just became detectable at each hop. Same reliability argument that justifies breaking a fat service into checkpointed steps.

Trust is a per-config score

Vercel's Grammel describes the authorization model plainly: trust accrues when "a very specific agent with a very specific prompt" has a history of success on "a certain category of bugs." That is empirical per-configuration trust, keyed on (agent config hash, prompt version, bug class). Nobody has published theirs. That absence is the whole gap between the blog post and a production system. The deployment shape is worth reading too: a UI, a web app, an API, an execution space and sandboxes, GitHub-synced, with a custom-built console. That is a symptom of Vercel's headcount, not a requirement of the pattern. GitHub Actions plus issue forms plus a webhook handler gets a v0 with zero net-new services.

The cheapest quality lever is a critic that can't see the code

A coding agent reviewing its own work sees its own code, its past decisions, and its rationale. That is context contamination, a process problem rather than a capability gap. The fix is a process boundary. Invoke the critic in a fresh context. Hand it only the rendered artifact. Withhold code and prior critiques. And keep the passing threshold out of the critic's own prompt so it cannot Goodhart the number that unblocks the pipeline. Ranking the artifact against four professional references beats asking "is this good?". Relative ranking has far lower run-to-run variance than absolute scoring.

Economics reported alongside the published pattern: the frontier critic consumed under 10% of output tokens while a cheaper model did implementation, against roughly 2x cost if the frontier model had done the work itself. Two caveats. A screenshot-fed critic is image-token heavy on input, so measure dollars, not token share. And the loop as specified has no termination guarantee: a badly calibrated critic never awards a pass, and the agent burns tokens trying to please it. That needs max_iterations, a per-run dollar ceiling, epsilon-convergence bail-out, and a dead-letter path to a human.

Where the sources disagree

Vercel reports a third of merged pull requests agent-authored. Reuters, working from scores of internal documents, reports Meta scrapped the aggressive phase of Project OT, drafted in January and exploring team cuts of up to 60%, because agents "wrote code but missed product results." Both can be true, and together they say code generation is decoupled from outcome delivery. A merged PR is only evidence that a diff landed. Track reopen-rate-within-30-days and production escape rate, not queue depth.

Code authoring got cheap. Verification is the bottleneck now, and the pipelines that work decompose until every stage emits an artifact a machine can check.

If you consume these packages

The upstream escalation path is closing too. Flue converts external pull requests to issues or discussions; tldraw auto-closes them, justified on contribution norms and "the changing landscape around code security." "Fork it, fix it, send a patch upstream to unblock us" is no longer a reliable play. Budget for two replacements: spec-quality issue writing as a real skill, since a well-specified issue is now the input format that produces code, and a maintained local patch workflow with a named rebase owner for anything on the critical path.

What to do

  1. Prototype a reproduce-only agent on your noisiest service repo this sprint: input is a bug report, output is a failing test committed to a branch, with no fix rights and no merge rights.

  2. Add an isolated critic to one existing agent loop this sprint, with the passing threshold in config rather than the prompt, plus a circuit breaker (max_iterations, per-run dollar ceiling, dead-letter to human).

  3. Pin exact versions of agent-authored upstreams, extend soak windows on minor bumps, and add contract tests at the SDK boundary before your next dependency upgrade.

The bottom line

Every story here has the same shape: someone held the right control on paper and had no artifact proving it ever fired. Generation got cheap — updates, code, agent runs — and the scarce good is now a machine-checkable assertion that something actually held. The operating assumption that breaks is that configuration counts as evidence; the teams moving fastest are the ones whose every stage emits something a machine can check. Pick the single control your product most depends on, write the test that goes red when it silently stops working, then break it on purpose to prove the test works.