Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions devlog/_plan/260930_gpt_6_1_sol_rollout/000_README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# 260930 GPT-6.1 Sol rollout, TokenLab protocol follow-up, release

Status: open. Loop session `01a0ef42-da06-7200-8394-aa35ebbe4ba9`, branch `codex/gpt-6-1-sol-rollout` from `origin/dev` `b78bfb8f00`.

OpenAI released GPT-6.1 Sol on 2026-09-29 as the successor to GPT-6 Sol. Only Sol moved to 6.1; Astra and Luna stay on GPT-6. This unit adds the model everywhere GPT-6 Sol is served, moves every place where GPT-6 Sol is the *default* to GPT-6.1 Sol (the same move #5640 made from GPT-5.6 to GPT-6), folds in TokenLab's protocol request from mail 546, and ships a release.

| Doc | Work-phase | Content |
|---|---|---|
| 010_research_digest.md | wp1 | Sourced facts for GPT-6.1 Sol and the TokenLab contract |
| 020_catalog_surfaces.md | wp2 | Diff-level list of provider, catalog, pricing and docs rows |
| 030_default_swap.md | wp2 | Defaults moving from gpt-6-sol to gpt-6.1-sol, roster migration v3 |
| 040_tokenlab_protocols.md | wp3 | Per-model wire routing; TokenLab JEV decision backend deferred to its own unit |
| 050_release.md | wp4 | PR, CI, merge, preview/main promotion, release.yml, npm verification |

## Audit record (wp1)

Read-only reviewer on gpt-6-sol (high), 2026-09-30:

- Round 1 FAIL, four blockers. Three concerned the JEV backend (combo dispatch passes no combo settings, combo normalization/persistence and the GUI editor would drop new fields, credential/URL/outbound guard must switch together). One named roster tests that enumerate models by value.
- Fold: the roster tests are listed in 020; the JEV backend is deferred to its own unit (040 records why and sketches it).
- Round 2 PASS. Non-blocking notes kept for B: the v3 roster migration must run after the v2 step and touch only bare `gpt-6-sol`; TokenLab's anthropic wire sends `x-api-key` to `/v1/messages`, which TokenLab accepts; `kiro-adapter.test.ts` (2047/2050) and `codex-catalog.test.ts` (7974/7985) take in-place edits only.
53 changes: 53 additions & 0 deletions devlog/_plan/260930_gpt_6_1_sol_rollout/010_research_digest.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# 010 Research digest

Observed 2026-09-30 KST. Full report with every URL: Aside run, `/Users/jun/.aside/u/0/artifacts/gpt61sol-research.md` (kept outside the repo). Live probes re-run from this checkout are marked (live).

## GPT-6.1 Sol, official

| Fact | Value | Source |
|---|---|---|
| API id | `gpt-6.1-sol`, no dated snapshot | developers.openai.com/api/docs/models/gpt-6.1-sol |
| Released | 2026-09-29 (API, ChatGPT Work, Codex) | openai.com/index/introducing-gpt-6-1-sol/ |
| API context / max input / max output | 1,050,000 / 922,000 / 128,000 | model page |
| API efforts | low, medium (default), high, xhigh, max | model page |
| Price per 1M | $2 input, $0.10 cached, $2.50 cache write, $10 output | pricing.md |
| Long context (>272K prompt) | $4 / $0.20 / $5 / $15 | pricing.md |
| Fast | 2x standard | pricing.md |
| Modalities | text + image in, text out | model page |
| Codex row (live, openai/codex models.json, #49318) | priority 1 (catalog default), efforts low..ultra, default effort low, context 272,000 / 872,000, Fast tier "2x speed, increased usage", minimal client 0.153.0 | codex-rs/models-manager/models.json |
| gpt-6-sol | retained: visibility list, priority 3, no upgrade, not deprecated | same file; deprecations page |
| GPT-6.1 Luna / Astra | do not exist (doc pages 404, absent from pricing, models index and Codex catalog) | model pages |

Only cached input changed versus GPT-6 Sol ($0.20 -> $0.10).

## Third-party listing (drives 020)

| Provider in this repo | Status | Id |
|---|---|---|
| OpenRouter | listed | `openai/gpt-6.1-sol` (1,050,000 ctx, 128,000 out) |
| Vercel AI Gateway | listed | `openai/gpt-6.1-sol` |
| GitHub Copilot | listed, GA rollout (github.blog 2026-09-29) | `gpt-6.1-sol` |
| Kilo | listed (models.dev) | `openai/gpt-6.1-sol` |
| OpenCode Zen | listed (live /zen/v1/models) | `gpt-6.1-sol` |
| Devin | listed (devin.ai blog); id not published | preemptive `gpt-6-1-sol` following its `gpt-5-6-sol` spelling |
| TokenLab | listed (live /v1/models/gpt-6.1-sol, Chat + Responses) | `gpt-6.1-sol` (live discovery) |
| Amazon Bedrock | not in models.dev; openai/codex source references `openai.gpt-6.1-sol` | preemptive |
| Cloudflare AI Gateway | not in catalog; OpenAI passthrough | preemptive |
| Kiro, CodeBuddy | not listed / unreadable; both carry preemptive gpt-6-sol rows today | preemptive, same policy as the Sonnet 5.5 Kiro rows |
| ZenMux | page explicitly "not a registered ZenMux page" | not added (live discovery picks it up) |
| DigitalOcean, Scaleway | not listed; DO naming for 6.1 unknown | not added |

## TokenLab (mail 546, 2026-09-30; live contract re-checked)

`GET https://api.tokenlab.sh/v1/models/{id}` returns `tokenlab.accepted_request_formats` (live):

| Models | Formats |
|---|---|
| gpt-6-astra, gpt-6-sol, gpt-6-luna, gpt-6.1-sol | chat, responses |
| claude-opus-5, claude-opus-5-5, claude-sonnet-5, claude-sonnet-5-5, claude-fable-5, claude-fable-5-1 | chat, anthropic_messages |
| deepseek-v4.1-flash, deepseek-v4-pro, kimi-k3, glm-5.3 | chat, responses, anthropic_messages |
| grok-4.7 | chat, responses |
| gemini-3.8-flash | chat, gemini_generate_content |

Endpoints from docs.tokenlab.sh/llms.txt: `/v1/chat/completions`, `/v1/responses`, `/v1/messages` (x-api-key or Bearer), `/v1/systemone`. System One takes `{model, state, questions}` with Bearer auth, current model `jev-1.13` — the same body shape `src/combos/jev.ts` already sends to TypeSafe. Vincent asks to keep the user's API-key delivery policy default (no forced `X-TokenLab-Delivery-Policy`).

30 changes: 30 additions & 0 deletions devlog/_plan/260930_gpt_6_1_sol_rollout/020_catalog_surfaces.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# 020 Catalog surfaces for gpt-6.1-sol (wp2)

Rule: add a row wherever a gpt-6-sol row exists and 010 says listed or preemptive; comment preemptive rows `260930 preemptive`. No gpt-6.1-luna / gpt-6.1-astra anywhere.

| File | Change |
|---|---|
| scripts/model-metadata.source.json | Clone the gpt-6-sol row as gpt-6.1-sol in openai, openai-codex, github-copilot, kilo, openrouter, vercel-ai-gateway, opencode-zen, amazon-bedrock (preemptive), cloudflare-ai-gateway (preemptive); cache_read 0.10 (0.20 on opencode-zen per its published figure); release_date 2026-09-29; knowledge 2026-04-30. ZenMux not added. Then `bun run generate:model-metadata`. |
| src/usage/expected-prices.ts | `GPT61_SOL` cost4 (2 / 10 / 0.10 / 2.50) with long-context tier; rows for openai-apikey (verified), openai (verified-derived), devin, devin-cli (verified-derived); pricing-list id. |
| src/providers/registry/model-seeds.ts | `OPENAI_GPT6_MODELS` gains gpt-6.1-sol (flows to openai-apikey 1,050,000 / 922,000 / 128,000 / low..max and OpenRouter models); OpenRouter context map adds openai/gpt-6.1-sol. |
| src/providers/registry/entries-core.ts | OpenRouter `modelSupportsServiceTier` adds openai/gpt-6.1-sol; BizRouter seed adds openai/gpt-6.1-sol; Devin seed adds gpt-6-1-sol (preemptive). |
| src/providers/registry/entries-extended.ts | Copilot models + `modelWireDefaults` gpt-6.1-sol -> openai-responses. |
| src/providers/codebuddy-models.ts, src/providers/kiro-models.ts, src/adapters/kiro/reasoning.ts, src/adapters/devin/live-models.ts | Mirror the gpt-6-sol rows (preemptive). |
| src/codex/catalog/native-models.ts | `NATIVE_GPT61_SOL_MODEL = "gpt-6.1-sol"` in built-in list, SELF_DESCRIBED set, drain-sentinel set; configured-native template moves to gpt-6.1-sol. |
| src/codex/catalog/metadata.ts | DOCUMENTED_NATIVE_OPENAI_ADDITIONS and context map (NATIVE_GPT6_CONTEXT). |
| src/codex/catalog/effort.ts | Ladder entry low..ultra like Sol. |
| src/codex/data/roster-pinned-models.json | Append the upstream gpt-6.1-sol row verbatim from openai/codex models.json (codex-rs bundle, #49318); pinned-models.ts comment updated. |
| src/codex/model-entitlements.ts | Comment: 6.1 Sol ungated like Sol. |
| docs-site providers.md, structure/catalog.md, structure/providers/openai-accounts.md | Document the row. |

Tests that enumerate the roster by value and must gain gpt-6.1-sol (audit A1 blocker 4):

- tests/codex-integration/native-model-toggle.test.ts:95 (built-in native roster) and :127 (flagship list)
- tests/providers/provider-registry-parity.test.ts:314 (exact openai-apikey model list)
- tests/codex-integration/codex-catalog.test.ts:6842 (catalog roster; file is 7974/7985 lines, so edit in place without adding lines)
- tests/providers/github-copilot/github-copilot-wire-defaults.test.ts:33, tests/service/service-tier-capability.test.ts:73 (OpenRouter tier map), tests/routing/subagent-model-fallback.test.ts:276
- tests/providers/kiro/kiro-adapter.test.ts:1744 is at 2047/2050: edit the existing list in place only.
- tests/codex-integration/configured-native-models.test.ts:93-102: a configured native must now borrow gpt-6.1-sol's pinned capabilities and hash (wp2 audit NEAR-PASS item). catalog-routed-comp-hash.test.ts:75 keeps its gpt-6-sol forward-alias expectation.
- BizRouter is not added: 010 has no evidence it lists gpt-6.1-sol, and live discovery picks it up once it does.

New focused test `tests/codex-integration/gpt61-sol-rows.test.ts` (registered in scripts/test-layout/layout.json and tests/fixtures/test-layout-expected.json) asserting: native row ladder low..ultra, default effort low, 272,000/872,000 context; openai-apikey 1,050,000/922,000/128,000 and low..max; Copilot Responses wire; expected price 2/10/0.10/2.50; no gpt-6.1-luna/astra id in any registry entry.
14 changes: 14 additions & 0 deletions devlog/_plan/260930_gpt_6_1_sol_rollout/030_default_swap.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# 030 Default swap gpt-6-sol -> gpt-6.1-sol (wp2)

Precedent: #5640 (`8adda594fd`) set the subagent default to the GPT-6 trio and upgraded stored rosters from 5.6 once, by version.

| Surface | Change |
|---|---|
| src/config/subagent-models.ts | `DEFAULT_SUBAGENT_MODELS = [astra, gpt-6.1-sol, luna]`; `SUBAGENT_MODELS_VERSION = 3`; the v3 step replaces bare `gpt-6-sol` with `gpt-6.1-sol` in place (deduped), once. A later deliberate re-pick of gpt-6-sol stays. v0/v1 installs chain through v2 then v3. |
| scripts/ci/docker-smoke.ts | subagentModels default trio. |
| Codex configured-native template | borrows gpt-6.1-sol's row (020). |
| docs-site agents.md (10 locales), guides/claude-code.md (10 locales), structure/subagents.md | Name the new default. |
| Tests | subagent-roster-migration (v2 -> v3, idempotence, re-pick retained, routed ids untouched), claude picker/intercept/management expectations that read the default trio, server startup reconcile. |

Out of scope: removing gpt-6-sol anywhere; it stays listed and selectable.

Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# 040 TokenLab per-model protocols and JEV backend (wp3)

## Wires

Keep the preset's provider-wide adapter `openai-chat` (the released, verified path). Add registry defaults so each model rides its declared native wire:

- `modelWireDefaults` -> `{ wire: "openai-responses", inbound: ["responses"] }` for gpt-6-astra, gpt-6-sol, gpt-6-luna, gpt-6.1-sol, grok-4.7, deepseek-v4.1-flash, deepseek-v4-pro, kimi-k3, glm-5.3. Scoped to Responses inbound (Codex) like the Alibaba Token Plan precedent (tests/providers/alibaba-token-plan-wire-defaults.test.ts): a Chat or Anthropic client keeps the verified Chat wire with no translation hop. User-overridable: an explicit `modelAdapters` entry of `openai-chat` wins.
- Claude ids -> Anthropic Messages through the existing endpoint-bound prefix pin (`WIRE_ADAPTER_PIN_PREFIXES` in src/types/wire.ts, the Command Code mechanism): `tokenlab: { endpoint: "https://api.tokenlab.sh/v1", prefixes: { "claude-": "anthropic" } }`. The anthropic adapter already normalizes `/v1` to `/v1/messages`. The pin is bound to the canonical endpoint, so a retargeted TokenLab row is untouched. Every live `claude-*` TokenLab id is checked to declare anthropic_messages before the prefix is used.
- Everything else, including gemini-3.8-flash, stays on Chat. Gemini native is deferred until tested, as Vincent proposed.
- No delivery-policy header is added: the user's API-key default stays authoritative.

Rejected: a provider-wide switch to Responses (sends Claude/Gemini to an endpoint they do not accept); separate provider entries (duplicates models by default); widening `MODEL_ADAPTER_OVERRIDE_ALLOWED` to anthropic (needs the #404 credential threat model; the prefix pin already exists and is endpoint-bound).

Tests: resolveWireProtocolOverride / resolved policy for each class on the canonical endpoint, user modelAdapters override back to Chat for a Responses default, retargeted base URL keeps Chat, anthropic URL resolves to https://api.tokenlab.sh/v1/messages.

## JEV decision backend — deferred to its own unit

Decision after audit A1 (blockers 1-3): not in this release. A per-combo backend has to travel through `src/server/responses/core-combo.ts:536` (the call passes no combo settings), combo normalization and persistence (`src/combos/types.ts:379`, `src/server/management/combo-routes.ts:231`), and the GUI combo editor round trip (`gui/src/combo-workspace-data.ts:266`, `:460`), and credential, fixed URL and canonical outbound guard (`src/combos/jev.ts:568`, `:599`) must switch together. It also sends conversation-derived decision state to a new third party, which deserves its own review and a GUI screenshot. That does not meet this unit's "fits cleanly" bar.

Follow-up unit sketch: combo fields `jevBackend: "typesafe" | "tokenlab"` (default typesafe) and `jevModel` (`jev-*`), fixed endpoint per backend (`https://api.typesafe.ai/v1/systemone`, `https://api.tokenlab.sh/v1/systemone`, body `{model, state, questions}` confirmed identical in docs.tokenlab.sh/api-reference/systemone/create-decision), credentials never shared between backends, allowlist/timeout/cancellation/fail-open unchanged.
39 changes: 39 additions & 0 deletions devlog/_plan/260930_gpt_6_1_sol_rollout/050_release.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# 050 Release (wp4)

1. Isolated verification in a /private/tmp checkout of the exact head with fresh OPENCODEX_HOME / CODEX_HOME: typecheck, focused tests, test:changed, structure:check, privacy:scan, skill:surface:check, file-size ratchet.
2. One PR to dev from codex/gpt-6-1-sol-rollout with the template; wait for exact-head required CI; maintainer merge under MAINTAINERS.md dev policy.
3. Release train per scripts/release.ts and the 2.70.0 precedent: dev version pre-move PR, preview promotion PR, main promotion PR; push-event Cross-platform CI + Service lifecycle green on each promotion SHA; release.yml dispatched with expected-sha for preview then stable.
4. Verify GitHub release assets, npm `latest` / `preview` dist-tags, latest.json.
5. Close the unit: move to devlog/_fin with an outcome doc.

## 2.73.0 concrete steps (revalidated at wp4 P, 2026-09-30)

Scope, on the owner's request to bundle the RT6 stabilization chat: 2.73.0 ships everything on `dev`
since v2.72.0 — the RT6 train (13 PRs through #6203, recorded in `devlog/_plan/260930_release_train_6/`
by that chat), #6261 (`540af24384`, Windows keyring test portability), and this PR. That chat was asked
not to run the release train itself. `dev` already reads 2.73.0 (#6243).

1. PR from `codex/gpt-6-1-sol-rollout` (rebased on `540af24384`). Exact-head PR CI plus a
`lane=all` Cross-platform CI dispatch on the head (the pull_request event skips windows 1-9).
Before merge, an explicit read-only security review of the TokenLab wire change
(MAINTAINERS.md: credential handling): where the API key is sent, which header, endpoint binding
of the Claude pin, no new logging; verdict recorded on the PR.
`scripts/ci/assert-mergeable-review.sh --maintainer-integration <pr>`, decision comment,
`gh pr merge --admin --squash --match-head-commit <head>` -> C. Assert `git show C:package.json` = 2.73.0.
2. Pre-move: `gh workflow run dev-version-bump.yml --ref main -f intended-version=2.73.0 -f mode=pre-move`;
merge its PR after CI -> dev 2.74.0.
3. Preview: branch `codex/promote-preview-2.73.0` from C, `git merge -s ours origin/preview`,
`bun scripts/release-version-sources.ts sync 2.73.0-preview.20260930`; diff vs C = four version sources.
PR to preview, `--admin --merge --match-head-commit` after its PR checks. The maintainer-integration
exception covers only `dev`; promotion merges run on the owner's explicit release authorization
for this unit (2026-09-30, "exec and release" / "배포해줘"), as 2.70.0-2.72.0 did, and each promotion
PR records that authorization.
4. Main: branch `codex/promote-main-2.73.0` from C, `git merge -s ours origin/main`, `git diff --quiet C HEAD`.
PR to main, same merge.
5. Push-event Cross-platform CI + Service lifecycle success on each promotion SHA.
6. `gh workflow run release.yml --ref preview -f version=2.73.0-preview.20260930 -f tag=preview -f dry-run=false -f expected-sha=<preview>`,
then `gh workflow run release.yml --ref main -f version=2.73.0 -f tag=latest -f dry-run=false -f expected-sha=<main>`
(release.yml defaults to a dry run and rejects other refs). Never republish; resume with
`resume-after-npm-publish=true` after an npm-acknowledged failure.
7. Verify npm dist-tags, gitHead, GitHub releases (stable not prerelease, asset count as v2.72.0), latest.json.
8. Record PR moving this unit to `devlog/_fin/`.
2 changes: 1 addition & 1 deletion docs-site/src/content/docs/fr/guides/claude-code.md
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ du sélecteur à une route opencodex :

```bash
ocx claude desktop bind claude-sonnet-4-6 xai/grok-4.7
ocx claude desktop bind claude-opus-4-6 native/gpt-6-sol
ocx claude desktop bind claude-opus-4-6 native/gpt-6.1-sol
ocx claude desktop unbind claude-opus-4-6
```

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ Les paramètres des agents déterminent la surface de collaboration Codex annonc
| --- | --- | --- | --- |
| `multiAgentMode?` | `"v1" \| "default" \| "v2"` | `"default"` | `v1` marque tous les modèles du catalogue comme compatibles v1 ; `v2` les marque tous comme compatibles v2. `default` rétablit les choix imposés en amont (Sol/Terra en v2, Luna en v1) et suit sinon l’indicateur natif `multi_agent_v2`. S’applique aux nouvelles sessions. |
| `keepNativeChatGptOnV1?` | `boolean` | `false` | Lorsque `multiAgentMode` vaut `"v2"`, marque les lignes natives ChatGPT (Sol/Terra et les autres modèles du backend ChatGPT) comme v1. Les parents routés restent en v2. Utilisez cette option pour qu'un parent ChatGPT puisse encore lancer Grok ou Claude — les tâches enfants v2 natives sont chiffrées par le service en amont ([#92](https://github.com/lidge-jun/opencodex/issues/92)). Ignoré en `v1` et `default`. |
| `subagentModels?` | `string[]` | `gpt-6-astra`, `gpt-6-sol`, `gpt-6-luna` | Jusqu’à cinq identifiants de modèles natifs non qualifiés, qualifiés par un compte sous la forme `<selector>/<native-openai-model>`, ou routés sous la forme `provider/model`, affichés en tête du sélecteur de sous-agents. Le tableau de bord ne propose que les identifiants natifs non qualifiés et les identifiants routés ; lors de l’enregistrement, il omet les choix exacts qualifiés par un compte. Pour les définir, utilisez `ocx agent subagents set` ou modifiez la configuration. Après la [migration unique vers Astra](/reference/configuration/agents/#astra-roster-upgrade), une liste explicitement vide est conservée. |
| `subagentModels?` | `string[]` | `gpt-6-astra`, `gpt-6.1-sol`, `gpt-6-luna` | Jusqu’à cinq identifiants de modèles natifs non qualifiés, qualifiés par un compte sous la forme `<selector>/<native-openai-model>`, ou routés sous la forme `provider/model`, affichés en tête du sélecteur de sous-agents. Le tableau de bord ne propose que les identifiants natifs non qualifiés et les identifiants routés ; lors de l’enregistrement, il omet les choix exacts qualifiés par un compte. Pour les définir, utilisez `ocx agent subagents set` ou modifiez la configuration. Après la [migration unique vers Astra](/reference/configuration/agents/#astra-roster-upgrade), une liste explicitement vide est conservée. |
| `injectionModel?` | `string` | — | Modèle de sous-agent natif ou routé privilégié dans les consignes de délégation v2 produites par le proxy. |
| `injectionEffort?` | `string` | — | Niveau d’effort privilégié (de `low` à `ultra`), pertinent uniquement avec `injectionModel`. |
| `injectionPrompt?` | `string` | — | Remplace le corps des consignes v2 intégrées. Accepte `{{model}}`, `{{effort}}`, `{{roster}}` et `{{fallback}}`. La présence d’un `injectionModel` suffit pour produire le prompt personnalisé. |
Expand Down
Loading
Loading