Cafiyn Pulse
← All issues
Issue 4Week of 21 September 2026

Frontier prices fell by half on Tuesday. The same day, next/og got a 9.5.

On 22 September OpenAI released GPT-6 Sol and Luna at half the listed price of the 5.6 models sitting beside them, and Anthropic cut Claude Opus to $4 and $20 per million tokens. The same day Vercel shipped an out-of-band Next.js release for a critical remote code execution flaw in next/og. Malicious npm and PyPI package versions spent the week harvesting credentials out of developer home directories, GitHub removed Node 20 from Actions runners with no way to pin back, and Google Play app registration closes on 30 September.

Hot takes

2

Our read on the week. Opinion, and labelled as such.

Two frontier labs cut prices on the same Tuesday. Only one of them is a drop-in swap.

Opinion
22 Sep

On 22 September OpenAI released GPT-6 Sol at $2 input and $10 output per million tokens, and GPT-6 Luna at $0.10 and $0.50, for prompts up to 272K input tokens. GPT-5.6 Sol and GPT-5.6 Luna remain listed at $4 and $20, and $0.20 and $1.20. The same day Anthropic released Claude Opus 5.5 at $4 and $20, twenty percent below Opus 5 at $5 and $25, with cache hits at $0.20 because Opus 5.5 prices them at 0.05x base input rather than the usual 0.1x. Anthropic's release notes also list three request shapes that now return a 400 error on Opus 5.5.

So what

The OpenAI cut costs you an eval run. The Anthropic one has a refactor attached: the thinking field is rejected in both its enabled and disabled forms, tool_choice types any and tool return 400, and computer use needs the computer_toolset_20260801 toolset on the Claude API and Google Cloud. Search your call sites for all three before you point a single request at Opus 5.5. And read what OpenAI does not say: GPT-5.6 Sol is explicitly promotional at least through 21 November 2026, while nothing on either page labels GPT-6 pricing as promotional at all. Budget on the number, not on the direction of travel.

Anthropic now bills for some refusals that never produced a token

Opinion
24 Sep

On 24 September Anthropic expanded which refusals are billed to include refusals that arrive before any output, when stop_details.category is bio, frontier_llm or reasoning_extraction, which it describes as the categories where it measures low volumes of false positives. Mid-stream refusals were already billed. The newly billed refusals are charged at the rates of the model that ran them. Refusals before output in other categories are still not billed, fallback credit is unchanged, and the change applies on all platforms.

So what

Narrow, defensible, and still worth a look at your own bill. If you run red team suites, jailbreak regression tests or safety evals that deliberately trip those three classifiers, that suite just acquired a line item. Log stop_details.category on every response now, so the charge is attributable when it lands instead of being an unexplained rise in next month's invoice.

Post-mortems

4

What broke, and the specific thing to check in your own stack.

Next.js shipped an out-of-band 16.3.6 for a critical remote code execution flaw in next/og

Security
22 Sep

On 22 September Vercel released Next.js 16.3.6 and 15.5.26 out of band. The advisory GHSA-vcvr-r3jv-pc5j is titled Remote Code Execution in next/og ImageResponse, carries CVE-2026-94545 at CVSS 9.5, and gives the affected range as 16.2.0 up to but not including 16.3.6. The entry point is an improper escaping bug in Satori, fixed in 0.33.5, which combined with flaws in other upstream dependencies could lead to code execution. The release post says version 15.5.26 includes related hardening but that Next.js 15.x is not affected by the remote code execution issue, and that applications using the Edge ImageResponse implementation are not affected.

So what

Upgrade if you are on any 16.2 or later build, then check whether an OG image route interpolates a slug, a search parameter or a username into SVG content, attributes or styles, because that is the exact precondition the advisory names. Applications that pass no attacker-controlled values into SVG are not affected. Preview and branch deployments keep serving the vulnerable build until you redeploy or delete them, which is the step most teams skip.

Malicious npm and PyPI package versions shipped a Go implant that harvests developer credentials

Security
23 Sep

OSV records MAL-2026-16476 and MAL-2026-16475, both published 23 September, describe malicious versions of the npm package memos-cloud-openclaw-plugin under the memtensor scope, at 0.1.21, 0.1.23 and 0.1.25, and of the PyPI package memoryos at 2.0.34. Both carry a Go implant called sckit that runs when the package loads. OSV says it targets .npmrc, .pypirc, .git-credentials, .netrc, SSH private keys, .vault-token and token caches, and collects credentials from the home directory and sends them to servers under skyleen[.]fr. In GitHub Actions it appends a BASH_ENV entry to GITHUB_ENV to capture PyPI publishing tokens. An open issue on the project repository, filed by an outside researcher, says the package's npm publish token appears to have been compromised. The maintainers have not publicly commented.

So what

