Engineering & Technical

The Engineer

The Signal

TeamCity's unauthenticated command execution means a patch can't prove the box was clean.

No login means no failed-auth entry, and that log line is the one you'd normally use to bound the exposure window. Without it, the window is the whole install. Registry push tokens, cloud OIDC trust, signing material, full source read: every credential resident on that server has to be treated as exposed, which makes rotation the work item, not the upgrade.

In Play

  1. Unauthenticated RCE Landed on Self-Hosted Control Planes

    JetBrains disclosed a critical TeamCity on-prem flaw allowing unauthenticated OS command execution and is telling everyone to update now, per The Hacker News's roundup. Three more control-plane bugs landed the same week: Arista VeloCloud Orchestrator On-Prem (CVE-2026-16812, CVSS 10.0) under active exploitation, Check Point Security Management (CVE-2026-16232, CVSS 9.3) added to CISA's KEV list with a July 25 federal deadline, and a public vBulletin pre-auth exploit reaching PHP eval(). Anything that rewrites config for many systems and answers untrusted networks is the same bug waiting for a different CVE.

    Ask Clarity
    Try
  2. A Local Kernel Race Is Now a Container Boundary Bug

    CVE-2026-53264 is a use-after-free race in the Linux traffic-control (net/sched) subsystem that takes a local user to root, and STAR Labs published a working exploit against CentOS Stream 9. CVSS scores it 7.8 because it assumes the attacker already has a shell — but a CI runner executing PR-triggered code is exactly that, by design. The longer-lived detail: a researcher credits AI assistance with turning the race into a reliable root exploit, which removes "hard to weaponize" from your triage math for memory-safety bugs.

    Ask Clarity
    Try
  3. Agent-Written Code Moved the Bottleneck Into CI

    Jarred Sumner ported 535,496 lines of Bun from Zig to Rust in 11 days using 64 parallel agents and a reported $165,000 of tokens, and that Rust build now powers Claude Code, per The Pragmatic Engineer's interviews inside Anthropic. Translation was roughly 15% of the effort; compiling, fixing tests and verifying took the other 85%. That split is a capacity statement about your build farm, not your model budget — 64 agents each run compile-and-test loops, so flake rate becomes an active hazard. The $165K figure is being publicly questioned, so treat it as directional.

    Ask Clarity
    Try
  4. The JavaScript Toolchain Forks at the Compiler API

    Anders Hejlsberg demoed TypeScript 7's Go-based compiler hitting a 10x speedup on VS Code's own 1.3-million-line codebase, per JavaScript Weekly. The cost is architectural: TS 7 drops direct compiler API access in favour of a new LSP server, so Vue, Astro and Svelte tooling stays pinned to TypeScript 6 until those projects migrate. In the same window React shipped 19.0.8, 19.1.9 and 19.2.8 to patch a denial-of-service in server function endpoints, and Oxlint's type-aware linting went stable — removing the one capability that justified typescript-eslint's cost.

    Ask Clarity
    Try
  5. Your Serving Engine, Not Your GPU, Sets Inference Cost

    vLLM statically pre-allocates about 90% of a device's memory at process start and has no awareness that another vLLM instance shares the card; HuggingFace's TEI takes one model-id per process. So an embedder, reranker, extractor and generator land on four cards that one card could physically hold. Teams that adopted small models to save money are renting 4x the GPUs, and nvidia-smi hides it because the allocation looks like real load. The fix is a server that owns the whole device and treats models as a working set — NVIDIA Triton's EXPLICIT model control and Ray Serve multiplexing already do this.

    Ask Clarity
    Try

Deep Dives

Patch the Build Server, Then Assume It Lied to You

Four critical flaws landed in one week and two already have working exploits, but the credential rotation after the patch is the part most teams will skip.

Why the rotation matters more than the patch

Pre-auth OS command execution on a CI server has a property most bugs don't: there is no way to prove the box was clean before the fix landed. The exploit path never touches a login, so there is no failed-auth trail, and no session to correlate anything against. If the instance accepted webhooks from the internet during the disclosure window, the defensible posture is to treat that entire window as an incident.

Blast radius is the mechanism. TeamCity agents typically hold registry push tokens, cloud OIDC trust relationships, signing material and full source read. Command execution there does not require persistence on the server. The attacker mints an artifact and leaves. So the ordering is fixed: patch to the latest build, rotate registry tokens, cloud keys and VCS PATs, re-verify custody of signing keys, then read the server audit log for OS command execution predating the patch.


The same shape, four times

FlawAuth neededBlast radiusExploit status
JetBrains TeamCity (on-prem)NoneSource, build secrets, signing, downstream artifactsAdvisory, patch out
Arista VCO CVE-2026-16812 (CVSS 10.0)Unclear; 10.0 implies noneConfig plane for the whole WAN estateActive exploitation
Check Point CVE-2026-16232 (CVSS 9.3)Auth bypassPolicy engine — attacker inherits admin authorityOn CISA KEV, July 25 deadline
Linux CVE-2026-53264 (CVSS 7.8)Local userHost root, then every co-tenant containerPublic PoC (STAR Labs)

