Skip to content

[ci] Backport only stability fixes to stable, default to claude-opus-5 - #3092

Merged
VaguelySerious merged 1 commit into
mainfrom
peter/backport-stability-only
Jul 24, 2026
Merged

[ci] Backport only stability fixes to stable, default to claude-opus-5#3092
VaguelySerious merged 1 commit into
mainfrom
peter/backport-stability-only

Conversation

@VaguelySerious

Copy link
Copy Markdown
Member

Two changes to .github/workflows/backport.yml.

1. stable takes stability fixes only

The decision prompt used to tell the AI to lean toward backporting, and listed "minor feature additions that are self-contained and not dependent on main-only changes" as backport-worthy. The result is that feature work lands on stable whenever it happens to cherry-pick cleanly — which is exactly backwards for a maintenance line whose users stayed behind for stability.

The prompt now recommends a backport only for:

  • Bug fixes to functionality that already exists on stable
  • Correctness, data-loss, crash, hang, deadlock, and resource-leak fixes
  • Security fixes, including vulnerability-motivated dependency bumps
  • Fixes for regressions introduced by an earlier backport
  • Test-only changes covering behavior that also exists on stable, and flaky-test fixes
  • Build/CI/release-plumbing fixes needed to keep stable buildable and releasable
  • Documentation corrections for content already on stable

and declines everything else, calling out the cases that used to slip through: small additive features, performance work and refactors that aren't fixing a user-visible defect, non-defect behavior changes to existing APIs, and routine non-security dependency bumps. Mixed fix-plus-feature commits are declined with the fix named in the reasoning so a human can split it out.

The tiebreak also flips: when in doubt, decline. A missed fix can be forced through with workflow_dispatch; unwanted change on stable can't be un-shipped. The prompt explicitly says a clean cherry-pick is not evidence that a change belongs on stable.

Nothing about the mechanism changes — the action still only ever opens a PR for human review, still comments the reasoning on the source PR when it declines, and workflow_dispatch still forces a backport.

2. Default model → anthropic/claude-opus-5