If either package appears in a lockfile or in an agent's dependency tree, rotate npm and PyPI tokens, GitHub personal access tokens, SSH keys and any cloud credentials readable from that machine or runner, then check CI logs for outbound connections to skyleen[.]fr. The general lesson is the scope: a package install runs code as you, so what is at risk is every credential your home directory can read, not only the ones the package legitimately needs.

Brevo says an attacker used a compromised Cloudflare API key to inject a script into customer-embedded files

Security
14 Sep

Brevo published a post-mortem on a 14 September incident in which, in its words, an attacker used a compromised Brevo Cloudflare API key to deploy a Cloudflare Worker on its account. Brevo says the Worker injected a malicious script into pages of brevo.com and sibforms.com and into three JavaScript files that customers embed on their own websites, showing selected visitors a fake Cloudflare human verification page that told them to press Win+R and paste a command. It gives the impact window as 15:01 to 20:30 UTC, with the lure live on the listed customer URLs from 16:07. Brevo states that app.brevo.com was not affected and that no Brevo systems were modified at their source, the content being altered in transit at its CDN edge. The stated root cause is a long-lived Cloudflare API key with full account permissions stored in application source code.

So what

Brevo asks anyone who ran the pasted command to treat that computer as compromised, to check WordPress sites for a plugin installed on 14 September, and to change Brevo passwords and review API keys. The transferable part is the root cause rather than the vendor: search your own repositories for long-lived full-permission CDN and DNS tokens and replace them with scoped ones. A third-party script tag is a standing grant to run code on every visitor you have, and it is worth knowing how many of those grants you have issued.

Cloudflare disclosed a cross-tenant vulnerability in Containers, and asks customers to do nothing

Security
24 Sep

On 24 September Cloudflare disclosed a vulnerability affecting Cloudflare Containers and Cloudflare Sandboxes, which is built on Containers. Cloudflare says it would potentially have allowed a customer with a Workers Paid account to recover residual data from storage blocks previously used by other customers' Containers on the same underlying host, potentially exposing filesystem metadata, directory structures, database pages and application data. Oren Yomtov of Accomplish reported it on 4 September, fixes finished rolling out on 7 September, and cleanup of affected cached snapshots completed on 19 September. Cloudflare says it has no evidence that customer data has been compromised, and that remediation does not require any further action by Cloudflare customers.

So what

There is genuinely nothing to do, which is the interesting part. What is worth filing is the shape of the risk: Containers and Sandboxes are multi-tenant and you do not choose the host, so whatever you write to a container disk sits on shared storage. Keep secrets in bindings rather than on disk, treat a container filesystem as scratch space, and note that Workers itself is not what was affected here.

Wins

3

Rounds, launches, and benchmarks worth measuring yourself against.

Python Workers are generally available on Cloudflare, with ASGI and WSGI connectors for FastAPI, Django and Flask

Launch
21 Sep

Cloudflare announced that Python Workers are now generally available, making Python a first-class, fully supported language on its developer platform. FastAPI, Django and Flask run inside Python Workers through built-in ASGI and WSGI connectors, and bindings cover Workers AI, R2, D1, Hyperdrive, Durable Objects, Queues and Workflows. The following day Cloudflare shipped Worker Previews, which give each Git branch a production-like place to run with its own code, configuration, URL, observability and state.

So what

If you have a Python backend and had written off edge deployment on language grounds, that constraint is gone. Neither announcement states pricing or plan tiers for Worker Previews, so confirm what a preview environment costs before you wire one into CI for every branch.

npm added stage-only tokens that can submit a release for review but are refused when used to publish

Launch
18 Sep

GitHub added an npm token permission level called read and write, stage only. A workflow uses npm stage publish to submit a version, and npm rejects direct npm publish attempts with that token even if it is configured to bypass two-factor authentication for automation. A maintainer then reviews and approves the release with 2FA. The token keeps other package write permissions, including moving dist-tags and deprecating versions. GitHub says npm is targeting January 2027 to remove direct publishing through bypass-2FA tokens.

So what

This is the structural fix for the attack two items above, where the entire prize was a publish token sitting in a release job. Swap CI automation tokens for stage-only ones, or move to trusted publishing, so a stolen token can no longer cut a release on its own. The tradeoff is real and worth naming: releases now need a human awake with a second factor.

Baselayer raised a $35M Series A led by M13 to extend business identity verification to AI agents

Funding
22 Sep

Baselayer, which helps financial institutions verify businesses and assess fraud risk, raised a $35M Series A led by M13, with Picus Capital, Torch Capital, Afore Capital and Matt Thompson of Socure participating. The company declined to disclose its valuation. Its current product does Know Your Business verification by combining business identity, credit and fraud data, and it is building what it calls Know Your Agent technology to check whether an AI agent is authorised to act for a person or a business.

So what

Nothing changes for you this week, and it would be dishonest to pretend otherwise. What is worth tracking is whether a real standard emerges for proving an agent acts on someone's behalf, because if your product lets agents touch customer accounts you will eventually need one, and right now there is no vendor here safe to standardise on. Start logging agent-initiated actions separately from human ones, so you have the data when a standard does arrive.

