OpenAI cuts Cursor on 12 Nov. I would not pin Lahebo to an editor model

Friday’s OpenAI notice is the software story this weekend. npm shipped a Shai-Hulud variant the same night. Here is the five-step check I would run before I change an editor or a lockfile.

I opened the software feed this morning and it was the same weekend in two costumes. OpenAI will stop supplying models to Cursor on 12 November, after SpaceX closed the acquisition. The same Friday night, ten malicious versions of a TanStack Query codegen package landed on npm — a Shai-Hulud variant calling itself Trinitite. Then I opened server/chat.ts and a lockfile. That was the useful order of events.

The Cursor letter is a vendor story. The npm hit is a lockfile story. Neither one is a reason to rewrite Lahebo, and neither one is a reason to ignore the editor I actually type in. OpenAI’s own post is short: they used the change-of-control clause, they gave the longest notice the contract allows, and Astra will not ship to Cursor at all.

We are making this choice because we cannot be confident that SpaceX will use our technology within our terms of service, based on our experience with Elon Musk’s companies violating contracts.

OpenAI, 28 August 2026

Ask Ayush already walks Gemini keys, not OpenAI, and I wrote that split in the Stripe–OpenRouter note. Cursor is where I edit. It is not where SyBazar charges a card.

Step 1: Name the jobs that actually need an OpenAI model in Cursor

Most of what I do in Cursor is “open this NestJS module and tell me if the Prisma query is stupid.” That can be Claude or Gemini. The jobs that break on 12 November are the ones that name an OpenAI model on purpose — a Composer default, a .cursor rule, a CI review bot. Write those down. If the list is empty, you do not have a Friday emergency. You have a calendar reminder for October.

export type EditorJob = "name-check" | "review" | "general";

/** Cursor is an editor. These jobs must still run if OpenAI is gone. */
export const FALLBACKS: Record<EditorJob, string[]> = {
  "name-check": ["gemini-flash-lite-latest"],
  review: ["claude-sonnet", "gemini-3.6-flash"],
  general: ["gemini-3.6-flash", "claude-sonnet"],
};

Anthropic said it would put more Claude compute behind Cursor. That is their problem to keep green. It is not a reason to point Lahebo’s billing module at whatever the editor has selected this week. I already dry-ran Nest 12 on Lahebo. That PR does not mention Cursor.

Step 2: Keep production and Ask Ayush off the editor’s model list

If a NestJS service reads CURSOR_MODEL or COPILOT_MODEL, that is the bug. Ask Ayush has GEMINI_API_KEY and a failover list. That stays. I am not adding OpenAI this weekend to “have a backup of a backup.” I am also not migrating the corner chat to Cursor’s remaining models because a press release used the word Astra.

import type { EditorJob } from "../ai/editor-jobs";

const ROUTES: Record<EditorJob, string[]> = {
  "name-check": ["gemini-flash-lite-latest", "gemini-flash-latest"],
  review: ["gemini-3.5-flash", "gemini-flash-latest"],
  general: ["gemini-3.6-flash", "gemini-3.5-flash", "gemini-flash-latest"],
};

export function modelsFor(job: EditorJob, preferred?: string) {
  return [preferred, ...ROUTES[job]].filter(
    (model, i, list): model is string =>
      Boolean(model) && list.indexOf(model) === i,
  );
}

12 November is the date. Not Monday. OpenAI gave about seventy-five days. Use them to stop hardcoding model ids in rules files and GitHub Actions. Do not rip Cursor out of this repo tonight. Do not buy a second editor because Musk posted that he could not care less.

Step 3: Search the lockfile for Friday night’s npm versions

The other headline is quieter and more likely to bite a Node repo. @7nohe/openapi-react-query-codegen — OpenAPI to TanStack Query hooks, ~150k weekly downloads — published ten malicious versions between 20:00 and 20:21 UTC on 28 August. The attacker commented on a pull request. The release workflow had no author gate. GHSA-9pvf-vcx3-x239, CVSS 9.6. npm has since deleted the versions. latest is 3.0.2 again.

rg -n "@7nohe/openapi-react-query-codegen" package-lock.json yarn.lock pnpm-lock.yaml \
  || true

# Bad if you still see:
# 0.5.4 0.5.5 1.6.3 1.6.4 2.2.1 2.2.2 3.0.3 3.0.4
# Safe pins published before 28 Aug 20:00 UTC: 0.5.3 1.6.2 2.2.0 3.0.2

npm ci --ignore-scripts
npm ls @7nohe/openapi-react-query-codegen

I do not think SyBazar or Lahebo pull this generator. I would still run the search. A lockfile is faster than a feeling. If npm ci 404s on one of those versions, that is the registry telling you the tarball is gone — update the pin. If you installed one of them on Friday, rotate credentials from a different machine. I already wrote the same lesson after GitHub’s retry-storm week: pin the lockfile, block lifecycle scripts in CI, do not float to a surprise major.

Step 4: Keep install scripts off in CI until you trust the tree

Four of the bad releases hid the payload in binding.gyp so node-gyp ran it without a preinstall line. npm ci --ignore-scripts would have stopped the obvious hook and still left a crafted gyp file in the tree. So: ignore-scripts in CI, then run only the scripts you named. Do not take --ignore-scripts off because a codegen package “needs a postinstall.” Generate the hooks in a job you own.

name: pr
on: pull_request
jobs:
  check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci --ignore-scripts
      - run: npx tsc --noEmit
      - run: npm test

Step 5: What I would copy from this weekend, and what I would not

The feed will move on. The useful part is boring and it travels. An editor is not your API. A lockfile is. Check the model list. Search the lockfile. Leave the feud in the tab you are not merging.

OpenAI, Cursor, and this weekend’s npm hit

When does OpenAI stop working inside Cursor?

OpenAI notified SpaceX that it will wind down the Cursor contract, with a proposed shutoff of 12 November 2026. That is the maximum notice the contract allows. Astra, OpenAI’s next model, will not be supplied to Cursor at all. Claude and Gemini access is a separate question — Anthropic said it would increase compute for Claude in Cursor.

Does the OpenAI–Cursor split break a NestJS API?

No. Lahebo, OnMission, and SyBazar do not call OpenAI through Cursor. An editor model list is not your production client. If a script or CI job hardcodes a Copilot or Cursor model id, that is the only code path to touch. Ask Ayush on this site already talks to Gemini.

What is the Trinitite npm attack?

On 28 August 2026 an attacker published ten malicious versions of @7nohe/openapi-react-query-codegen — a TanStack Query codegen package — by triggering a GitHub release workflow from an issue comment. npm has removed those versions. latest is back on 3.0.2. If a lockfile still pins 0.5.4, 0.5.5, 1.6.3, 1.6.4, 2.2.1, 2.2.2, 3.0.3, or 3.0.4, npm ci will 404. That is the safe outcome.

Should I switch editors this weekend because of OpenAI?

No. The shutoff is 12 November, not tonight. I would write down which jobs in Cursor actually need an OpenAI model, and make sure production and Ask Ayush do not. Switching hosts because of one vendor letter is how you spend Monday fixing a checkout.

What should I do if I installed a malicious package version?

Treat that laptop or CI runner as compromised. Rotate GitHub, npm, cloud, and SSH credentials from a clean machine. Do not rotate from the same box that ran the install. Then pin a known-good version published before 28 August 20:00 UTC — 3.0.2 is the restored latest — and reinstall with npm ci --ignore-scripts until you trust the tree.