* Keep native watcher and supervision contracts on Node
* Route real permission and new ledger contracts through Node
* Synchronize handshake cleanup with forced termination
* Give native chat names one renderer source and drop Vault's name repair copies
The host's saved conversation name now rides the structured session status
feed, which already exists per host, is keyed by the durable session id, and
keeps a closed chat's summary. Tab strip, sidebar rows and AI Vault (list and
search) read it through one hook and one display order (tab alias, saved name,
host label). Vault no longer copies names into its cached results, so the
projection, recovery and pending-title modules and their tab-snapshot lanes are
removed. Indexed search hits now carry the native owner and saved name from the
host that indexed them.
* Type the sidebar name test fixture without an assertion
* Keep Vault search working when the chat host will not install
Naming and owning search hits is bookkeeping: if the native chat host fails to
install, return the plain hits instead of failing the search. The runtime RPC
only installs the host for clients that will receive the owners.
* Publish chat names to the feed independently of the tab retitle
A failed feed publication no longer skips retitling the open tab. The publish
now lives in the naming deps, where a test covers it.
* Note why the status feed must keep closed chats' summaries
* Bound names and owner ids that come from a paired host
Drop a published chat name the record store would refuse, and cap a search
hit's owner workspace id at the same length the list row and record use.
* Let native chat search hits from a paired host open their chat
A paired host's search hits carry no resume command, so the row disabled
every open action even for a native chat it can open through its owner, as
its list row does.
* Ignore workspace ids that name object members in tab lookups
A paired host's row or search hit could carry a workspace id such as
"constructor", which read an Object.prototype member as a tab list and broke
the render. The shared tab index now reads only own workspace entries.
* Schedule unit tests across runtimes by measured duration
* Keep new SQLite fixture suites on Node after updating main
* Inject scheduling timings instead of mocking the module
* Keep agent-session database lifecycle contracts on Node
* feat: generate chat names through configured text agents
* Project structured chat names across stored tabs and session rows
* Name native chats from their first live message
* Restore the journal test provider handle import
* Fix first-message naming and live Vault title updates
* Preserve Unicode characters in bounded chat naming prompts
* Read chat naming settings only when a turn needs them
* fix(chat): store only generated conversation names
* fix(chat): keep ordinary labels across unnamed chat surfaces
* fix(chat): preserve naming after fast first turns
* Preserve native chat names across command-first sends and Vault lifecycle
* Route native chat SQLite contracts through the existing Node test pool
* feat(settings): add chat naming controls to Chat page
* Preserve chat naming drafts and configure Custom commands through host settings
* Scope synthetic command output to its journal thread in naming test
* Keep naming test fixtures within their typed project boundaries
* Resolve the real Vault hook directly in its integration test
* Publish chat naming save refs after render commits
* fix: keep Japanese chat naming copy stable during repair
* Update test contracts for the naming integration
* Keep journal fixture reads on the host clock
* Give Chat names a separate settings section
* Run Vitest on Bun while preserving Node runtime contracts
* Preserve runtime timing provenance and keep the Bun pin in config
* Scope builtin compatibility mocks to test-only lint exceptions
* Give capture retention fixtures distinct filesystem timestamps
* Await the copy button success state in the React fixture
* Bound Node test worker shutdown and tighten migration fixtures