- CI/Release workflows:
Swatinem/rust-cachewas silently missing on every run because noshared-keywas set, causing each workflow/job combination to use a separate cache namespace. Addedshared-key: build-<target>to all cross-target build jobs (shared betweenci.ymlandrelease-crates.yml) andshared-key: test-ubuntu-latestto all Linux test jobs (shared betweenci.yml,pr-ci.yml, andrelease-crates.yml publish-crate). Also parallelisedpublish-crate(no longer waits forbuild-binaries), removedbrew updatefrom macOS protoc install, and dropped the redundantcargo publish --dry-runpass.
unlost ingest: Panic on non-ASCII characters (e.g. box-drawing chars├,└,─) caused by byte-indexing into a multi-byte UTF-8 string instorage.rs. Fixed to use char-boundary-safe truncation.unlost reindex: Crash on capsules withnullnext_stepsorsymbolsfields. Added#[serde(default)]to those fields inJsonCapsule. Also hardenedconn_idandexchange_seqagainst missing values in old records.
- Release: Re-release of 0.20.0 with correct CI-built binaries (0.20.0 tag was corrupted by a manual release attempt).
--output json/--jsonflag: All retrieval commands (query,trace,recall,brief,explore,challenge,reflect,thread) now accept--output json(or the--jsonshortcut). Combined with--no-llm, this produces a stable JSON array of capsule objects — no LLM required, no text parsing needed. Schema:id,ts_ms,time_utc,source,category,intent,decision,rationale,next_steps,symbols,failure_mode,agent_session_id,source_pointer,distance.unlost ingest <file.md>: New command that chunks a markdown document into capsules by##/###heading. Parses YAML frontmatter (target,target_path,symbols,related,category), extracts[[wiki-links]], code-fence language tags, and inline backtick identifiers as symbols. Tags capsulescategory: cartographyby default (overridable with--category). No LLM required — uses only the embedding model. Supports multiple files in one invocation and--globalfor the global workspace.
--no-llmflag on all LLM-using commands:recall,brief,reflect,explore,challenge, andpr-commentnow all accept--no-llmto skip the LLM narrative and print raw capsule data instead. Allows full use of unlost memory commands on machines without an LLM configured.query,trace,thread, andinitalready had this flag; this change brings the remaining commands in line.
unlost reindex: Tolerate capsules withnullstring fields (category,intent,decision,rationale,request_path,source) instead of crashing withinvalid type: null, expected a string. Adds#[serde(default)]to those fields so older or partially-written records are skipped gracefully rather than aborting a full reindex mid-run.
unlost config llm anthropic --sso: New SSO flag on the existinganthropicsubcommand. Opens the browser, runs an OAuth 2.0 PKCE flow againstconsole.anthropic.com, exchanges the temporary access token for a permanentsk-ant-...API key via Anthropic'screate_api_keyendpoint, and stores it in config — no manual key management required.--api-keyand--ssoare mutually exclusive.
docs/index.html: Updated landing page to cover 0.15.0 and 0.16.0 changes: addednote+local://to the Source Pointer Registry; enrichedunlost threadcommand entry with LLM synthesis, timeline rendering details, and flag examples; enrichedunlost noteentry with--globalflag and source pointer footer behaviour; added Claude Cowork to the "Any agent. One shared memory." hero row and the Agent Integration install block.
- Claude Cowork integration: New
unlost shim coworkhook shim,unlost shim replay coworkbackfill command,unlost config agent coworkinstaller, andagents/cowork/plugin package. Cowork shares Claude Code's hook wire format and JSONL transcript schema, so the implementation reuses the same parsing pipeline. Installing the plugin gives Cowork friction detection (UserPromptSubmit) and automatic session recording (Stop), plus the unlost MCP connector for in-session memory queries.
-
MCP server (
unlost mcp serve): New Model Context Protocol stdio server exposing 7 task-shaped tools for agents:unlost_recall(workspace memory lookup),unlost_trace_decision(causal chain),unlost_challenge(pressure-test a proposal),unlost_thread(cross-workspace topic history),unlost_orient(recent touches + drift signal),unlost_capsule_get(fetch capsule by id), andunlost_note(write a decision, opt-in). All read tools run on the no-LLM fast path targeting < 250ms per call. Write tools are gated behind--allow-writes(default off). Wired viaunlost config agent mcp --target <claude|opencode|copilot|generic>. Usesrmcp1.7.0 for MCP protocol compliance. Seeagents/mcp/README.md. -
unlost_mcpOpenCode skill (.opencode/skills/unlost-mcp/SKILL.md): Teaches the agent when to call each MCP tool proactively — before edits, before reversals, at the start of complex subtasks, and for cross-project memory. -
Source pointers: Every capsule now carries an optional
source_pointerfield — an opaque URI pointing back to the system-of-record for that turn. Schemes:claude+jsonl://...#turn=<uuid>,opencode+message://<session>/<msg_id>,copilot+events://...#offset=<bytes>,git+commit://<repo>#<sha>,git+tag://<repo>#<name>,changelog+version://<path>#<version>. Stored as a new nullable column in LanceDB (source_pointer, additive migration following thete_*precedent), written to JSONL, and re-hydrated byreindex. All five shim paths populate the field: Claude hooks, OpenCode stdio plugin, OpenCode replay, Copilot events, git commit/tag ingestion, and changelog ingestion. Thequeryandinspectcommands printsource_ref(human label) andsource_uri(raw URI) footers for hits that carry a pointer.resolve_source_label(uri)inworkspace.rsprovides per-scheme rendering with 9 unit tests. -
recurrence_signalchannel: NewSymptomChannelsfield that measures how strongly the current user turn matches a dormant capsule not seen in the recent window. Drives the resurfacing basin inTrajectoryController. Stored as a per-turn EMA value inSymptomChannels; does not participate in the aggregate trajectory intensity. -
Resurfacing basin (
TrajectoryController::update_with_candidates): When a dormant capsule scoressimilarity × structural_weight ≥ 0.78and the session has not yet had a standalone resurfacing, the controller emits a SYSTEM NOTE with the prior decision, its rationale, source URI, and — for cross-workspace matches — an"in <project>"clause. Modifier mode appends to an existing basin note instead of firing standalone. The oldupdate()delegates to the new method with empty candidates for backward compatibility. Renamecheck_friction → check_turnthroughout (flow.rs, all shims, comments) to reflect the expanded scope. -
resurfaced.rs— Global cooldown ledger at~/.local/share/unlost/resurfaced.jsonl, shared across all workspaces.record()appends a(capsule_id, ts_ms)entry;load()reads both the legacy per-workspace file and the global ledger;is_cooling()enforces a 30-day window. UUID-based capsule IDs make cross-workspace collisions safe. -
query_capsules_cross_workspaceinstorage.rs: Fans out an ANN query across the current workspace and every registered peer workspace. Tags each hit withorigin_workspace_id. Merges results by distance ascending, capped tototal_limit. Per-workspace failures are debug-logged and skipped. Used by both the per-turn recurrence channel inflow.rsand the newthreadcommand. -
Cross-workspace workspace labels:
workspace_label(info)andworkspace_label_by_id(id)inworkspace.rsderive human-readable project names from workspace root basenames. Used in SYSTEM NOTEs and thethreadmap. -
list_other_workspacesinworkspace.rs: Returns all registered workspaces except the current one. Used byquery_capsules_cross_workspacefor the fan-out. -
record_resurfacing_emittedinmetrics.rs: Logs aResurfacingEmittedevent tometrics.jsonlwithworkspace_id,agent_session_id,matched_capsule_id,similarity,mode("standalone"/"modifier"), andcandidate_age_days. Enables future success-metric computation (fraction of surfacings where the agent referenced the capsule). -
CapsuleHit.origin_workspace_id: New optional field onCapsuleHit. Set by cross-workspace retrieval to identify which workspace a hit came from;Nonefor single-workspace queries. Used by the recurrence channel and thethreadcommand renderer. -
unlost thread: New command that maps when a topic was explored over time, across all registered projects. Results render as a recent-first, notes-style retrospective: LLM synthesis first (when enabled), then day-grouped notes with 80-column wrapping, quiet metadata, dim provenance (from <workspace> · <source-ref>), dim support lines, folded near-duplicate echoes, arc duration in the header, and backward-in-time gap markers (N days earlier,N months earlier · long return). If no LLM is configured, the command falls back to extracted notes and prints a dim configuration hint instead of failing. Optional LLM synthesis describes the user's journey through the topic — what it means, why it mattered enough to recur, and what older notes change about the current reading — without framing any moment as "unresolved". Cross-workspace retrieval is the default. Supports--since,--no-llm,--limit,--output plain,--llm-model. -
docs/index.html: Added "The context you didn't know you needed" section describing the proactive recurrence channel surfacing dormant capsules before the developer asks. -
unlost note: New command to capture manual notes into workspace memory. Accepts positional text,--stdinfor piped input, and--source <label>for free-form categorization. If no project (git repo or manifest) is detected, notes land in aglobalworkspace under~/.local/share/unlost/workspaces/global/. The--globalflag forces this regardless of the current directory. Symbols are auto-extracted from note text for retrieval viaunlost query --symbol. Notes are written to both LanceDB andcapsules.jsonl, survivingunlost reindex. Source pointer URI schemenote+local://<root>#<ts_ms>renders asmanual note (2026-05-16)in query/thread footers.
check_friction→check_turn: Renamed throughoutflow.rs, all shim call sites, and inline comments to reflect that this hook now does far more than friction detection (per-turn ANN retrieval, recurrence scoring, resurfacing injection).CopsuleHitandResponseMetastruct fields: Both structs gained new nullable fields (origin_workspace_id,source_pointer). All construction sites —recall.rs,brief.rs,init.rs,reindex.rs,recording.rs,resurfaced.rstests — updated withNonedefaults, keeping backward compat.unlost note: Captured note text is now word-wrapped at 80 columns before storage, soquery,inspect, andthreaddisplay it cleanly without per-command wrapping logic.- Thread provenance: Anchor cluster headers (where it landed / the turn / where it started) and timeline dates now render provenance on a separate indented line wrapped to
WRAP_WIDTH, preventing single-line overflows with long source label lists.
- Silent schema evolution failure:
ensure_capsules_tablenow logs a warning whenadd_columnsfails instead of swallowing the error. Schema-mismatch insert errors ininsert_capsule_rowproduce an actionable message pointing tounlost reindex. unlost_notecapsule id:insert_capsule_rownow returns the UUID it generates, sounlost_notereturns the real capsule id. Previously it returned the source-pointer URI, which is not theidcolumn — making the returned id unusable withunlost_capsule_get.
### Fixed
- Previous release broke because release was created by agent as immutable before the workflow existed
TurnEval: Per-turn evaluation metadata computed on-the-fly at flush time with zero LLM calls. Each capsule now carries 12 agent-tuning (tune) dimensions — persisted governorSymptomChannelspreviously discarded after friction decisions — plus 5 developer coaching (coach) dimensions:clarity,context_freshness(cache ratio + frustration slope, captures compaction signal),verification_rigor,decision_progress, andscope_discipline. Behavioral flags (session_heavy,session_too_long,retry_loop,blind_acceptance, etc.) derived from thresholds on both dimensions. Stored in LanceDB (te_*columns with schema evolution), JSONL capsule log, and metrics. Displayed inunlost inspect.TurnEval.cost_acceleration: New coach dimension (0–1) measuring whether token spend is accelerating without correspondingdecision_progress. Computed as the relative growth oftokens_inputover a 3-turn rolling window, weighted by lack of progress. Emitscost_spikeflag when > 0.5.unlost reflect: New command generating a structured coaching/diagnostics narrative from per-turnTurnEvaltelemetry — no raw transcript required. Three modes:--mode coach(developer collaboration habits),--mode tune(agent drift and failure patterns),--mode both. Supports--session <id>and--since <duration>scoping.- Every output opens with NEXT ACTIONS — 3–5 scannable bold imperatives before the full analysis.
tune/bothmodes include SKILL ASSESSMENT: audits installed agent skills (.opencode/skills/,.claude/skills/, etc.) against turn data (helped / hurt / neutral), then lists behavioural gaps to fill with "Look for skills that…" guidance derived from observed patterns. Infrastructure/observer skills (unlost, git-workflow, graph tools) are automatically excluded from the audit.- Rich ANSI renderer: mode-coloured section headers, score colouring (green/yellow/red),
(low confidence)markers, dimmed turn references,→NEXT ACTIONS bullets,◆skill assessment bullets.
- Outcome backfill: At each checkpoint,
te_outcome_hint(progressed/stalled/regressed/unclear) is retroactively set via deterministic lookahead heuristics and written back via LanceDBUPDATE. TurnEvalin all retrieval paths:query_capsules_lancedb,scan_capsules_lancedb, and the fan-out path all populateturn_evalonCapsuleHitvia a sharedread_turn_evalhelper.TurnEvalbackfill on reindex:unlost reindexautomatically populatesTurnEvalfor all capsule history. Post-v0.13 capsules restore full data from JSONL; pre-v0.13 capsules get coach dimensions computed from content + a rolling 8-turn history window (v1-reindexversion marker).- Extended
verification_rigordetection: Static analysis and type-checker outputs now count as verification evidence:clippy,mypy,tsc,pyright,eslint,ruff,biome,golangci, plus failure patternstype error,type mismatch,lint error,E0(Rust),TS(TypeScript).
--mode diagnose→--mode tune: The agent-facing reflect persona is nowtunethroughout — CLI, prompts, inspect output, and comments — to make clear it targets agent behaviour improvement rather than generic diagnosis.
- GitHub Copilot CLI integration:
unlost shim copilotandunlost config agent copilotprovide hooks-based integration with GitHub Copilot CLI. Session transcripts are read directly from~/.copilot/session-state/<uuid>/events.jsonl, giving access to full user and assistant text without synthesis. Session discovery usesworkspace.yamlcreated_atproximity andsummarycross-check atsessionStart, andupdated_atproximity atsessionEnd. InstallssessionStart,userPromptSubmitted, andsessionEndhooks via.github/hooks/unlost.json, and writes a Copilot-compatible skill to.github/copilot/skills/unlost/.
docs/index.html: Restructured landing page to prioritize Context Ownership and Memory over control. "How It Works" now follows the Memory Lifecycle (Record → Extract → Ground). Added "One Memory. Many Lenses" section to showcasetrace,challenge, andexploreas different views on the same grounded context. Moved "Cognitive Mirror" technical details to a dedicated deep-dive section at the bottom.
0.11.2 - 2026-02-26
- Friction detection false positives: Three targeted changes reduce spurious de-escalation interventions during productive back-and-forth discussions. (1) The
anger_streakfast path now requires trajectory intensity >= Watch threshold (0.5) in addition to 2+ consecutive negative turns — pure emotion-classification noise can no longer trigger an intervention without corroborating behavioral evidence. (2) The go_emotionsdisapprovallabel is excluded from the anger streak counter, since it maps to intellectual disagreement rather than user upset; it still contributes to trajectory intensity via valence. (3) The heuristic override that mappedneutral + 1 frustration signal → disapprovalis removed — a single matched keyword (e.g."broken"in a technical description) is too weak a signal to override a neutral classification.
README: Reframed mission around ownership vs. authorship. The README now leads with the human engineer's perspective — accountability in incidents, reviews, and architecture decisions — rather than agent failure modes. Removed the babysitting tax framing and failure mode table from the lead; commands are now grouped by the moment you reach for them (understanding, deciding, handing off).
0.11.1 - 2026-02-25
- README: Restructured for better readability, moving installation to top and collapsing technical details.
unlost checkpointoutput: Fixed narrative output not wrapping at 80 columns. Now usesrender_narrativeto ensure proper formatting and ANSI coloring.- Recall/inspect filtering bug: Fixed an issue where
unlost recallandunlost inspectwith filters (e.g.--emotion joy) would return no results. The optimization to fetch only the most recent rows was calculating the offset based on the total row count instead of the filtered row count, often skipping all matching rows.
0.11.0 - 2026-02-24
unlost config agent: Automatically install theunlost-pr-commentcommand when configuring the agent./unlost-walkthroughskill: Installs a walkthrough skill for both OpenCode and Claude Code that guides users through recent changes step-by-step (with VSCodecode --gotonavigation).- "Under the Hood" section: Added to both
README.mdanddocs/index.html— a grouped inventory of every technique, algorithm, and strategy Unlost uses (trajectory sensing, emotion/NLP, retrieval/memory, storage/infrastructure), with "where it's used" context on the landing page.
unlost pr-commentdual-audience comment: The comment now serves both the author (staying close to code written by AI agents) and the reviewer. Voice changed from "you" to "we". New sections: "What we were navigating" (shared tradeoff framing with emotional signal woven in), "Ripple effects" (functional knock-on effects across commands/features, not just code imports), "Left open" (deferred decisions, open questions, unresolved next_steps from capsules), and "Re-read this" (1-2 linked file:function pointers to non-obvious logic). File references are now clickable GitHub blob links built from the head SHA and repo coordinates. "How To Verify" removed. Em-dashes banned from output. A blockquote hook at the top of every comment shows the decision count and explains what unlost does; if no decisions were found, it says so plainly and suggests a replay command. Fixed:headRepositoryOwneris now fetched as a top-level field (the nestedheadRepository.owner.loginpath was always empty).
unlost inspectcapsule order: Capsules are now displayed oldest-first (newest at end) instead of newest-first.- LanceDB timestamp filter crash: Avoids a DataFusion interval planning error (
lhs:Null, rhs:Int64) when applyingts_msrange filters on mixed-schema datasets; falls back to client-side time filtering and prints a repair command (unlost reindex).
0.10.0 - 2026-02-24
unlost pr-comment: New command that posts a staff-engineer-style context comment on a GitHub PR (requiresghCLI). The comment explains what the changed code is, where the decisions that shaped it come from (drawing on recorded capsules and git history), and flags high-dependency files that may have wider impact ("Worth noting" section). Accepts a PR URL or number, an optional--session-idto scope the trace, and an optional--from-commitfor diff bounds.- Stealth PR comment — OpenCode shim: When the agent creates a GitHub PR via
gh pr create(detected by scanningbashtool-call outputs for a GitHub PR URL), the OpenCode stdio shim automatically spawnsunlost pr-commentin the background without blocking the agent. - Stealth PR comment — Claude shim: Same stealth detection for the Claude Stop hook: assistant
texts from each batch are scanned for a GitHub PR URL and
unlost pr-commentis spawned if found. unlost trace --session-id: New flag to restrict the causal chain to capsules from a specific agent session, enabling per-session archaeology.unlost trace --from-commit/--to-commit: New flags to scope the trace to a commit range. Commit refs (branch names, SHAs,HEAD, etc.) are resolved to timestamps viagit log -1 --format=%ct, then used assince/untilfilters on the capsule store.
0.10.0 - 2026-02-24
unlost interventions: New diagnostics command to show recent friction interventions applied to agents. Displays timestamp, building time (how long friction was building), severity/intensity score, cause/diagnosis, topic (user intent), symbols involved, user emotion, and symptom channels. Supports--limit,--since,--untilfilters.unlost challenge --deep:challengeis now concise by default — outputs onlyTHE DECISION,ALTERNATIVES(2-3 options, no Cost/Evidence fields), andVERDICT. Pass--deepto get the full analysis withUNKNOWNSandPROBESsections.- Git provenance in capsules: Each capsule now records
head_sha(git HEAD at buffer-open time) andcommit_sha(HEAD at flush time, when it has moved). Both fields are stored in LanceDB and displayed inunlost inspect, making it possible to correlate memory entries with exact commits. - HyPE questions surfaced in
inspectand scan:unlost inspectnow displays the pre-generated HyPE questions stored alongside each capsule, so stored vectors can be verified.scan_capsulesalso now readsquestions_textfrom LanceDB rather than returning an empty list.
- Spurious spec interventions on short/meta inputs: Three paths in the governor were firing alignment-check notes out of turn on messages like
"yes"or short directives like"Extend trace.". (1) The ambient spec note now requires ≥4 words in intent and a non-empty decision before producing a check-in, preventing nonsense notes like"my current understanding is 'yes'. Next I'll do ''". (2) Thenorth_starselection in the high-debt spec branch now requires ≥6 words and excludes meta phrases (casual,check-in,continue, etc.), so"User initiated a casual check-in"can no longer appear as"Original Goal"and undermine the note. (3) The blind-acceptance intensity boost now skips known confirmation words (yes,ok,sure,proceed,do it, etc.) so decisive short inputs no longer inflate intensity toward an unwarranted intervention. - Windows stack overflow on startup: The shim binary (
unlost shim opencode) was crashing on Windows before writing the{"ready":true}signal because the default Windows main-thread stack (1 MiB) is too small for the deeply-nested tokio async state machine. Added.cargo/config.tomlwith/STACK:8388608forx86_64-pc-windows-msvcandaarch64-pc-windows-msvctargets, matching the 8 MiB default on Linux/macOS. - Duplicate capsules on plugin restart: The OpenCode plugin now computes a
turn_key(${userMessageId}:${assistantMessageId}) and sends it with every record request, making the server-side deduplication guard reachable across restarts. Previously, restarting the plugin cleared in-memory dedup state and caused any re-surfaced exchange to be written tocapsules.jsonla second time. - Failure mode interventions are now session-scoped:
evaluate_failure_modespreviously read the last 5 capsules from LanceDB with no session boundary awareness. ADrift,RetrySpiral,Rediscovery, orFalseProgresstag on the final capsule of a previous session would fire a system note on the very first message of the next session — with no actual friction to detect. The function now accepts a session ID and filters history to the current session only before evaluating. If no capsules from the current session exist yet, it returnsNone. Sessions with no known ID (e.g. the HTTP proxy path) retain the previous cross-session behaviour.
- HyPE-aligned retrieval for all commands: Each command now frames its user query with a command-specific intent prefix before embedding, turning retrieval into a question-to-question match rather than a keyword-to-document match. This exploits the HyPE (Hypothetical Prompt Embeddings) questions already stored in
questions_textat indexing time — without any extra LLM call at query time. Framing per command:recall: "What happened with <target>?"brief: "Why is the current state of <target> the way it is?"challenge: "Was the decision about <target> the right call?"explore: "What are the alternatives and trade-offs for <target>?"trace: "What sequence of decisions led to <target>?" If the user's input already contains a?, the prefix is prepended as a soft bias rather than replacing the phrasing.
tracefan-out quality guard: Fan-out (symbol-linked) capsules that carry no meaningful content — emptyintentand emptydecision— are now dropped before entering the causal chain. Previously all symbol-linked rows were admitted regardless of content, letting ghost/replay extractions pollute the chain.
0.9.0 - 2026-02-23
- Git tag ingestion: Git tags are now first-class capsules (
category: "GitTag"). Each tag captures its name, dereferenced commit SHA, creator date, tag message, and the files touched by the tagged commit — so queries like "what changed between v0.8.0 and v0.9.0?" can be answered from memory. Deduplicates by tag name ingit/ingested_tags.txt. Works for both annotated and lightweight tags. - Live changelog re-ingest on Stop hook: The Claude shim now calls
ingest_changelogat the end of every session. IfCHANGELOG.mdwas in the session's touched paths (or has un-ingested versions), new entries are captured immediately without requiring a manualunlost replay. Zero-LLM cost, idempotent. - Live tag ingest on Stop hook: The Claude shim also calls
ingest_git_tagson every Stop hook, so tags created during a session are captured as boundary capsules before the next session begins. - OpenCode stdio shim session-end ingest: The OpenCode stdio shim (
unlost shim opencode) now runsingest_git_tagsandingest_changelogwhen stdin closes (session end), giving it parity with the Claude Stop hook. Also drains the background worker before process exit to ensure no capsules are lost.
ingest_git_tagswired into all batch paths:unlost init,unlost replay claude, andunlost replay opencodenow all callingest_git_tagsimmediately afteringest_git_commits, so tag history is backfilled alongside commit history.
0.8.0 - 2026-02-23
unlost explore: New command for forward-looking planning grounded in workspace memory. Given a scenario or goal (e.g.unlost explore "should we keep lancedb or move to sqlite+fts?"), retrieves the most relevant capsules via semantic search combined with an importance-scored full scan (failure modes, rationale, cross-session recurrence). Capsules are context — not a cage — so the LLM can reason beyond them while clearly labelling what comes from memory ([memory]) vs. external knowledge ([outside]). Output sections: CONTEXT FROM MEMORY, PATHS WORTH CONSIDERING, TENSIONS, QUESTIONS TO SIT WITH, IF YOU GO FURTHER.unlost challenge: New command to pressure-test a past decision or technology choice (e.g.unlost challenge "lancedb"orunlost challenge "is our code currently properly organized?"). Uses three evidence sources: (1) the live code graph via unfault-core (hotspots, dependency topology, routes, file list — ground truth even when capsules are thin), (2) changelog capsules (version history), and (3) conversational memory capsules (decisions, rationale, failure modes). Output sections: THE DECISION, ALTERNATIVES (as readable named cards with Upside/Downside/Cost/Evidence fields), VERDICT (keep if / change if), UNKNOWNS, PROBES.GraphContext+build_graph_context_for_workspace: New helper inworkspace.rsthat builds the full unfault-core code graph and extracts hotspots (centrality), hub dependencies, routes, and file paths in one call. Used bychallengeto inject structural ground truth into the LLM prompt.
- Grouped help output:
unlost --helpandunlost(no args) now display commands organised into four sections — Memory (query,trace,recall,explore,challenge,brief), Workspace (init,reindex,clear,where), Setup (config,model), and Diagnostics (metrics,replay,inspect) — instead of a single flat list. Implemented via a customhelp_templateon the rootClistruct (clap'snext_help_headingderive attribute does not apply to struct-variant subcommands). exploreprompt redesign: Rewritten to be genuinely open-ended and generative — a thinking partner, not an auditor. The LLM is instructed to use workspace memory as background and constraint, then think freely beyond it. Alternatives are labelled[memory]or[outside]so the user knows what is grounded and what is creative.challengealternatives format: Replaced pipe-separated table (unreadable at terminal width) with named card format per alternative. Each card uses circled numbers (①②③④), with dimmed field labels (Upside:,Downside:,Cost:,Evidence:) and a blank line between cards for scannability.- Higher-signal recall selection:
unlost recallnow filters low-signal capsules (e.g. replay/ghost extractions), scans a wider recent window to avoid crowd-out, and includes git commit capsules by default so the narrative stays anchored when conversational signal is thin. - Recall interventions controls: Interventions can be hidden from output (
UNLOST_RECALL_HIDE_INTERVENTIONS=1) and are excluded from the LLM narrative context by default unless explicitly enabled (UNLOST_RECALL_INTERVENTIONS_IN_CONTEXT=1). - Faster
reindexrebuilds:unlost reindexnow batches embeddings and LanceDB inserts, clears the workspace DB directory in one operation, and shows in-place progress during rebuild. - Richer
trace --rawoutput: Raw trace printing now includes capsule source and best-effort references (e.g.commit:<hash>/version:vX.Y.Z) when available.
render_structuredpolish: Space inserted between circled number and card title text (①Keep→① Keep). Probe lines changed from dim cyan (\x1b[2;36m, nearly invisible on dark backgrounds) to normal cyan (\x1b[36m). All prose, card field values, and probe lines now wrap at 80 columns via a newwrap_ansi_line()helper that measures visible width by skipping ANSI SGR escape sequences.- Safer
reindexconfirmation: Confirmation prompt now reads a single line from stdin (instead of blocking on EOF), improving behavior in non-interactive environments. - Recall rendering clarity: The narrative output now labels the final section as
Next steps (if any):to avoid implying that every recap must produce action items.
0.7.1 - 2026-02-20
- OpenCode skill generation:
unlost config agent opencodenow automatically creates.opencode/skills/unlost/SKILL.md(per-project) or~/.config/opencode/skills/unlost/SKILL.md(with--global). The skill teaches OpenCode agents what unlost provides and how to use it. If the file already exists, the command prompts before overwriting. - Two-tier query guidance in skill: The generated skill distinguishes fast-path commands (
unlost query --no-llm,unlost metrics) — safe to run proactively with no LLM cost — from LLM-path commands (unlost query,unlost recall,unlost brief) — which should only run on explicit user request.
0.7.0 - 2026-02-19
unlost brief: New command that produces a staff-engineer-style codebase debrief. Answers "what do I need to know to work here without getting surprised?" by scanning all recorded history (not just recent turns), scoring capsules by importance (failure modes, explicit rationale, cross-session recurrence), and producing four structured sections: MENTAL MODEL, KEY DESIGN DECISIONS, THINGS THAT BITE, ENTRY POINTS. Ends with a GO DEEPER section of suggestedunlostcommands to drill down further. Scoped variant (unlost brief src/governor.rs) narrows the debrief to a specific file or concept.- Git commit ingestion: Git commits are now first-class capsules. Each commit becomes an
IntentCapsulewithcategory: "GitCommit", subject as the decision, body as the rationale, and touched files as symbols — embedded for semantic search, zero LLM cost. Deduplicates by hash across runs. unlost replay git: New subcommand to ingest git history on demand (unlost replay git --max-commits 500).- Automatic git ingestion:
unlost replay opencode,unlost replay claude, andunlost initnow automatically ingest git history after their main work completes. No extra step needed.
- Git capsule routing: Git capsules are included in
briefandquery(where historical decisions are valuable) but excluded fromrecall(which stays focused on the conversational story) and from the trajectory controller's history window (which operates on live agent turns only).
- LLM Schema Compatibility: Fixed invalid JSON schema for
extraction_modefield inIntentCapsulethat caused OpenAI-compatible APIs to reject requests with HTTP 400. The field was emitting$refalongside sibling keywords (description,default), which is disallowed. Now uses an inline schema viaschemars(schema_with = ...).
0.6.4 - 2026-02-17
- CLI Replay Clarity: Rephrased Hybrid Mode description and summary output to explicitly state that local indexing happens for all turns, while LLM analysis is reserved for pivotal moments.
0.6.3 - 2026-02-17
- CLI Replay Summary: Rephrased the summary output to be more intuitive, distinguishing between local indexing and selective LLM analysis with explicit API savings percentage.
0.6.2 - 2026-02-17
- Release Stability: Synchronized
Cargo.lockto ensure reproducible builds with--locked.
0.6.1 - 2026-02-17
- Test Stability: Fixed compilation errors in
src/types.rstests due to missingextraction_modefield inIntentCapsuleinitializers.
0.6.0 - 2026-02-17
- Hybrid Replay Default: Implemented research-backed tiered extraction. Replay now auto-detects "pivotal" turns (emotional friction, corrective keywords, high structural churn) for LLM analysis while always indexing raw text locally for maximum recall at minimum cost.
- Selective Extraction Heuristics: New
is_pivotalsensor inflow.rsthat identifies high-signal conversation branches using emotional valence, symbol churn, and message complexity. - Replay Statistical Summary: The replay CLI now reports "pivotal moment" analysis percentages, providing transparency into LLM usage and signal density.
- CLI Replay Refactor: Replaced ambiguous
--no-llmflag with a clear trinary choice:--no-extraction(zero-cost), default (Hybrid), and--full-extraction(high-fidelity). - Maintenance Tools: Added
--clearflag tounlost replayto safely wipe existing workspace database and deduplication trackers for a fresh backfill.
- Optimized Search recall: Defaulted replay to local raw text embeddings for all turns, ensuring 88.5% Recall@5 (per internal research) without requiring any API calls for "routine" turns.
- Improved Recall Recency: Adjusted
unlost recallselection logic to prioritize absolute recency (last 30 mins) and latest session context, preventing older replayed historical work from drowning out current progress.
0.5.0 - 2026-02-17
- Trajectory-Aware Interventions: Moved from raw percentages to descriptive severity labels (Significant, Strong, Acute) and plain-English diagnoses (e.g., "Grounding failure", "Repetitive stall").
- Intervention Duration: Track and display the build-up phase ("Intervened after Xm") to better reflect the trajectory slope.
- Contextual Topics: Automatically capture the conversation topic (user intent) during interventions and display it in
unlost recall. - Intelligent Backfilling: Added support for backfilling topics and diagnoses for historical intervention logs by matching timestamps against conversation history.
- Improved Time Formatting: Human-centric elapsed time representation (e.g., "1h 11m ago", "yesterday") in recall output.
- Cleaner Symbol Display: Truncated and filtered symbol lists in recall to prioritize signal over noise (e.g., "src/main.rs and 22 others").
- Enhanced Narrative Context: The LLM generating the recall summary now receives detailed intervention metadata (duration, diagnosis, topic) to weave friction points into the workspace story.
0.4.2 - 2026-02-16
- Sync
Cargo.lockto fix failed release workflow
0.4.1 - 2026-02-16
- Updated changelog to include 0.3.0 and 0.4.0 entries to fix release workflow
0.4.0 - 2026-02-16
- Git Grounding: Verify agent claims against actual commit history with
--git-groundingflag during replay - Fluency Sensor: Measure assistant verbosity vs user input to detect "Blind Acceptance" risk (Nature Scientific Reports alignment)
- Cognitive Mirror Enhancements:
unlost metricsnow shows average verbosity and context-load inflection diagnostics - Turn Key Deduplication: Fixed state gap between live recording and transcript replay using persistent turn keys
- Promoted Trajectory-based regulator framing across documentation and website
- Removed
internal/benchfrom cargo workspace members
0.3.0 - 2026-02-15
- TrajectoryController: Proactive regulator with
Stable → Watch → Intervenestate machine - Basin Architecture: Classification of friction into Loop (stalls), Spec (misunderstanding), and Drift (hallucination)
- Codebase Grounding: Integration with
unfault-corefor sub-second symbol graph validation - Temporal Awareness: "Coffee pause" logic that decays controller state across inactivity to avoid misattributions
- Symptom Channels: Logic churn, instruction staticness, and grounding stall sensors
- First-class
unlost replaycommand for transcript backfilling - Semantic coloring for terminal output
- Hid internal-only commands
serveandrecord - Enhanced
unlost metricswith basin-specific breakdowns and high-cost window rankings
0.2.7 - 2026-02-13
unlost shim replay opencodeto backfill OpenCode message history into capsules- Discovers sessions for workspace from
~/.local/share/opencode/storage/ - Extracts user/assistant turn pairs with usage metadata
- Parallel processing with spinner progress
- Discovers sessions for workspace from
- Cost warning before replay (both Claude and OpenCode) showing turn count and LLM model
- Suggests cheaper alternatives for expensive models (gpt-4o-mini for OpenAI, claude-3-5-haiku for Anthropic)
0.2.6 - 2026-02-13
- Enhanced documentation with real command output examples
- Updated
unlost recallexample showing file-specific narrative summaries - Updated
unlost queryexample demonstrating semantic search results
0.2.5 - 2026-02-13
unlost wherenow shows the correct workspace ID from config instead of recomputing it- Fixes cases where manifest files (pyproject.toml, package.json, etc.) were added/removed after initial workspace registration
- Ensures
whereoutput matches the actual data location used by other commands
0.2.4 - 2026-02-11
- Recall narrative now weights recency: emphasizes latest capsules when describing "recent work"
- Friction detection skips warnings when current user emotion is neutral/positive
- Friendly error message when OPENAI_API_KEY is missing instead of panic
0.2.3 - 2026-02-10
- Conversational friction detection now triggers even when no symbols are extracted (e.g. "I'm confused")
- Treat explicit confusion as friction for stateless first-message nudges
- Added "upset" as a frustration signal to improve heuristic detection when the emotion model under-classifies
0.2.2 - 2026-02-10
unlost shim replay claudeto backfill Claude transcript history (with best-effort de-dupe)- Stateless friction note for clearly frustrated first messages (no capsule history required)
- Standardize naming on
claude(CLI, shims, docs); keepclaudecodeas a compatibility alias - Claude transcript ingestion now records user-only turns and includes bounded
tool_resulttext
- Claude shim cursor logic that could skip most new transcript lines after the first
Stop
0.2.1 - 2026-02-10
- Release workflow now creates GitHub releases with notes extracted from this changelog
0.2.0 - 2026-02-10
Version alignment release - CLI and OpenCode plugin now share the same version number.
0.1.1 - 2026-02-09
- OpenCode plugin integration with friction detection
- Agent session ID tracking for multi-session workflows
- Async companion recording with usage-aware output
- Query and recall filter flags (
--session,--agent, etc.) - Windows support with
ortcopy-dylibs enabled - Best-effort touched-path recording (
touched_paths) to improve file association in capsules
- OpenCode config switched to plugin-only + global install pattern
- Shim architecture extracted for companion flow separation
- README overhauled with agent orientation and failure modes
- Scoped
unlost recall <file>now prioritizes semantic matches and backfills with recent capsules only if needed - Optional recall workspace snapshot gated behind
UNLOST_RECALL_GIT_SNAPSHOT=1
- Suppressed duplicate flush jobs
- Improved recall output formatting
- Recall relevance for file scopes by expanding semantic recall and reducing unrelated context injection
- Claude Code transcript ingestion now captures touched paths from tool/snapshot events so file edits show up in memory
0.1.0 - 2026-01-26
- Local mood metadata (ONNX) stored alongside capsules
- Recall prompt now includes mood and per-request metadata for richer storytelling
Initial public version.
- Recorder:
unlost servemultiplexed HTTP proxy for multiple workspaces via/w/<workspace_id>/<provider>/...unlost recordsingle-workspace proxy mode
- Memory:
- Capsule extraction into
category/intent/decision/rationale/next_steps/symbols - Local embeddings (fastembed) + LanceDB storage and query
- Capsule extraction into
- UX:
unlost recallandunlost querynarrative outputsunlost inspectfor raw capsule inspectionunlost initseeds capsules from code graph + optional bounded git history