@@ -35,6 +35,134 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3535 compatible gateways keep the generic Chat contract. FIM
3636 (` /v1/fim/completions ` ) is not wired.
3737
38+ ## [ 0.9.6] - 2026-08-09
39+
40+ Codewhale v0.9.6 is a subtractive release. The runtime stopped supervising the
41+ model and started getting out of its way: the guards that interrupted live work
42+ are gone, mode-specific prompt doctrine is gone, compaction was rebuilt on a
43+ much smaller design, and a truncated provider response can no longer be
44+ recorded as a finished answer.
45+
46+ Most of these were found by running the v0.9.5 binary against Terminal-Bench
47+ 2.1 beside Pi 0.8.41 on the same model, effort, endpoint, and task digests, and
48+ then reading the trials Codewhale lost.
49+
50+ ### Added
51+
52+ - Mistral AI (la Plateforme) is now a first-class OpenAI-compatible provider
53+ route. Select it with ` provider = "mistral" ` , ` CODEWHALE_PROVIDER=mistral ` ,
54+ or ` codewhale --provider mistral ` . Aliases ` mistral-ai ` , ` mistralai ` , and
55+ ` la-plateforme ` resolve to the same route. Authenticate with
56+ ` MISTRAL_API_KEY ` (get one at < https://console.mistral.ai/api-keys > ), or
57+ via ` [providers.mistral].api_key ` / ` codewhale auth set --provider mistral ` .
58+ Endpoint defaults to ` https://api.mistral.ai/v1 ` ; model defaults to
59+ ` mistral-code-latest ` (Codestral coding model, 256K context; the historical
60+ ` codestral-latest ` slug is accepted as an alias). The current static picker
61+ ships ` mistral-code-latest ` , ` mistral-medium-latest ` ,
62+ ` mistral-small-latest ` , and ` mistral-large-latest ` with 256K-class windows.
63+ Adjustable reasoning is wired end-to-end for ` mistral-medium-latest ` and
64+ ` mistral-small-latest ` : Codewhale sends ` reasoning_effort ` (` none ` or ` high `
65+ only — intermediate tiers get HTTP 400 code 3051), parses the polymorphic
66+ `content: [ {type: thinking, thinking: [ {type: text, text: ...}] , closed:
67+ bool}, {type: text, text: ...}] ` shape emitted during reasoning, and
68+ replays the thinking trace back into multi-turn history per the
69+ [ official reasoning guide] ( https://docs.mistral.ai/studio-api/conversations/reasoning ) .
70+ Deprecated native Magistral IDs remain accepted
71+ when configured explicitly, always replay thinking, and never receive the
72+ adjustable effort field. Non-reasoning models (` mistral-code-latest ` ,
73+ ` mistral-large-latest ` ) never receive it. Mistral-specific reasoning wire
74+ behavior is limited to the documented first-party HTTPS ` /v1 ` hosts; custom
75+ compatible gateways keep the generic Chat contract. FIM
76+ (` /v1/fim/completions ` ) is not wired.
77+ - ** Persistent background services for headless exec.** ` Bash ` accepts
78+ ` persist: true ` (Unix, real ` codewhale exec ` , explicit
79+ ` --sandbox danger-full-access ` , ` background: true ` only). The service starts
80+ with null stdio in its own process group; a successful exec transfers
81+ ownership and emits a release receipt naming the pid. Failure, cancellation,
82+ a terminating signal, or engine-channel EOF kills it and exits nonzero.
83+ Ordinary background jobs keep their existing kill-on-drop lifetime. Before
84+ this, a server the model started and verified died when the exec that
85+ started it succeeded, and the external verifier got connection refused.
86+ - ** Static Linux ARM64 binaries.** Release and nightly now build
87+ ` aarch64-unknown-linux-musl ` on the native ARM runner, with a static check
88+ (no ELF interpreter) and a launch smoke on the matching runner. The previous
89+ GNU build inherited the builder's ` GLIBC_2.39 ` floor and would not start on
90+ Ubuntu 22.04 ARM64 and similar images.
91+
92+ ### Changed
93+
94+ - ** ` Bash action="wait" ` blocks by default.** It previously computed blocking
95+ from a separate ` wait ` boolean defaulting to false, so
96+ ` {"action":"wait","task_id":...,"timeout_ms":600000} ` returned immediately
97+ and ignored the timeout. Pass ` wait: false ` for a nonblocking snapshot.
98+ ` task_shell_wait ` keeps its documented nonblocking default, including when
99+ ` wait ` /` block ` arrive as null.
100+ - ** Compaction rebuilt on the Codex design.** One summary request that is the
101+ live conversation plus a final handoff-summary message, so the provider's
102+ prefix cache covers everything already sent; a committed summary; and a
103+ replacement history of the recent user messages within a fixed token budget.
104+ On context-window overflow it drops the oldest history item and retries.
105+ Sessions saved under the previous format still restore their committed
106+ summary. Manual compaction remains nonblocking and serialized, both
107+ lifecycle labels persist for the real lifecycle, and the successor request
108+ carries the committed summary.
109+ - ** One prompt for every mode.** Plan, Agent, and Operate previously shipped
110+ separate doctrine prompts that were prepended to the constitution, so a mode
111+ change rewrote the stable prefix. Modes differ in permissions and available
112+ tools, which runtime policy and the live tool catalog already express per
113+ turn. Headless hosts get a compact constitution; interactive hosts keep the
114+ full base; explicit embedder and base-prompt overrides still win.
115+ - ** Goals are no longer bounded from inside the runtime.** The three-per-turn
116+ continuation cap, the auto-pause after three identical verifier gap sets, and
117+ the instruction to stop at any unanswered question are gone. ` max_steps ` ,
118+ the opt-in ` [goal] max_continuations ` circuit breaker, and terminal
119+ complete/blocked status remain the ways a goal run ends.
120+ - ` todo_write ` is documented as an optional progress surface. Its description
121+ no longer instructs the model to keep the list live or never batch
122+ completions.
123+
124+ ### Fixed
125+
126+ - ** A truncated response is a failure, not an answer.** The turn loop read
127+ usage from the message delta and discarded its stop reason; trials that spent
128+ their whole output allowance on reasoning and emitted no answer were recorded
129+ ` status=completed ` , ` termination_reason=resolved ` . The stop reason is now
130+ retained end to end. On an incomplete stop the runtime charges the billed
131+ usage, keeps the visible fragment as interrupted rather than as a completed
132+ assistant message, closes every opened tool lifecycle without executing the
133+ call, and fails the turn with the provider's own reason. The Responses
134+ adapter preserves ` incomplete_details.reason ` instead of flattening it, so an
135+ unknown future reason cannot be mistaken for a finished answer.
136+ - The same rule now covers every remaining direct model consumer: compaction,
137+ the ` review ` and ` verify ` tools, MCP thread handling, purge, the advisor, the
138+ auto-route classifier, the fleet router, both setup drafts, and
139+ ` codewhale review ` .
140+ - ** Step-budget exhaustion is a typed failure.** Reaching ` max_steps ` before
141+ completion is ` Failed ` / ` BudgetExhausted ` and cannot release a pending
142+ persistent service. A goal continuation injected on the final step no longer
143+ relabels an already delivered answer as a step-budget failure.
144+ - Cancellation arriving after the provider reported terminal usage still
145+ charges the turn.
146+
147+ ### Removed
148+
149+ - ** The no-progress stuck guard.** It fingerprinted steps by tool name and
150+ arguments with no result digest, so polling a live background job looked
151+ identical every time. It stopped ` filter-js-from-html ` while the task it was
152+ waiting on went on to pass, and stopped ` llm-inference-batching-scheduler `
153+ and ` mcmc-sampling-stan ` mid-optimizer and mid-compile.
154+ - ** The read-repeat guard.** It coalesced same-batch duplicate reads onto one
155+ execution and, past a threshold, replaced results with a receipt pointing at
156+ a prior tool-use id. A model that asks to read a file twice now reads it
157+ twice.
158+ - ** Tool-error strategy coaching.** Errors were rewritten to append fallback
159+ advice, and a degradation hint fired after two consecutive error steps.
160+ Errors now return as the tool produced them.
161+
162+ ### Contributors
163+
164+ - Xavier Pestel (@xavierpestel-ai ) — Mistral AI provider route (#5295 ).
165+
38166## [ 0.9.5] - 2026-08-08
39167
40168Codewhale v0.9.5 consolidates the terminal application into one compiled
@@ -5262,6 +5390,7 @@ overflow report and `/theme` picker edge-wrapping patch in #1814.
52625390Older releases (v0.8.39 and earlier) are archived in [ docs/CHANGELOG_ARCHIVE.md] ( docs/CHANGELOG_ARCHIVE.md ) .
52635391
52645392[ Unreleased ] : https://github.com/Hmbown/CodeWhale/compare/v0.9.5...HEAD
5393+ [ 0.9.6 ] : https://github.com/Hmbown/CodeWhale/compare/v0.9.5...v0.9.6
52655394[ 0.9.5 ] : https://github.com/Hmbown/CodeWhale/compare/v0.9.4...v0.9.5
52665395[ 0.9.4 ] : https://github.com/Hmbown/CodeWhale/compare/v0.9.3...v0.9.4
52675396[ 0.9.3 ] : https://github.com/Hmbown/CodeWhale/compare/v0.9.2...v0.9.3
0 commit comments