/title was merged into /rename in 24c7dee46 as a discoverable alias sharing
the session name, which made long descriptive session names dominate the
terminal tab and left no way to give parallel windows a short identity.
Restore the independent design from 8b6bcc5e0: /title sets a per-session
tab/window title (persisted on SavedSession.window_title), /title off
clears it, and the root 'title' config key (editable via /config title
... --save) supplies the default. The session *name* stays owned by
/rename. The mid-first-turn recovery added by #5444 is reused so /title
applies immediately on a live first turn too.
Record the public GitHub Release in the generated and documented web facts so a cold deploy cannot regress the install surface to v0.9.8.\n\nChecks: web prebuild, facts/docs/locale checks, 267 Vitest tests, ESLint.\n\nNo-Issue: post-release public-surface bookkeeping
- Move all 10 docs/*.id.md files into docs/id/ (dropping the .id
suffix), leaving English redirect stubs at the old paths for one
release cycle
- Update README.id.md links to point at docs/id/
- Note docs/id/ alongside docs/zh_hans/ in LOCALIZATION.md's scope note
Part of #5482
Signed-off-by: Shizuku <2163018547@qq.com>
- Move LSP_PHP_CUSTOM.zh-CN.md and WINDOWS_BEGINNER.zh-CN.md into
docs/zh_hans/ (dropping the .zh-CN suffix), leaving redirect stubs at
the old paths for one release cycle
- Add docs/zh_hans/README.md as the canonical Chinese reading index,
ordered by experience level (beginner / getting-started / power user /
developer)
- Add a language-switcher banner to docs/LSP_PHP_CUSTOM.md and
back-link/last-synced stamps to both migrated Chinese docs
- Note in LOCALIZATION.md that docs translations are not a locale
surface; their status lives in docs/zh_hans/README.md and #5482
Part of #5482
Signed-off-by: Shizuku <2163018547@qq.com>
Delegate capability mutations through authoritative App operations, bridge portable RegisterCommand metadata into the TUI registry, and enforce monotonic migration-frontier transitions against the baseline revision.
Use Node's bounded recursive-removal retries so delayed Windows handle release after concurrent wrapper downloads does not fail an otherwise successful smoke. Persistent cleanup errors still reject after the finite retry window.
No-Issue: owner-directed v0.9.9 Windows release-smoke hardening
Clear conversation-local prompt pin and drift-baseline state whenever SyncSession installs a new or restored prefix. This makes the next turn send a full system prompt instead of treating it as workspace drift from the previous conversation, while host-owned overrides remain byte-stable.
Fixes#5505
lib/deploy-preflight.test.ts spawns check-cloudflare-deploy-env.mjs by
URL.pathname, which stays percent-encoded. In a checkout under a path
with non-ASCII characters the spawned filename does not exist, node
exits on module-not-found, and the 7 cases in the file that spawn the
script fail on the exit code — reading as a missing-credentials failure
when nothing about the environment is wrong. The other 5 read
package.json and the workflow file directly and are unaffected.
fileURLToPath decodes it, which is what the scripts under web/scripts/
already do.
Keep the MCP-name sentinel in parsed config without launching a process that intentionally exits before initialization. Drain and assert the mid-session child so future early exits identify their actual cause.
No-Issue: owner-directed v0.9.9 CI isolation repair
Bind the CNB tag build to the checked-out commit before compiling and fail if CNB's advertised commit disagrees. Keep the release notes on the same verified identity and lock the ordering in the workflow contract test.
No-Issue: owner-directed v0.9.9 CNB release identity gate
Resolve RUSTSEC-2026-0258 by moving the locked HTTP/2 implementation to its patched release. Preserve the existing dependency graph and change only h2's version and checksum.
Verified with cargo audit, the locked all-target workspace check, strict all-feature clippy, and the app-server HTTP test suite.
No-Issue: newly disclosed release-blocking RustSec advisory
Hold an actionable Space through the raw-paste ambiguity window, dispatch it as a transcript action only when the detector flushes one typed character, and keep leading Space intact when another rapid byte proves paste payload.
No-Issue: owner-directed v0.9.9 Ghostty reasoning QA follow-up
Render the Whale Brothers / Codewhale lockup as a pure React component in DSH’s additive shell.overlay slot. Preserve the existing responsive styling and ARIA contract without touching document.body or installing window listeners.
Verified with formatting, 38 focused DSH tests, strict all-target clippy, and live Chrome wide/narrow browser QA against DSH 0.1.0-rc.6.
No-Issue: owner-directed v0.9.9 DSH integration hardening
Signed-off-by: Hunter Bown <hunter@hunterbown.com>
Move native Ghostty off the legacy 30 FPS compatibility lane and onto a synchronized 60 FPS cap. Cross-fade caustic color changes without changing their authored 12-column topology, while preserving the safer 30 FPS path inside tmux and SSH.
Verified with the real release binary in Ghostty, focused cadence and truecolor tests, formatting, and strict TUI clippy.
No-Issue: owner-reported real Ghostty v0.9.9 QA regression
Both page bodies branched on isZh for every string, so the 16 partial
locales had nowhere to put a translation and the copy sat outside the
check:locales and dictionaries.test.ts parity gates.
The copy moves verbatim into web/lib/i18n/dictionaries/<code>/, en plus
zh, and both pages read one dictionary. Every other locale resolves to
the English reference exactly as the ternaries did.
The hooks overview sentence typesets [[hooks.hooks]], /hooks and
[hooks].enabled as inline code. Those are config syntax rather than
copy, so they stay in the page and the sentence carries a {token} for
each one, which also puts it under the existing token-parity check.
splitTokens splits a template on every token it carries — splitToken
handles one, and this sentence has three.
Route an actionable reasoning Space before the raw paste-burst hold while preserving spaces inside an already-active paste.
Render the newest reasoning receipt at its compact baseline, then spend only rows genuinely unused by the full transcript viewport before truncating. Historical reasoning and explicit summaries keep their compact limits.
No-Issue: owner-reported real Ghostty v0.9.9 QA regression
Mount a reversible Whale Brothers / Codewhale identity lockup through the generated DSH bundle client and strengthen the ocean scene so the integration reads clearly at a glance.
Keep the surface pointer-inert, responsive below 760 px, additive to DSH-owned branding, and covered by deterministic fragment identity, focused tests, and release documentation.
No-Issue: owner-directed v0.9.9 DSH identity refinement
Signed-off-by: Hunter Bown <hunter@hunterbown.com>
Keep partial-locale routes available while canonicalizing English fallbacks to their source. Generate sitemap and hreflang entries from page-body translation coverage and omit synthetic last-modified timestamps.
Verified with the complete web gate: generated facts, facts/docs/locale checks, 267 tests, lint, and the production build.
Signed-off-by: Hunter Bown <hunter@hunterbown.com>
Serialize telemetry contract processes under nextest so their cross-process lock fixtures cannot race each other, and retry the fixture's short-lived arming lock transition.
Use the runtime-thread suite's existing deadlock watchdog for engine-stream settlement and eviction on loaded Windows runners.
Verified: cargo fmt --all -- --check; all 15 telemetry contract tests; closed_engine_event_stream_fails_turn_items_and_evicts_engine.
Keep the current-release contributor ledger, website credit arrays, and public surface facts in exact parity with the v0.9.9 changelog. Record Gabriel-Degret's first contribution and the full h3c-hexin skills fold-in.\n\nVerified with all 266 web tests, facts/docs parity, ESLint, TypeScript, and the 512-page production build.
Signed-off-by: Hunter Bown <hunter@hunterbown.com>
Document the late fold-ins for narrow TUI metrics, rustdoc, configured skill stability, auto-router timeout, bounded CI jobs, web localization, rusqlite, docs cleanup, and OrcaRouter billing.\n\nCredit h3c-hexin and first-time contributor Gabriel-Degret, then keep the root and TUI changelogs synchronized.\n\nVerified by the version check, crate publication dry-run, optimized release build, npm wrapper smoke, and full workspace test suite.
Signed-off-by: Hunter Bown <hunter@hunterbown.com>
The delete-confirmation test assumed an empty personal Fleet directory and failed on maintainer machines with real Fleets. Give it a temporary CODEWHALE_HOME so both the list and deletion assertions are hermetic.\n\nVerified with the exact failing test and the complete fleet_list test module.
Signed-off-by: Hunter Bown <hunter@hunterbown.com>
Avoid prefix collisions in model-facing warning sanitization and match Path::display output for legal non-UTF-8 Unix roots.\n\nVerified with 218 focused skills tests and the 55-metric runtime-contract gate.\n\nNo-Issue: addresses review feedback on #5492.
Normalize model-facing warning separators, preserve discoverable paths for ordinary workspace roots, and keep custom configured roots private. Trim redundant prompt prose so the stricter behavior remains below the existing contract ceiling.\n\nVerified with 216 focused skills tests and the 55-metric runtime-contract gate.\n\nNo-Issue: follow-up corrections for #5492.
None of the ten ci.yml jobs set timeout-minutes, so GitHub's 360-minute
default applied. A runner that gets assigned but never executes (logs 404
forever, job stuck in_progress) can sit on a required gate for up to six
hours: tonight the #5492 Lint job did exactly that for 73+ minutes with
zero log output until a human cancelled it and reran.
Caps are generous against observed cold-run maxima (Lint ~15m, Test
macOS ~60m): changes/versions/integrations/actionlint 10-15m, lint and
smokes 30m, docs 60m, the test matrix 90m. Legitimate slow builds keep
their headroom; only a runner that is dead or never produces logs now
fails the job quickly and visibly, so the gate says fail instead of
hanging.
No-Issue: hardening discovered while merging the 0.9.9 fold-in queue
(#5492 Lint hung runner).
The configured-skills stability change swaps a 33-char fixture skills root
for the 19-char <configured-skills> token in the representative skill-stage
warning, so every stage from skill onward re-hashes (identities are digests
of the normalized prompt text).
Identities re-measured via scripts/measure-runtime-contract.py on the
hermetic representative fixture (tempdir workspace + pinned HOME/SHELL;
path/platform normalization makes the normalized text host-independent).
Byte ceilings are unchanged: the change shrinks the prompt and one-way
ceilings pass decreases automatically. This is the maintainer re-base the
budget comment calls for when a prompt change is deliberate.
No-Issue: budget identity re-base for #5473 / #5492.
The catalog is prompt text the model reads, not a shell path: on Windows
Path::display() emits backslashes, so workspace-relative entries like
.claude/skills/workspace-skill/SKILL.md rendered with backslashes and the
new stability test failed on windows-latest. Render every privacy-safe
skill path through one normalizer that maps the platform separator to '/'.
Also collapse the nested if in prompt_skill_path so clippy -D warnings
stays green. Verified: cargo test -p codewhale-tui --lib skills::tests
96 passed locally.
The aggregator arm listed Openrouter | NvidiaNim | OpencodeZen only, so the
official OrcaRouter endpoint (https://api.orcarouter.ai/v1, provider kind and
defaults landed in #5321) fell through to the first-party PAYG surface.
OrcaRouter is a zero-markup router/aggregator (Continuum AI Corp; models.dev
publishes an orcarouter provider with 81 rows, api.orcarouter.ai/v1/models
verified live), so its default URL joins the aggregator arm. Pinned by a
billing-surface table test next to OpenRouter's. Truth change for the billing
surface label; clamp and price values untouched.
Verified: cargo test -p codewhale-tui --lib pricing -> 80 passed.
No-Issue: follow-up to the OrcaRouter wiring from #5321; the mislabel was
found during the 0.9.9 provider-completeness audit.
Add [auto.router] timeout_secs (default 4, 0 = default, clamped to 300). The classifier call previously used a hardcoded 4s cap, too tight for local OpenAI-compatible routers (llama.cpp) where a queue delay silently downgrades Auto to the local heuristic. Plumbing: AutoRouterConfig field + Config accessor, carried on ModelInventory, used by both timeout paths in auto_route_inventory_recommendation. Covered by inventory_router_timeout_secs_respects_config_with_clamp.