June 14, 2026

Vue frontend cutover, delegate provider, memory v2

Major frontend milestone: the legacy static apps and auth-gate are deleted after a full Vue 3 cutover

Major frontend milestone: the legacy static apps and auth-gate are deleted after a full Vue 3 cutover. The interface app (login, onboarding, chat) is built as multi-page Vue entries, served from a multi-stage Docker image with a node:22 + pnpm 11.6.0 builder stage. The Brain SPA at /brain-next/ is delivered with all 11 nav panels plus 27 sub-views (Scheduler, Lists, Documents, Capabilities/Policies, Skills, MCP, backup/restore, Providers, Vision, and the seven Cognition sub-views) — each a faithful port of the legacy JS with verbatim DOM, classes, and copy. P2a ships the spine (router, Pinia shell store, shared composables, 13 UI primitives, brain.scss port); later phases add Providers+Vision panels, rich-media card components, conversation SFCs (bubbles, segments, ACT cycle, error), InputDock compose/send/stop, voice availability, theme toggle, and real-backend Playwright feature tests (no mocks).

Backend gains a Delegate provider — the subagent (web_search/web_browse) runs on a dedicated provider independent of chat, defaulting to the main provider. A new ProviderType.DELEGATE is resolved with vision>delegate>chat precedence, Vision/Delegate selectors live in the Brain Providers tab, and providers pinned to any role can no longer be deleted (backend raises ValueError → 409; Brain disables the button with a tooltip naming the held role). Stale P0 HomeView Playwright specs are rewritten as real-backend specs covering smoke, websocket, theme persistence, and full WS turn round-trips.

The episodic-memory redesign ships its capstone: a self-heal convergence release-gate feature test seeds a pre-redesign DB and proves boot backfill, decay recompute, retrieval, fact-extraction backlog drain, HDBSCAN/UMAP super-episode roll-up, and legacy moment-row wipe all compose end-to-end with no operator migration. Moments v2 moves user-curated bookmarks off the data_graph kind=‘moment’ rows into a dedicated moments store with FTS5/vec0 indexes, synchronous embedding on pin, and an explicit-recall lane; the 6h auto-capture worker is deleted. Hierarchy roll-up replaces the never-firing 0.90-cosine gate with a count trigger (≥50 leaf apexes → L2-normalise → UMAP(10d, cosine, seed=42) → HDBSCAN(euclidean, min_cluster_size=10)) and fixes a latent bug where episodes.level was never written — now parents and children carry level/last_relevant_at/tombstoned_at/consolidated_into so per-tier decay ages each level at its own tau.

ToolResult conformance moves from a runtime sweep to a build-time mypy gate: abilities gain a [tool.mypy] config and test_ability_return_types_are_statically_honoured runs mypy over the abilities package, catching any run() that could return non-ToolResult on every branch (not just the empty-args edge the old sweep exercised). 34 per-ability ToolResult test files collapse into one parametrized conformance sweep (−3,836 LOC). Separately, the dispatch seam gets a KeyHealer/KeyNormalizer OOP refactor (TKT-973) and a key-healing pass (TKT-964) that lower-cases + strips model-mangled argument keys and resolves per-tool variants (read url→source, web_download url→source) before the ACTION_REQUIRED pre-gate — healing only ever makes policy more specific, never more permissive.

The subconscious worker grows an idle-gate compaction step (TKT-974): when the gate opens, a fresh user-channel MessageProcessor runs only its compactors (no _setup, no ACT, no LLM turn) to fold accumulated chat history into the durable watermark — moves compaction out of the mid-turn over-cap recovery path. Snapshot cleanup drops the dead session_secret (Flask never signed sessions — auth uses a DB-backed opaque token), and restore now skips unknown artifact kinds with a warning instead of aborting on a single missing kind (regression test reproduces the live KeyError). Brain Import/Export gets a theme-reactive inline loader that hides the password field and button while the snapshot assembles. Various cleanup: drop ActDispatcherService artifacts, reword the stale OVER_CAP comment, suppress SonarCloud smells on the snapshot surface, exclude vendored bundles from eslint, and rewrite the architecture/web-interface docs for the Vue 3 frontend.

  • Vue 3 cutover: legacy static apps and auth-gate deleted; interface + Brain SPA served from multi-stage Docker image with node:22 + pnpm 11.6.0 builder, all 11 Brain panels + 27 sub-views ported faithfully, real-backend Playwright specs replace P0 mocks

  • Delegate provider (TKT-960) + deletion guard: ProviderType.DELEGATE resolves with vision>delegate>chat precedence, Vision/Delegate selectors in Brain Providers tab, pinned providers return 409 on delete

  • Memory redesign capstone: self-heal convergence release-gate test proves boot backfill, decay, retrieval, fact-extraction, HDBSCAN/UMAP roll-up, and legacy moment-wipe all compose end-to-end; moments v2 moves bookmarks to a dedicated store and drops the auto-capture worker; count-trigger UMAP→HDBSCAN hierarchy roll-up fixes the latent episodes.level=0 decay bug

  • ToolResult contract becomes a build-time mypy gate (TKT-975); 34 per-ability tests collapse into one parametrized sweep (−3,836 LOC); KeyHealer/KeyNormalizer OOP refactor + key-healing dispatch seam resolves model-mangled argument keys (read url→source) before the pre-gate

  • Subconscious idle-gate compaction (TKT-974) runs user-channel MessageProcessor.compact() as the first tick job (no LLM turn); snapshot session_secret dropped; restore skips unknown artifact kinds with a warning; Brain Import/Export gets a theme-reactive inline loader