Releases: johncwaters/glimmervoid
Release list
Glimmervoid v0.26.1
Added
- Change Map is the default Review view: the Review sidebar opens on a map of how the session's changes connect to the code, with Diff one click away. For each repository it shows changed files grouped under their nearest
AGENTS.md, import-graph blast radius and the tests that reach each file, untested files, files that usually change together but are missing from this change, fix-heavy hotspots, and collisions with other live sessions on the same repository. Every row opens its file in Diff. - Change Map for workspace sessions: a workspace session gets one map across its member repositories, refreshed at each turn end, and its Diff shows every member with member-prefixed paths. When one member's
package.jsondepends on another member's package, the map shows the link and whether the dependency is linked locally or comes from the registry, meaning a change only reaches it after a publish. - Change Map narrator: optional cited claims written by a model from the map's facts, off by default (
changeMap.narrator.enabled).changeMap.narrator.enginepicksclaude(default) orcodex, which runscodex execread-only with an output schema; a blank model uses the engine's default. Claims that cite no known fact are dropped. - Import resolution for real repositories: blast radius and test reach now follow tsconfig
pathsandbaseUrlthrough relativeextendschains, NodeNext.jsspecifiers that point at.tssources, and Python imports.
Fixed
- Session spawns after a dependency reinstall: node-pty's spawn-helper execute bit is repaired before every spawn, so an
npm ciunder a live server no longer leaves every new session failing withposix_spawnp failed.until a restart. - Workspace review controls: workspace sessions no longer show Merge, Resync or a branch-sync row, and their alt+m and alt+r shortcuts do nothing, since Glimmervoid never merges or rebases workspace members.
Glimmervoid v0.26.0
Added
- Workspace sessions: a session can span several connected repositories. Its working directory is a folder holding one fresh worktree per chosen repo on a
glimmervoid/workspace/<id>branch, plus a generatedAGENTS.mdmap and aCLAUDE.mdpointer, so each repo's own instructions load only when the agent works there. Glimmervoid only creates and releases the member worktrees: release keeps a member with uncommitted work, branches are never deleted, and the workspace prefix sits outside branch cleanup. - Minimizable review sidebar: a Minimize control collapses the desktop review sidebar to a narrow strip with a Show review button, giving the focused terminal the width back. The choice persists across reloads, and the panel stays mounted so diff caches and draft notes survive.
- Outcome counters: notification delivery, Telegram sends, hook endpoint rejections, WebSocket opens and closes, and event loop lag are now counted and drained into one
[outcomes] summaryjournal line a minute, listing only non-zero counters and staying silent when idle. A hook rejection records only a fixed outcome name, and an off-loopback refusal is counted apart from a bad bearer token.
Fixed
- Notifications: when every dashboard reported focused, suppressed notifications never reached the phone and could be held for hours; a suppressed entry now climbs to the Telegram rung after
phoneEscalationMslike any unacknowledged one. Telegram messages drop the redundant category prefix, and plan-ready copy reads as a sentence. - Session resume: a blank spawn after a restart no longer overwrites the saved resume id with one that never got a transcript, which could orphan the real conversation. Only a report that is a genuine resume target is persisted, and
/clearstill adopts the new id. - node-pty on macOS: boot and
glimmervoid doctornow repair aspawn-helperbinary installed without its execute bit, which turned every session spawn intoposix_spawnp failed.while preflight still reported node-pty healthy. - Phone terminal: opening a session in the Terminal tab no longer paints the grid with most glyphs missing until a reload; a WebGL addon first attached without a layout box is rebuilt on its first visible activation.
- Memory distillation: the prompts now state every rule the claim verifier enforces, including the citation cap and the single-kind rule, which had left distill refused on every run for days. Refused runs back off geometrically instead of rerunning every 15 minutes, and a pass skipped because the store was busy retries once the quiet window clears instead of waiting for a tick that could stay locked in phase with a looping session.
- Memory retention and backfill: eviction deletes records the distiller has already read before unread ones, and the distill cursor resets whenever a non-distilled projection is published. Backfill keeps an offset for every file it reads, flushes at the queue bound instead of dropping records, and never marks a file interrupted by a stop as read.
- Ingest lane: stopping the lane now waits for every source to finish closing, so a settings-driven rebuild no longer subscribes the same roots while the old watchers are still shutting down.
Changed
- Usage scanning: a pass yields to the event loop once per 64 unchanged files instead of after every file, cutting roughly 9,300 yields per idle pass to about 146.
- CI: the Windows test leg is dropped; CI runs on Ubuntu only. No Windows code path or platform claim changes.
Glimmervoid v0.25.0
Added
- Plan review: ExitPlanMode requests are captured as retained revisions and open a Plan face on the focused desktop card or phone Terminal screen, with a Plan ready badge, Board attention row, notification routing and
#plan/<id>deep links. The operator can approve, approve edits, send whole-plan or section feedback, or answer in the terminal; edited markdown returns through Claude Code's own plan write, in-progress drafts are watched read-only, and every revision can be compared with a collapsed line diff. Holds fail open on disconnect, lifecycle changes or timeout, while plan bodies stay behind the authenticated control socket and render through a bounded text-only markdown parser. - Agent extensibility: with
agentApi.enabledon, a supervised session receives an authenticatedGLIMMERVOID_AGENT_URLand can runglimmervoid spawn,glimmervoid attentionandglimmervoid board. Spawned children are capped, ephemeral siblings with their own worktrees and immediate dashboard cards; early or repeated attention notes are held and combined until the session can raise them. File-onlycustomAgentsdeclarations add title-detected CLI agents with configurable command, arguments and busy or idle titles, while Settings lists each declaration and its cached command availability and exposes a danger-confirmed Agent API toggle. - GitHub Issues: an on-demand Issues tab on desktop and phone lists open issues for a configured project and opens a dedicated session with a scrubbed prompt built from the selected issue, without polling or sending issue bodies to the dashboard.
- Review annotations: the diff sidebar accepts notes on committed or uncommitted lines, keeps drafts beside their rows and in a notes bar, and sends the batch to the session as one safe bracketed paste for the operator to submit. Each note identifies the path, section, side and correct old or new line number, and drafts survive a deferred paste but expire when their diff section changes.
- Storage retention: orphaned uploads, obsolete pack variant directories, missing-transcript tail rows and PostHog scratch files are pruned automatically. Recordings gain the directory-wide
capture.retainBytesbudget, defaulting to 64 MiB when another recording retention bound is active, without removing a file still held open. - Environment-provided secrets:
GLIMMERVOID_POSTHOG_API_KEYandGLIMMERVOID_TELEGRAM_BOT_TOKENcan supply the corresponding config secrets; values supplied this way are stripped from dashboard saves and backups. - Flying animals: animation is now a separate persisted, default-off dashboard preference that works with every theme and scales and repositions its sprites across desktop, phone, resize and orientation changes.
- Radar and Trace detail: Radar adds explicit loading states, first and last seen times, issue status, poll interval, live elapsed time, occurrence deltas, titled sparklines and a reachable Open trace action. Trace adds row offsets, turn and tool duration, incremental metrics, kind and error badges, persisted kind filters, expand and collapse controls, and compact subagent identifiers.
Fixed
- Terminal grid: attach now restores a server-maintained terminal screen instead of replaying width-dependent raw history, and the server owns PTY dimensions through ordered claims and size frames so hidden or differently sized viewers cannot corrupt wrapping. Desktop and phone viewers claim only while engaged, retain and retry an unsent claim after reconnect or focus changes, and the phone reclaims its full grid after Android keyboard, background and reopen cycles.
- Updates: a release tag already contained by the checkout is no longer offered as an update or refused later as not-fast-forward; the dashboard instead asks for a restart. Failed, interrupted and discarded staging journals are retired at the next boot, while handoff failures and successful handoffs remain visible when operator action may still be required.
- Memory: configured retention and per-kind caps now prune the SQLite store and FTS rows instead of only the in-memory view, preserve locked records, run after appends as well as boot, and truncate the WAL. Records from deleted worktrees are re-keyed to their repository when possible, delivered memory hashes are recorded per changed output so the echo filter works, busy writes retry, and delta distillation keeps untouched project claims while advancing through backlog.
- Detection, trace and Mill metrics: Claude Code SessionStart now reaches the local command relay so
/clearand/compactreset detection, repeated subagent stops are idempotent, and prompt classification uses the turn boundary rather than the spinner-dominated live state. Trace resume handles a maximum-sized final record and reports a missing subagent transcript once; Mill preserves live accumulators across pack delivery and non-empty outcomes across teardown. - Background lanes: ingest stops retrying deleted worktrees and rolls repeated flush logs into one line per minute, branch cleanup skips only an unusable project instead of backing off every repository, PostHog retries one transient gateway failure, and unrelated settings saves no longer restart secret-bearing PR or PostHog lanes because their config comparisons ignore key order.
- Session resume: a Claude Code session whose stored resume id has no matching transcript now starts fresh instead of exiting failed and discarding its clean worktree; Codex and Grok resume behavior is unchanged.
- Dashboard attention and navigation: the Visions dot now tracks unacknowledged findings, comments, hands, fixes and intent instead of every background message, the PR and Radar settings links describe their real destinations, the Radar Open trace control no longer disappears inside truncated status text, and help no longer advertises shortcuts that do not work from the resting dashboard.
- Installation and launchers: builds mark the declared
glimmervoidexecutable runnable for checkout-based installs. Startup andglimmervoid doctornow detect a missingnode-ptynative binding before the server loads and print the install-shape-specific repair command required by npm 12. - macOS support: shell ingest defaults to zsh history, Visions editor setup finds VS Code-family app bundles outside
PATHand accepts verified absolute editor paths, directory comparisons handle symlink and APFS case aliases through real paths, native binding guidance namesxcode-select, and stop notifications useosascriptwhen appropriate.
Changed
- Glimmervoid rename: the product, package, executable, state directory, environment variables, session branch prefix, hook routes, browser identity, editor extension and generated assets are renamed from Glissa to Glimmervoid without compatibility aliases. Configuration now comes only from
GLIMMERVOID_CONFIGor the Glimmervoid state directory, so an existing installation needs its service repointed and starts with a fresh state directory; oldglissa/session/branches are outside the new cleanup prefix. - Mill measurement: the pack-read rate and related fields are removed because packs are injected as context rather than opened through the Read tool, eliminating an authenticated PostToolUse request on every Read and removing a metric that could never become non-zero.
Glissa v0.24.3
Added
- Session Trace: every terminal records its Claude Code transcript as normalized records under
~/.glissa/traces(prompt, skill expansion, thinking, tool call, tool result, assistant) with a checkpoint sidecar so a restart resumes instead of replaying. A Trace tab on the desktop and the phone shows a terminal's trace as turns headed by their prompt, collapsed to one line and expandable, with Load earlier paging back to a 5000-row ceiling. The surfaces followdebugMode; capture is on by default behind the file-onlytrace.enabledkey. - Server updates from Settings: a machine-updates section shows Installed, Latest and Last checked with a Channel select (release tags or the checked-out branch), and Check for updates, Update and Restart actions. An update is staged in a detached worktree, built there, and handed off at restart by a fast-forward plus renames, so nothing live changes until the build is proven; a dependency-free recovery shim restores a backup after a crash between renames.
- Phone key strip uploads any file, not only images; only a strictly matched trailing extension from the client name reaches disk.
- Lane log seam:
createLaneLogrenders structuredkey=valuefields, suppresses a repeated warning once per key, and builds debug lines lazily. The trace and usage lanes log through it with one prefix each ([trace],[usage]), refusal and failure lines name the session, path and reason, and both lanes emit debug-gated heartbeats underdebugModeso a healthy lane can be told from a dead one. A boundary test fences the lane modules onto the seam. - Visions: scope means the configured projects; each review focuses on the lines edited since the last one; comments and diagnostics carry through edits and a late dispatch result is carried across the edits made meanwhile; every dispatch is sized in the journal; a comment whose anchor was just delivered is not re-remembered; a repeated word is flagged only across a whitespace gap.
Fixed
- Trace: a subagent that kept working after its first stop lost every later record, and a transcript past 8 MiB lost its tail; subagents are now tailed by a checkpointed per-path offset, committed only at complete lines. A lost checkpoint replayed a whole transcript into the trace; recovery now fails closed at the transcript end with a notice. A refused transcript said "outside the root" for a missing file, an unreadable one and a non-regular file alike; it now names the reason and leaves a notice in the trace. Every record body is capped so the page reader never drops one, signature-only empty thinking rows are dropped, a tool result paged in before its call is relabeled once the call arrives, a skill expansion keeps its link across a restart, an unreadable record shows as a notice instead of a silent gap, and a new conversation is traced from its first line even though Claude names the transcript before creating it.
- Usage: a scan pass that lost a file to an io error counted as complete, so the warehouse stored the undercount and budgets evaluated on it; a pass now reports complete, byte-limited or io-failed, only a complete or an incremental io-failed pass writes the warehouse, budgets wait for a complete pass or three consecutive io-failed ones, and the report shows the outcome. A corrupt
usage-lanes.json,usage-warehouse.jsonor budget state file was rewritten from empty; it is now quarantined beside the original as.corrupt-<ms>and an unreadable one is never overwritten. A budget alert stamped its threshold fired before a fire-and-forget Telegram send whose failure was swallowed; the threshold is stamped only after delivery, the send is bounded by a transport timeout, and the failure is logged. Card chips refresh on replacement and prune, the dashboard names a cached price table with its age, a failed price fetch is warned, and the heatmap uses the server's day. - Branch cleanup deletes remote branches with
--no-verify, so a slow pre-push hook in a managed repo no longer stalls the single git queue for a minute after a restart.
Changed
- The phone key strip drops the unused Ctrl+C key.
- Dead exports and single-caller wrappers were removed across the server, session, detection, notification, dashboard and shared trees; no feature, config key, route or wire message changed.
Glissa v0.24.2
Added
- Branch cleanup proves a merge by content: a remote session branch landed by rebase or squash is recognised as merged when a three-way merge of it into the integration tip leaves the tip's tree unchanged, so it no longer lingers on origin until the 14-day stale rule. Custom merge drivers,
merge.default,merge.renormalizeand the built-inuniondriver are disabled for that proof, and any probe failure keeps the branch. - Branch cleanup scope is a prefix allowlist:
branchGc.prefixes(defaultglissa/session/andworktree-agent-) decides which remote branches and local worktrees the lane may touch;branchGc.dryRuntraces every planned deletion aswould-deletewithout touching anything. Both keys are file-only and survive dashboard edits to the other branch cleanup settings. - Merged local worktrees are removed: the lane lists every worktree of a project, keeps anything locked, dirty, unmerged, on a protected branch, or owned by a live session, and removes the rest with their branches, so Claude Code agent worktrees left behind after their commits landed no longer accumulate.
branchGc.worktrees(default on) gates the pass. - Dependabot version updates run weekly for npm and GitHub Actions.
Changed
-
Context mill is one switch:
millEnabled(default on) replacespacksAutoRebuildand the per-project pack lists. Every configured project receives every pack spec on disk at spawn, alphabetically, up to the unchanged four pack per session cap; a spec over the cap is skipped with the existing over-cap warning. The "Deliver to" checkboxes on the Mill tab and the per-project "Context packs" toggles in Settings are gone; off means no pack builds and no delivery to any session, project or lane. A staleprojects[].packskey inconfig.jsonis ignored, and apacksAutoRebuild: falseleft inconfig.jsoncarries over tomillEnabled: false. -
The whole project is TypeScript: every module is strict ESM
.ts, Vite bundles the server, CLI, relays, and editor extension alongside the dashboard, and the published package shipsdist/only. The Node floor rises to 22.18. After upgrading, re-runglissa agent setup grok: the managed hook entry in~/.grok/hooks.jsonpoints at the old relay path. -
Provisioned servers that start Glissa with
node server.jsmust switch tonode dist/server/index.js(a source checkout usesnode server/main.ts); the systemd unit lives in the dotfiles repo.
Glissa v0.24.1
Fixed
- The Mill tab now shows a pending delivery row for each consuming project whose card has not spawned a session yet, gated through the same deliverability predicate the spawn applies, so dormant cards no longer vanish behind "no live sessions" and the tab never promises a delivery the spawn would refuse.
- The phone layout's settings screen scrolls again; its panel mount was missing from the phone flex rules, leaving the settings content without a definite height to scroll inside.
Glissa v0.24.0
Added
- Mill pack measurement: an always-on funnel records, per pack and per session, delivery, whether the agent actually opened the pack (via a PostToolUse Read hook), and the session outcome (interruptions, disposition, tokens), folded into durable per-session records and rendered as scorecards on the Mill tab. Codex and Grok sessions are recorded but never counted in open-rate denominators. The lane is the repo's first TypeScript module, run by Node native type stripping as the migration beachhead, which raises the Node floor to 22.18.0.
- Pack ablation harness: a hand-run driver pairs ON/OFF sessions per task through an isolated in-process backend, grades each arm with an objective check command, joins the funnel record, and reports an exact McNemar verdict over discordant pairs; infrastructure failures are excluded as invalid pairs rather than scored.
- Settings view: the 11-tab settings dialog is replaced by a primary Settings view with search, deep links, an unattended-actions grouping, and a phone section sheet.
- Hooks tab: operator Claude Code hooks are visible in the dashboard alongside the built-in ones Glissa injects.
- Visions editor integration: an extension install CLI ships a packed vsix, editors publish open/save/close activity into ingest, and the lane focuses on the edit with intent threads and buffer-anchored comments surfaced as editor diagnostics.
- Wire contracts: Zod schemas in
shared/contracts/now define the wire and persisted shapes, parsed fail-closed at boundaries and pinned by a typecheck gate. - Worktree base sync: session worktrees sync their base branch with origin on initial create and fresh restart, with integration-branch resolution centralized.
- The Usage tab is banded by altitude, the phone board groups sessions by project, and the tab favicon reflects waiting and complete states.
Changed
- Express upgraded from 4.22 to 5.2 with trust-boundary guards reverified.
- The typecheck gate now covers
server/,session/,detection/,notifications/,shared/, andpublic/at zero errors under the strict family, with no ignore or unknown-laundering escapes. - The Session god class and the backend module are decomposed; lanes are reached through one accessor and browser virtual modules through one manifest.
- Packs publish under
versions/<hash>withcurrentas a pointer file, and memory distillation walks a durable sequence cursor with per-project projection byte caps.
Fixed
- Memory ingest no longer records tool-call transcripts, skips stale records to cut distill backlog, and the distill prompt travels by file instead of argv.
- Session completion is held while a subagent stop is orphaned, and pack builds skip self-referential and empty packs.
Glissa v0.23.1
Added
- Mill and Visions settings in the dashboard: a new Mill settings tab exposes the pack distiller, long-term memory, memory distillation, and ingest gates, and the Visions tab gains project scoping and an auto-fix toggle, so these lanes are no longer configurable only by hand-editing
config.json.
Changed
- Memory settings cross the control WebSocket as an allow-list of booleans and clamped integers only; paths, record content, and unknown keys are refused by name on write and projected out on echo, and a dashboard save merges onto the stored block so file-only knobs survive.
- A Visions project scope entry that the picker cannot render is preserved across an unrelated settings save instead of collapsing the scope to unrestricted.
Glissa v0.23.0
Added
- First-class Codex CLI sessions: Glissa now discovers installed agent adapters, offers an agent picker when more than one is available, and reports resolved binaries through
glissa doctor. Codex sessions gain structural hook and title status detection, safe workspace permissions, resume support, context-pack delivery, per-vendor usage attribution, and an adapter badge. - Grok Build sessions: an opt-in
glissa agent setup grokcommand installs a guarded home hook file for supervised Grok sessions, with status detection, resume, background-task completion gating, context-pack delivery, and Grok-specific usage attribution. - Opt-in long-term memory: Glissa can retain HMAC-signed knowledge, intent, feedback, and transcript records in a machine-wide SQLite store with FTS5 retrieval, automatic budgeted backfill across Claude, Codex, and Grok transcripts, retention controls, and secure forgetting that scrubs the row, search index, and WAL. This raises the Node floor to 22.16.0.
- Distilled memory delivery: a bounded headless lane turns remembered records into verified global and per-project claims, diverts proposed changes to locked facts for review, and delivers relevant memory through fenced Visions prompts and data-only context packs while suppressing quoted-memory feedback loops.
- Mill dashboard: a new desktop tab and phone screen report context-pack budgets, builds, versions, drift, outputs, watchers, consumers, and live delivery state without adding a polling timer.
- Per-project context-pack controls and variants: Mill can assign packs to a checkout through delta-safe checkboxes, build and watch only packs with consumers, keep dormant sessions dormant during assignment, group duplicate session records by resolved project path, and derive independent project-specific variants with base-pack fallback.
- Automatic remote session-branch cleanup: a default-on lane periodically removes remote
glissa/session/*branches that are proven merged or orphaned beyond the staleness threshold, while protecting configured sessions and integration branches. SetbranchGc.enabledtofalseto opt out. - Managed rtk support for Codex: when rtk is enabled but missing, Glissa downloads a pinned release into
~/.glissa/bin, verifies its pinned SHA-256 digest, reports installation status in Settings andglissa doctor, and enables Codex command rewriting through a dedicated guarded hook relay. - Native Linux and Pop!_OS support: Glissa now handles POSIX process groups, worktree links, command resolution, secure config modes, ephemeral files, and session teardown natively, with Linux installation coverage added to CI and platform-specific notification fallback.
- Durable Telegram escalation: Telegram notifications are queued before delivery and replayed after a crash until confirmed, while an unacknowledged terminal notification can escalate to Telegram even when a dashboard connection remains open.
Changed
- Navigator is now Visions: the feature, configuration key, WebSocket route, LSP identity, files, and VS Code companion were renamed consistently to Visions.
- Project-aware Visions intent and diagnostics: intent is persisted per stable project id, selected by the deepest matching project root, and shared correctly when multiple sessions use the same checkout. Model diagnostics are always low-severity hints and exclude syntax, type, formatting, and lint findings that belong to the real toolchain.
- Denser dashboard navigation and reporting: desktop view tabs now use a centered segmented-pill control, the Mill phone screen uses bounded cards and compact grids, Usage and Mill copy is shorter while preserving provenance labels, and the Glissa server terminal tab identifies itself by port.
- Leaner bundled Glissa context pack: the pack now delivers only its distilled brief and rules instead of repeating the raw source documents, reducing its budget from 12,000 to 6,000 tokens.
- Quieter automated PR reviews: review comments identify themselves as automated, omit praise and empty re-review updates, avoid unconditional agent guidance, and keep finding summaries focused on actionable changes.
Fixed
- Dashboard reconnects after restarts and device wake: control and terminal sockets now recover from server shutdowns, phone sleep, black-holed handshakes, half-open connections, stale page tokens, and cached sequence reuse; protocol heartbeats reap dead sockets, and a changed server build reloads the page into a fresh snapshot.
- Local dashboard trust boundary hardened: browser connections now require an exact listener-port Origin and per-process page token, Host values are allow-listed, decoded pairing paths close traversal bypasses, and managed hook directories and files must have safe ownership, type, and permissions. Hook injection also falls back to title detection when project Claude settings could contribute untrusted hooks.
- Visions dispatches stay current and bounded: blank documents spend no budget, edits arriving during a dispatch invalidate stale results, ERROR verdicts cannot carry findings or intent, oversized relay frames force a clean resync, shared documents clear only after their last editor closes, and prompts are read from capped files instead of riding process arguments.
- Context-pack publishing survives races and crashes: per-pack locks serialize concurrent builders, stale locks are reclaimed atomically, interrupted rotation falls back to the previous good build, duplicate output paths fail before publishing, and lock-release failures no longer hide the original build error. Packless sessions also scrub inherited pack-discovery flags.
- Worktree review and cleanup are safer: a session branch tracking its own remote copy no longer uses that copy as the review base, so the sidebar shows only the session's changes after a rebase. Discard now preserves committed-but-unmerged work, process-group checks catch background holders, and new rerere resolutions immediately retrigger cooled-down rebases.
- Background lanes shut down cleanly: restart and shutdown now await every lane drain and killed PTY tree under named bounds before worktrees are discarded. PR Review and Radar state writes are serialized asynchronously, and PR polling uses jittered outage backoff.
- Session switching keeps visual continuity: desktop switches no longer publish a temporary 80x24 terminal size or produce a large layout jump, and elapsed time in the current state survives a dashboard reload instead of resetting.
- External config edits are no longer swallowed: content-signature suppression now distinguishes Glissa's own writes from later saves, reloads, and operator reversions, closing both timing-window cases that could silently leave disk and live state out of sync.
- Memory ingestion and distillation boundaries hardened: transcript timestamps are clamped, backfill and live offsets cannot race, oversized lines stay intact through secret scrubbing, projected paths cannot escape their roots, and ephemeral memory lanes are confined to throwaway working directories with capped result files.
Removed
- Manual Visions intent correction: the editable and lockable intent control is gone; intent is now maintained by the model, with incorrect intent treated as an upstream Visions defect instead of operator-managed state.
Glissa v0.22.0
Added
- First-class phone layout: the dashboard now has dedicated Board, Terminal, Review, Radar, PRs, and Usage screens on phones, with bottom navigation, live element re-parenting, attention-first triage, and soft-keyboard handling that routes phone text input around xterm's fragile IME path.
- Phone image upload: the phone key strip can upload an image into the active session, saving the file under Glissa's upload area and bracket-pasting the path into the PTY for the operator to send.
- Radar error monitoring: an opt-in lane that polls PostHog error tracking, classifies every issue against the last poll (spiking, regressed, new, worsened, quiet), pings Telegram for the ones that matter, and dispatches headless agents that diagnose them into a report and an investigations inbox on the dashboard.
- Radar auto-fix: with
posthog.autoFixon, a spiking, regressed, or new issue in a project that maps to a real git checkout dispatches a reproduce-then-fix agent instead of the diagnose-only investigation. The agent works in an isolated throwaway worktree and may only commit locally; Glissa pushes the branch and opens the pull request itself, refuses a diff that touches.github/workflows/, and never merges. A finished fix pings Telegram with the pull request link and whether the bug was reproduced first; a fix that needs a decision or failed outright pings too, and a non-event stays silent. - Navigator model diagnostics (tier 2): dispatch results may carry model-proposed diagnostics, validated and capped by the same rules as comments and published as a union with the deterministic rule sweep. They are cleared on any edit or close, and an ERROR verdict never blanks a standing set.
Changed
- Distribution moved to GitHub installs: Glissa is no longer published to the npm registry; standalone installs now use
npm install -g github:johncwaters/glissa, and release/update docs now point at GitHub tags and themainbranch package metadata. - The update check keys on releases, not commits: the update banner now fires only when a newer
vX.Y.ZGitHub release exists (resolved fromgit ls-remote --tags, with the GitHub releases API as fallback) instead of on every commit that reachesmain. The npm-global update command pins the release tag and the banner links the release page instead of a commit compare.
Fixed
- WebSocket upgrades are routed by pathname: control and data upgrades are classified before handoff, unknown local upgrades are left for Vite, remote unknown upgrades are closed, and both control and terminal clients now use jittered reconnect backoff instead of reconnecting in lockstep.
- Server lifecycle and install diagnostics are quieter and more reliable: service-managed restarts now exit non-zero under systemd so the supervisor restarts Glissa, pairing writes dedupe stored devices, and PATH diagnostics dedupe duplicate Claude command matches.
- Shell-history tail survives same-path rewrites: a history file rewritten in place (PSReadLine trimming to its cap) or deleted and recreated reusing its inode no longer replays from a stale offset, which could publish mid-command fragments into the ring. A 512-byte head sample now proves the file is still the one the tail was reading, and a changed head re-baselines instead of publishing.
- Windows short-path watcher abort, again: the agent-log and shell-history ingest watchers bypassed the 0.21.0
canonicalizePathseam, so watching an 8.3 short path (CI temp dirs) aborted the whole process from native code. Both are wrapped now, and a repo-wide guardrail test fails any futurefs.watchcall whose target is not canonicalized. - GitHub release creation from non-Windows hosts:
scripts/release.jsprobed for theghCLI with the Windows-onlywhere, silently skipping the GitHub release when run from Linux.
Removed
- Navigator LSP sync was simplified: the relay now advertises full-text document sync, so incremental range updates and the framer's malformed-header resync are gone.