Skip to content

Fixes the Claude Code Exec backend for issue #233 - #238

Open
Nuplum (45lab95) wants to merge 1 commit into
microsoft:mainfrom
45lab95:fix/claude-exec-reflection
Open

Fixes the Claude Code Exec backend for issue #233#238
Nuplum (45lab95) wants to merge 1 commit into
microsoft:mainfrom
45lab95:fix/claude-exec-reflection

Conversation

@45lab95

Copy link
Copy Markdown

Summary

Fixes the Claude Code Exec backend for issue #233: with --backend claude_code_exec, both optimizer and target roles now
default to Claude Code (symmetric default), and the agent's SDK session trace is parsed into structured claude_trace_steps.txt files that are injected into the reflection
prompt — addressing context-length truncation and trajectory loss.

Implementation

  1. Backend registration + symmetric defaultbackend_config.py, model/__init__.py, scripts/train.py, scripts/eval_only.py register claude_code_exec; both roles
    default to it (a role pinned to a non-default value like minimax_chat still overrides).
  2. SDK trace → structured stepscodex_harness.py adds parse/format/persist_claude_trace_steps: extracts text / tool_call / tool_result steps from the SDK message
    stream, drops init / thinking_tokens bookkeeping, caps tool_result at 200 chars, and persists one file per prediction.
  3. Gated injectionreflect.py injects #### Claude Trace Steps only when REFLACT_CLAUDE_TRACE_TO_OPTIMIZER=1, which trainer.py sets only for claude_code_exec
    targets with model.claude_trace_to_optimizer: true (default; mirrors the existing codex gate).
  4. reasoning_effort wiring — the previously-dead REASONING_EFFORT module global is now consumed via run_claude_code_chat(..., effort=...) and forwarded by the
    dispatcher.
  5. Tests + docs — new tests/test_claude_code_backend.py; configs/_base_/default.yaml, docs/reference/config.md, and _FLATTEN_MAP extended.

Results

  • Unit tests: tests/test_claude_code_backend.py + tests/test_role_backend_resolution.py58 passed (11 new cases all green).
  • Integration smoke (small searchqa run): exit 0, accept=1, best-on-val 0.7500 → 0.9375, 80 claude_trace_steps.txt written.
  • Artifacts intact: merged_patch.json / config.json valid; skill v0000v0001.

How to verify

PYTHONUTF8=1 uv run --extra dev pytest tests/test_claude_code_backend.py tests/test_role_backend_resolution.py -q
# → 58 passed

Run a small searchqa training with --backend claude_code_exec --optimizer_backend claude_code_exec, then check:

  1. Reflection does not raise ValueError: Unsupported optimizer backend.
  2. Every prediction directory contains claude_trace_steps.txt.
  3. The analyst prompt contains #### Claude Trace Steps.
  4. All output files are valid UTF-8 (use PYTHONUTF8=1 on Windows).

…ace support

Register claude_code_exec as a full optimizer/target backend (issue microsoft#233).
--backend claude_code_exec now defaults both roles to claude_code_exec so
reflection sees the agent's complete session, and the SDK message stream is
parsed into structured trace steps persisted as claude_trace_steps.txt and
injected into the analyst prompt.

- model/claude_code_backend.py (new): chat_optimizer/chat_optimizer_messages on
  run_claude_code_chat, reasoning_effort threaded through, retry loop that
  surfaces non-JSON structured replies as RuntimeError, token tracking.
- model/codex_harness.py: parse/format/persist claude trace steps (text,
  tool_call, tool_result; drops init/thinking_tokens; 200-char tool_result cap;
  total truncation) + effort override on run_claude_code_chat.
- trainer.py/reflect.py: inject Claude Trace Steps gated behind
  REFLACT_CLAUDE_TRACE_TO_OPTIMIZER, set by the trainer only for claude_code_exec
  targets with model.claude_trace_to_optimizer (mirrors codex gate; default true).
- config.py/default.yaml/docs: model.claude_trace_to_optimizer key + flatten
  mapping + config.md rows.
- backend_config.py + model/__init__.py: register backend, route chat dispatch,
  token summary, reasoning effort, deployments.
- scripts/train.py, eval_only.py: symmetric default + accurate comments.
- tests: tests/test_claude_code_backend.py (10 tests: parsing, dispatch, effort,
  retry, trainer/reflect gating); test_role_backend_resolution.py updated to the
  symmetric default.

Verified: 58 unit tests pass; integration smoke on searchqa improved best-on-val
0.7500 -> 0.9375 with 80 claude_trace_steps.txt written; all output files valid
UTF-8 (no GBK mojibake).
@45lab95 Nuplum (45lab95) changed the title feat(claude_code_exec): add claude code optimizer backend with SDK tr… Fixes the Claude Code Exec backend for issue #233 Aug 20, 2026
@45lab95

Copy link
Copy Markdown
Author

@microsoft-github-policy-service agree

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