The pattern generalises past these four products. Anything that can rewrite configuration for many systems and is reachable from an untrusted network is the highest-leverage target in a distributed architecture. That list includes ArgoCD, Atlantis, Vault, mesh control planes, IaC runners and internal admin consoles. Build the exposure map once, because it outlives every individual CVE on this list.

Why the 7.8 is worse than the 7.8

CVSS scores local privilege escalation conservatively because it assumes the attacker already has a foothold. On a container platform, that assumption is the product. A runner executing PR-triggered code is an attacker with a local shell by design, and so is a customer-supplied job. The net/sched subsystem has historically been reachable from unprivileged user namespaces and from anything holding CAP_NET_ADMIN inside its own netns: service-mesh init containers, CNI plugins, VPN sidecars, traffic-shaping tooling. Verify that reachability against the running configuration rather than assuming it. What is confirmed is the bug class and a working exploit, not any specific exposure path.

Where the sources converge

The security reporting, CISA's deadline and the vBulletin case all point the same way. The reporting says exploit difficulty is no longer a mitigating control, because a researcher credits AI assistance with developing the tc race into a full root exploit. The federal side agrees implicitly: CISA gave civilian agencies a three-day mitigation deadline on the Check Point bug, which is a published opinion about exploitation rate. vBulletin is the counterexample that proves the point. Upstream had already patched, so the public exploit is now scanner payload aimed at everyone who skipped the update.

A pre-auth RCE on a build server is not a vulnerability to schedule. It is a disclosure window, and every artifact shipped inside it is unproven.

What to do

  1. Patch every on-prem TeamCity instance to the latest build today, then rotate registry tokens, cloud keys, VCS PATs and re-verify signing key custody before reopening the server to webhooks.

  2. Inventory CAP_NET_ADMIN grants and unprivileged user-namespace availability across node pools this sprint, and schedule out-of-band kernel patching for any pool running untrusted or multi-tenant workloads.

  3. Remove exploit complexity as a deprioritisation factor from your vulnerability SLA policy for memory-safety and race-condition classes by the next policy review.

535,496 Lines in 11 Days Because the Tests Didn't Know the Language

The Bun rewrite is being read as a model-capability result; the enabler was a verification asset built years earlier, and that asset is what most repositories lack.

The precondition nobody puts in the headline

One detail carries this whole project: Bun's test suite is written in TypeScript. It asserts runtime behaviour, not internals, so it does not care whether the runtime underneath is Zig or Rust. The exact same suite graded both builds. The port itself was mechanical, with the minimum number of behavioural changes, and Sumner wrote a migration plan and style guide before any agent ran.

Invert that and the method collapses. Tests written in the service's own language, mocking concrete internal types, give you no oracle for a port. The ask becomes rewriting the implementation and the verification at the same time, then trusting the output. That is hoping, not engineering. Cheap diagnostic for any repo: score the top three services on black-box contract coverage against white-box unit coupling, then ask whether the suite would still be valid if the implementation language changed.


What the 15/85 split actually budgets

Translation was about 15% of elapsed time. Compiling, fixing tests and verifying correctness was the other 85%. Thariq Shihipar reports the same shape independently: few tokens go to implementation, most go to discovery, prototyping, mocking, verification and testing. Read it as a capacity plan. Sixty-four agents each run compile-and-test loops, so CI becomes the rate limiter and flake rate turns into an active hazard. A nondeterministic test teaches an agent to contort correct code until the assertion goes green.

The gates that make unreadable code mergeable

Sumner's operating question was how to merge 100+ PRs a day and know the code works. The pipeline is the transplantable part:

  1. Issue filed, an agent attempts reproduction; if it reproduces, a second container attempts a fix.
  2. A mandatory test that fails on the current build and passes with the patch, written before the PR may open.
  3. No test means auto-reject. No exceptions, no human negotiation.
  4. Linters, then two independent reviewers, Claude review and CodeRabbit, then agents argue on the thread.
  5. Human merge once gates are green.

Steps 2 and 3 cost CI minutes rather than tokens, and they hit the precise failure mode of high-volume machine output. Cheapest item on the list. Adopt it first.

Where the evidence is thinner than the story

Two caveats. The $165,000 token figure is being actively questioned in public, which is useful signal by itself, because headline engineering-cost claims are now getting audited. And much of Bun's repository activity is, in the author's phrase, "Claude talking to Claude." The same model family writes the code, the tests, the fuzzers and the review. Correlated blind spots, textbook. Running CodeRabbit next to Claude review reads as deliberate decorrelation. A language port also has a free independent oracle sitting right there: differential fuzzing against the old binary. Same inputs, both implementations, diff the outputs. The legacy Zig build is the one oracle no model authored.

What did not compress

The same reporting covers Claude Managed Agents: six months against a pre-AI estimate of roughly two years. The head of engineering names planning as the single biggest element, in a process that "looked more like a typical pre-AI planning process," Google Doc PRD included. Execution compressed roughly 4x. Cross-org alignment across a sandboxing team and three cloud providers did not. The filter that survives all of this: run the 64-agent play on work that would otherwise never get done at all.

