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
100 changes: 100 additions & 0 deletions devlog/_plan/260907_code_mode_host_contract/040_delivery_record.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
# 040 — Delivery record: code-mode host contract

Recorded 2026-09-07 from GitHub PR and Actions API responses. This records the delivery requested
by [030_docs_and_delivery.md](030_docs_and_delivery.md#d-record).

## Delivered revision and CI identity

- [PR #3854](https://github.com/lidge-jun/opencodex/pull/3854) is merged into `dev`;
GitHub records `merged_at: 2026-09-07T06:41:03Z`.
- Final PR head: `6bdcba5bff4196debf3cd159c7af3d34e35a24e0`.
- Merge commit: `ece556a6ed32dc811bd660ddd8ef9e829512457a`.
- [Pre-merge CI run 34090946313](https://github.com/lidge-jun/opencodex/actions/runs/34090946313),
attempt 1: `event: pull_request`, `head_sha: 6bdcba5bff4196debf3cd159c7af3d34e35a24e0`,
`status: completed`, `conclusion: success`; updated `2026-09-07T06:39:04Z`.
- [Merge-head CI run 34091933836](https://github.com/lidge-jun/opencodex/actions/runs/34091933836), attempt 1:
`event: push`, `head_sha: ece556a6ed32dc811bd660ddd8ef9e829512457a`,
`status: completed`, `conclusion: success`; updated `2026-09-07T06:50:18Z`.

The pre-merge run matches the final PR head; the later push run matches the merge commit.
These are distinct CI records. This API check does not attest that the separate local receipt
required by 030 was recorded.

## Per-job results

Each run has 21 completed jobs: 19 success, 2 skipped. Every job has the same conclusion in both
runs. Names below are the literal Actions job names; each evidence link identifies its own run.

| Job | Conclusion in both runs | Pre-merge evidence | Merge-head evidence |
|---|---|---|---|
| `select windows runner` | success | [job 101644191502](https://github.com/lidge-jun/opencodex/actions/runs/34090946313/job/101644191502) | [job 101647069433](https://github.com/lidge-jun/opencodex/actions/runs/34091933836/job/101647069433) |
| `changes` | success | [job 101644191303](https://github.com/lidge-jun/opencodex/actions/runs/34090946313/job/101644191303) | [job 101647069779](https://github.com/lidge-jun/opencodex/actions/runs/34091933836/job/101647069779) |
| `windows ${{ matrix.shard }}/6` | skipped | [job 101644212182](https://github.com/lidge-jun/opencodex/actions/runs/34090946313/job/101644212182) | [job 101647096144](https://github.com/lidge-jun/opencodex/actions/runs/34091933836/job/101647096144) |
| `macos 1/2` | success | [job 101644233998](https://github.com/lidge-jun/opencodex/actions/runs/34090946313/job/101644233998) | [job 101647111898](https://github.com/lidge-jun/opencodex/actions/runs/34091933836/job/101647111898) |
| `api usage` | success | [job 101644234038](https://github.com/lidge-jun/opencodex/actions/runs/34090946313/job/101644234038) | [job 101647111914](https://github.com/lidge-jun/opencodex/actions/runs/34091933836/job/101647111914) |
| `storage policy` | success | [job 101644234034](https://github.com/lidge-jun/opencodex/actions/runs/34090946313/job/101644234034) | [job 101647111922](https://github.com/lidge-jun/opencodex/actions/runs/34091933836/job/101647111922) |
| `docker smoke` | success | [job 101644234277](https://github.com/lidge-jun/opencodex/actions/runs/34090946313/job/101644234277) | [job 101647111928](https://github.com/lidge-jun/opencodex/actions/runs/34091933836/job/101647111928) |
| `keyring ubuntu` | success | [job 101644234063](https://github.com/lidge-jun/opencodex/actions/runs/34090946313/job/101644234063) | [job 101647111929](https://github.com/lidge-jun/opencodex/actions/runs/34091933836/job/101647111929) |
| `test 3/4` | success | [job 101644234103](https://github.com/lidge-jun/opencodex/actions/runs/34090946313/job/101644234103) | [job 101647111932](https://github.com/lidge-jun/opencodex/actions/runs/34091933836/job/101647111932) |
| `test 4/4` | success | [job 101644234047](https://github.com/lidge-jun/opencodex/actions/runs/34090946313/job/101644234047) | [job 101647111936](https://github.com/lidge-jun/opencodex/actions/runs/34091933836/job/101647111936) |
| `keyring macos` | success | [job 101644233982](https://github.com/lidge-jun/opencodex/actions/runs/34090946313/job/101644233982) | [job 101647111942](https://github.com/lidge-jun/opencodex/actions/runs/34091933836/job/101647111942) |
| `test 1/4` | success | [job 101644234139](https://github.com/lidge-jun/opencodex/actions/runs/34090946313/job/101644234139) | [job 101647111951](https://github.com/lidge-jun/opencodex/actions/runs/34091933836/job/101647111951) |
| `gates` | success | [job 101644233985](https://github.com/lidge-jun/opencodex/actions/runs/34090946313/job/101644233985) | [job 101647111970](https://github.com/lidge-jun/opencodex/actions/runs/34091933836/job/101647111970) |
| `keyring windows` | success | [job 101644234037](https://github.com/lidge-jun/opencodex/actions/runs/34090946313/job/101644234037) | [job 101647111972](https://github.com/lidge-jun/opencodex/actions/runs/34091933836/job/101647111972) |
| `macos 2/2` | success | [job 101644234066](https://github.com/lidge-jun/opencodex/actions/runs/34090946313/job/101644234066) | [job 101647111974](https://github.com/lidge-jun/opencodex/actions/runs/34091933836/job/101647111974) |
| `npm-global ubuntu-latest` | success | [job 101644234059](https://github.com/lidge-jun/opencodex/actions/runs/34090946313/job/101644234059) | [job 101647111980](https://github.com/lidge-jun/opencodex/actions/runs/34091933836/job/101647111980) |
| `npm-global windows-latest` | success | [job 101644234098](https://github.com/lidge-jun/opencodex/actions/runs/34090946313/job/101644234098) | [job 101647111990](https://github.com/lidge-jun/opencodex/actions/runs/34091933836/job/101647111990) |
| `test 2/4` | success | [job 101644234167](https://github.com/lidge-jun/opencodex/actions/runs/34090946313/job/101644234167) | [job 101647112003](https://github.com/lidge-jun/opencodex/actions/runs/34091933836/job/101647112003) |
| `npm-global macos-latest` | success | [job 101644234033](https://github.com/lidge-jun/opencodex/actions/runs/34090946313/job/101644234033) | [job 101647112012](https://github.com/lidge-jun/opencodex/actions/runs/34091933836/job/101647112012) |
| `macos control` | skipped | [job 101644235362](https://github.com/lidge-jun/opencodex/actions/runs/34090946313/job/101644235362) | [job 101647112696](https://github.com/lidge-jun/opencodex/actions/runs/34091933836/job/101647112696) |
| `ci` | success | [job 101646588871](https://github.com/lidge-jun/opencodex/actions/runs/34090946313/job/101646588871) | [job 101649082610](https://github.com/lidge-jun/opencodex/actions/runs/34091933836/job/101649082610) |

The Windows full-suite matrix was **SKIPPED in both runs**. Windows keyring create/read/delete smoke and
npm-global packaging/install/help smoke passed; those focused passes do not establish Windows
full-suite coverage. The `ci` aggregate accepts successful or skipped prerequisites, so its green
result does not turn skipped jobs into passes. On the merge-head run, `gates` includes successful Typecheck, GUI tests,
Privacy scan, skill-surface check, release-helper syntax check, and CLI help smoke; its GUI lint,
GUI build, and dashboard-preview steps were skipped.

Evidence retrieval (read-only):

```sh
gh api repos/lidge-jun/opencodex/pulls/3854
gh api repos/lidge-jun/opencodex/actions/runs/34090946313
gh api 'repos/lidge-jun/opencodex/actions/runs/34090946313/jobs?per_page=100'
gh api repos/lidge-jun/opencodex/actions/runs/34091933836
gh api 'repos/lidge-jun/opencodex/actions/runs/34091933836/jobs?per_page=100'
```

## Limits and residuals

The delivered scope is the pre-call guidance and post-hoc recovery annotations described in
[030](030_docs_and_delivery.md). Guidance cannot force model compliance, repair the model's
JavaScript or patch payload, or replace the host's validation. The effect on the live Grok defect
rate remains **unmeasured** until a live re-probe; CI success is not a defect-rate measurement.

Anthropic, Google, OpenAI-chat, and command-code tool-result paths still lack exec-result
annotation seams and do not annotate these host failures. Existing coverage is limited to native
routed Responses, Kiro, and Cursor.

Two public review threads were **OPEN / UNRESOLVED in the recorded 2026-09-07 audit snapshot**: GitHub's review-thread API returned
`isResolved: false` for both on 2026-09-07. The merge and green CI do not resolve these findings.
Source inspected for that snapshot was read at worktree HEAD `0fd3408b99994f74bd509975df7ee89823ddfecd`:

- [discussion_r3947178410](https://github.com/lidge-jun/opencodex/pull/3854#discussion_r3947178410):
`src/adapters/exec-tool-result-normalize.ts:196` searches arbitrary output for a marker substring.
Successful output from a command such as `rg` or `cat` can therefore receive a misleading
recovery hint when it quotes that phrase, even though the command did not fail. The requested
host-error status/envelope or exact diagnostic check remains unimplemented at this anchor.
- [discussion_r3947178418](https://github.com/lidge-jun/opencodex/pull/3854#discussion_r3947178418):
`src/adapters/cursor/tool-result-normalize.ts:114` gates annotation on tool name/namespace
without request-catalog or freeform provenance. A structured tool named `exec` can receive
unrelated host guidance. The requested code-mode provenance check remains unimplemented at
this anchor.

These limitations were also recorded in [000](000_plan.md). Recording them here is not a fix,
review resolution, or claim that successful output is left byte-identical.

Local runtime, tests, typecheck, build, and install: **NOT RUN** by instruction. No live model
re-probe was performed for this record. The remote results above belong to the recorded PR head
and merge commit and do not validate later candidate documentation or test patches.
12 changes: 10 additions & 2 deletions docs-site/src/content/docs/fr/guides/claude-code.md
Original file line number Diff line number Diff line change
Expand Up @@ -290,8 +290,16 @@ anciens alias hachés et les identifiants `claude-ocx-<provider>--<model>` des c
toujours résolus.

Si le sélecteur situé au bas de Claude Desktop ne modifie pas le modèle d'une conversation 3P déjà en cours,
utilisez `/model <id>` dans cette conversation. OpenCodex ne peut pas observer l'état du sélecteur ; il
achemine l’identifiant du modèle porté par chaque requête. Confirmez le résultat sous **Journaux → requestModel**.
vous pouvez essayer `/model <id>`, mais ce contournement peut également échouer sur les versions de Desktop
concernées. Le [ticket #3782](https://github.com/lidge-jun/opencodex/issues/3782) rapporte que sous Windows,
avec Claude Desktop 1.46388.4, la conversation continue d'utiliser son modèle initial après des changements
via le sélecteur du bas comme via `/model`. Ce signalement ne permet pas d'établir quel composant du client
ou du routage est à l'origine de ce comportement.

Vous pouvez aussi essayer de sélectionner le modèle par défaut souhaité dans le profil Claude Desktop
d'OpenCodex, de réappliquer ce profil et de démarrer une nouvelle conversation. Il s'agit d'une étape de
dépannage, sans garantie de résolution. OpenCodex ne peut pas observer l'état du sélecteur ; il achemine
l'identifiant du modèle porté par chaque requête. Vérifiez ce que le client envoie sous **Logs → requestedModel**.

Les modèles dont la fenêtre de contexte de référence atteint 1M obtiennent une ligne supplémentaire `…[1m]` dans le sélecteur.
Sa sélection indique à Claude Code la fenêtre complète de 1M pour ce modèle, tout en maintenant le compactage automatique ; le proxy retire
Expand Down
2 changes: 1 addition & 1 deletion docs-site/src/content/docs/fr/guides/integrations.md
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ niveaux. Dans ces cas, le commutateur est verrouillé afin que rien ne soit modi
**OMP** n'est pas affecté non plus par les modifications voisines, mais pour une autre raison : son outil
d'écriture ne modifie, octet par octet, que sa propre plage `providers.opencodex` ; le reste du fichier
n'est jamais réécrit. Pour les autres formats susceptibles de contenir des commentaires (Hermes, OpenClaw,
Kimi Code, Gajae Code, MiniMax Code, ZCode, Prime Agent, Aside et Raycast — documents YAML, JSON5 et TOML réécrits en entier), ou lorsque les propres entrées
Kimi Code, Gajae Code, MiniMax Code et Raycast — documents YAML, JSON5 et TOML réécrits en entier), ou lorsque les propres entrées
d'opencodex ont été modifiées, le commutateur se verrouille et la désactivation est refusée plutôt que de
deviner quelles modifications vous appartiennent.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,24 @@ avec un contexte de `922000` et une entrée maximale de `922000` ; OpenRouter i
}
```

## Éditeur de noms d'affichage des modèles

Dans le tableau de bord, **Models** permet d'enregistrer durablement des noms lisibles pour les modèles découverts. Développez le fournisseur,
repérez un modèle découvert et choisissez **Name**. La boîte de dialogue garde le sélecteur exact
`provider/model` visible pendant que vous enregistrez un libellé lisible. Choisissez **Reset name**
pour revenir aux métadonnées du fournisseur ou au sélecteur utilisé par défaut. **Name** ne change
que l'affichage ; le crayon distinct consacré à l'alias modifie l'alias court de routage et n'est
pas un éditeur de nom d'affichage. Les lignes OpenAI natives et celles des modèles personnalisés
conservent leurs commandes existantes.

Si la modification est enregistrée mais que l'actualisation échoue, la boîte de dialogue reflète
la valeur enregistrée et garde **Retry** disponible. Retry relance la convergence du catalogue
si le serveur a signalé son échec, ou recharge la liste si seule la requête de liste a échoué.
La reprise d'une réinitialisation conserve cette opération ; elle ne rétablit pas l'ancien nom.
Les requêtes ont un délai maximal de 60 secondes couvrant l'écriture et l'actualisation de la liste
qui suit. Un dépassement de délai n'annule pas une écriture : utilisez **Retry** pour vérifier
le nom actuel avant d'effectuer une autre modification.

## Exemple complet

```json
Expand Down
12 changes: 10 additions & 2 deletions docs-site/src/content/docs/guides/claude-code.md
Original file line number Diff line number Diff line change
Expand Up @@ -309,8 +309,16 @@ canonical ids. The synthetic 2026 date is an internal slot, not a release date.
and `claude-ocx-<provider>--<model>` ids from older configs still resolve.

If Claude Desktop's footer picker does not change the model for an already-running 3P
conversation, use `/model <id>` in that conversation. OpenCodex cannot observe picker state; it
routes the model id carried by each request. Confirm the result under **Logs → requestedModel**.
conversation, you can try `/model <id>`, but this workaround may also fail on affected Desktop
builds. [Issue #3782](https://github.com/lidge-jun/opencodex/issues/3782) reports that on Windows
with Claude Desktop 1.46388.4, the conversation continues using its initial model after both
footer-picker and `/model` changes. The report does not establish which client or routing
component causes the behavior.

You can also try selecting the intended default model in the OpenCodex Claude Desktop profile,
reapplying the profile, and starting a new conversation. This is a troubleshooting step, not a
guaranteed fix. OpenCodex cannot observe picker state; it routes the model id carried by each
request. Confirm what the client sends under **Logs → requestedModel**.

Models with an authoritative 1M context window get an extra `…[1m]` picker row: selecting it makes
Claude Code account a full 1M context for that model (auto-compaction stays on) — the proxy strips
Expand Down
24 changes: 16 additions & 8 deletions docs-site/src/content/docs/guides/integrations.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,14 +62,22 @@ One caveat specific to Aside: the running app rewrites `models.json` itself, so
fully quit and reopen Aside after applying, the same way Claude Desktop needs a
restart. Aside's block is loopback-only and never carries a real credential.

Raycast has two prerequisites. Custom Providers is a **Raycast Pro** feature: on a
free plan the file is still written, but `ocx integration client status --client
raycast` and the Integrations page report a warning, because Raycast will not
read it. And Raycast only creates its `ai` folder when you open Raycast →
Settings → AI → **Reveal Providers Config** once; opencodex uses that folder as
the install signal and reports the client as not installed until then. Raycast
reads `~/.config/raycast/ai/providers.yaml` on macOS and Windows alike and does
not honor `XDG_CONFIG_HOME`, so that path is not relocatable.
The managed Raycast integration supports **macOS and Windows**. Custom Providers
is a **Raycast Pro** feature: on a free plan the file is still written, but
`ocx integration client status --client raycast` and the Integrations page report
a warning, because Raycast will not read it. On macOS or Windows, open Raycast →
Settings → AI → **Reveal Providers Config** once so the `ai` folder exists.
On these supported platforms, opencodex uses that folder as its install signal
and reports the client as not installed until it exists. Linux is unsupported,
even if the folder exists.

The status field `aiDirPresent` reports only whether `~/.config/raycast/ai` exists,
independently of whether the Raycast app is installed or the platform is supported.
It does not prove that Raycast is installed or usable. The CLI prints `plan` on a
separate line and adds the macOS/Windows setup instruction when `aiDirPresent` is
false; `--json` preserves the raw status, including the nested `raycast` block.
Raycast reads `~/.config/raycast/ai/providers.yaml` on macOS and Windows alike and
does not honor `XDG_CONFIG_HOME`, so that path is not relocatable.

The managed block is one element, `id: opencodex`, in the file's `providers`
sequence: `name: OpenCodex`, `base_url: http://<host>:<port>/v1`, and every
Expand Down
15 changes: 12 additions & 3 deletions docs-site/src/content/docs/ja/guides/claude-code.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,9 +163,18 @@ Claude Code 2.1.129 以降は `GET /v1/models?limit=1000` でゲートウェイ
提供します。両系列は継続してデコードできるため、どちらの形式でも `settings.json` に保存したモデルは
引き続き動作します。

Claude Desktop のフッターピッカーで実行中の 3P 会話のモデルが切り替わらない場合は、その会話で
`/model <id>` を使用してください。OpenCodex はピッカーの状態を直接参照できず、各リクエストに
含まれるモデル ID をルーティングします。結果は **Logs → requestedModel** で確認できます。
Claude Desktop のフッターピッカーで実行中の 3P 会話のモデルが切り替わらない場合は、
`/model <id>` を試せますが、影響を受ける Desktop ビルドではこの回避策も失敗することがあります。
[Issue #3782](https://github.com/lidge-jun/opencodex/issues/3782) では、Windows 上の
Claude Desktop 1.46388.4 で、フッターピッカーと `/model` のどちらで変更しても、会話が最初の
モデルを使い続けると報告されています。この報告だけでは、クライアントやルーティングのどの
コンポーネントがこの動作の原因なのかは確定できません。

OpenCodex の Claude Desktop プロファイルで希望するデフォルトモデルを選択し、プロファイルを
再適用して、新しい会話を開始することも試せます。これはトラブルシューティングの手順であり、
解決を保証するものではありません。OpenCodex はピッカーの状態を参照できず、各リクエストに
含まれるモデル ID をルーティングします。クライアントが何を送信しているかは
**Logs → requestedModel** で確認してください。

**エイリアス構文ルール:** provider には `/` や `--` を含められず `native` と同じでもいけません。
`/` も `~` も含まない plain な model ID は v1 接頭辞 `claude-ocx-…` のままです。`/` または `~` を含む
Expand Down
Loading
Loading