AMBER (ENGRAM) v1.5.12
Install with AMBER_1.5.12.661_x64-setup.exe (199,920,978 bytes, SHA-256 6f40260fb31de9c21281808157b43f7614f0205405f98f7b5b0693994592e50d). This release folds in v1.5.9 through v1.5.12.
Offline machines: the optional FP32 ModelPack is unchanged since v1.5.8 — core/install/model_manifest.py and resource/embedding-model/ are byte-identical — so download AMBER_1.5.8.552_FP32_ModelPack.zip from the v1.5.8 release and import it with --role model-cache --import-pack <zip>. It is not duplicated here.
AMBER (ENGRAM) v1.5.12 makes the overlay's bubble chat usable with an externally started renderer. Engram now hosts an authenticated loopback Event API that renderers connect to on their own, and it never launches, terminates, or inspects a renderer process.
External overlay Event API v2
- Token-authenticated JSONL on
127.0.0.1. Renderers read~/.engram/overlay-event-api-v2.json, register, and reconnect with bounded backoff after a host restart rotates credentials. - One connection may advertise several logical renderers as a catalog; Engram promotes a replace owner only after the matching
renderer.ready. - Published policy is metadata-only. Prompts, thinking, tool I/O, file paths, and memory contents are never sent.
- Engram stores only a renderer's logical ID and mode — never executables, arguments, working directories, manifests, or asset paths. Legacy
command-based configuration is diagnosed but never executed.
The bubble chat no longer stalls
Two blocking calls sat on the Tk main thread and only fired on the external-renderer path, which is why this never showed with the bundled character.
- Persisting renderer geometry ran a synchronous yaml round trip and
fsync— 49 ms on the measured machine (p95 72 ms), once per reported geometry change. It is now queued and coalesced on a writer thread, while reads replay unflushed updates so a caller still observes its own write. A one-second drag reporting 20 updates went from roughly 980 ms of frozen UI and 20 disk writes to 1.209 ms and a single write. - Publishing an event ran a blocking
sendall. A renderer that paused reading filled the socket buffer and froze the host for a full second before the renderer was dropped. Outbound is now a bounded per-client queue with its own thread; only semantic events are shed under pressure, never position, visibility, or handshake messages. - Renderer input is drained every 10 ms instead of every 50 ms.
Bubble z-order follows what the user actually does
The answer bubble stays in front while the reply is written and after it completes, wherever the user happens to be working. It steps behind the window the user clicks, and returns when the overlay is clicked again. The input bar follows the same rule — under a replace renderer the host never wins the OS foreground, so its previous focus-scoped rule could never fire and the input bar opened underneath other windows.
Also in this release
- Restarting returns to the presentation the user was in, without the renderer playing an exit animation and immediately reappearing. The click is answered in about 176 ms instead of leaving a dead window painted for roughly ten seconds.
- Declarative bundled sprite timelines: first-cell hold substitution, loop and one-shot completion, layered frames, deterministic ranged holds, bucket rotation.
- The speech bubble's tail tip can be dragged apart from the body; the direction persists with existing bubble position state.
Bashis classified asexecuteintool_category.PowerShellmatchedshellwhilebashcontains none of the generic verbs, so it had been falling through toother.- Subagent definitions moved from
config/skills/toconfig/agents/<provider>/, deployed byinstaller/deploy_agent_definitions.ps1. - Console windows no longer flash when guards and policy hooks invoke
gitfrom console-less GUI processes.
Validation
- AMBER release source: 755 tests passed. The remaining failures are outside this change and reproduce identically on the unchanged development baseline — most need the optional
kuzupackage, some assert manual prose, two read the developer's ownoverlay.user.yaml(they pass under an isolated profile), and one is a pre-existing tunnel mock. - Measured against a live host with a real external replace renderer: input-to-reaction round trip p50 10.8 ms / p95 15.4 ms, and 1,049 broadcasts pushed at a peer that had stopped reading left that round trip unchanged with no loss.
- Z-order was confirmed on screen rather than by assertion alone: the answer bubble sits above the active window while answering, is occluded by an application the user clicks, and returns to the front when the character is clicked again.
Design notes, sequence and timing diagrams, and the measurements are in docs/dev/external-overlay-bubble-flow.md.