6.9 KiB
CodeWhale 0.8.68 Handoff — Finish the Landing
Status (2026-07-12): Historical / completed. Every actionable item below either landed by v0.8.68 (multipart/brotli removal, palette migration, allowed_tools deletion, tools_file/removed_messages cleanup, double-Enter steer) or was deliberately superseded — item 7's "remove
todo_*aliases at 0.9.0" went the other way: #4132 keepstodo_*/checklist_*as hidden replay aliases, so do not execute it. The DO-NOT-DELETE module table below remains a standing guardrail. The companionopportunities.mdwas never committed; its link is dangling by design.
Companion document:(not in the repository) — this file was the what to do next; the catalog behind it stayed private.opportunities.md
Branch & Location
- Worktree:
/Users/hunter/Desktop/Harnesses/CW/.cw-worktrees/v0867-pr4047 - Branch:
work/v0.9.0-cutover(7 ahead of origin/main, 0 behind) - PR: #4099 open to main
- Remote:
Hmbown/CodeWhale
Current State (verified)
cargo check --workspace✅ PASSEScargo clippy --workspace --all-features -- -D warnings✅ PASSES- 16 files changed in working tree (unstaged, not committed yet)
⛔ DO NOT DELETE — Verified Active
These six modules were flagged as "dead code" by the original scout audit. They are all actively imported and used. Previous agents deleted them and caused 19+ compile errors. Do not touch them under any circumstances.
| Module | Active consumers |
|---|---|
tui/src/memory.rs |
prompts.rs, engine.rs, context_report.rs, ui.rs |
tui/src/context_budget.rs |
core/engine/context.rs:9, engine/tests.rs |
tui/src/model_registry.rs |
tui/model_picker.rs:737, model_profile.rs:149 |
tui/src/prompt_zones.rs |
core/session.rs:8, core/engine/turn_loop.rs:10 |
tui/src/tools/remember.rs |
tools/registry.rs:890, tools/mod.rs:41 |
config/src/route/ (entire dir) |
catalog.rs:38, models_dev.rs:20, pricing.rs:25 |
What's Actually Done (verified in working tree)
| Item | Status | Evidence |
|---|---|---|
| B1.1 — mimalloc for CLI | ✅ Done | crates/cli/Cargo.toml:38 + crates/cli/src/main.rs:1-2 |
| B1.6 — pdf-extract feature-gated | ✅ Done | Cargo.toml:17 (pdf = ["dep:pdf-extract"]), web_run.rs #[cfg(feature = "pdf")] |
B9.1 — to_vec in app-server |
✅ Done | app-server/src/lib.rs:293,309,325,336,1155 |
| B9.2 — compact JSON tool output | ✅ Done | tools/src/lib.rs, tool_execution.rs, registry.rs — no to_string_pretty in these paths |
| B8.2 — spawn_blocking in tasks.rs | ✅ Done | tasks.rs:769,848,935 |
| file.rs perf tweaks | ✅ Done | tools/file.rs modified |
| Palette migration (partial) | ✅ 3 files | logging.rs, remote_setup/mod.rs, palette_audit.rs — done |
| Double-enter tests | ✅ Written | tui/app/tests.rs — enter_with_double_tap(), last_enter_instant |
What the PREVIOUS Handoff Claimed Was Done — But ISN'T
| Claim | Reality |
|---|---|
| B1.4 — reqwest multipart removed | ❌ Still in Cargo.toml: features = [..., "multipart", ...] |
| B1.5 — reqwest brotli removed | ❌ Still in Cargo.toml: features = [..., "brotli"] |
| allowed_tools() deleted | ❌ Still present at subagent/mod.rs:448 |
| smoothness.md deleted | ❌ Still present (29,613 bytes) |
Remaining Work (in priority order, compile after each)
1. Remove reqwest multipart + brotli features
- File:
crates/tui/Cargo.toml— remove"multipart"and"brotli"from thereqwestfeatures array. Zero uses ofreqwest::multipartexist.gzipalone is sufficient. - Risk: None. Verify
cargo checkafter.
2. Palette brand migration (DEEPSEEK_* → WHALE_*)
- See the 🎨 section in
opportunities.mdfor full details. - ⚠️ main.rs is NOT part of this. Its 98
DEEPSEEK_*refs are environment variable names (DEEPSEEK_API_KEY,DEEPSEEK_BASE_URL, etc.). Renaming them breaks every user's config. Leave them alone. - The actual migration targets ~216
palette::DEEPSEEK_*color references across 40+ files incrates/tui/src/. - Missing prerequisite: No
WHALE_INFO/WHALE_BG/WHALE_PANEL/WHALE_ERRORColorconstants exist (only_RGBtuples). Add them totokens.rsfirst. - Plan: Add Color constants →
sedreplace_RGBvariants first, then bare names → add#[deprecated]to now-unused aliases → compile.
3. Delete allowed_tools() method
- File:
crates/tui/src/tools/subagent/mod.rs:448— delete the method and its match arms (deprecated since v0.6.6). Keep the struct fields at lines 1261 and 1363.
4. Delete smoothness.md
- File:
smoothness.md(29,613 bytes) — unreferenced doc file.
5. Remove tools_file config field
config.rs:1881— removepub tools_file: Option<String>fieldconfig.rs:5513— remove merge lineconfig.example.toml:162— remove commented# tools_fileline
6. Remove removed_messages dead field
compaction.rs:918— remove field with#[allow(dead_code)]+TODO(v0.8.71)comment. Dead in production.
7. Remove todo_* alias scaffolding (v0.9.0 gate)
tools/todo.rs:177-178— removeTODO_ALIAS_FIRST_DEPRECATED_VERSION,TODO_ALIAS_REMOVAL_VERSIONconstants andis_compat_alias()(line 182)tools/registry.rs— removetodo_*registrations (keepchecklist_*)
8. B8.1 — spawn_blocking for blocking cmd.output()
tools/git_history.rs:485— wrapcmd.output()intokio::task::spawn_blockingtools/review.rs:645,672— same
9. B5.2 — clippy await_holding_lock audit
- Run
cargo clippy --workspace --all-features -- -W clippy::await_holding_lock -W clippy::await_holding_refcell_ref - Fix any warnings (guards held across
.await).
10. Double-Enter for Steer (feature implementation)
Tests exist in tui/app/tests.rs but the feature code does not:
- Add
last_enter_instant: Option<Instant>field toAppstruct intui/app.rs - Add
enter_with_double_tap(&mut self) -> Option<SubmitDisposition>method - In
decide_submit_disposition(), change busy-waiting arm to returnQueueinstead ofSteer - Wire up in
tui/ui.rsEnter handler - Update composer hint text in
tui/widgets/mod.rs
Final Steps
- Commit all changes with descriptive message
- Push to
work/v0.9.0-cutover - Verify PR #4099 CI passes (fix any failures)
- Run
cargo test --workspace --lockedto verify tests pass - Build release binary:
cargo build --release -p codewhale-tui
Guidelines
- Work file-by-file, compile after each change
- NEVER delete a file without first grepping for ALL imports of that module
- For dead code removal: prefer adding
#[allow(dead_code)]over deleting files with active imports - Commit in logical chunks, not one giant commit