diff --git a/.env.example b/.env.example
index 6291cdb..e83cdb3 100644
--- a/.env.example
+++ b/.env.example
@@ -7,12 +7,12 @@
# Anthropic
# ANTHROPIC_API_KEY=sk-ant-xxxxx
-# ANTHROPIC_MODEL=claude-sonnet-4-20250514
+# ANTHROPIC_MODEL=claude-opus-5-5
# OpenAI / 兼容服务
# OPENAI_API_KEY=sk-xxxxx
# OPENAI_BASE_URL=https://api.openai.com/v1
-# OPENAI_MODEL=gpt-4o
+# OPENAI_MODEL=gpt-6-astra
# 百炼
# DASHSCOPE_API_KEY=sk-xxxxx
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1fbecbe..639368d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,103 @@
## [Unreleased]
+## [0.2.130] - 2026-10-01
+
+### Fixed (P131 — current models, and what P129/P130 broke)
+
+**Every current Claude model was unusable.** The Anthropic adapter sent `temperature: 0.3`
+on every request. Fable 5 / 5.1, Opus 4.7+ and Sonnet 5+ reject sampling parameters with a
+400, and the retry only fired for errors that mentioned `thinking`. So every agent turn
+failed on two of the three Claude presets. Reasoning levels were sent as `budget_tokens`,
+which those models also reject (`off` sent `thinking.disabled`, a 400 on Opus 5.5).
+- **Per-model request surface:** `thinking.ts` gains `claudeCaps()` /
+ `anthropicReasoningParams()`. These models now get no sampling fields, and reasoning
+ level maps to `thinking: {type:'adaptive', display:'summarized'}` + `output_config.effort`.
+ `off` on an always-thinking model becomes `effort: low`.
+- **Broader retry:** a 400 naming temperature / thinking / effort is retried once without
+ those fields, so a model id we don't know yet degrades instead of dying.
+- **Refusals:** `stop_reason: "refusal"` now shows a notice instead of an empty reply.
+
+**GPT-6 Astra was unusable on api.openai.com.**
+- The reasoning-model check only matched `gpt-5`, so `gpt-6-astra` got `max_tokens` +
+ `temperature`, both 400s.
+- On `/chat/completions` it also rejects `reasoning_effort` together with tools, and
+ rejects the `minimal` effort. Agent turns now omit the effort (model default), and plain
+ chat maps `off` → `low`.
+- The fallback detector now recognises "… are not supported" errors.
+- "Test connection" sent `max_tokens` to every OpenAI reasoning model, so it failed for
+ GPT-5.x too. It now uses `max_completion_tokens`.
+- The vision path had the same `max_tokens` / `temperature` problem.
+
+**Sidecar stalls (since P129).** The stdin watchdog called `peek()` on stdin from a helper
+thread. After ~2 s idle, the request that followed the next one was not read until more
+input arrived, so back-to-back tool calls stalled into 60 s timeouts. That is likely the
+real source of the "timed out but it finished" reports P130 worked around. The watchdog now
+checks the parent PID and never touches stdin.
+
+**P130 timeout ≠ failure, finished properly.**
+- **Absolute cap:** heartbeats prove Python is alive, not that SolidWorks progresses. A COM
+ call stuck on a modal dialog heartbeated forever, and Stop could not break it (every new
+ message got AGENT_BUSY). Each call now has an absolute cap of 3× its budget (`sw_status`
+ has none), and `call()` takes the abort signal (code `CANCELLED`).
+- **One request at a time:** a request queued behind a slow call burned its budget unread,
+ timed out, and its same-op_id retry re-ran a tool whose first run had failed (only
+ successes were cached). Requests now go out one at a time, budgets start when sent, and
+ failures are cached under their op_id too.
+- **Namespaced op_ids:** op_ids are scoped per agent run. Providers that restart tool-call
+ ids per conversation (Kimi's `functions.
-
+
-
+
-
+
-
+