On the radar

5

Shifts that have not hit you yet but will.

Google Play app registration closes on 30 September, and unregistered apps face global removal

Deadline
30 Sep

Google's policy page sets 30 September 2026 for Play Console app registration, required to meet Android developer verification requirements and Play Console requirements. Google says 99% of apps on Play have been registered automatically, and tells developers to check their Play Console Home page and register any remaining apps to avoid global removal from Google Play. Separately, it says developers can use Play Console to register apps they distribute outside Google Play to ensure those can be installed on certified Android devices.

So what

Five days. Open Play Console Home and check every package name you ship, including apps under a second developer account, apps you took over by transfer, and internal testing builds, because those are exactly the listings that fall outside the 99 percent. If you distribute an app outside Play, register it there too or it may stop installing on certified devices.

Apple's single set of EU business terms starts on 1 October, and you have to actively agree to it

Deadline
1 Oct

From 1 October 2026 apps distributed in the EU fall under one set of terms. The per-install Core Technology Fee is replaced by a 5 percent Core Technology Commission on digital transactions in apps distributed outside the App Store, and the Initial Acquisition Fee and Store Services Fee are eliminated. Apple lists commission of 26 percent on Apple In-App Purchase, or 15 percent for Small Business Program participants, 20 percent and 10 percent for alternative payment processing inside the app, and a Store Services commission of 15 percent and 10 percent on out-of-app offers. Developers select their payment options and must maintain those options for 12 months. Account Holders have to review and agree to the updated licence agreement.

So what

Two things get missed here. It is not automatic: an Account Holder has to accept the updated agreement in the developer account, so nothing happens if nobody logs in. And the payment configuration you are live with on 1 October is the one you keep until October 2027, so run the take-rate model before you choose, and check whether Small Business Program enrolment moves you from 26 percent to 15 percent.

GitHub put dates on removing ssh-rsa: a 3072-bit minimum from 14 October, brownouts on 4 November and 9 December

Breaking change
22 Sep

GitHub published a timeline for removing the ssh-rsa signature type, meaning RSA keys signed with SHA-1, along with the diffie-hellman-group-exchange-sha256 key exchange. All new RSA SSH keys uploaded after 14 October 2026 must be at least 3072 bits, for both signing and authentication. Brownouts follow on 4 November and 9 December 2026. The same 14 October date enables mlkem768x25519-sha256 on github.com. The changelog also prints a final removal date of January 13, 2026, which falls before the brownouts listed above it, so we are not quoting a year for the removal until GitHub corrects the entry.

So what

Run ssh -v git@github.com from your CI image and from every deploy box and read the negotiated signature and key exchange algorithms. Audit repository deploy keys and organisation keys for RSA keys under 3072 bits and for anything old enough to be SHA-1 signed, then rotate to ed25519. Treat 4 November as the fire drill: a brownout is the day your pipeline tells you whether you were wrong, at a time you chose.

Google's pricing page schedules a doubling of Gemini 3.6, 3.7 and 3.8 Flash prices on 1 January 2027

Pricing
1 Jan

The Gemini Developer API pricing page lists Gemini 3.8 Flash input at $0.75 through 31 December 2026 and $1.50 starting 1 January 2027, with output going from $3.75 to $7.50 per million tokens on the same date. Gemini 3.7 Flash and 3.6 Flash carry identical figures. The same date raises both 3.8 TTS models, both Gemini Robotics ER 2 previews, and context caching, which goes from $0.075 to $0.15 per million tokens on 3.8 Flash. Gemini 3.5 Flash-Lite at $0.30 and $2.50 has no scheduled increase, and neither does any Pro tier.

So what

Google does not call this introductory or promotional pricing anywhere on the page. It simply lists two prices with a date between them, which is a scheduled increase by any other name. If a workload runs on a 3.x Flash model, build the 2027 budget on $1.50 and $7.50 now, and benchmark it against Flash-Lite, which carries no scheduled rise. We have logged the date in our price change log.

Node 20 is gone from GitHub Actions runners, and the opt-out that let you pin back is gone too

Breaking change
23 Sep

GitHub published what it calls the final notification that Node 20 is no longer available on GitHub Actions runners. Runners now use Node 24 for JavaScript actions, maintainers must set an action's runs.using value to node24 and cut a new release, and the temporary ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION opt-out is no longer available. GitHub also flags that Node 24 is incompatible with macOS 13.4 and earlier and has no official ARM32 support, so self-hosted runners on those systems are no longer supported.

So what

Search .github and any action.yml you publish for node20 and node16, and move runs.using to node24. There is no longer an escape hatch, so a workflow that depended on the opt-out fails on its next run rather than warning you. If you run self-hosted runners, check the macOS version and the architecture before the next scheduled job rather than after it.

Open the tool.

Most of what shows up in Post-mortems maps to one of ten categories the Stack Grader already checks.

Check your stack against these failures