Skip to content

fix(claudex): [1m] を外し compact 窓をバックエンドのキャップ内に収める - #811

Merged
tak848 merged 2 commits into
mainfrom
fix/claudex-context-cap
Jul 15, 2026
Merged

tak848 merged 2 commits into
mainfrom
fix/claudex-context-cap

Conversation

@tak848

@tak848 tak848 commented Jul 15, 2026

Copy link
Copy Markdown
Owner

Why

claudex(#807)で GPT-5.6 Sol を実タスクに使ったところ、Context limit reached · /compact or /clear to continue が出てセッションがデッドロックした(実セッションで 370288 tokens を確認)。

原因は2つの設定不整合:

  1. [1m] サフィックスによる context 誤認: claudex は --model gpt-5.6-sol[1m] を渡していた。[1m] は CC に「context は 1M」と信じさせるが、claudex が経由する ChatGPT/Codex バックエンドの Sol は実測 ~372K でキャップされる(API の Sol は 1.05M だが、サブスク経由は別。OpenAI は課金都合で Codex default を 272K↔372K で動かしている — thsottiaux / openai/codex#31860, #32806)。CC は「1M ある」と思って auto-compact を焚かず、~372K の壁に激突。壁に当たってからの compact は現 context 全量を要約に送るため同じ上限を超えて失敗し、デッドロックする。

  2. OS 環境変数がプロジェクト設定に負ける: 安全弁として入れていた CLAUDE_CODE_AUTO_COMPACT_WINDOW を OS 環境変数で注入していたが、settings ファイルの env は OS 環境変数に勝つ(env-vars.md)。実際 work プロジェクトの .claude/settings.json が env.CLAUDE_CODE_AUTO_COMPACT_WINDOW: '750000'(Opus 用)を設定しており、claudex の値が握り潰されていた。

What

dot_zsh/functions/claudex.zsh:

  • model / small model から [1m] を除去(gpt-5.6-sol / gpt-5.6-luna)。CC に嘘の 1M を信じさせない
  • compact 窓を --settings(CLI 引数)で渡す。優先順位は Managed > Command-line > Local > Project > User(settings.md)なので、project の settings.json(750000)にも勝てる
  • 既定値 360000。観測済みの 372K キャップに合わせ、auto-compact が窓の約9割手前 ~331K で焚かれ、summary 呼び出しが 372K の壁の内側で完了する。CLAUDEX_COMPACT_WINDOW で上書き可能(backend が 272K に巻き戻った日はこれで下げる)

検証

  • zsh -n 構文チェック
  • claude をスタブし、--model gpt-5.6-sol --settings {"env":{"CLAUDE_CODE_AUTO_COMPACT_WINDOW":"360000"}} が正しく渡ること、CLAUDEX_COMPACT_WINDOW 上書きが効くことを確認
  • --settings(CLI 引数)が project settings.json を上書きすることは settings.md の precedence(Command-line > Project)で確認。※ nested claude 実行がサンドボックスで禁止のため live 実測は未実施

未検証: 実際に claudex セッションで 360K 付近まで伸ばして compact が壁の手前で成功することは、実タスクでの確認が必要。

https://claude.ai/code/session_01NqfvJkL7QkYwXqXvhg5fjB

tak848 added 2 commits July 15, 2026 13:05
gpt-5.6-sol は API では 1.05M context だが、claudex が経由する ChatGPT/Codex
バックエンドでは実効 ~353K(raw 372K)にキャップされ、regression で 258K まで
下がることもある(openai/codex#31860, #32806)。

従来 model に付けていた [1m] が CC に「1M ある」と誤認させ、auto-compact が
早期に焚かれなかった。安全弁として入れていた AUTO_COMPACT_WINDOW=272000 も [1m] に
上書きされ死んでいた。結果、コンテキストが ~372K の壁に激突し、そこからの compact は
全 context を要約に送るため同じ上限を超えて失敗、デッドロックしていた
(実セッションで 370288 tokens / "Context limit reached" を確認)。

- model / small model から [1m] を除去
- AUTO_COMPACT_WINDOW を 272000 → 220000 に下げ、regression(258K)でも壁の手前で
  必ず compact させる。CLAUDEX_COMPACT_WINDOW で上書き可能

Claude-Session: https://claude.ai/code/session_01NqfvJkL7QkYwXqXvhg5fjB
前コミットは OS 環境変数で AUTO_COMPACT_WINDOW を渡していたが、settings ファイルの
env は OS 環境変数に勝つため、プロジェクトの .claude/settings.json が
env.CLAUDE_CODE_AUTO_COMPACT_WINDOW を設定していると負けて無効化される(実際
layerone プロジェクトが 750000 を設定しており、claudex の値が握り潰されて
デッドロックの一因になっていた)。

優先順位は Managed > Command-line > Local > Project > User(settings.md)なので、
--settings(CLI 引数)で渡せば project 設定にも勝てる。これに切り替える。

値は観測済みの 372K キャップに合わせて 360000(compact は ~331K で焚かれ、summary
呼び出しが 372K の壁の内側で完了する)。backend が 272K に巻き戻った日にデッドロックが
再発したら CLAUDEX_COMPACT_WINDOW=250000 のように下げる。

Claude-Session: https://claude.ai/code/session_01NqfvJkL7QkYwXqXvhg5fjB
@tak848
tak848 marked this pull request as ready for review July 15, 2026 04:26
@tak848
tak848 merged commit 1cf2ac5 into main Jul 15, 2026
2 checks passed
@tak848
tak848 deleted the fix/claudex-context-cap branch July 15, 2026 04:28

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 2 potential issues.

Open in Devin Review

ANTHROPIC_AUTH_TOKEN="unused" \
ANTHROPIC_SMALL_FAST_MODEL="${CLAUDEX_SMALL_MODEL:-gpt-5.6-luna[1m]}" \
ANTHROPIC_SMALL_FAST_MODEL="${CLAUDEX_SMALL_MODEL:-gpt-5.6-luna}" \
CLAUDE_CODE_SUBAGENT_MODEL="${model%\[*}" \

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: CLAUDE_CODE_SUBAGENT_MODEL のパターンマッチが実質 no-op になっている

CLAUDE_CODE_SUBAGENT_MODEL="${model%\[*}" (dot_zsh/functions/claudex.zsh:93) は [ 以降を除去するパターンだが、model の既定値から [1m] が除去されたため、通常のケースでは何も除去しない no-op になっている。ユーザーが CLAUDEX_MODEL='gpt-5.6-sol-fast[1m]' のようにブラケット付きで指定した場合の防御としては機能するが、ヘッダーコメント(16行目)の例示が gpt-5.6-sol-fast(ブラケットなし)になっているため、このパターンが必要になるケースは実質的にない。削除しても動作に影響はないが、防御的コードとして残す判断も妥当。

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment on lines +85 to +97
local compact_settings="{\"env\":{\"CLAUDE_CODE_AUTO_COMPACT_WINDOW\":\"${CLAUDEX_COMPACT_WINDOW:-360000}\"}}"

# CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC は settings.jsonnet と同様に設定しない
# (remote-control の eligibility チェックがブロックされるため)。無駄なモデル呼び出し自体は
# settings.jsonnet の DISABLE_NON_ESSENTIAL_MODEL_CALLS で既に止まっている
ANTHROPIC_BASE_URL="http://127.0.0.1:${CLAUDEX_PORT:-18765}" \
ANTHROPIC_AUTH_TOKEN="unused" \
ANTHROPIC_SMALL_FAST_MODEL="${CLAUDEX_SMALL_MODEL:-gpt-5.6-luna[1m]}" \
ANTHROPIC_SMALL_FAST_MODEL="${CLAUDEX_SMALL_MODEL:-gpt-5.6-luna}" \
CLAUDE_CODE_SUBAGENT_MODEL="${model%\[*}" \
CLAUDE_CODE_AUTO_COMPACT_WINDOW=272000 \
CLAUDE_CODE_MAX_TOOL_USE_CONCURRENCY=3 \
CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK=1 \
ENABLE_TOOL_SEARCH=false \
command claude --model "$model" "$@"
command claude --model "$model" --settings "$compact_settings" "$@"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: dot_zshenv.tmpl の 500000 と --settings の 360000 の優先順位が正しく機能するか

dot_zshenv.tmpl:31 で CLAUDE_CODE_AUTO_COMPACT_WINDOW=500000 が OS 環境変数として export される。素の claude 実行時はこの値が使われる(Opus の 1M context に適切)。claudex 実行時は --settings で {"env":{"CLAUDE_CODE_AUTO_COMPACT_WINDOW":"360000"}} が渡される。Claude Code の設定優先順位は Managed > Command-line > Local > Project > User > OS env であるため、Command-line レベルの --settings が OS env の 500000 に勝ち、360000 が適用される。この優先順位はコミットメッセージで言及されている settings.md に基づいている。ただし、もしプロジェクトの .claude/settings.json が Managed レベルで CLAUDE_CODE_AUTO_COMPACT_WINDOW を設定している場合は Managed が勝つ。コミットメッセージでは layerone プロジェクトが 750000 を Project レベルで設定していたケースに言及しており、Command-line > Project なので今回の修正で解決する。

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

tak848 added a commit that referenced this pull request Jul 15, 2026
## Why

#811 で `[1m]` を外したが、これは statusline を悪化させる判断ミスだった。`[1m]` を外すと statusline
の分母がモデル既定(~200K)になり、Sol は 200K を超える(実効 372K まで到達)ためゲージが 100%
を振り切って読めなくなる。実キャップ 372K に一番近い表示は `[1m]` の `/1000k` なので、付けた方が良い。

また #811 の前提「デッドロックは `[1m]` のせい」は実は証明できていなかった。当時のセッションは `[1m]` と project
の `settings.json` の `CLAUDE_CODE_AUTO_COMPACT_WINDOW: 750000` が両方あり、どちらも
372K の壁より上(920K と 690K)だったので、どちらが compaction 基準を握っていたかは区別できない。

## What

`dot_zsh/functions/claudex.zsh`:

- **model / small model に `[1m]` を復活**(`gpt-5.6-sol[1m]` /
`gpt-5.6-luna[1m]`)。statusline を `/1000k` に戻す
- auto-compact のガードは #811 で入れた `--settings` の
`CLAUDE_CODE_AUTO_COMPACT_WINDOW=360000`(compact を ~331K で焚く)を維持
- `[1m]` が明示 `AUTO_COMPACT_WINDOW` を上書きして 372K
で詰む場合に備え、`CLAUDEX_MODEL='gpt-5.6-sol'`(`[1m]` 無し)へのフォールバック例をコメントに残した

狙いは「statusline `/1000k`(実キャップ 372K に最も近い表示)+ `--settings` 360000 による壁手前
compact」の両取り。これが成立するかは `[1m]` が明示 `AUTO_COMPACT_WINDOW` を上書きしないことに依存する。

## 検証

- `zsh -n` 構文チェック
- claude をスタブし、`--model gpt-5.6-sol[1m] --settings
{"env":{"CLAUDE_CODE_AUTO_COMPACT_WINDOW":"360000"}}` が渡ること、subagent は
`[1m]` を剥がした `gpt-5.6-sol` になること、`CLAUDEX_MODEL='gpt-5.6-sol'`
フォールバックが効くことを確認

**要実測(nested claude 禁止で机上検証不可)**: `[1m]` 付きで context を伸ばし、compact が 1M
手前ではなく 360000 基準の ~331K で焚かれること。331K 付近で焚ければ両取り成立。372K まで行って詰むなら `[1m]`
が `AUTO_COMPACT_WINDOW` を上書きするということなので、`CLAUDEX_MODEL='gpt-5.6-sol'`
にフォールバックする。

    # 実測コマンド(既存コードでも CLAUDEX_MODEL 上書きで試せる)
    CLAUDEX_MODEL='gpt-5.6-sol[1m]' claudex

https://claude.ai/code/session_01NqfvJkL7QkYwXqXvhg5fjB
Sign up for free to 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.

1 participant