[BUG] Routine API trigger ignores the model selector and runs Sonnet; Run now and schedule honor it

Status Open
Reported on v2.1.278
Maintainer reply None cached
Activity 0 comments · opened Sep 23, 2026

Preflight Checklist

  • [x] I have searched existing issues and this is not a duplicate (closest: #79285, #83560, #85291, all auto-closed as stale; none names the API trigger path specifically)
  • [x] This is a bug report, not a feature request

What's Wrong?

A cloud routine (claude.ai/code/routines) with its model selector set to Opus starts a claude-sonnet-5 session when fired through its API trigger (POST https://api.anthropic.com/v1/claude_code/routines/<trig_id>/fire). The same routine started with Run now honors the selector.

Three trigger paths, same account (Max 5x), same day, 2026-09-22:

| Routine | Selector | Trigger | /status model |
| --- | --- | --- | --- |
| orchestrator | Opus | schedule | claude-opus-5 |
| worker-opus | Opus 5.5 | API fire, 05:30:33Z | claude-sonnet-5 |
| worker-opus | Opus 5.5 | Run now, 21:50:22Z | claude-opus-5-5 |
| worker-sonnet | Haiku (temporarily) | Run now | Haiku |

Every API-fired session of the Opus routine checked since 2026-09-07 reports Sonnet. Run now reads the selector (the Haiku test proves it isn't inheriting the desktop app's model). Only the API path ignores it.

Session IDs: session_01EDk56vQyKfMjaLtYKwxfnh (API fire, Sonnet), session_015o5cWcWkkdpKNZcRAhWys9 (Run now, Opus 5.5), session_01VjQxUGJgwXA5xWRFmAk9oi (schedule, Opus 5), session_01QoaA1tXj8StcxMYABTeH4V (API fire 2026-09-19, Sonnet).

What Should Happen?

The routines doc says "Claude uses the selected model on every run." An API-fired run should start on the routine's selected model, the same as Run now and schedule. Alternatively, the /fire body should accept a model field; the API reference documents text as the only field and says unknown fields are ignored, so there is currently no way to request a model per fire.

Error Messages/Logs

Claude Code session info (2026-09-22T21:23:39.745Z)
Session:
- Claude Code: 2.1.278
- Desktop app: 2.2553.13 · macOS 26.5.2 (arm64)
- Model: claude-sonnet-5
- Permissions: Auto
- Started: Routine · 2026-09-22T05:30:33.659Z
- Session ID: session_01EDk56vQyKfMjaLtYKwxfnh
Account: Max (5x)
Claude Code session info (2026-09-22T21:50:34.014Z)
Session:
- Desktop app: 2.2553.13 · macOS 26.5.2 (arm64)
- Model: claude-opus-5-5
- Permissions: Auto
- Started: Routine · 2026-09-22T21:50:22.302Z
- Session ID: session_015o5cWcWkkdpKNZcRAhWys9
Account: Max (5x)

Steps to Reproduce

  1. Create a cloud routine, set the model selector to Opus, add an API trigger, copy the URL and token.
  2. Fire it:

``bash
curl -sS -X POST "$URL" \
-H "Authorization: Bearer $TOKEN" \
-H "anthropic-beta: experimental-cc-routine-2026-04-01" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{"text": "hello"}'
``

  1. Open the returned session and run /status. Model is claude-sonnet-5.
  2. Click Run now on the same routine and run /status. Model is Opus.

Claude Model

Opus 5.5 selected on the routine; session runs claude-sonnet-5.

Is this a regression?

Unknown. Earliest observation 2026-09-07; no earlier API fires were checked.

Last Working Version

Unknown.

Claude Code Version

2.1.278 (API-fired session), 2.1.280 (schedule-fired session)

Platform

Claude Code on the web (cloud routines), viewed from the desktop app 2.2553.13

Operating System

macOS 26.5.2 (arm64), desktop app; the sessions themselves run in Anthropic's cloud environment

Terminal/Shell

N/A

Additional Information

The selector on the affected routine changed from "Opus 5" to "Opus 5.5" without being edited, at the Opus 5.5 release. The API-fired result was Sonnet both before and after that, so the reported model does not track the selector at all on that path. Related earlier reports: #79285 (routines firing on Sonnet despite an explicit model), #83560 (model_update_disabled on trigger model updates), #85291 (trigger session_context.model ignored on the run path).

View original on GitHub ↗