Cheap code generation moves the bottleneck into CI, and what decides throughput after that is whether the test suite can be trusted without being read.

What to do

  1. Score your top three services this sprint on implementation-agnostic test coverage — can the suite validate behaviour if the language changed? — and record black-box contract coverage versus white-box unit coupling per service.

  2. Adopt the failing-then-passing test gate for all agent-authored PRs by the next sprint boundary: the PR must include a test that fails on the current build and passes with the patch, with no-test PRs auto-rejected.

  3. Instrument CI for agent load before raising concurrency: capture p50/p95 build-plus-test wall time, per-test flake rate and cache hit rate, and set a flake quarantine policy this quarter.

TypeScript 7's 10x Has a Toll Gate, and Vue, Astro and Svelte Are Standing at It

The speedup is real and measured on a genuinely pathological codebase, but the mental model that breaks is "upgrade when ready" — your framework plugins decide, not you.

The version number is not the problem; the dependency graph is

Accurate model: anything in your toolchain that imports the TypeScript compiler API is a hard pin to TypeScript 6. TS 7's Go compiler drops direct compiler API access and replaces it with a new LSP language server. Microsoft externalised the coordination cost onto downstream framework maintainers. Vue, Astro and Svelte tooling all reach into that API today.

The unglamorous failure mode is a caret range on typescript in a workspace whose framework plugin touches the compiler. TS 7 lands inside that range. The build breaks with an error that points nowhere useful. Pinning explicitly is cheap now and painful later.

ConsumerUses compiler API?TS 7 pathYour move
App code type-checked by tsc/tsgoNoDirect — full 10xAdopt early; biggest CI win
Editor / IDE integrationVia language serverNew LSP serverVerify extension compatibility
Vue / Astro / Svelte toolingYesBlocked until LSP migrationPin TS 6 explicitly, no floating ranges
Codemods / AST tooling you ownYesRewrite against LSP or stay on 6Scope the rewrite before it's urgent

Check what the benchmark actually was: VS Code's own 1.3-million-line codebase, with real pathological types, not a synthetic suite. The number is credible. Its availability to you is conditional.


The cheaper CI win that shipped quietly alongside it

Type-aware linting is usually the longest single step in a TypeScript monorepo's pipeline. It requires a full type-check, so you pay for tsc twice. Oxlint's type-aware linting is stable, which matches the one capability that justified typescript-eslint's cost. The incumbent's remaining moat is plugin ecosystem breadth, not capability.

Do not plan a cutover. Plan a parallel run. Oxlint in report-only mode alongside the existing config, then diff both the findings and the wall-clock. The steady state is two linters, Oxlint for the hot path and ESLint for the long tail of custom org rules, and that is fine. It is still a large net win. It is the highest ratio of CI time saved to engineering effort available in this ecosystem.

Two security items

React shipped 19.0.8, 19.1.9 and 19.2.8 to patch a denial-of-service in server function endpoints. Three simultaneous backports means exposure spans the whole 19.x line. Patch, then confirm that server function routes are rate-limited at the edge. A DoS patch with no rate limit is one fix short. Nuxt shipped 4.5.1 and 3.21.10 as security patches a week after 4.5, which is the textbook argument against being first to adopt any x.y.0.

Separately, Matteo Collina of Node.js core published the argument that prototype pollution cannot be hardened at the runtime level. That reclassifies a whole vulnerability class from "wait for a Node patch" to permanent application-layer responsibility. Three concrete moves follow: schema-validate at the edge instead of deep-merging request bodies, use Object.create(null) for any user-keyed lookup map or config bag, and test --disable-proto in a staging container. The recursive config merge is the canonical sink. A targeted grep usually finds it.

The trade-off the celebration skips

Native rewrites have reached the type checker itself, alongside Rspack, Biome, Turbopack, Bun and Oxlint. Most of it is genuinely good engineering. The cost is narrower, more sanctioned extension surfaces and a smaller pool of people who can fix your bug. The TS 7 LSP boundary is that trade-off, made explicit and paid for by framework maintainers. The selection rule that holds: native for hot paths you consume but never extend, escape hatches preserved wherever custom rules, transforms or AST access are required.

Speed is table stakes in this toolchain now. Extensibility is the scarce resource, and TypeScript 7 prices it explicitly.

What to do

  1. Patch React to 19.2.8 / 19.1.9 / 19.0.8 this week and confirm server function routes are rate-limited at the edge.

  2. Inventory which devDependencies import the TypeScript compiler API directly and pin those workspaces to TS 6 explicitly this sprint, replacing floating caret ranges.

  3. Run Oxlint with type-aware linting in report-only mode alongside typescript-eslint in CI this quarter and measure the wall-clock delta plus the rule-coverage gap before changing anything.

The bottom line

Fund the thing that grades machine output — black-box tests, a golden task set, a per-request cost meter — because it is the only asset that scales with code nobody reads.