Was anthropic/claude-fable-5. Confirmed the slug is exposed by the AI Gateway (https://ai-gateway.vercel.sh/v1/models), so opencode won't hit ProviderModelNotFoundError. The model input still overrides it per dispatch.

AGENTS.md is updated to match.

Verification

  • .github/workflows/backport.yml parses as YAML (js-yaml), env.AI_MODEL resolves as expected.
  • Rendered the prompt-building block with stub commit context and diffed the output — all backticks and **bold** survive shell escaping, no stray command substitution.

Expect the immediate effect to be a lower backport rate; the no-backport comment on each source PR states which criterion applied.

🤖 Generated with Claude Code

`stable` is a maintenance line: its users stayed behind for stability, so
it should take fixes and nothing else. The previous prompt told the AI to
lean toward backporting and explicitly listed "self-contained minor
feature additions" as backport-worthy, which pulled feature work onto the
branch whenever it cherry-picked cleanly.
The decision prompt now recommends a backport only for defect, security,
regression, test, build/release, and doc-correction changes, declines
everything else (including small additive features and non-defect perf
work), and breaks ties toward declining — `workflow_dispatch` remains the
escape hatch for anything wrongly declined.
Also bumps the default opencode model to `anthropic/claude-opus-5`.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@VaguelySerious
VaguelySerious requested review from a team and ijjk as code ownersJuly 24, 2026 20:20
@vercel

vercelBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 0d5185e

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions

github-actionsBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

All tests passed

E2E Test Summary

Summary
PassedFailedSkippedTotal
✅ ▲ Vercel Production145502391694
✅ 💻 Local Development162102271848
✅ 📦 Local Production162102271848
✅ 🐘 Local Postgres162102271848
✅ 🪟 Windows15400154
✅ 📋 Other102002121232
✅ vercel-multi-region270027
Total7519011328651
Details by Category

✅ ▲ Vercel Production

AppPassedFailedSkipped
✅ astro126028
✅ example126028
✅ express126028
✅ fastify126028
✅ hono126028
✅ nextjs-turbopack15103
✅ nextjs-webpack15103
✅ nitro126028
✅ nuxt126028
✅ sveltekit14509
✅ vite126028

✅ 💻 Local Development

AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
✅ nuxt-stable128026
✅ sveltekit-stable14707
✅ vite-stable128026

✅ 📦 Local Production

AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
✅ nuxt-stable128026
✅ sveltekit-stable14707
✅ vite-stable128026

✅ 🐘 Local Postgres

AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
✅ nuxt-stable128026
✅ sveltekit-stable14707
✅ vite-stable128026

✅ 🪟 Windows

AppPassedFailedSkipped
✅ nextjs-turbopack15400

✅ 📋 Other

AppPassedFailedSkipped
✅ e2e-local-dev-nest-stable128026
✅ e2e-local-dev-tanstack-start-128026
✅ e2e-local-postgres-nest-stable128026
✅ e2e-local-postgres-tanstack-start-128026
✅ e2e-local-prod-nest-stable128026
✅ e2e-local-prod-tanstack-start-128026
✅ e2e-vercel-prod-nest126028
✅ e2e-vercel-prod-tanstack-start126028

✅ vercel-multi-region

AppPassedFailedSkipped
✅ nextjs-turbopack2700

📋 View full workflow run

@github-actions

github-actionsBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

commit 0d5185e · Fri, 24 Jul 2026 20:41:51 GMT · run logs

Backend: vercel · app: nextjs-turbopack

MetricScenarioBest (ms)P75 (ms)P90 (ms)P99 (ms)Samples
TTFSstep248 (-65%) 💚1394 🔴 (+33%) 🔻1437 🔴 (+34%) 🔻1733 🔴 (+20%) 🔻30
TTFSstream279 (-71%) 💚1390 🔴 (+36%) 🔻1420 🔴 (+37%) 🔻1447 🔴 (+38%) 🔻30
TTFShook + stream317 (-73%) 💚1612 🔴 (+22%) 🔻1644 🔴 (+18%) 🔻1708 🔴 (+2.2%)30
STSO1020 steps (1-20)174 (+7.4%)290 🔴 (+16%) 🔻384 🔴 (+28%) 🔻417 🔴 (+37%) 🔻19
STSO1020 steps (101-120)199 (+7.6%)280 🔴 (+1.1%)409 🔴 (+25%) 🔻921 🔴 (+159%) 🔻19
STSO1020 steps (1001-1020)512 (+12%)599 🔴 (+8.1%)647 🔴 (+8.2%)666 🔴 (-19%) 💚19
WO1020 steps408516 (+6.8%)408516 (+6.8%)408516 (+6.8%)408516 (+6.8%)1
SLstream latency109 (+45%) 🔻158 🔴 (+31%) 🔻176 🔴 (+28%) 🔻200 🔴 (-76%) 💚30
SOstream overhead (text)117 (+21%) 🔻205 (+31%) 🔻329 (+69%) 🔻1042 🔴 (+318%) 🔻30
SOstream overhead (structured)137 (+40%) 🔻264 🔴 (+53%) 🔻317 (+28%) 🔻1769 🔴 (+532%) 🔻30
ℹ️ Metric definitions & methodology

Best/P75/P90/P99 deltas compare against the most recent benchmark run on main at the time of this run. 🔻 flags a delta worse than +15%, 💚 one better than −15%.

Metrics — TTFS: time to first step body (in-deployment start() → first step body, deployment clocks) · STSO: step-to-step overhead (gap between consecutive step bodies) · WO: workflow overhead (whole-run time outside step bodies, in-deployment anchored) · SL: stream latency (in-deployment write → read propagation, readAt - writtenAt) · SO: stream overhead (end-to-end write+consume time beyond the modelled generation window)

Scenarios — step: one trivial no-op step, no stream; no hooks, so the run stays in turbo mode (in-process fast path) · stream: one streaming step; no hooks, so the run stays in turbo mode (in-process fast path) · hook + stream: registers a hook before one step, which exits turbo mode (dispatch path) · 1020 steps: 1020 trivial sequential steps; STSO is measured between consecutive steps in the given step ranges, and WO is the whole-run overhead outside step bodies · stream latency: parallel reader/writer steps on a dedicated stream; SL is the in-deployment write->read propagation (readAt - writtenAt) · stream overhead (text): writer streams 300 variable-length text token deltas paced at 100/s for 3s (a haiku-size LLM's token throughput) while a parallel reader drains the whole stream; SO is the end-to-end write+consume time beyond the 3s generation window (overhead/backpressure) · stream overhead (structured): same workload as stream overhead (text), but each delta is an AI-SDK-style structured object ({ type: 'text-delta', id, text }) instead of a raw string, so the SO gap vs the text scenario is the added serialization cost

🔴 marks a percentile over its target (within target is left unmarked). Targets (p75/p90/p99, ms) — TTFS 200/300/600 · SL 50/60/125 · SO 250/500/1000 · STSO (1-20) 20/30/60 · STSO (101-120) 30/45/90 · STSO (1001-1020) 40/60/120

All metrics are measured from deployment-side timestamps only. Runs are triggered by an in-deployment route that stamps the anchor (clientStart) right before start(), so the CI runner’s request and its path through api.vercel.com sit outside every measured window. TTFS = in-deployment start() → first step body (turbo uses the in-process fast path, non-turbo the dispatch path), and includes the VQS dispatch hop plus any /flow cold start. STSO/WO are measured between step bodies on the deployment. SL is measured inside the workflow (parallel reader/writer steps), so it no longer includes the api.vercel.com read path.

Cold starts are kept in the numbers on purpose — they are part of real bursty-workload latency. The workbench deployment cold-starts the /flow invocation for a large fraction of runs, inflating P75+; the Best column shows the fastest (warm-start) sample for comparison.

@VaguelySerious
VaguelySerious merged commit bc53e5a into mainJul 24, 2026
103 of 106 checks passed
@VaguelySerious
VaguelySerious deleted the peter/backport-stability-only branch July 24, 2026 21:29
@github-actions

Copy link
Copy Markdown
Contributor

No backport to stable for bc53e5a (AI decision).

This commit only changes the backport automation's decision policy and default AI model in .github/workflows/backport.yml, which I verified does not exist on origin/stable (the workflow runs solely from main), plus the matching AGENTS.md prose describing that main-only workflow and an empty changeset. It fixes no defect in anything that ships from stable and does nothing to keep stable buildable, testable, or releasable, so backporting it would have no effect there.

To override, re-run the Backport to stable workflow manually via workflow_dispatch and paste this commit SHA into the ref input:

bc53e5a31b89af5d8bc50365796646d4de596005

pranaygp added a commit that referenced this pull request Jul 28, 2026
…ry-2
* origin/main: (292 commits)
feat(core): seal forwarded stream writes to the owner's public key (#3098)
feat(core): seal hook payloads to the target run's public key (#3096)
[e2e] Rebuild the event-log corruption repro around step-count divergence (#3147)
feat: decrypt sealed payloads in the dashboard and CLI (#3146)
Prewarm only appended replay payloads (#3131)
feat: publish each run's X25519 public key on the run entity (#3095)
feat(core): route sealed envelopes through the serialization layer (#3094)
docs: redirect retired migration-guides URLs to comparisons (#3127)
feat(core): add `encp` sealed-box encryption primitive (#3093)
chore(core): clarify runtime comments (#3111)
Remove obsolete world factory aliases (#3112)
feat(core): deterministic sandbox hardening (#3045)
Remove retired v1 step route plumbing (#3061)
[core] Don't count racing invocations' duplicate step_started events toward the maxRetries ceiling (#3069)
[world-testing] Isolate each spawned test server's data directory (#3055)
fix: upgrade postcss to >=8.5.18 to address GHSA-r28c-9q8g-f849 (#3102)
[next] Respect .gitignore in dev watcher to avoid EMFILE on large monorepos (#3085)
[ci] Backport only stability fixes to `stable`, default to claude-opus-5 (#3092)
perf(core): immediate leading-edge dispatch for idle streams (flush window default 0) (#3088)
Optimize `processImportSpecifier` by computing `shouldFollowImportsFromFile` once per file (#3052)
...
# Conflicts:
#	docs/components/geistdocs/desktop-menu.tsx
#	docs/components/geistdocs/mobile-menu.tsx
#	docs/content/docs/v5/cookbook/advanced/child-workflows.mdx
#	docs/content/docs/v5/cookbook/advanced/upgrading-workflows.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/agent-cancellation.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/durable-agent.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/human-in-the-loop.mdx
#	docs/content/docs/v5/cookbook/common-patterns/batching.mdx
#	docs/content/docs/v5/cookbook/common-patterns/idempotency.mdx
#	docs/content/docs/v5/cookbook/common-patterns/rate-limiting.mdx
#	docs/content/docs/v5/cookbook/common-patterns/saga.mdx
#	docs/content/docs/v5/cookbook/common-patterns/scheduling.mdx
#	docs/content/docs/v5/cookbook/common-patterns/sequential-and-parallel.mdx
#	docs/content/docs/v5/cookbook/common-patterns/timeouts.mdx
#	docs/content/docs/v5/cookbook/common-patterns/webhooks.mdx
#	docs/content/docs/v5/cookbook/common-patterns/workflow-composition.mdx
#	docs/content/docs/v5/cookbook/index.mdx
#	docs/content/docs/v5/cookbook/integrations/ai-sdk.mdx
#	docs/content/docs/v5/cookbook/integrations/chat-sdk.mdx
#	docs/content/docs/v5/cookbook/integrations/sandbox.mdx
#	docs/next.config.ts
#	docs/proxy.ts
#	docs/scripts/lint.ts
#	pnpm-lock.yaml
#	pnpm-workspace.yaml
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@VaguelySerious@TooTallNate
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
[ci] Backport only stability fixes to `stable`, default to claude-opus-5 by VaguelySerious · Pull Request #3092 · vercel/workflow · GitHub
Skip to content

[ci] Backport only stability fixes to stable, default to claude-opus-5 - #3092

Merged
VaguelySerious merged 1 commit into
mainfrom
peter/backport-stability-only
Jul 24, 2026
Merged

[ci] Backport only stability fixes to stable, default to claude-opus-5#3092
VaguelySerious merged 1 commit into
mainfrom
peter/backport-stability-only

Conversation

@VaguelySerious

Copy link
Copy Markdown
Member

Two changes to .github/workflows/backport.yml.

1. stable takes stability fixes only

The decision prompt used to tell the AI to lean toward backporting, and listed "minor feature additions that are self-contained and not dependent on main-only changes" as backport-worthy. The result is that feature work lands on stable whenever it happens to cherry-pick cleanly — which is exactly backwards for a maintenance line whose users stayed behind for stability.

The prompt now recommends a backport only for:

  • Bug fixes to functionality that already exists on stable
  • Correctness, data-loss, crash, hang, deadlock, and resource-leak fixes
  • Security fixes, including vulnerability-motivated dependency bumps
  • Fixes for regressions introduced by an earlier backport
  • Test-only changes covering behavior that also exists on stable, and flaky-test fixes
  • Build/CI/release-plumbing fixes needed to keep stable buildable and releasable
  • Documentation corrections for content already on stable

and declines everything else, calling out the cases that used to slip through: small additive features, performance work and refactors that aren't fixing a user-visible defect, non-defect behavior changes to existing APIs, and routine non-security dependency bumps. Mixed fix-plus-feature commits are declined with the fix named in the reasoning so a human can split it out.

The tiebreak also flips: when in doubt, decline. A missed fix can be forced through with workflow_dispatch; unwanted change on stable can't be un-shipped. The prompt explicitly says a clean cherry-pick is not evidence that a change belongs on stable.

Nothing about the mechanism changes — the action still only ever opens a PR for human review, still comments the reasoning on the source PR when it declines, and workflow_dispatch still forces a backport.

2. Default model → anthropic/claude-opus-5

Was anthropic/claude-fable-5. Confirmed the slug is exposed by the AI Gateway (https://ai-gateway.vercel.sh/v1/models), so opencode won't hit ProviderModelNotFoundError. The model input still overrides it per dispatch.

AGENTS.md is updated to match.

Verification

  • .github/workflows/backport.yml parses as YAML (js-yaml), env.AI_MODEL resolves as expected.
  • Rendered the prompt-building block with stub commit context and diffed the output — all backticks and **bold** survive shell escaping, no stray command substitution.

Expect the immediate effect to be a lower backport rate; the no-backport comment on each source PR states which criterion applied.

🤖 Generated with Claude Code

`stable` is a maintenance line: its users stayed behind for stability, so
it should take fixes and nothing else. The previous prompt told the AI to
lean toward backporting and explicitly listed "self-contained minor
feature additions" as backport-worthy, which pulled feature work onto the
branch whenever it cherry-picked cleanly.
The decision prompt now recommends a backport only for defect, security,
regression, test, build/release, and doc-correction changes, declines
everything else (including small additive features and non-defect perf
work), and breaks ties toward declining — `workflow_dispatch` remains the
escape hatch for anything wrongly declined.
Also bumps the default opencode model to `anthropic/claude-opus-5`.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@VaguelySerious
VaguelySerious requested review from a team and ijjk as code ownersJuly 24, 2026 20:20
@vercel

vercelBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 0d5185e

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions

github-actionsBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

All tests passed

E2E Test Summary

Summary
PassedFailedSkippedTotal
✅ ▲ Vercel Production145502391694
✅ 💻 Local Development162102271848
✅ 📦 Local Production162102271848
✅ 🐘 Local Postgres162102271848
✅ 🪟 Windows15400154
✅ 📋 Other102002121232
✅ vercel-multi-region270027
Total7519011328651
Details by Category

✅ ▲ Vercel Production

AppPassedFailedSkipped
✅ astro126028
✅ example126028
✅ express126028
✅ fastify126028
✅ hono126028
✅ nextjs-turbopack15103
✅ nextjs-webpack15103
✅ nitro126028
✅ nuxt126028
✅ sveltekit14509
✅ vite126028

✅ 💻 Local Development

AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
✅ nuxt-stable128026
✅ sveltekit-stable14707
✅ vite-stable128026

✅ 📦 Local Production

AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
✅ nuxt-stable128026
✅ sveltekit-stable14707
✅ vite-stable128026

✅ 🐘 Local Postgres

AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
✅ nuxt-stable128026
✅ sveltekit-stable14707
✅ vite-stable128026

✅ 🪟 Windows

AppPassedFailedSkipped
✅ nextjs-turbopack15400

✅ 📋 Other

AppPassedFailedSkipped
✅ e2e-local-dev-nest-stable128026
✅ e2e-local-dev-tanstack-start-128026
✅ e2e-local-postgres-nest-stable128026
✅ e2e-local-postgres-tanstack-start-128026
✅ e2e-local-prod-nest-stable128026
✅ e2e-local-prod-tanstack-start-128026
✅ e2e-vercel-prod-nest126028
✅ e2e-vercel-prod-tanstack-start126028

✅ vercel-multi-region

AppPassedFailedSkipped
✅ nextjs-turbopack2700

📋 View full workflow run

@github-actions

github-actionsBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

commit 0d5185e · Fri, 24 Jul 2026 20:41:51 GMT · run logs

Backend: vercel · app: nextjs-turbopack

MetricScenarioBest (ms)P75 (ms)P90 (ms)P99 (ms)Samples
TTFSstep248 (-65%) 💚1394 🔴 (+33%) 🔻1437 🔴 (+34%) 🔻1733 🔴 (+20%) 🔻30
TTFSstream279 (-71%) 💚1390 🔴 (+36%) 🔻1420 🔴 (+37%) 🔻1447 🔴 (+38%) 🔻30
TTFShook + stream317 (-73%) 💚1612 🔴 (+22%) 🔻1644 🔴 (+18%) 🔻1708 🔴 (+2.2%)30
STSO1020 steps (1-20)174 (+7.4%)290 🔴 (+16%) 🔻384 🔴 (+28%) 🔻417 🔴 (+37%) 🔻19
STSO1020 steps (101-120)199 (+7.6%)280 🔴 (+1.1%)409 🔴 (+25%) 🔻921 🔴 (+159%) 🔻19
STSO1020 steps (1001-1020)512 (+12%)599 🔴 (+8.1%)647 🔴 (+8.2%)666 🔴 (-19%) 💚19
WO1020 steps408516 (+6.8%)408516 (+6.8%)408516 (+6.8%)408516 (+6.8%)1
SLstream latency109 (+45%) 🔻158 🔴 (+31%) 🔻176 🔴 (+28%) 🔻200 🔴 (-76%) 💚30
SOstream overhead (text)117 (+21%) 🔻205 (+31%) 🔻329 (+69%) 🔻1042 🔴 (+318%) 🔻30
SOstream overhead (structured)137 (+40%) 🔻264 🔴 (+53%) 🔻317 (+28%) 🔻1769 🔴 (+532%) 🔻30
ℹ️ Metric definitions & methodology

Best/P75/P90/P99 deltas compare against the most recent benchmark run on main at the time of this run. 🔻 flags a delta worse than +15%, 💚 one better than −15%.

Metrics — TTFS: time to first step body (in-deployment start() → first step body, deployment clocks) · STSO: step-to-step overhead (gap between consecutive step bodies) · WO: workflow overhead (whole-run time outside step bodies, in-deployment anchored) · SL: stream latency (in-deployment write → read propagation, readAt - writtenAt) · SO: stream overhead (end-to-end write+consume time beyond the modelled generation window)

Scenarios — step: one trivial no-op step, no stream; no hooks, so the run stays in turbo mode (in-process fast path) · stream: one streaming step; no hooks, so the run stays in turbo mode (in-process fast path) · hook + stream: registers a hook before one step, which exits turbo mode (dispatch path) · 1020 steps: 1020 trivial sequential steps; STSO is measured between consecutive steps in the given step ranges, and WO is the whole-run overhead outside step bodies · stream latency: parallel reader/writer steps on a dedicated stream; SL is the in-deployment write->read propagation (readAt - writtenAt) · stream overhead (text): writer streams 300 variable-length text token deltas paced at 100/s for 3s (a haiku-size LLM's token throughput) while a parallel reader drains the whole stream; SO is the end-to-end write+consume time beyond the 3s generation window (overhead/backpressure) · stream overhead (structured): same workload as stream overhead (text), but each delta is an AI-SDK-style structured object ({ type: 'text-delta', id, text }) instead of a raw string, so the SO gap vs the text scenario is the added serialization cost

🔴 marks a percentile over its target (within target is left unmarked). Targets (p75/p90/p99, ms) — TTFS 200/300/600 · SL 50/60/125 · SO 250/500/1000 · STSO (1-20) 20/30/60 · STSO (101-120) 30/45/90 · STSO (1001-1020) 40/60/120

All metrics are measured from deployment-side timestamps only. Runs are triggered by an in-deployment route that stamps the anchor (clientStart) right before start(), so the CI runner’s request and its path through api.vercel.com sit outside every measured window. TTFS = in-deployment start() → first step body (turbo uses the in-process fast path, non-turbo the dispatch path), and includes the VQS dispatch hop plus any /flow cold start. STSO/WO are measured between step bodies on the deployment. SL is measured inside the workflow (parallel reader/writer steps), so it no longer includes the api.vercel.com read path.

Cold starts are kept in the numbers on purpose — they are part of real bursty-workload latency. The workbench deployment cold-starts the /flow invocation for a large fraction of runs, inflating P75+; the Best column shows the fastest (warm-start) sample for comparison.

@VaguelySerious
VaguelySerious merged commit bc53e5a into mainJul 24, 2026
103 of 106 checks passed
@VaguelySerious
VaguelySerious deleted the peter/backport-stability-only branch July 24, 2026 21:29
@github-actions

Copy link
Copy Markdown
Contributor

No backport to stable for bc53e5a (AI decision).

This commit only changes the backport automation's decision policy and default AI model in .github/workflows/backport.yml, which I verified does not exist on origin/stable (the workflow runs solely from main), plus the matching AGENTS.md prose describing that main-only workflow and an empty changeset. It fixes no defect in anything that ships from stable and does nothing to keep stable buildable, testable, or releasable, so backporting it would have no effect there.

To override, re-run the Backport to stable workflow manually via workflow_dispatch and paste this commit SHA into the ref input:

bc53e5a31b89af5d8bc50365796646d4de596005

pranaygp added a commit that referenced this pull request Jul 28, 2026
…ry-2
* origin/main: (292 commits)
feat(core): seal forwarded stream writes to the owner's public key (#3098)
feat(core): seal hook payloads to the target run's public key (#3096)
[e2e] Rebuild the event-log corruption repro around step-count divergence (#3147)
feat: decrypt sealed payloads in the dashboard and CLI (#3146)
Prewarm only appended replay payloads (#3131)
feat: publish each run's X25519 public key on the run entity (#3095)
feat(core): route sealed envelopes through the serialization layer (#3094)
docs: redirect retired migration-guides URLs to comparisons (#3127)
feat(core): add `encp` sealed-box encryption primitive (#3093)
chore(core): clarify runtime comments (#3111)
Remove obsolete world factory aliases (#3112)
feat(core): deterministic sandbox hardening (#3045)
Remove retired v1 step route plumbing (#3061)
[core] Don't count racing invocations' duplicate step_started events toward the maxRetries ceiling (#3069)
[world-testing] Isolate each spawned test server's data directory (#3055)
fix: upgrade postcss to >=8.5.18 to address GHSA-r28c-9q8g-f849 (#3102)
[next] Respect .gitignore in dev watcher to avoid EMFILE on large monorepos (#3085)
[ci] Backport only stability fixes to `stable`, default to claude-opus-5 (#3092)
perf(core): immediate leading-edge dispatch for idle streams (flush window default 0) (#3088)
Optimize `processImportSpecifier` by computing `shouldFollowImportsFromFile` once per file (#3052)
...
# Conflicts:
#	docs/components/geistdocs/desktop-menu.tsx
#	docs/components/geistdocs/mobile-menu.tsx
#	docs/content/docs/v5/cookbook/advanced/child-workflows.mdx
#	docs/content/docs/v5/cookbook/advanced/upgrading-workflows.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/agent-cancellation.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/durable-agent.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/human-in-the-loop.mdx
#	docs/content/docs/v5/cookbook/common-patterns/batching.mdx
#	docs/content/docs/v5/cookbook/common-patterns/idempotency.mdx
#	docs/content/docs/v5/cookbook/common-patterns/rate-limiting.mdx
#	docs/content/docs/v5/cookbook/common-patterns/saga.mdx
#	docs/content/docs/v5/cookbook/common-patterns/scheduling.mdx
#	docs/content/docs/v5/cookbook/common-patterns/sequential-and-parallel.mdx
#	docs/content/docs/v5/cookbook/common-patterns/timeouts.mdx
#	docs/content/docs/v5/cookbook/common-patterns/webhooks.mdx
#	docs/content/docs/v5/cookbook/common-patterns/workflow-composition.mdx
#	docs/content/docs/v5/cookbook/index.mdx
#	docs/content/docs/v5/cookbook/integrations/ai-sdk.mdx
#	docs/content/docs/v5/cookbook/integrations/chat-sdk.mdx
#	docs/content/docs/v5/cookbook/integrations/sandbox.mdx
#	docs/next.config.ts
#	docs/proxy.ts
#	docs/scripts/lint.ts
#	pnpm-lock.yaml
#	pnpm-workspace.yaml
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@VaguelySerious@TooTallNate
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [ci] Backport only stability fixes to `stable`, default to claude-opus-5 by VaguelySerious · Pull Request #3092 · vercel/workflow · GitHub
Skip to content

[ci] Backport only stability fixes to stable, default to claude-opus-5 - #3092

Merged
VaguelySerious merged 1 commit into
mainfrom
peter/backport-stability-only
Jul 24, 2026
Merged

[ci] Backport only stability fixes to stable, default to claude-opus-5#3092
VaguelySerious merged 1 commit into
mainfrom
peter/backport-stability-only

Conversation

@VaguelySerious

Copy link
Copy Markdown
Member

Two changes to .github/workflows/backport.yml.

1. stable takes stability fixes only

The decision prompt used to tell the AI to lean toward backporting, and listed "minor feature additions that are self-contained and not dependent on main-only changes" as backport-worthy. The result is that feature work lands on stable whenever it happens to cherry-pick cleanly — which is exactly backwards for a maintenance line whose users stayed behind for stability.

The prompt now recommends a backport only for:

  • Bug fixes to functionality that already exists on stable
  • Correctness, data-loss, crash, hang, deadlock, and resource-leak fixes
  • Security fixes, including vulnerability-motivated dependency bumps
  • Fixes for regressions introduced by an earlier backport
  • Test-only changes covering behavior that also exists on stable, and flaky-test fixes
  • Build/CI/release-plumbing fixes needed to keep stable buildable and releasable
  • Documentation corrections for content already on stable

and declines everything else, calling out the cases that used to slip through: small additive features, performance work and refactors that aren't fixing a user-visible defect, non-defect behavior changes to existing APIs, and routine non-security dependency bumps. Mixed fix-plus-feature commits are declined with the fix named in the reasoning so a human can split it out.

The tiebreak also flips: when in doubt, decline. A missed fix can be forced through with workflow_dispatch; unwanted change on stable can't be un-shipped. The prompt explicitly says a clean cherry-pick is not evidence that a change belongs on stable.

Nothing about the mechanism changes — the action still only ever opens a PR for human review, still comments the reasoning on the source PR when it declines, and workflow_dispatch still forces a backport.

2. Default model → anthropic/claude-opus-5

Was anthropic/claude-fable-5. Confirmed the slug is exposed by the AI Gateway (https://ai-gateway.vercel.sh/v1/models), so opencode won't hit ProviderModelNotFoundError. The model input still overrides it per dispatch.

AGENTS.md is updated to match.

Verification

  • .github/workflows/backport.yml parses as YAML (js-yaml), env.AI_MODEL resolves as expected.
  • Rendered the prompt-building block with stub commit context and diffed the output — all backticks and **bold** survive shell escaping, no stray command substitution.

Expect the immediate effect to be a lower backport rate; the no-backport comment on each source PR states which criterion applied.

🤖 Generated with Claude Code

`stable` is a maintenance line: its users stayed behind for stability, so
it should take fixes and nothing else. The previous prompt told the AI to
lean toward backporting and explicitly listed "self-contained minor
feature additions" as backport-worthy, which pulled feature work onto the
branch whenever it cherry-picked cleanly.
The decision prompt now recommends a backport only for defect, security,
regression, test, build/release, and doc-correction changes, declines
everything else (including small additive features and non-defect perf
work), and breaks ties toward declining — `workflow_dispatch` remains the
escape hatch for anything wrongly declined.
Also bumps the default opencode model to `anthropic/claude-opus-5`.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@VaguelySerious
VaguelySerious requested review from a team and ijjk as code ownersJuly 24, 2026 20:20
@vercel

vercelBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 0d5185e

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions

github-actionsBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

All tests passed

E2E Test Summary

Summary
PassedFailedSkippedTotal
✅ ▲ Vercel Production145502391694
✅ 💻 Local Development162102271848
✅ 📦 Local Production162102271848
✅ 🐘 Local Postgres162102271848
✅ 🪟 Windows15400154
✅ 📋 Other102002121232
✅ vercel-multi-region270027
Total7519011328651
Details by Category

✅ ▲ Vercel Production

AppPassedFailedSkipped
✅ astro126028
✅ example126028
✅ express126028
✅ fastify126028
✅ hono126028
✅ nextjs-turbopack15103
✅ nextjs-webpack15103
✅ nitro126028
✅ nuxt126028
✅ sveltekit14509
✅ vite126028

✅ 💻 Local Development

AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
✅ nuxt-stable128026
✅ sveltekit-stable14707
✅ vite-stable128026

✅ 📦 Local Production

AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
✅ nuxt-stable128026
✅ sveltekit-stable14707
✅ vite-stable128026

✅ 🐘 Local Postgres

AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
✅ nuxt-stable128026
✅ sveltekit-stable14707
✅ vite-stable128026

✅ 🪟 Windows

AppPassedFailedSkipped
✅ nextjs-turbopack15400

✅ 📋 Other

AppPassedFailedSkipped
✅ e2e-local-dev-nest-stable128026
✅ e2e-local-dev-tanstack-start-128026
✅ e2e-local-postgres-nest-stable128026
✅ e2e-local-postgres-tanstack-start-128026
✅ e2e-local-prod-nest-stable128026
✅ e2e-local-prod-tanstack-start-128026
✅ e2e-vercel-prod-nest126028
✅ e2e-vercel-prod-tanstack-start126028

✅ vercel-multi-region

AppPassedFailedSkipped
✅ nextjs-turbopack2700

📋 View full workflow run

@github-actions

github-actionsBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

commit 0d5185e · Fri, 24 Jul 2026 20:41:51 GMT · run logs

Backend: vercel · app: nextjs-turbopack

MetricScenarioBest (ms)P75 (ms)P90 (ms)P99 (ms)Samples
TTFSstep248 (-65%) 💚1394 🔴 (+33%) 🔻1437 🔴 (+34%) 🔻1733 🔴 (+20%) 🔻30
TTFSstream279 (-71%) 💚1390 🔴 (+36%) 🔻1420 🔴 (+37%) 🔻1447 🔴 (+38%) 🔻30
TTFShook + stream317 (-73%) 💚1612 🔴 (+22%) 🔻1644 🔴 (+18%) 🔻1708 🔴 (+2.2%)30
STSO1020 steps (1-20)174 (+7.4%)290 🔴 (+16%) 🔻384 🔴 (+28%) 🔻417 🔴 (+37%) 🔻19
STSO1020 steps (101-120)199 (+7.6%)280 🔴 (+1.1%)409 🔴 (+25%) 🔻921 🔴 (+159%) 🔻19
STSO1020 steps (1001-1020)512 (+12%)599 🔴 (+8.1%)647 🔴 (+8.2%)666 🔴 (-19%) 💚19
WO1020 steps408516 (+6.8%)408516 (+6.8%)408516 (+6.8%)408516 (+6.8%)1
SLstream latency109 (+45%) 🔻158 🔴 (+31%) 🔻176 🔴 (+28%) 🔻200 🔴 (-76%) 💚30
SOstream overhead (text)117 (+21%) 🔻205 (+31%) 🔻329 (+69%) 🔻1042 🔴 (+318%) 🔻30
SOstream overhead (structured)137 (+40%) 🔻264 🔴 (+53%) 🔻317 (+28%) 🔻1769 🔴 (+532%) 🔻30
ℹ️ Metric definitions & methodology

Best/P75/P90/P99 deltas compare against the most recent benchmark run on main at the time of this run. 🔻 flags a delta worse than +15%, 💚 one better than −15%.

Metrics — TTFS: time to first step body (in-deployment start() → first step body, deployment clocks) · STSO: step-to-step overhead (gap between consecutive step bodies) · WO: workflow overhead (whole-run time outside step bodies, in-deployment anchored) · SL: stream latency (in-deployment write → read propagation, readAt - writtenAt) · SO: stream overhead (end-to-end write+consume time beyond the modelled generation window)

Scenarios — step: one trivial no-op step, no stream; no hooks, so the run stays in turbo mode (in-process fast path) · stream: one streaming step; no hooks, so the run stays in turbo mode (in-process fast path) · hook + stream: registers a hook before one step, which exits turbo mode (dispatch path) · 1020 steps: 1020 trivial sequential steps; STSO is measured between consecutive steps in the given step ranges, and WO is the whole-run overhead outside step bodies · stream latency: parallel reader/writer steps on a dedicated stream; SL is the in-deployment write->read propagation (readAt - writtenAt) · stream overhead (text): writer streams 300 variable-length text token deltas paced at 100/s for 3s (a haiku-size LLM's token throughput) while a parallel reader drains the whole stream; SO is the end-to-end write+consume time beyond the 3s generation window (overhead/backpressure) · stream overhead (structured): same workload as stream overhead (text), but each delta is an AI-SDK-style structured object ({ type: 'text-delta', id, text }) instead of a raw string, so the SO gap vs the text scenario is the added serialization cost

🔴 marks a percentile over its target (within target is left unmarked). Targets (p75/p90/p99, ms) — TTFS 200/300/600 · SL 50/60/125 · SO 250/500/1000 · STSO (1-20) 20/30/60 · STSO (101-120) 30/45/90 · STSO (1001-1020) 40/60/120

All metrics are measured from deployment-side timestamps only. Runs are triggered by an in-deployment route that stamps the anchor (clientStart) right before start(), so the CI runner’s request and its path through api.vercel.com sit outside every measured window. TTFS = in-deployment start() → first step body (turbo uses the in-process fast path, non-turbo the dispatch path), and includes the VQS dispatch hop plus any /flow cold start. STSO/WO are measured between step bodies on the deployment. SL is measured inside the workflow (parallel reader/writer steps), so it no longer includes the api.vercel.com read path.

Cold starts are kept in the numbers on purpose — they are part of real bursty-workload latency. The workbench deployment cold-starts the /flow invocation for a large fraction of runs, inflating P75+; the Best column shows the fastest (warm-start) sample for comparison.

@VaguelySerious
VaguelySerious merged commit bc53e5a into mainJul 24, 2026
103 of 106 checks passed
@VaguelySerious
VaguelySerious deleted the peter/backport-stability-only branch July 24, 2026 21:29
@github-actions

Copy link
Copy Markdown
Contributor

No backport to stable for bc53e5a (AI decision).

This commit only changes the backport automation's decision policy and default AI model in .github/workflows/backport.yml, which I verified does not exist on origin/stable (the workflow runs solely from main), plus the matching AGENTS.md prose describing that main-only workflow and an empty changeset. It fixes no defect in anything that ships from stable and does nothing to keep stable buildable, testable, or releasable, so backporting it would have no effect there.

To override, re-run the Backport to stable workflow manually via workflow_dispatch and paste this commit SHA into the ref input:

bc53e5a31b89af5d8bc50365796646d4de596005

pranaygp added a commit that referenced this pull request Jul 28, 2026
…ry-2
* origin/main: (292 commits)
feat(core): seal forwarded stream writes to the owner's public key (#3098)
feat(core): seal hook payloads to the target run's public key (#3096)
[e2e] Rebuild the event-log corruption repro around step-count divergence (#3147)
feat: decrypt sealed payloads in the dashboard and CLI (#3146)
Prewarm only appended replay payloads (#3131)
feat: publish each run's X25519 public key on the run entity (#3095)
feat(core): route sealed envelopes through the serialization layer (#3094)
docs: redirect retired migration-guides URLs to comparisons (#3127)
feat(core): add `encp` sealed-box encryption primitive (#3093)
chore(core): clarify runtime comments (#3111)
Remove obsolete world factory aliases (#3112)
feat(core): deterministic sandbox hardening (#3045)
Remove retired v1 step route plumbing (#3061)
[core] Don't count racing invocations' duplicate step_started events toward the maxRetries ceiling (#3069)
[world-testing] Isolate each spawned test server's data directory (#3055)
fix: upgrade postcss to >=8.5.18 to address GHSA-r28c-9q8g-f849 (#3102)
[next] Respect .gitignore in dev watcher to avoid EMFILE on large monorepos (#3085)
[ci] Backport only stability fixes to `stable`, default to claude-opus-5 (#3092)
perf(core): immediate leading-edge dispatch for idle streams (flush window default 0) (#3088)
Optimize `processImportSpecifier` by computing `shouldFollowImportsFromFile` once per file (#3052)
...
# Conflicts:
#	docs/components/geistdocs/desktop-menu.tsx
#	docs/components/geistdocs/mobile-menu.tsx
#	docs/content/docs/v5/cookbook/advanced/child-workflows.mdx
#	docs/content/docs/v5/cookbook/advanced/upgrading-workflows.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/agent-cancellation.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/durable-agent.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/human-in-the-loop.mdx
#	docs/content/docs/v5/cookbook/common-patterns/batching.mdx
#	docs/content/docs/v5/cookbook/common-patterns/idempotency.mdx
#	docs/content/docs/v5/cookbook/common-patterns/rate-limiting.mdx
#	docs/content/docs/v5/cookbook/common-patterns/saga.mdx
#	docs/content/docs/v5/cookbook/common-patterns/scheduling.mdx
#	docs/content/docs/v5/cookbook/common-patterns/sequential-and-parallel.mdx
#	docs/content/docs/v5/cookbook/common-patterns/timeouts.mdx
#	docs/content/docs/v5/cookbook/common-patterns/webhooks.mdx
#	docs/content/docs/v5/cookbook/common-patterns/workflow-composition.mdx
#	docs/content/docs/v5/cookbook/index.mdx
#	docs/content/docs/v5/cookbook/integrations/ai-sdk.mdx
#	docs/content/docs/v5/cookbook/integrations/chat-sdk.mdx
#	docs/content/docs/v5/cookbook/integrations/sandbox.mdx
#	docs/next.config.ts
#	docs/proxy.ts
#	docs/scripts/lint.ts
#	pnpm-lock.yaml
#	pnpm-workspace.yaml
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@VaguelySerious@TooTallNate
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [ci] Backport only stability fixes to `stable`, default to claude-opus-5 by VaguelySerious · Pull Request #3092 · vercel/workflow · GitHub
Skip to content

[ci] Backport only stability fixes to stable, default to claude-opus-5 - #3092

Merged
VaguelySerious merged 1 commit into
mainfrom
peter/backport-stability-only
Jul 24, 2026
Merged

[ci] Backport only stability fixes to stable, default to claude-opus-5#3092
VaguelySerious merged 1 commit into
mainfrom
peter/backport-stability-only

Conversation

@VaguelySerious

Copy link
Copy Markdown
Member

Two changes to .github/workflows/backport.yml.

1. stable takes stability fixes only

The decision prompt used to tell the AI to lean toward backporting, and listed "minor feature additions that are self-contained and not dependent on main-only changes" as backport-worthy. The result is that feature work lands on stable whenever it happens to cherry-pick cleanly — which is exactly backwards for a maintenance line whose users stayed behind for stability.

The prompt now recommends a backport only for:

  • Bug fixes to functionality that already exists on stable
  • Correctness, data-loss, crash, hang, deadlock, and resource-leak fixes
  • Security fixes, including vulnerability-motivated dependency bumps
  • Fixes for regressions introduced by an earlier backport
  • Test-only changes covering behavior that also exists on stable, and flaky-test fixes
  • Build/CI/release-plumbing fixes needed to keep stable buildable and releasable
  • Documentation corrections for content already on stable

and declines everything else, calling out the cases that used to slip through: small additive features, performance work and refactors that aren't fixing a user-visible defect, non-defect behavior changes to existing APIs, and routine non-security dependency bumps. Mixed fix-plus-feature commits are declined with the fix named in the reasoning so a human can split it out.

The tiebreak also flips: when in doubt, decline. A missed fix can be forced through with workflow_dispatch; unwanted change on stable can't be un-shipped. The prompt explicitly says a clean cherry-pick is not evidence that a change belongs on stable.

Nothing about the mechanism changes — the action still only ever opens a PR for human review, still comments the reasoning on the source PR when it declines, and workflow_dispatch still forces a backport.

2. Default model → anthropic/claude-opus-5

Was anthropic/claude-fable-5. Confirmed the slug is exposed by the AI Gateway (https://ai-gateway.vercel.sh/v1/models), so opencode won't hit ProviderModelNotFoundError. The model input still overrides it per dispatch.

AGENTS.md is updated to match.

Verification

  • .github/workflows/backport.yml parses as YAML (js-yaml), env.AI_MODEL resolves as expected.
  • Rendered the prompt-building block with stub commit context and diffed the output — all backticks and **bold** survive shell escaping, no stray command substitution.

Expect the immediate effect to be a lower backport rate; the no-backport comment on each source PR states which criterion applied.

🤖 Generated with Claude Code

`stable` is a maintenance line: its users stayed behind for stability, so
it should take fixes and nothing else. The previous prompt told the AI to
lean toward backporting and explicitly listed "self-contained minor
feature additions" as backport-worthy, which pulled feature work onto the
branch whenever it cherry-picked cleanly.
The decision prompt now recommends a backport only for defect, security,
regression, test, build/release, and doc-correction changes, declines
everything else (including small additive features and non-defect perf
work), and breaks ties toward declining — `workflow_dispatch` remains the
escape hatch for anything wrongly declined.
Also bumps the default opencode model to `anthropic/claude-opus-5`.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@VaguelySerious
VaguelySerious requested review from a team and ijjk as code ownersJuly 24, 2026 20:20
@vercel

vercelBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 0d5185e

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions

github-actionsBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

All tests passed

E2E Test Summary

Summary
PassedFailedSkippedTotal
✅ ▲ Vercel Production145502391694
✅ 💻 Local Development162102271848
✅ 📦 Local Production162102271848
✅ 🐘 Local Postgres162102271848
✅ 🪟 Windows15400154
✅ 📋 Other102002121232
✅ vercel-multi-region270027
Total7519011328651
Details by Category

✅ ▲ Vercel Production

AppPassedFailedSkipped
✅ astro126028
✅ example126028
✅ express126028
✅ fastify126028
✅ hono126028
✅ nextjs-turbopack15103
✅ nextjs-webpack15103
✅ nitro126028
✅ nuxt126028
✅ sveltekit14509
✅ vite126028

✅ 💻 Local Development

AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
✅ nuxt-stable128026
✅ sveltekit-stable14707
✅ vite-stable128026

✅ 📦 Local Production

AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
✅ nuxt-stable128026
✅ sveltekit-stable14707
✅ vite-stable128026

✅ 🐘 Local Postgres

AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
✅ nuxt-stable128026
✅ sveltekit-stable14707
✅ vite-stable128026

✅ 🪟 Windows

AppPassedFailedSkipped
✅ nextjs-turbopack15400

✅ 📋 Other

AppPassedFailedSkipped
✅ e2e-local-dev-nest-stable128026
✅ e2e-local-dev-tanstack-start-128026
✅ e2e-local-postgres-nest-stable128026
✅ e2e-local-postgres-tanstack-start-128026
✅ e2e-local-prod-nest-stable128026
✅ e2e-local-prod-tanstack-start-128026
✅ e2e-vercel-prod-nest126028
✅ e2e-vercel-prod-tanstack-start126028

✅ vercel-multi-region

AppPassedFailedSkipped
✅ nextjs-turbopack2700

📋 View full workflow run

@github-actions

github-actionsBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

commit 0d5185e · Fri, 24 Jul 2026 20:41:51 GMT · run logs

Backend: vercel · app: nextjs-turbopack

MetricScenarioBest (ms)P75 (ms)P90 (ms)P99 (ms)Samples
TTFSstep248 (-65%) 💚1394 🔴 (+33%) 🔻1437 🔴 (+34%) 🔻1733 🔴 (+20%) 🔻30
TTFSstream279 (-71%) 💚1390 🔴 (+36%) 🔻1420 🔴 (+37%) 🔻1447 🔴 (+38%) 🔻30
TTFShook + stream317 (-73%) 💚1612 🔴 (+22%) 🔻1644 🔴 (+18%) 🔻1708 🔴 (+2.2%)30
STSO1020 steps (1-20)174 (+7.4%)290 🔴 (+16%) 🔻384 🔴 (+28%) 🔻417 🔴 (+37%) 🔻19
STSO1020 steps (101-120)199 (+7.6%)280 🔴 (+1.1%)409 🔴 (+25%) 🔻921 🔴 (+159%) 🔻19
STSO1020 steps (1001-1020)512 (+12%)599 🔴 (+8.1%)647 🔴 (+8.2%)666 🔴 (-19%) 💚19
WO1020 steps408516 (+6.8%)408516 (+6.8%)408516 (+6.8%)408516 (+6.8%)1
SLstream latency109 (+45%) 🔻158 🔴 (+31%) 🔻176 🔴 (+28%) 🔻200 🔴 (-76%) 💚30
SOstream overhead (text)117 (+21%) 🔻205 (+31%) 🔻329 (+69%) 🔻1042 🔴 (+318%) 🔻30
SOstream overhead (structured)137 (+40%) 🔻264 🔴 (+53%) 🔻317 (+28%) 🔻1769 🔴 (+532%) 🔻30
ℹ️ Metric definitions & methodology

Best/P75/P90/P99 deltas compare against the most recent benchmark run on main at the time of this run. 🔻 flags a delta worse than +15%, 💚 one better than −15%.

Metrics — TTFS: time to first step body (in-deployment start() → first step body, deployment clocks) · STSO: step-to-step overhead (gap between consecutive step bodies) · WO: workflow overhead (whole-run time outside step bodies, in-deployment anchored) · SL: stream latency (in-deployment write → read propagation, readAt - writtenAt) · SO: stream overhead (end-to-end write+consume time beyond the modelled generation window)

Scenarios — step: one trivial no-op step, no stream; no hooks, so the run stays in turbo mode (in-process fast path) · stream: one streaming step; no hooks, so the run stays in turbo mode (in-process fast path) · hook + stream: registers a hook before one step, which exits turbo mode (dispatch path) · 1020 steps: 1020 trivial sequential steps; STSO is measured between consecutive steps in the given step ranges, and WO is the whole-run overhead outside step bodies · stream latency: parallel reader/writer steps on a dedicated stream; SL is the in-deployment write->read propagation (readAt - writtenAt) · stream overhead (text): writer streams 300 variable-length text token deltas paced at 100/s for 3s (a haiku-size LLM's token throughput) while a parallel reader drains the whole stream; SO is the end-to-end write+consume time beyond the 3s generation window (overhead/backpressure) · stream overhead (structured): same workload as stream overhead (text), but each delta is an AI-SDK-style structured object ({ type: 'text-delta', id, text }) instead of a raw string, so the SO gap vs the text scenario is the added serialization cost

🔴 marks a percentile over its target (within target is left unmarked). Targets (p75/p90/p99, ms) — TTFS 200/300/600 · SL 50/60/125 · SO 250/500/1000 · STSO (1-20) 20/30/60 · STSO (101-120) 30/45/90 · STSO (1001-1020) 40/60/120

All metrics are measured from deployment-side timestamps only. Runs are triggered by an in-deployment route that stamps the anchor (clientStart) right before start(), so the CI runner’s request and its path through api.vercel.com sit outside every measured window. TTFS = in-deployment start() → first step body (turbo uses the in-process fast path, non-turbo the dispatch path), and includes the VQS dispatch hop plus any /flow cold start. STSO/WO are measured between step bodies on the deployment. SL is measured inside the workflow (parallel reader/writer steps), so it no longer includes the api.vercel.com read path.

Cold starts are kept in the numbers on purpose — they are part of real bursty-workload latency. The workbench deployment cold-starts the /flow invocation for a large fraction of runs, inflating P75+; the Best column shows the fastest (warm-start) sample for comparison.

@VaguelySerious
VaguelySerious merged commit bc53e5a into mainJul 24, 2026
103 of 106 checks passed
@VaguelySerious
VaguelySerious deleted the peter/backport-stability-only branch July 24, 2026 21:29
@github-actions

Copy link
Copy Markdown
Contributor

No backport to stable for bc53e5a (AI decision).

This commit only changes the backport automation's decision policy and default AI model in .github/workflows/backport.yml, which I verified does not exist on origin/stable (the workflow runs solely from main), plus the matching AGENTS.md prose describing that main-only workflow and an empty changeset. It fixes no defect in anything that ships from stable and does nothing to keep stable buildable, testable, or releasable, so backporting it would have no effect there.

To override, re-run the Backport to stable workflow manually via workflow_dispatch and paste this commit SHA into the ref input:

bc53e5a31b89af5d8bc50365796646d4de596005

pranaygp added a commit that referenced this pull request Jul 28, 2026
…ry-2
* origin/main: (292 commits)
feat(core): seal forwarded stream writes to the owner's public key (#3098)
feat(core): seal hook payloads to the target run's public key (#3096)
[e2e] Rebuild the event-log corruption repro around step-count divergence (#3147)
feat: decrypt sealed payloads in the dashboard and CLI (#3146)
Prewarm only appended replay payloads (#3131)
feat: publish each run's X25519 public key on the run entity (#3095)
feat(core): route sealed envelopes through the serialization layer (#3094)
docs: redirect retired migration-guides URLs to comparisons (#3127)
feat(core): add `encp` sealed-box encryption primitive (#3093)
chore(core): clarify runtime comments (#3111)
Remove obsolete world factory aliases (#3112)
feat(core): deterministic sandbox hardening (#3045)
Remove retired v1 step route plumbing (#3061)
[core] Don't count racing invocations' duplicate step_started events toward the maxRetries ceiling (#3069)
[world-testing] Isolate each spawned test server's data directory (#3055)
fix: upgrade postcss to >=8.5.18 to address GHSA-r28c-9q8g-f849 (#3102)
[next] Respect .gitignore in dev watcher to avoid EMFILE on large monorepos (#3085)
[ci] Backport only stability fixes to `stable`, default to claude-opus-5 (#3092)
perf(core): immediate leading-edge dispatch for idle streams (flush window default 0) (#3088)
Optimize `processImportSpecifier` by computing `shouldFollowImportsFromFile` once per file (#3052)
...
# Conflicts:
#	docs/components/geistdocs/desktop-menu.tsx
#	docs/components/geistdocs/mobile-menu.tsx
#	docs/content/docs/v5/cookbook/advanced/child-workflows.mdx
#	docs/content/docs/v5/cookbook/advanced/upgrading-workflows.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/agent-cancellation.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/durable-agent.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/human-in-the-loop.mdx
#	docs/content/docs/v5/cookbook/common-patterns/batching.mdx
#	docs/content/docs/v5/cookbook/common-patterns/idempotency.mdx
#	docs/content/docs/v5/cookbook/common-patterns/rate-limiting.mdx
#	docs/content/docs/v5/cookbook/common-patterns/saga.mdx
#	docs/content/docs/v5/cookbook/common-patterns/scheduling.mdx
#	docs/content/docs/v5/cookbook/common-patterns/sequential-and-parallel.mdx
#	docs/content/docs/v5/cookbook/common-patterns/timeouts.mdx
#	docs/content/docs/v5/cookbook/common-patterns/webhooks.mdx
#	docs/content/docs/v5/cookbook/common-patterns/workflow-composition.mdx
#	docs/content/docs/v5/cookbook/index.mdx
#	docs/content/docs/v5/cookbook/integrations/ai-sdk.mdx
#	docs/content/docs/v5/cookbook/integrations/chat-sdk.mdx
#	docs/content/docs/v5/cookbook/integrations/sandbox.mdx
#	docs/next.config.ts
#	docs/proxy.ts
#	docs/scripts/lint.ts
#	pnpm-lock.yaml
#	pnpm-workspace.yaml
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@VaguelySerious@TooTallNate
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' [ci] Backport only stability fixes to `stable`, default to claude-opus-5 by VaguelySerious · Pull Request #3092 · vercel/workflow · GitHub
Skip to content

[ci] Backport only stability fixes to stable, default to claude-opus-5 - #3092

Merged
VaguelySerious merged 1 commit into
mainfrom
peter/backport-stability-only
Jul 24, 2026
Merged

[ci] Backport only stability fixes to stable, default to claude-opus-5#3092
VaguelySerious merged 1 commit into
mainfrom
peter/backport-stability-only

Conversation

@VaguelySerious

Copy link
Copy Markdown
Member

Two changes to .github/workflows/backport.yml.

1. stable takes stability fixes only

The decision prompt used to tell the AI to lean toward backporting, and listed "minor feature additions that are self-contained and not dependent on main-only changes" as backport-worthy. The result is that feature work lands on stable whenever it happens to cherry-pick cleanly — which is exactly backwards for a maintenance line whose users stayed behind for stability.

The prompt now recommends a backport only for:

  • Bug fixes to functionality that already exists on stable
  • Correctness, data-loss, crash, hang, deadlock, and resource-leak fixes
  • Security fixes, including vulnerability-motivated dependency bumps
  • Fixes for regressions introduced by an earlier backport
  • Test-only changes covering behavior that also exists on stable, and flaky-test fixes
  • Build/CI/release-plumbing fixes needed to keep stable buildable and releasable
  • Documentation corrections for content already on stable

and declines everything else, calling out the cases that used to slip through: small additive features, performance work and refactors that aren't fixing a user-visible defect, non-defect behavior changes to existing APIs, and routine non-security dependency bumps. Mixed fix-plus-feature commits are declined with the fix named in the reasoning so a human can split it out.

The tiebreak also flips: when in doubt, decline. A missed fix can be forced through with workflow_dispatch; unwanted change on stable can't be un-shipped. The prompt explicitly says a clean cherry-pick is not evidence that a change belongs on stable.

Nothing about the mechanism changes — the action still only ever opens a PR for human review, still comments the reasoning on the source PR when it declines, and workflow_dispatch still forces a backport.

2. Default model → anthropic/claude-opus-5

Was anthropic/claude-fable-5. Confirmed the slug is exposed by the AI Gateway (https://ai-gateway.vercel.sh/v1/models), so opencode won't hit ProviderModelNotFoundError. The model input still overrides it per dispatch.

AGENTS.md is updated to match.

Verification

  • .github/workflows/backport.yml parses as YAML (js-yaml), env.AI_MODEL resolves as expected.
  • Rendered the prompt-building block with stub commit context and diffed the output — all backticks and **bold** survive shell escaping, no stray command substitution.

Expect the immediate effect to be a lower backport rate; the no-backport comment on each source PR states which criterion applied.

🤖 Generated with Claude Code

`stable` is a maintenance line: its users stayed behind for stability, so
it should take fixes and nothing else. The previous prompt told the AI to
lean toward backporting and explicitly listed "self-contained minor
feature additions" as backport-worthy, which pulled feature work onto the
branch whenever it cherry-picked cleanly.
The decision prompt now recommends a backport only for defect, security,
regression, test, build/release, and doc-correction changes, declines
everything else (including small additive features and non-defect perf
work), and breaks ties toward declining — `workflow_dispatch` remains the
escape hatch for anything wrongly declined.
Also bumps the default opencode model to `anthropic/claude-opus-5`.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@VaguelySerious
VaguelySerious requested review from a team and ijjk as code ownersJuly 24, 2026 20:20
@vercel

vercelBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 0d5185e

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions

github-actionsBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

All tests passed

E2E Test Summary

Summary
PassedFailedSkippedTotal
✅ ▲ Vercel Production145502391694
✅ 💻 Local Development162102271848
✅ 📦 Local Production162102271848
✅ 🐘 Local Postgres162102271848
✅ 🪟 Windows15400154
✅ 📋 Other102002121232
✅ vercel-multi-region270027
Total7519011328651
Details by Category

✅ ▲ Vercel Production

AppPassedFailedSkipped
✅ astro126028
✅ example126028
✅ express126028
✅ fastify126028
✅ hono126028
✅ nextjs-turbopack15103
✅ nextjs-webpack15103
✅ nitro126028
✅ nuxt126028
✅ sveltekit14509
✅ vite126028

✅ 💻 Local Development

AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
✅ nuxt-stable128026
✅ sveltekit-stable14707
✅ vite-stable128026

✅ 📦 Local Production

AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
✅ nuxt-stable128026
✅ sveltekit-stable14707
✅ vite-stable128026

✅ 🐘 Local Postgres

AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
✅ nuxt-stable128026
✅ sveltekit-stable14707
✅ vite-stable128026

✅ 🪟 Windows

AppPassedFailedSkipped
✅ nextjs-turbopack15400

✅ 📋 Other

AppPassedFailedSkipped
✅ e2e-local-dev-nest-stable128026
✅ e2e-local-dev-tanstack-start-128026
✅ e2e-local-postgres-nest-stable128026
✅ e2e-local-postgres-tanstack-start-128026
✅ e2e-local-prod-nest-stable128026
✅ e2e-local-prod-tanstack-start-128026
✅ e2e-vercel-prod-nest126028
✅ e2e-vercel-prod-tanstack-start126028

✅ vercel-multi-region

AppPassedFailedSkipped
✅ nextjs-turbopack2700

📋 View full workflow run

@github-actions

github-actionsBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

commit 0d5185e · Fri, 24 Jul 2026 20:41:51 GMT · run logs

Backend: vercel · app: nextjs-turbopack

MetricScenarioBest (ms)P75 (ms)P90 (ms)P99 (ms)Samples
TTFSstep248 (-65%) 💚1394 🔴 (+33%) 🔻1437 🔴 (+34%) 🔻1733 🔴 (+20%) 🔻30
TTFSstream279 (-71%) 💚1390 🔴 (+36%) 🔻1420 🔴 (+37%) 🔻1447 🔴 (+38%) 🔻30
TTFShook + stream317 (-73%) 💚1612 🔴 (+22%) 🔻1644 🔴 (+18%) 🔻1708 🔴 (+2.2%)30
STSO1020 steps (1-20)174 (+7.4%)290 🔴 (+16%) 🔻384 🔴 (+28%) 🔻417 🔴 (+37%) 🔻19
STSO1020 steps (101-120)199 (+7.6%)280 🔴 (+1.1%)409 🔴 (+25%) 🔻921 🔴 (+159%) 🔻19
STSO1020 steps (1001-1020)512 (+12%)599 🔴 (+8.1%)647 🔴 (+8.2%)666 🔴 (-19%) 💚19
WO1020 steps408516 (+6.8%)408516 (+6.8%)408516 (+6.8%)408516 (+6.8%)1
SLstream latency109 (+45%) 🔻158 🔴 (+31%) 🔻176 🔴 (+28%) 🔻200 🔴 (-76%) 💚30
SOstream overhead (text)117 (+21%) 🔻205 (+31%) 🔻329 (+69%) 🔻1042 🔴 (+318%) 🔻30
SOstream overhead (structured)137 (+40%) 🔻264 🔴 (+53%) 🔻317 (+28%) 🔻1769 🔴 (+532%) 🔻30
ℹ️ Metric definitions & methodology

Best/P75/P90/P99 deltas compare against the most recent benchmark run on main at the time of this run. 🔻 flags a delta worse than +15%, 💚 one better than −15%.

Metrics — TTFS: time to first step body (in-deployment start() → first step body, deployment clocks) · STSO: step-to-step overhead (gap between consecutive step bodies) · WO: workflow overhead (whole-run time outside step bodies, in-deployment anchored) · SL: stream latency (in-deployment write → read propagation, readAt - writtenAt) · SO: stream overhead (end-to-end write+consume time beyond the modelled generation window)

Scenarios — step: one trivial no-op step, no stream; no hooks, so the run stays in turbo mode (in-process fast path) · stream: one streaming step; no hooks, so the run stays in turbo mode (in-process fast path) · hook + stream: registers a hook before one step, which exits turbo mode (dispatch path) · 1020 steps: 1020 trivial sequential steps; STSO is measured between consecutive steps in the given step ranges, and WO is the whole-run overhead outside step bodies · stream latency: parallel reader/writer steps on a dedicated stream; SL is the in-deployment write->read propagation (readAt - writtenAt) · stream overhead (text): writer streams 300 variable-length text token deltas paced at 100/s for 3s (a haiku-size LLM's token throughput) while a parallel reader drains the whole stream; SO is the end-to-end write+consume time beyond the 3s generation window (overhead/backpressure) · stream overhead (structured): same workload as stream overhead (text), but each delta is an AI-SDK-style structured object ({ type: 'text-delta', id, text }) instead of a raw string, so the SO gap vs the text scenario is the added serialization cost

🔴 marks a percentile over its target (within target is left unmarked). Targets (p75/p90/p99, ms) — TTFS 200/300/600 · SL 50/60/125 · SO 250/500/1000 · STSO (1-20) 20/30/60 · STSO (101-120) 30/45/90 · STSO (1001-1020) 40/60/120

All metrics are measured from deployment-side timestamps only. Runs are triggered by an in-deployment route that stamps the anchor (clientStart) right before start(), so the CI runner’s request and its path through api.vercel.com sit outside every measured window. TTFS = in-deployment start() → first step body (turbo uses the in-process fast path, non-turbo the dispatch path), and includes the VQS dispatch hop plus any /flow cold start. STSO/WO are measured between step bodies on the deployment. SL is measured inside the workflow (parallel reader/writer steps), so it no longer includes the api.vercel.com read path.

Cold starts are kept in the numbers on purpose — they are part of real bursty-workload latency. The workbench deployment cold-starts the /flow invocation for a large fraction of runs, inflating P75+; the Best column shows the fastest (warm-start) sample for comparison.

@VaguelySerious
VaguelySerious merged commit bc53e5a into mainJul 24, 2026
103 of 106 checks passed
@VaguelySerious
VaguelySerious deleted the peter/backport-stability-only branch July 24, 2026 21:29
@github-actions

Copy link
Copy Markdown
Contributor

No backport to stable for bc53e5a (AI decision).

This commit only changes the backport automation's decision policy and default AI model in .github/workflows/backport.yml, which I verified does not exist on origin/stable (the workflow runs solely from main), plus the matching AGENTS.md prose describing that main-only workflow and an empty changeset. It fixes no defect in anything that ships from stable and does nothing to keep stable buildable, testable, or releasable, so backporting it would have no effect there.

To override, re-run the Backport to stable workflow manually via workflow_dispatch and paste this commit SHA into the ref input:

bc53e5a31b89af5d8bc50365796646d4de596005

pranaygp added a commit that referenced this pull request Jul 28, 2026
…ry-2
* origin/main: (292 commits)
feat(core): seal forwarded stream writes to the owner's public key (#3098)
feat(core): seal hook payloads to the target run's public key (#3096)
[e2e] Rebuild the event-log corruption repro around step-count divergence (#3147)
feat: decrypt sealed payloads in the dashboard and CLI (#3146)
Prewarm only appended replay payloads (#3131)
feat: publish each run's X25519 public key on the run entity (#3095)
feat(core): route sealed envelopes through the serialization layer (#3094)
docs: redirect retired migration-guides URLs to comparisons (#3127)
feat(core): add `encp` sealed-box encryption primitive (#3093)
chore(core): clarify runtime comments (#3111)
Remove obsolete world factory aliases (#3112)
feat(core): deterministic sandbox hardening (#3045)
Remove retired v1 step route plumbing (#3061)
[core] Don't count racing invocations' duplicate step_started events toward the maxRetries ceiling (#3069)
[world-testing] Isolate each spawned test server's data directory (#3055)
fix: upgrade postcss to >=8.5.18 to address GHSA-r28c-9q8g-f849 (#3102)
[next] Respect .gitignore in dev watcher to avoid EMFILE on large monorepos (#3085)
[ci] Backport only stability fixes to `stable`, default to claude-opus-5 (#3092)
perf(core): immediate leading-edge dispatch for idle streams (flush window default 0) (#3088)
Optimize `processImportSpecifier` by computing `shouldFollowImportsFromFile` once per file (#3052)
...
# Conflicts:
#	docs/components/geistdocs/desktop-menu.tsx
#	docs/components/geistdocs/mobile-menu.tsx
#	docs/content/docs/v5/cookbook/advanced/child-workflows.mdx
#	docs/content/docs/v5/cookbook/advanced/upgrading-workflows.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/agent-cancellation.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/durable-agent.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/human-in-the-loop.mdx
#	docs/content/docs/v5/cookbook/common-patterns/batching.mdx
#	docs/content/docs/v5/cookbook/common-patterns/idempotency.mdx
#	docs/content/docs/v5/cookbook/common-patterns/rate-limiting.mdx
#	docs/content/docs/v5/cookbook/common-patterns/saga.mdx
#	docs/content/docs/v5/cookbook/common-patterns/scheduling.mdx
#	docs/content/docs/v5/cookbook/common-patterns/sequential-and-parallel.mdx
#	docs/content/docs/v5/cookbook/common-patterns/timeouts.mdx
#	docs/content/docs/v5/cookbook/common-patterns/webhooks.mdx
#	docs/content/docs/v5/cookbook/common-patterns/workflow-composition.mdx
#	docs/content/docs/v5/cookbook/index.mdx
#	docs/content/docs/v5/cookbook/integrations/ai-sdk.mdx
#	docs/content/docs/v5/cookbook/integrations/chat-sdk.mdx
#	docs/content/docs/v5/cookbook/integrations/sandbox.mdx
#	docs/next.config.ts
#	docs/proxy.ts
#	docs/scripts/lint.ts
#	pnpm-lock.yaml
#	pnpm-workspace.yaml
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@VaguelySerious@TooTallNate
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [ci] Backport only stability fixes to `stable`, default to claude-opus-5 by VaguelySerious · Pull Request #3092 · vercel/workflow · GitHub
Skip to content

[ci] Backport only stability fixes to stable, default to claude-opus-5 - #3092

Merged
VaguelySerious merged 1 commit into
mainfrom
peter/backport-stability-only
Jul 24, 2026
Merged

[ci] Backport only stability fixes to stable, default to claude-opus-5#3092
VaguelySerious merged 1 commit into
mainfrom
peter/backport-stability-only

Conversation

@VaguelySerious

Copy link
Copy Markdown
Member

Two changes to .github/workflows/backport.yml.

1. stable takes stability fixes only

The decision prompt used to tell the AI to lean toward backporting, and listed "minor feature additions that are self-contained and not dependent on main-only changes" as backport-worthy. The result is that feature work lands on stable whenever it happens to cherry-pick cleanly — which is exactly backwards for a maintenance line whose users stayed behind for stability.

The prompt now recommends a backport only for:

  • Bug fixes to functionality that already exists on stable
  • Correctness, data-loss, crash, hang, deadlock, and resource-leak fixes
  • Security fixes, including vulnerability-motivated dependency bumps
  • Fixes for regressions introduced by an earlier backport
  • Test-only changes covering behavior that also exists on stable, and flaky-test fixes
  • Build/CI/release-plumbing fixes needed to keep stable buildable and releasable
  • Documentation corrections for content already on stable

and declines everything else, calling out the cases that used to slip through: small additive features, performance work and refactors that aren't fixing a user-visible defect, non-defect behavior changes to existing APIs, and routine non-security dependency bumps. Mixed fix-plus-feature commits are declined with the fix named in the reasoning so a human can split it out.

The tiebreak also flips: when in doubt, decline. A missed fix can be forced through with workflow_dispatch; unwanted change on stable can't be un-shipped. The prompt explicitly says a clean cherry-pick is not evidence that a change belongs on stable.

Nothing about the mechanism changes — the action still only ever opens a PR for human review, still comments the reasoning on the source PR when it declines, and workflow_dispatch still forces a backport.

2. Default model → anthropic/claude-opus-5

Was anthropic/claude-fable-5. Confirmed the slug is exposed by the AI Gateway (https://ai-gateway.vercel.sh/v1/models), so opencode won't hit ProviderModelNotFoundError. The model input still overrides it per dispatch.

AGENTS.md is updated to match.

Verification

  • .github/workflows/backport.yml parses as YAML (js-yaml), env.AI_MODEL resolves as expected.
  • Rendered the prompt-building block with stub commit context and diffed the output — all backticks and **bold** survive shell escaping, no stray command substitution.

Expect the immediate effect to be a lower backport rate; the no-backport comment on each source PR states which criterion applied.

🤖 Generated with Claude Code

`stable` is a maintenance line: its users stayed behind for stability, so
it should take fixes and nothing else. The previous prompt told the AI to
lean toward backporting and explicitly listed "self-contained minor
feature additions" as backport-worthy, which pulled feature work onto the
branch whenever it cherry-picked cleanly.
The decision prompt now recommends a backport only for defect, security,
regression, test, build/release, and doc-correction changes, declines
everything else (including small additive features and non-defect perf
work), and breaks ties toward declining — `workflow_dispatch` remains the
escape hatch for anything wrongly declined.
Also bumps the default opencode model to `anthropic/claude-opus-5`.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@VaguelySerious
VaguelySerious requested review from a team and ijjk as code ownersJuly 24, 2026 20:20
@vercel

vercelBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 0d5185e

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions

github-actionsBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

All tests passed

E2E Test Summary

Summary
PassedFailedSkippedTotal
✅ ▲ Vercel Production145502391694
✅ 💻 Local Development162102271848
✅ 📦 Local Production162102271848
✅ 🐘 Local Postgres162102271848
✅ 🪟 Windows15400154
✅ 📋 Other102002121232
✅ vercel-multi-region270027
Total7519011328651
Details by Category

✅ ▲ Vercel Production

AppPassedFailedSkipped
✅ astro126028
✅ example126028
✅ express126028
✅ fastify126028
✅ hono126028
✅ nextjs-turbopack15103
✅ nextjs-webpack15103
✅ nitro126028
✅ nuxt126028
✅ sveltekit14509
✅ vite126028

✅ 💻 Local Development

AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
✅ nuxt-stable128026
✅ sveltekit-stable14707
✅ vite-stable128026

✅ 📦 Local Production

AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
✅ nuxt-stable128026
✅ sveltekit-stable14707
✅ vite-stable128026

✅ 🐘 Local Postgres

AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
✅ nuxt-stable128026
✅ sveltekit-stable14707
✅ vite-stable128026

✅ 🪟 Windows

AppPassedFailedSkipped
✅ nextjs-turbopack15400

✅ 📋 Other

AppPassedFailedSkipped
✅ e2e-local-dev-nest-stable128026
✅ e2e-local-dev-tanstack-start-128026
✅ e2e-local-postgres-nest-stable128026
✅ e2e-local-postgres-tanstack-start-128026
✅ e2e-local-prod-nest-stable128026
✅ e2e-local-prod-tanstack-start-128026
✅ e2e-vercel-prod-nest126028
✅ e2e-vercel-prod-tanstack-start126028

✅ vercel-multi-region

AppPassedFailedSkipped
✅ nextjs-turbopack2700

📋 View full workflow run

@github-actions

github-actionsBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

commit 0d5185e · Fri, 24 Jul 2026 20:41:51 GMT · run logs

Backend: vercel · app: nextjs-turbopack

MetricScenarioBest (ms)P75 (ms)P90 (ms)P99 (ms)Samples
TTFSstep248 (-65%) 💚1394 🔴 (+33%) 🔻1437 🔴 (+34%) 🔻1733 🔴 (+20%) 🔻30
TTFSstream279 (-71%) 💚1390 🔴 (+36%) 🔻1420 🔴 (+37%) 🔻1447 🔴 (+38%) 🔻30
TTFShook + stream317 (-73%) 💚1612 🔴 (+22%) 🔻1644 🔴 (+18%) 🔻1708 🔴 (+2.2%)30
STSO1020 steps (1-20)174 (+7.4%)290 🔴 (+16%) 🔻384 🔴 (+28%) 🔻417 🔴 (+37%) 🔻19
STSO1020 steps (101-120)199 (+7.6%)280 🔴 (+1.1%)409 🔴 (+25%) 🔻921 🔴 (+159%) 🔻19
STSO1020 steps (1001-1020)512 (+12%)599 🔴 (+8.1%)647 🔴 (+8.2%)666 🔴 (-19%) 💚19
WO1020 steps408516 (+6.8%)408516 (+6.8%)408516 (+6.8%)408516 (+6.8%)1
SLstream latency109 (+45%) 🔻158 🔴 (+31%) 🔻176 🔴 (+28%) 🔻200 🔴 (-76%) 💚30
SOstream overhead (text)117 (+21%) 🔻205 (+31%) 🔻329 (+69%) 🔻1042 🔴 (+318%) 🔻30
SOstream overhead (structured)137 (+40%) 🔻264 🔴 (+53%) 🔻317 (+28%) 🔻1769 🔴 (+532%) 🔻30
ℹ️ Metric definitions & methodology

Best/P75/P90/P99 deltas compare against the most recent benchmark run on main at the time of this run. 🔻 flags a delta worse than +15%, 💚 one better than −15%.

Metrics — TTFS: time to first step body (in-deployment start() → first step body, deployment clocks) · STSO: step-to-step overhead (gap between consecutive step bodies) · WO: workflow overhead (whole-run time outside step bodies, in-deployment anchored) · SL: stream latency (in-deployment write → read propagation, readAt - writtenAt) · SO: stream overhead (end-to-end write+consume time beyond the modelled generation window)

Scenarios — step: one trivial no-op step, no stream; no hooks, so the run stays in turbo mode (in-process fast path) · stream: one streaming step; no hooks, so the run stays in turbo mode (in-process fast path) · hook + stream: registers a hook before one step, which exits turbo mode (dispatch path) · 1020 steps: 1020 trivial sequential steps; STSO is measured between consecutive steps in the given step ranges, and WO is the whole-run overhead outside step bodies · stream latency: parallel reader/writer steps on a dedicated stream; SL is the in-deployment write->read propagation (readAt - writtenAt) · stream overhead (text): writer streams 300 variable-length text token deltas paced at 100/s for 3s (a haiku-size LLM's token throughput) while a parallel reader drains the whole stream; SO is the end-to-end write+consume time beyond the 3s generation window (overhead/backpressure) · stream overhead (structured): same workload as stream overhead (text), but each delta is an AI-SDK-style structured object ({ type: 'text-delta', id, text }) instead of a raw string, so the SO gap vs the text scenario is the added serialization cost

🔴 marks a percentile over its target (within target is left unmarked). Targets (p75/p90/p99, ms) — TTFS 200/300/600 · SL 50/60/125 · SO 250/500/1000 · STSO (1-20) 20/30/60 · STSO (101-120) 30/45/90 · STSO (1001-1020) 40/60/120

All metrics are measured from deployment-side timestamps only. Runs are triggered by an in-deployment route that stamps the anchor (clientStart) right before start(), so the CI runner’s request and its path through api.vercel.com sit outside every measured window. TTFS = in-deployment start() → first step body (turbo uses the in-process fast path, non-turbo the dispatch path), and includes the VQS dispatch hop plus any /flow cold start. STSO/WO are measured between step bodies on the deployment. SL is measured inside the workflow (parallel reader/writer steps), so it no longer includes the api.vercel.com read path.

Cold starts are kept in the numbers on purpose — they are part of real bursty-workload latency. The workbench deployment cold-starts the /flow invocation for a large fraction of runs, inflating P75+; the Best column shows the fastest (warm-start) sample for comparison.

@VaguelySerious
VaguelySerious merged commit bc53e5a into mainJul 24, 2026
103 of 106 checks passed
@VaguelySerious
VaguelySerious deleted the peter/backport-stability-only branch July 24, 2026 21:29
@github-actions

Copy link
Copy Markdown
Contributor

No backport to stable for bc53e5a (AI decision).

This commit only changes the backport automation's decision policy and default AI model in .github/workflows/backport.yml, which I verified does not exist on origin/stable (the workflow runs solely from main), plus the matching AGENTS.md prose describing that main-only workflow and an empty changeset. It fixes no defect in anything that ships from stable and does nothing to keep stable buildable, testable, or releasable, so backporting it would have no effect there.

To override, re-run the Backport to stable workflow manually via workflow_dispatch and paste this commit SHA into the ref input:

bc53e5a31b89af5d8bc50365796646d4de596005

pranaygp added a commit that referenced this pull request Jul 28, 2026
…ry-2
* origin/main: (292 commits)
feat(core): seal forwarded stream writes to the owner's public key (#3098)
feat(core): seal hook payloads to the target run's public key (#3096)
[e2e] Rebuild the event-log corruption repro around step-count divergence (#3147)
feat: decrypt sealed payloads in the dashboard and CLI (#3146)
Prewarm only appended replay payloads (#3131)
feat: publish each run's X25519 public key on the run entity (#3095)
feat(core): route sealed envelopes through the serialization layer (#3094)
docs: redirect retired migration-guides URLs to comparisons (#3127)
feat(core): add `encp` sealed-box encryption primitive (#3093)
chore(core): clarify runtime comments (#3111)
Remove obsolete world factory aliases (#3112)
feat(core): deterministic sandbox hardening (#3045)
Remove retired v1 step route plumbing (#3061)
[core] Don't count racing invocations' duplicate step_started events toward the maxRetries ceiling (#3069)
[world-testing] Isolate each spawned test server's data directory (#3055)
fix: upgrade postcss to >=8.5.18 to address GHSA-r28c-9q8g-f849 (#3102)
[next] Respect .gitignore in dev watcher to avoid EMFILE on large monorepos (#3085)
[ci] Backport only stability fixes to `stable`, default to claude-opus-5 (#3092)
perf(core): immediate leading-edge dispatch for idle streams (flush window default 0) (#3088)
Optimize `processImportSpecifier` by computing `shouldFollowImportsFromFile` once per file (#3052)
...
# Conflicts:
#	docs/components/geistdocs/desktop-menu.tsx
#	docs/components/geistdocs/mobile-menu.tsx
#	docs/content/docs/v5/cookbook/advanced/child-workflows.mdx
#	docs/content/docs/v5/cookbook/advanced/upgrading-workflows.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/agent-cancellation.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/durable-agent.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/human-in-the-loop.mdx
#	docs/content/docs/v5/cookbook/common-patterns/batching.mdx
#	docs/content/docs/v5/cookbook/common-patterns/idempotency.mdx
#	docs/content/docs/v5/cookbook/common-patterns/rate-limiting.mdx
#	docs/content/docs/v5/cookbook/common-patterns/saga.mdx
#	docs/content/docs/v5/cookbook/common-patterns/scheduling.mdx
#	docs/content/docs/v5/cookbook/common-patterns/sequential-and-parallel.mdx
#	docs/content/docs/v5/cookbook/common-patterns/timeouts.mdx
#	docs/content/docs/v5/cookbook/common-patterns/webhooks.mdx
#	docs/content/docs/v5/cookbook/common-patterns/workflow-composition.mdx
#	docs/content/docs/v5/cookbook/index.mdx
#	docs/content/docs/v5/cookbook/integrations/ai-sdk.mdx
#	docs/content/docs/v5/cookbook/integrations/chat-sdk.mdx
#	docs/content/docs/v5/cookbook/integrations/sandbox.mdx
#	docs/next.config.ts
#	docs/proxy.ts
#	docs/scripts/lint.ts
#	pnpm-lock.yaml
#	pnpm-workspace.yaml
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@VaguelySerious@TooTallNate
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); [ci] Backport only stability fixes to `stable`, default to claude-opus-5 by VaguelySerious · Pull Request #3092 · vercel/workflow · GitHub
Skip to content

[ci] Backport only stability fixes to stable, default to claude-opus-5 - #3092

Merged
VaguelySerious merged 1 commit into
mainfrom
peter/backport-stability-only
Jul 24, 2026
Merged

[ci] Backport only stability fixes to stable, default to claude-opus-5#3092
VaguelySerious merged 1 commit into
mainfrom
peter/backport-stability-only

Conversation

@VaguelySerious

Copy link
Copy Markdown
Member

Two changes to .github/workflows/backport.yml.

1. stable takes stability fixes only

The decision prompt used to tell the AI to lean toward backporting, and listed "minor feature additions that are self-contained and not dependent on main-only changes" as backport-worthy. The result is that feature work lands on stable whenever it happens to cherry-pick cleanly — which is exactly backwards for a maintenance line whose users stayed behind for stability.

The prompt now recommends a backport only for:

  • Bug fixes to functionality that already exists on stable
  • Correctness, data-loss, crash, hang, deadlock, and resource-leak fixes
  • Security fixes, including vulnerability-motivated dependency bumps
  • Fixes for regressions introduced by an earlier backport
  • Test-only changes covering behavior that also exists on stable, and flaky-test fixes
  • Build/CI/release-plumbing fixes needed to keep stable buildable and releasable
  • Documentation corrections for content already on stable

and declines everything else, calling out the cases that used to slip through: small additive features, performance work and refactors that aren't fixing a user-visible defect, non-defect behavior changes to existing APIs, and routine non-security dependency bumps. Mixed fix-plus-feature commits are declined with the fix named in the reasoning so a human can split it out.

The tiebreak also flips: when in doubt, decline. A missed fix can be forced through with workflow_dispatch; unwanted change on stable can't be un-shipped. The prompt explicitly says a clean cherry-pick is not evidence that a change belongs on stable.

Nothing about the mechanism changes — the action still only ever opens a PR for human review, still comments the reasoning on the source PR when it declines, and workflow_dispatch still forces a backport.

2. Default model → anthropic/claude-opus-5

Was anthropic/claude-fable-5. Confirmed the slug is exposed by the AI Gateway (https://ai-gateway.vercel.sh/v1/models), so opencode won't hit ProviderModelNotFoundError. The model input still overrides it per dispatch.

AGENTS.md is updated to match.

Verification

  • .github/workflows/backport.yml parses as YAML (js-yaml), env.AI_MODEL resolves as expected.
  • Rendered the prompt-building block with stub commit context and diffed the output — all backticks and **bold** survive shell escaping, no stray command substitution.

Expect the immediate effect to be a lower backport rate; the no-backport comment on each source PR states which criterion applied.

🤖 Generated with Claude Code

`stable` is a maintenance line: its users stayed behind for stability, so
it should take fixes and nothing else. The previous prompt told the AI to
lean toward backporting and explicitly listed "self-contained minor
feature additions" as backport-worthy, which pulled feature work onto the
branch whenever it cherry-picked cleanly.
The decision prompt now recommends a backport only for defect, security,
regression, test, build/release, and doc-correction changes, declines
everything else (including small additive features and non-defect perf
work), and breaks ties toward declining — `workflow_dispatch` remains the
escape hatch for anything wrongly declined.
Also bumps the default opencode model to `anthropic/claude-opus-5`.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@VaguelySerious
VaguelySerious requested review from a team and ijjk as code ownersJuly 24, 2026 20:20
@vercel

vercelBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 0d5185e

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions

github-actionsBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

All tests passed

E2E Test Summary

Summary
PassedFailedSkippedTotal
✅ ▲ Vercel Production145502391694
✅ 💻 Local Development162102271848
✅ 📦 Local Production162102271848
✅ 🐘 Local Postgres162102271848
✅ 🪟 Windows15400154
✅ 📋 Other102002121232
✅ vercel-multi-region270027
Total7519011328651
Details by Category

✅ ▲ Vercel Production

AppPassedFailedSkipped
✅ astro126028
✅ example126028
✅ express126028
✅ fastify126028
✅ hono126028
✅ nextjs-turbopack15103
✅ nextjs-webpack15103
✅ nitro126028
✅ nuxt126028
✅ sveltekit14509
✅ vite126028

✅ 💻 Local Development

AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
✅ nuxt-stable128026
✅ sveltekit-stable14707
✅ vite-stable128026

✅ 📦 Local Production

AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
✅ nuxt-stable128026
✅ sveltekit-stable14707
✅ vite-stable128026

✅ 🐘 Local Postgres

AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
✅ nuxt-stable128026
✅ sveltekit-stable14707
✅ vite-stable128026

✅ 🪟 Windows

AppPassedFailedSkipped
✅ nextjs-turbopack15400

✅ 📋 Other

AppPassedFailedSkipped
✅ e2e-local-dev-nest-stable128026
✅ e2e-local-dev-tanstack-start-128026
✅ e2e-local-postgres-nest-stable128026
✅ e2e-local-postgres-tanstack-start-128026
✅ e2e-local-prod-nest-stable128026
✅ e2e-local-prod-tanstack-start-128026
✅ e2e-vercel-prod-nest126028
✅ e2e-vercel-prod-tanstack-start126028

✅ vercel-multi-region

AppPassedFailedSkipped
✅ nextjs-turbopack2700

📋 View full workflow run

@github-actions

github-actionsBot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

commit 0d5185e · Fri, 24 Jul 2026 20:41:51 GMT · run logs

Backend: vercel · app: nextjs-turbopack

MetricScenarioBest (ms)P75 (ms)P90 (ms)P99 (ms)Samples
TTFSstep248 (-65%) 💚1394 🔴 (+33%) 🔻1437 🔴 (+34%) 🔻1733 🔴 (+20%) 🔻30
TTFSstream279 (-71%) 💚1390 🔴 (+36%) 🔻1420 🔴 (+37%) 🔻1447 🔴 (+38%) 🔻30
TTFShook + stream317 (-73%) 💚1612 🔴 (+22%) 🔻1644 🔴 (+18%) 🔻1708 🔴 (+2.2%)30
STSO1020 steps (1-20)174 (+7.4%)290 🔴 (+16%) 🔻384 🔴 (+28%) 🔻417 🔴 (+37%) 🔻19
STSO1020 steps (101-120)199 (+7.6%)280 🔴 (+1.1%)409 🔴 (+25%) 🔻921 🔴 (+159%) 🔻19
STSO1020 steps (1001-1020)512 (+12%)599 🔴 (+8.1%)647 🔴 (+8.2%)666 🔴 (-19%) 💚19
WO1020 steps408516 (+6.8%)408516 (+6.8%)408516 (+6.8%)408516 (+6.8%)1
SLstream latency109 (+45%) 🔻158 🔴 (+31%) 🔻176 🔴 (+28%) 🔻200 🔴 (-76%) 💚30
SOstream overhead (text)117 (+21%) 🔻205 (+31%) 🔻329 (+69%) 🔻1042 🔴 (+318%) 🔻30
SOstream overhead (structured)137 (+40%) 🔻264 🔴 (+53%) 🔻317 (+28%) 🔻1769 🔴 (+532%) 🔻30
ℹ️ Metric definitions & methodology

Best/P75/P90/P99 deltas compare against the most recent benchmark run on main at the time of this run. 🔻 flags a delta worse than +15%, 💚 one better than −15%.

Metrics — TTFS: time to first step body (in-deployment start() → first step body, deployment clocks) · STSO: step-to-step overhead (gap between consecutive step bodies) · WO: workflow overhead (whole-run time outside step bodies, in-deployment anchored) · SL: stream latency (in-deployment write → read propagation, readAt - writtenAt) · SO: stream overhead (end-to-end write+consume time beyond the modelled generation window)

Scenarios — step: one trivial no-op step, no stream; no hooks, so the run stays in turbo mode (in-process fast path) · stream: one streaming step; no hooks, so the run stays in turbo mode (in-process fast path) · hook + stream: registers a hook before one step, which exits turbo mode (dispatch path) · 1020 steps: 1020 trivial sequential steps; STSO is measured between consecutive steps in the given step ranges, and WO is the whole-run overhead outside step bodies · stream latency: parallel reader/writer steps on a dedicated stream; SL is the in-deployment write->read propagation (readAt - writtenAt) · stream overhead (text): writer streams 300 variable-length text token deltas paced at 100/s for 3s (a haiku-size LLM's token throughput) while a parallel reader drains the whole stream; SO is the end-to-end write+consume time beyond the 3s generation window (overhead/backpressure) · stream overhead (structured): same workload as stream overhead (text), but each delta is an AI-SDK-style structured object ({ type: 'text-delta', id, text }) instead of a raw string, so the SO gap vs the text scenario is the added serialization cost

🔴 marks a percentile over its target (within target is left unmarked). Targets (p75/p90/p99, ms) — TTFS 200/300/600 · SL 50/60/125 · SO 250/500/1000 · STSO (1-20) 20/30/60 · STSO (101-120) 30/45/90 · STSO (1001-1020) 40/60/120

All metrics are measured from deployment-side timestamps only. Runs are triggered by an in-deployment route that stamps the anchor (clientStart) right before start(), so the CI runner’s request and its path through api.vercel.com sit outside every measured window. TTFS = in-deployment start() → first step body (turbo uses the in-process fast path, non-turbo the dispatch path), and includes the VQS dispatch hop plus any /flow cold start. STSO/WO are measured between step bodies on the deployment. SL is measured inside the workflow (parallel reader/writer steps), so it no longer includes the api.vercel.com read path.

Cold starts are kept in the numbers on purpose — they are part of real bursty-workload latency. The workbench deployment cold-starts the /flow invocation for a large fraction of runs, inflating P75+; the Best column shows the fastest (warm-start) sample for comparison.

@VaguelySerious
VaguelySerious merged commit bc53e5a into mainJul 24, 2026
103 of 106 checks passed
@VaguelySerious
VaguelySerious deleted the peter/backport-stability-only branch July 24, 2026 21:29
@github-actions

Copy link
Copy Markdown
Contributor

No backport to stable for bc53e5a (AI decision).

This commit only changes the backport automation's decision policy and default AI model in .github/workflows/backport.yml, which I verified does not exist on origin/stable (the workflow runs solely from main), plus the matching AGENTS.md prose describing that main-only workflow and an empty changeset. It fixes no defect in anything that ships from stable and does nothing to keep stable buildable, testable, or releasable, so backporting it would have no effect there.

To override, re-run the Backport to stable workflow manually via workflow_dispatch and paste this commit SHA into the ref input:

bc53e5a31b89af5d8bc50365796646d4de596005

pranaygp added a commit that referenced this pull request Jul 28, 2026
…ry-2
* origin/main: (292 commits)
feat(core): seal forwarded stream writes to the owner's public key (#3098)
feat(core): seal hook payloads to the target run's public key (#3096)
[e2e] Rebuild the event-log corruption repro around step-count divergence (#3147)
feat: decrypt sealed payloads in the dashboard and CLI (#3146)
Prewarm only appended replay payloads (#3131)
feat: publish each run's X25519 public key on the run entity (#3095)
feat(core): route sealed envelopes through the serialization layer (#3094)
docs: redirect retired migration-guides URLs to comparisons (#3127)
feat(core): add `encp` sealed-box encryption primitive (#3093)
chore(core): clarify runtime comments (#3111)
Remove obsolete world factory aliases (#3112)
feat(core): deterministic sandbox hardening (#3045)
Remove retired v1 step route plumbing (#3061)
[core] Don't count racing invocations' duplicate step_started events toward the maxRetries ceiling (#3069)
[world-testing] Isolate each spawned test server's data directory (#3055)
fix: upgrade postcss to >=8.5.18 to address GHSA-r28c-9q8g-f849 (#3102)
[next] Respect .gitignore in dev watcher to avoid EMFILE on large monorepos (#3085)
[ci] Backport only stability fixes to `stable`, default to claude-opus-5 (#3092)
perf(core): immediate leading-edge dispatch for idle streams (flush window default 0) (#3088)
Optimize `processImportSpecifier` by computing `shouldFollowImportsFromFile` once per file (#3052)
...
# Conflicts:
#	docs/components/geistdocs/desktop-menu.tsx
#	docs/components/geistdocs/mobile-menu.tsx
#	docs/content/docs/v5/cookbook/advanced/child-workflows.mdx
#	docs/content/docs/v5/cookbook/advanced/upgrading-workflows.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/agent-cancellation.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/durable-agent.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/human-in-the-loop.mdx
#	docs/content/docs/v5/cookbook/common-patterns/batching.mdx
#	docs/content/docs/v5/cookbook/common-patterns/idempotency.mdx
#	docs/content/docs/v5/cookbook/common-patterns/rate-limiting.mdx
#	docs/content/docs/v5/cookbook/common-patterns/saga.mdx
#	docs/content/docs/v5/cookbook/common-patterns/scheduling.mdx
#	docs/content/docs/v5/cookbook/common-patterns/sequential-and-parallel.mdx
#	docs/content/docs/v5/cookbook/common-patterns/timeouts.mdx
#	docs/content/docs/v5/cookbook/common-patterns/webhooks.mdx
#	docs/content/docs/v5/cookbook/common-patterns/workflow-composition.mdx
#	docs/content/docs/v5/cookbook/index.mdx
#	docs/content/docs/v5/cookbook/integrations/ai-sdk.mdx
#	docs/content/docs/v5/cookbook/integrations/chat-sdk.mdx
#	docs/content/docs/v5/cookbook/integrations/sandbox.mdx
#	docs/next.config.ts
#	docs/proxy.ts
#	docs/scripts/lint.ts
#	pnpm-lock.yaml
#	pnpm-workspace.yaml
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@VaguelySerious@TooTallNate