chore(release): prepare v0.8.60 — drop 0.8.59 docs, clear clippy gates, credit new models

Remove stale v0.8.59 release docs (release-notes-v0.8.59.md, docs/V0_8_59_RELEASE_TRIAGE.md) now that v0.8.59 is shipped.

Clear three clippy release-gate lints: const-evaluate the DEFAULT_SPAWN_DEPTH ceiling assert, and allow the intentional await_holding_lock on two Z.ai routing tests that must hold the test-env mutex across the await.

Credit new 0.8.60 models and first-party provider routes in the changelog: GLM-5.2 (Z.ai + OpenRouter), first-party Z.ai, StepFun/StepFlash (step-3.7-flash), and MiniMax (MiniMax-M3) routes (#3187/#3191). Regenerate the embedded crates/tui/CHANGELOG.md slice.
This commit is contained in:
Hunter B
2026-06-14 00:06:44 -07:00
parent 652d3925ae
commit 69c19007c9
6 changed files with 16 additions and 475 deletions
+6
View File
@@ -26,6 +26,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- **Slash-menu Ctrl+P/Ctrl+N navigation (#3196).** The slash command menu now - **Slash-menu Ctrl+P/Ctrl+N navigation (#3196).** The slash command menu now
supports Ctrl+P/Ctrl+N movement without letting the global file picker steal supports Ctrl+P/Ctrl+N movement without letting the global file picker steal
focus while the menu is open. Thanks @1Git2Clone for the PR. focus while the menu is open. Thanks @1Git2Clone for the PR.
- **New models and first-party provider routes.** This release adds
**GLM-5.2** (selectable on the Z.ai Coding Plan and over OpenRouter as
`z-ai/glm-5.2`, alongside the existing GLM-5.1 default), a first-party
**Z.ai** provider route, a first-party **StepFun / StepFlash** route
(`step-3.7-flash`), and a first-party **MiniMax** route defaulting to
`MiniMax-M3` with the M2.7/M2.5/M2.1 family selectable (#3187/#3191).
### Changed ### Changed
+1 -1
View File
@@ -7423,7 +7423,7 @@ fallback_providers = ["deepseek", "openrouter"]
DEFAULT_SPAWN_DEPTH DEFAULT_SPAWN_DEPTH
); );
assert_eq!(FleetExecConfig::default().max_spawn_depth, 3); assert_eq!(FleetExecConfig::default().max_spawn_depth, 3);
assert!(DEFAULT_SPAWN_DEPTH <= MAX_SPAWN_DEPTH_CEILING); const { assert!(DEFAULT_SPAWN_DEPTH <= MAX_SPAWN_DEPTH_CEILING) };
} }
#[test] #[test]
+6
View File
@@ -26,6 +26,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- **Slash-menu Ctrl+P/Ctrl+N navigation (#3196).** The slash command menu now - **Slash-menu Ctrl+P/Ctrl+N navigation (#3196).** The slash command menu now
supports Ctrl+P/Ctrl+N movement without letting the global file picker steal supports Ctrl+P/Ctrl+N movement without letting the global file picker steal
focus while the menu is open. Thanks @1Git2Clone for the PR. focus while the menu is open. Thanks @1Git2Clone for the PR.
- **New models and first-party provider routes.** This release adds
**GLM-5.2** (selectable on the Z.ai Coding Plan and over OpenRouter as
`z-ai/glm-5.2`, alongside the existing GLM-5.1 default), a first-party
**Z.ai** provider route, a first-party **StepFun / StepFlash** route
(`step-3.7-flash`), and a first-party **MiniMax** route defaulting to
`MiniMax-M3` with the M2.7/M2.5/M2.1 family selectable (#3187/#3191).
### Changed ### Changed
+2
View File
@@ -7329,6 +7329,7 @@ mod terminal_mode_tests {
} }
#[tokio::test] #[tokio::test]
#[allow(clippy::await_holding_lock)]
async fn explicit_exec_model_routes_to_unique_authenticated_provider_candidate() { async fn explicit_exec_model_routes_to_unique_authenticated_provider_candidate() {
let _env_lock = crate::test_support::lock_test_env(); let _env_lock = crate::test_support::lock_test_env();
let _zai = crate::test_support::EnvVarGuard::set("ZAI_API_KEY", "zai-key"); let _zai = crate::test_support::EnvVarGuard::set("ZAI_API_KEY", "zai-key");
@@ -7349,6 +7350,7 @@ mod terminal_mode_tests {
} }
#[tokio::test] #[tokio::test]
#[allow(clippy::await_holding_lock)]
async fn explicit_exec_model_reports_ambiguous_authenticated_provider_candidates() { async fn explicit_exec_model_reports_ambiguous_authenticated_provider_candidates() {
let _env_lock = crate::test_support::lock_test_env(); let _env_lock = crate::test_support::lock_test_env();
let _zai = crate::test_support::EnvVarGuard::set("ZAI_API_KEY", "zai-key"); let _zai = crate::test_support::EnvVarGuard::set("ZAI_API_KEY", "zai-key");
-366
View File
@@ -1,366 +0,0 @@
# v0.8.59 Release Triage
Generated on 2026-06-12 for `Hmbown/CodeWhale`.
Current local release branch at handoff time:
- Branch: `codex/v0.8.59-release-ready`
- Head: `ca826bb2 fix(tui): clarify Codex response errors`
- Remote: `origin=https://github.com/Hmbown/CodeWhale.git`
## Mission
Move v0.8.59 toward release by actively landing, harvesting, or closing the
remaining PR and issue queue. Do not only summarize. Use GitHub and local Git
state to decide which items are already landed, which can be directly merged,
which need a credited harvest, and which should be deferred with a clear note.
Start from `codex/v0.8.59-release-ready` unless Hunter gives a newer branch.
## Key Operating Idea: Scratch Integration Branches
Hunter's "dummy branch" idea is feasible and useful. Use it.
The scratch branch is for discovery and acceleration:
- create it from the real release branch;
- merge or cherry-pick many candidate PR heads into it;
- use conflicts, tests, and diff review to learn what composes;
- harvest only the safe result back into the release branch.
The scratch branch is not the thing to ship. It can contain noisy merge commits,
temporary conflict resolutions, and interactions between unrelated PRs.
Suggested local workflow:
```bash
git fetch --prune origin
git switch codex/v0.8.59-release-ready
git pull --ff-only
git switch -c scratch/v0.8.59-pr-train-$(date +%Y%m%d-%H%M)
```
Fetch specific PR heads into temporary refs:
```bash
git fetch origin pull/3152/head:refs/tmp/pr-3152
git fetch origin pull/3148/head:refs/tmp/pr-3148
git fetch origin pull/3150/head:refs/tmp/pr-3150
```
Dry-run conflicts before touching the scratch branch:
```bash
base=$(git merge-base origin/codex/v0.8.59-release-ready refs/tmp/pr-3152)
git merge-tree "$base" origin/codex/v0.8.59-release-ready refs/tmp/pr-3152
```
On the scratch branch, merge one candidate at a time:
```bash
git merge --no-ff refs/tmp/pr-3152
```
If it conflicts, resolve only enough to learn whether the PR should be directly
merged, cherry-picked, harvested, or closed as already landed. After the scratch
experiment, return to the release branch and apply the final result as narrow
commits.
Use direct GitHub merge only when the PR is clean against the actual landing
branch. Many PRs are clean against `main` but conflict against
`codex/v0.8.59-release-ready`.
If a scratch branch needs CI, push it only as a clearly named scratch branch or
draft PR after Hunter authorizes that branch/CI lane. Never tag or publish from
scratch.
## Credit Contract
When harvesting contributor work:
- Preserve the original author when practical.
- Add `Co-authored-by` using `.github/AUTHOR_MAP` or:
```bash
gh api users/<login> --jq '"\(.id)+\(.login)@users.noreply.github.com"'
```
- Include this line in the commit body:
```text
Harvested from PR #N by @handle
```
The repo has `.github/workflows/auto-close-harvested.yml`, which closes PRs
after such commits land on `main`. Until then, leave clear comments linking the
release-branch commit or harvest plan.
## Recently Approved PRs Already Covered
`Hmbown` submitted formal `APPROVED` reviews on these PRs on 2026-06-12. A
follow-up scratch-merge pass against `codex/v0.8.59-release-ready` found that
the release branch already contains equivalent or stronger implementations. Do
not spend another cycle re-harvesting them; close them after the release branch
lands on `main`, or leave/update triage comments if they remain open.
### PR #3152 - SSE `data:` parsing
- URL: https://github.com/Hmbown/CodeWhale/pull/3152
- Author: `wgeeker`
- Title: `fix(SSE): accept SSE data lines without space after colon`
- Hunter approval: 2026-06-12T16:10:34Z
- GitHub merge state against `main`: `BLOCKED`
- Non-success checks shown by `gh`: none
- Head: `fix/sse-data-prefix-no-space`
- Commit: `50445eb3 fix: accept SSE data lines without space after colon`
- Files: `crates/tui/src/client.rs`, `client/anthropic.rs`, `client/chat.rs`,
`client/responses.rs`
- Release-branch result: scratch merge produced a literal zero diff.
- Covered by release commit: `2f717d33 fix(tui): accept compact SSE data
fields`.
- Notes: release branch already has an identical `extract_sse_data_value`
helper and equivalent tests.
- Action: no harvest needed. Keep the triage comment as credit and close after
the release branch lands on `main`.
### PR #3148 - `--model auto` / `DEEPSEEK_MODEL`
- URL: https://github.com/Hmbown/CodeWhale/pull/3148
- Author: `hongchen1993`
- Title: `fix(exec): resolve --model auto via DEEPSEEK_MODEL env and reorder ExecArgs`
- Hunter approval: 2026-06-12T16:10:21Z
- GitHub merge state against `main`: `CLEAN`
- Non-success checks shown by `gh`: none
- Head: `fix/auto-model-agent-plan`
- Commits: `b67f4add`, `55e66a6e`
- File: `crates/tui/src/main.rs`
- Release-branch result: fully covered.
- Covered by release commit: `862cb2e3 fix(exec): preserve auto model handoff`.
- Notes: `ExecArgs` is already reordered so the prompt is last, and the release
branch env fallback is a superset: `CODEWHALE_MODEL`, then `DEEPSEEK_MODEL`.
- Action: no harvest needed. Keep the triage comment as credit and close after
the release branch lands on `main`.
### PR #3150 - prompt source map / context usage
- URL: https://github.com/Hmbown/CodeWhale/pull/3150
- Author: `idling11`
- Title: `feat(context): add prompt source map and context-usage report (#3143)`
- Hunter approval: 2026-06-12T16:10:10Z
- GitHub merge state against `main`: `CLEAN`
- Non-success checks shown by `gh`: none
- Head: `feat/3143-prompt-source-map`
- Commits: `e91d4984`, `97e711c4`, `c463dac4`, `b8efcde0`
- Files include `crates/tui/src/context_report.rs`, command wiring,
`compaction.rs`, `localization.rs`, `main.rs`, and TUI UI/app files.
- Closing issue: #3143
- Release-branch result: independently implemented.
- Covered by release commit: `0986cabb feat(tui): add context source map
report`.
- Notes: release branch already has `/context [report|json|summary]` and
`codewhale doctor --context-json`. Gemini's string-slicing and duplicate
`AGENTS.md` findings apply to the PR implementation, not the release branch:
the release module does no string slicing and no `AGENTS.md` processing. The
PR's remaining tests target its divergent API and do not transplant cleanly.
- Action: no harvest needed. Keep the triage comment as credit and close after
the release branch lands on `main`.
## Current v0.8.59 PR Queue
Open PRs carrying `v0.8.59` at the handoff scan, updated with the
release-branch scratch triage pass.
### Merge cleanly into the release branch (await Hunter approval)
- #3062 - fix(tools): apply strict mode per schema
- #3008 - docs(prompt): clarify Constitution trust framing
- #3006 - fix update release-download timeout/error messaging
- #3003 - bump `clap_complete` (CodeQL neutral)
- #3002 - bump `rustls` (CodeQL neutral)
- #3001 - bump `reqwest` (CodeQL neutral)
- #2971 - expose matched approval rule metadata
- #2943 - normalize macOS Cmd/SUPER to CONTROL
These can be landed directly or via a small scratch train, but they did not have
Hunter approval at the 2026-06-12 re-scan (reviewDecision empty on all). Ask for
approval or review each one before merging. Lowest-risk first: docs PR #3008,
update-network fallback #3006, then the three dependency bumps
#3001/#3002/#3003.
### Already landed on the release branch (verified by scratch merge, zero residual diff)
Triage comments with the covering commits were posted on each on 2026-06-12.
Close after the release branch reaches `main`.
- #2901 - localize ToolFamily labels. Zero unique commits vs release branch.
- #3056 - hotbar number keys. Covered by `3de1d35c` with stronger tests
(extra `needs_redraw` assertions).
- #3052 - verbosity settings. Covered by `42de833d`, which is a superset
(case/whitespace-tolerant `is_concise_verbosity`).
- #3011 - provider source tracking + unsupported-TUI errors. Release branch
already has `ProviderSource::Cli/Env` and `provider_is_supported_by_tui`
with per-source error messages.
- #3009 - cli-compare Harbor harness. Release-branch script is a strict
evolution (adds `_first_present`/`_stable_path` helpers).
- #2895 - `siliconflow_cn` provider config field. Test merge produced zero
residual diff.
### Genuinely missing work; needs review/rebase (commented 2026-06-12)
- #3051 - feat(voice): `/voice` speech-to-text. Release branch has NO voice
command — this is a real 711-line feature. Conflicts in `commands/mod.rs`,
`localization.rs`, `tui/ui.rs`, and it smuggles an unrelated
`switch_provider` change (`app.api_key`/`app.base_url` reassignment) that
collides with the release branch's `reasoning_effort.normalize_for_provider`
line. Asked contributor to split/rebase; Hunter decides 0.8.59 vs next.
- #3005 - refactor(config): provider metadata registry. NOT landed — real
~300-line net simplification delta. One semantic conflict: release branch
registers config key `siliconflow_cn`; PR uses `siliconflow` + aliases.
Recommend deferring the refactor to the cycle after v0.8.59 unless Hunter
wants it in; asked for rebase onto the release branch.
### Blocked against `main` or with failing checks
- #3053 - docs: add Upgrading from deepseek-tui section. Merge state: BLOCKED.
- #3013 - detect legacy deepseek/deepseek-tui binary and print migration
instructions. Merge state: BLOCKED; macOS test failed and Windows test was
cancelled at scan time.
- #2995 - bump actions/stale from 9 to 10. Merge state: BLOCKED; version drift
failed and CodeQL was neutral.
- #2903 - build static linux x64 binaries with musl. Merge state: BLOCKED.
### Dirty / needs rebase, conflict triage, or harvest
- #3010 - exclude Calm personality overlay from default prompt path
- #2940 - localize Cmd command output messages
- #2932 - localize mode-picker messages
- #2929 - localize pending-input preview messages
- #2926 - localize onboard-welcome and app-mode-switch messages
- #2921 - localize sidebar panel labels, status messages, and focus indicators
- #2919 - localize ConfigEdit labels and default values
- #2918 - localize ConfigSection and ConfigScope labels
- #2899 - localize SubAgents surface
- #2894 - localize composer surface
- #2879 - align Hugging Face provider docs, errors, and tests
- #2851 - refactor TUI command groups into focused implementations; draft
- #2808 - runtime-api session save, undo/retry, and snapshot endpoints; dirty,
`needs-human`, lint failing
- #2773 - complete provider fallback chain
- #2239 - i18n Phase 1-4b wiring plus rebase compile fixes
## Full Open-PR Equivalence Audit (2026-06-12, vs release head d7de0a88)
Method: `git merge-tree --write-tree` of every open PR head against the
release branch. "Already landed" means the merge result tree is identical to
the release branch tree. Manual scratch-merge verdicts override raw
merge-tree conflicts where noted.
### Landed on the release branch in this pass
- #2943 - macOS SUPER→CONTROL normalization. Merged as `4d84d66e`, tests green.
- #2971 - matched approval rule metadata. Merged as `d7de0a88`, tests green.
### Already landed (identical tree; close after release reaches main)
#2895, #2901, #3001, #3002, #3003, #3006, #3008, #3062, #3119, #3135
(#3119/#3135 are duplicates of each other), plus manually verified
zero-residual: #3152, #3148, #3150, #3056, #3052, #3011, #3009.
### Clean merge with real delta (candidates; need review, not in v0.8.59 label mostly)
- Security: #3140 command-injection fix in hooks (3 files) — high priority review.
- Infra: #2903 musl static linux build (3 files; was BLOCKED on main, clean here).
- Docs: #2986 harvest-credit close template.
- Dependency bumps (workflow/web/rust): #2991, #2992, #2993, #2994, #2995,
#2996, #2997, #2998, #2999, #3000.
- Generated test PRs: #3113, #3116, #3120, #3122, #3125, #3130, #3131, #3132,
#3134, #3137.
- Generated perf/cleanup PRs: #3105, #3107, #3108, #3109, #3112, #3117,
#3121, #3129.
### Conflict against release branch (need scratch triage, rebase, or defer)
Real feature/fix work: #3103 (#3080), #3104 (#3095), #3106 (#3095), #3013,
#3010, #3053, #2773 (#2574), #2808, #2851, #2865, #2933, #2486, #2879,
#3051 (voice, see above), #3005 (registry refactor, see above).
i18n localize train (likely serial-conflicting with each other): #2239,
#2894, #2899, #2918, #2919, #2921, #2926, #2929, #2932, #2940.
Generated test/cleanup PRs with conflicts: #3110, #3111, #3114, #3115,
#3118, #3123, #3124, #3126, #3127, #3128, #3133, #3136, #3138, #3139, #3141.
## Milestone Issues
At scan time, milestone `v0.8.59` had 76 open issues and 35 open PRs, for 111
open milestone items. Issue priorities:
1. #3063 release tracker and release-blocker coordination.
2. Close/update already-covered approved PRs #3152, #3148, #3150 after the
release branch reaches `main`; do not re-harvest them.
3. User-visible bugs/regressions: #3064, #3067, #3065, #3080, #3088, #3095,
#3094, #3070, #1812, #1679, #1190, #1120, #1060, #861, #759, #1920.
4. Provider/model catalog and cost/context: #3086, #3085, #3084, #3083, #3076,
#3075, #3073, #3072, #3071, #3066, #2574, #1310, #868.
5. Tool and runtime UX: #3146, #3145, #3144, #3143, #3102, #3079, #2886,
#1917, #1847, #1822, #1802, #1794, #1186.
6. TUI and command polish: #3081, #3077, #3074, #3069, #2870, #2791, #1871,
#1722, #963.
7. Docs/localization/migration: #3093, #3092, #3091, #3090, #3087, #3068,
#3061, #3058, #1447, #1118, #683.
For each issue, first ask: "Is this already satisfied on
`codex/v0.8.59-release-ready`?" If yes, prepare a closure/update note with the
commit hash. If no, implement or harvest the smallest safe slice.
## Suggested Next Work Session
Conflict triage of #3056/#3052/#3051/#3011/#3009/#3005 was completed on
2026-06-12 (scratch branch `scratch/v0.8.59-conflict-triage-20260612`,
local only). Remaining:
1. Get Hunter's explicit approval to land the eight release-branch-clean PRs:
#3062, #3008, #3006, #3003, #3002, #3001, #2971, #2943.
2. Land those in small batches, starting with docs/dependencies/low-risk fixes,
and run focused checks after each batch.
3. Hunter decisions needed: include #3051 (voice) in v0.8.59 or defer; defer
#3005 (provider registry refactor) or reconcile the `siliconflow_cn` vs
`siliconflow`+aliases key naming and land.
4. After the release branch reaches `main`, close the verified-covered PRs:
#3152, #3148, #3150, #2901, #3056, #3052, #3011, #3009, #2895.
5. Triage the blocked PRs (#3053, #3013, #2995, #2903) and the dirty/localize
train, then move to milestone issues per the priority list above.
6. Update `CHANGELOG.md` and close/update linked issues only after verification.
## Useful Commands
List PRs with v0.8.59:
```bash
gh pr list -R Hmbown/CodeWhale --state open --limit 200 \
--search 'milestone:v0.8.59' \
--json number,title,url,headRefName,baseRefName,mergeStateStatus,reviewDecision,isDraft,statusCheckRollup
```
Find formal reviews by Hunter on open PRs:
```bash
for n in $(gh pr list -R Hmbown/CodeWhale --state open --limit 200 --json number --jq '.[].number'); do
gh pr view -R Hmbown/CodeWhale "$n" --json number,title,url,reviews,updatedAt \
--jq '. as $pr | [.reviews[]? | select(.author.login == "Hmbown") | {number:$pr.number,title:$pr.title,url:$pr.url,prUpdatedAt:$pr.updatedAt,state:.state,submittedAt:.submittedAt}][] | [.number,.state,.submittedAt,.prUpdatedAt,.title,.url] | @tsv'
done
```
Check whether a PR has patch-equivalent commits already on the release branch:
```bash
git log --cherry-mark --right-only --oneline \
origin/codex/v0.8.59-release-ready...refs/tmp/pr-3152
```
Show conflicts without modifying the worktree:
```bash
base=$(git merge-base origin/codex/v0.8.59-release-ready refs/tmp/pr-3152)
git merge-tree "$base" origin/codex/v0.8.59-release-ready refs/tmp/pr-3152
```
-107
View File
@@ -1,107 +0,0 @@
v0.8.59
CodeWhale v0.8.59 is a stability and integration release that hardens the TUI,
improves sidebar interactivity, localizes notifications, cleans up user-facing
naming, and adds experimental config and runtime API foundations.
---
## TUI stability and interactivity
- **Sidebar resize stays live during active turns** — the split pane no longer
freezes while the model is generating.
- **Sidebar hover stays live while loading** — detail popovers update in real
time instead of dropping mid-turn.
- **Hover highlight cleared on exit** — stale highlight state no longer
persists after leaving the sidebar.
- **Ghostty motion override kept live** — mouse motion events continue to
work correctly in Ghostty terminals.
- **Mouse-report sanitizer added** — raw SGR mouse reports are sanitized
defensively so corrupted composer input is blocked.
- **Sidebar Copy action** — the right-click context menu now includes Copy
alongside existing actions.
- **Richer Work overflow and Agents hover detail** — sidebar detail
popovers surface more information for Work and Agents entries.
- **Provider-wait state is now observable** — the TUI shows route, idle
budget, and fanout-preflight state during provider waits.
- **fanout launches are queued behind a visible launch gate** — interactive
fanout no longer stalls the TUI without feedback.
## Sub-agent safety and worker-ledger substrate
- **Sub-agents survive backgrounded waits** — worker cards are no longer
dropped when the TUI yields during long waits.
- **Interrupted sub-agent lifecycle events are emitted** — stale running
cards are reconciled with actual state.
- **Runtime-prompt stand-still guard** — the TUI no longer spins in an
autonomous loop when the launch gate is closed.
## i18n and user-facing naming
- **Notifications are now localized** — notification text respects the
configured language instead of always rendering in English.
- **Tool family labels are localized** — 10 tool family labels now use
MessageId-based i18n.
- **Config editor labels are localized** — config section editor labels
follow the configured language.
- **"Bash" shown in user-facing UI** — shell execution is surfaced as "Bash"
in the TUI while `exec_shell` remains the internal tool name.
## Provider and model updates
- **Kimi OAuth credentials aligned with Kimi Code** — the config path for
Kimi OAuth credentials now matches the Kimi Code provider surface.
- **Kimi K2.7 Code defaults added** — model metadata for Kimi K2.7 Code is
included.
- **SiliconFlow CN provider config split** — a separate provider entry for
SiliconFlow China is available.
- **Provider metadata registry refactored** — provider metadata is now
data-driven and easier to extend.
- **OpenRouter Nemotron preset fixed** — the invalid model ID is corrected.
- **Provider fallback chain activated** — harvested from community PR #2773.
## Experimental config and runtime API
- **Experimental feature flags**`[experimental]` config section for goal
and WhaleFlow opt-ins, surfaced through normal config paths.
- **Runtime API Phase 0 + Phase 1** — brand-neutral naming, capabilities
advertisement, and dynamic tool protocol types for editor/GUI clients.
- **Command strategy registry** — harvested from community PR #2851.
- **Context source map report** — visibility into rules, tools, memory, and
skills contributions to prompt cost.
## Community harvests
- **PR #3010** — lock slim default prompt with calm-overlay regression test.
- **PR #2808** — thread undo/retry and snapshot restore endpoints.
- **PR #3051** — voice input commands and hotbar integration.
- **PR #2773** — activate provider fallback chain.
- **PR #2851** — command strategy registry.
## Other fixes and improvements
- **macOS Command modifier normalized to Control** for keyboard shortcuts
(#2938).
- **Hotbar slots dispatched from number keys**.
- **Thread goals persisted through the app server**.
- **Concise verbosity mode added** to config.
- **Workspace trust required for project hooks** — safety boundary
enforced.
- **Thread detail item reads batched** — N+1 query fix.
- **Legacy deepseek users guided to codewhale** in update paths.
- **Static Linux x64 musl binaries** now built.
- **Approval rule metadata exposed at runtime**.
- **Codex response errors clarified** in TUI.
- **Microsoft Build Tools / cmake --build** shell compatibility fix.
- **PDF extraction hardened** for non-Identity-H CMap fonts.
---
**Full headless sub-agents (fleet manager, worker runtime, durable inbox/ledger)
are deferred to v0.8.60 / #3096.** The v0.8.59 release includes the
sub-agent safety and worker-ledger substrate that v0.8.60 builds on.
**v0.8.60+ tracking issues remain open:**
- #3096 — Full headless sub-agents and worker runtime
- #1310 — MiniMax first-party provider
- #3187 — Z.ai / StepFlash first-party providers