You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Antigravity CLI support (experimental). The plugin carries a native Antigravity package beside its Claude Code and Codex files: eager KG tools whose descriptions the model sees, session preload, prompt recall, and file recall for file views, edits and explicit shell reads. Antigravity truncates MCP results above about 10 KB, so a larger reply from any KG tool returns a short receipt and arrives through the next PreInvocation hook in UTF-8 chunks of up to 40 KB. Nothing it implies is recorded until the last chunk is acknowledged: seen and full-read state, sync position, the read timestamp and promotion out of the archive. A refused reply changes nothing, and queued replies survive new prompts and server restarts. A compaction checkpoint in the transcript re-queues the preload and replays pending replies from the start. Install with agy plugin install from a checkout; see ANTIGRAVITY.md. Signed-in resume, fork, clear and compaction checks are still open.
Budget notices: the server tells a session when to wrap up. On the hooks it already serves, the server reads the session's own quota gauge and says once per level per window: plan the wrap-up at 80% of the five-hour window, wrap up now at 90%, and the same at 90/95% of the week. Claude Code reads the status-line file (no notices without it), Codex the session's own rollout, Antigravity a live agy -p /usage reading cached for five minutes. An audit of Codex rollouts had found sessions at 90–97% of five hours that never read their quota. Off with "budget_notices": false in chores.json or KG_BUDGET_NOTICES=0.
Antigravity maintenance runner and history scouting. Antigravity prompts dispatch chores like Claude Code and Codex, and "runner": "antigravity" runs them on agy: gated on a live /usage reading for the run's model group (weekly-only plans skip the five-hour gate), refused unless your Antigravity settings grant the tier's kg tools or while paid credits could be spent. The run is a tool-less kg-maintainer agent in its own workspace, refused unless agy -p /agents lists it, and stopped if agy logs a fallback to its default agent; deletions stay on Ask, so it never deletes. Verified with a mock model only. /kg-scout gains an Antigravity recipe: the prompt history as index, the conversation database as inventory, transcripts as the record.
The retrieval evaluator can report what a session did after staged recall.python -m eval --transcripts reads the matching Claude Code transcripts and Codex rollouts against historical graph snapshots and counts, per recall route and cohort, later explicit reads, node updates, endorsements, gist phrases in prose and requests on touched files. The counts describe observed activity, not benefit: missing transcripts and unobservable operations are reported as coverage gaps. It is opt-in, local and read-only; without the flag the report is unchanged. The file-request grammar the hooks use moved into core/file_requests.py unchanged, so the evaluator shares it without importing the server.
Search in the visual editor uses the same ranking as kg_search. IDs, descriptions, notes, and file references are searched across every tier of the selected graph. A ranked result list highlights matching text; the canvas shows the top five matches and their connecting paths, with an option to show all matches. Selecting a hidden result reveals it without recalling it. Ranking, stemming, term weighting, and path finding now live in shared read-only helpers.
Node details explain the archival score. The live scorer supplies the total, raw recency/connectedness/usefulness values, percentile ranks, weights, and weighted contributions, including connection weights, the hub floor, and endorsement decay. Active and archived nodes use their actual compaction/refill pools; grace-protected and orphaned nodes show marked previews. Inspection never promotes nodes or updates their read timestamps.
GET /api/projects: the memory server now lists its own project graphs. One row per projects/<slug>/graph.json under the storage root — slug, project_path from _meta (or null when never stamped), whether that folder still exists, node counts per tier (active/archived/orphaned), edge count, and the graph file's mtime as last-used. Reads graph files directly, like the maintenance-debt survey; never creates, loads, migrates or writes one. The visual editor's project list now calls this instead of scanning ~/.claude/projects/ Claude Code history, so a project used only from Codex shows up, a custom KG_STORAGE_ROOT is honored, and a graph is never listed twice or guessed from a slug. A graph whose folder is gone or whose _meta never recorded a path is still shown, marked as such; one with no recorded path can't be opened (there's nothing to address it by) and says so instead of silently doing nothing. Against an older server without the route, or one it cannot reach, the editor falls back to the previous history scan; a missing route is logged once per process.
The visual editor opens a mature graph as a picture of what's live, not a grey mass. Default view now draws active nodes plus their one-hop neighbours; archived neighbours stay (dimmed, as before), orphaned nodes are hidden, and an Include orphaned toggle brings back all of them, not only those next to an active node; and All nodes reaches the unfiltered view. Node radius is driven by degree over every non-orphaned edge at the level, computed once regardless of which view is showing, so hubs read as hubs and don't resize when the view toggles. Edge labels show on hover instead of crowding the canvas permanently. The header now accounts for every stored edge instead of silently dropping some: it names how many are drawn, how many are hidden by the default view, and how many are dangling (an endpoint missing from this level), and does the same for node counts when the default view is narrower than the full graph.
Changed
Gists can be edited and saved above the length target. Inline and modal editors keep a visible warning without blocking typing or saving. Their counters use the server's canonical 300-character soft target and count Unicode characters the same way as Python; maintenance debt uses the same target.
The visual editor names both view choices explicitly: “Visible nodes” and “All nodes,” with a persistent view summary and hidden-node count. Choosing a view exits search; graph switching clears search, and late responses cannot replace the current graph's results.
The recommended setup is one output style, and Codex and Antigravity get the same text.recommended-setup/output-styles/concise-quality-v3.md carries the working agreement, the response rules and memory habits in one file, and replaces CLAUDE.md and concise-quality-v2.md, whose benchmark numbers the setup README keeps, attributed to the parts v3 merged. Its Memory section applies only with the plugin installed. The new Codex setup loads it as developer_instructions, with the loading evidence and a small behaviour test, and sets up the footer for limits and context; the new Antigravity setup loads it as a global GEMINI.md rule and configures two data rows with a divider, quota and context gauges. The status line keeps each quota bucket's observation time, so a cached value shows its age, and has fixture tests in CI. Copies already installed under ~/.claude/ are untouched; the README says how to move from v2 without loading the text twice.
/kg-scout asks before the expensive reads, except when nobody is there to ask. After scanning the prompt index it lists the candidate sessions and lets you pick which transcripts to read in full, unless the request already names them. An unattended run picks for itself, records what it chose and skipped, and is paced by the runner's own quota gauge instead: it continues only while the 5h window is under 40%, the weekly under 70% and the week is on course to leave quota unused, the same gates as a maintenance pass. The Codex recipe now names the rollout inventory as its index.
Sessions without a project are user-only, and everything obeys that scope.kg_read() without cwd opens a user-only session (Claude Desktop chat has no folder to give); the home directory and a folderless Codex app chat (~/Documents/Codex/<date>/<slug>) are user-only too, unless a graph already exists there. Such a session is reused by its id, refuses project writes with the call that attaches a project, and attaches one when a later kg_read passes cwd, keeping its id and what it has seen. A session bound to a project ignores a different cwd and says so. File recall, capture counting and maintenance follow the session's scope instead of the hook's cwd, so a home-directory session no longer loads, counts into or offers a project graph for its folder.
Endorsed nodes and hubs are the last to be orphaned. When the archived section outgrows its budget, archived nodes are now orphaned by their archival score (recency, connectedness, endorsements) instead of by their edges to active nodes alone, and connectedness has a floor that grows with a node's total edge count, so an entity hub no longer scores as isolated while its neighbourhood sleeps. Replayed on three real graphs (every orphan restored, then orphaned again to the same budget), endorsed nodes among the orphaned fell from 108 to 53, 88 to 39 and 6 to 0, and hubs of 10+ edges from 7 to 1. Nodes already orphaned stay orphaned.
Fixed
After a compaction, recall no longer treats dropped memories as present. The compacted summary keeps only part of what the session was shown, but the session kept its seen-set and full-read flag: prompt and file recall withheld memories the summary had dropped, and the next full read rendered them as bare ids. A SessionStart with source: compact now resets that state before re-rendering the preload, so the full-read reminder returns and recall can surface those memories again. View times are kept, so a stale write is still refused.
Codex relative shell reads use the command's actual directory. When the hook omits workdir, file recall matches its inner invocation id to a completed rollout record, including parallel calls and identical commands in different directories. The lookup checks session/turn identity, reads at most 256 KiB, caps records and parsing time, and rejects missing or ambiguous evidence. It never falls back to the session directory. Absolute operands remain usable. Shell recall also supports nl and rg with explicit file operands; a relative read whose directory cannot be placed is logged as unresolved_cwd or ambiguous_call, without the command text; other Bash calls add nothing to recall.jsonl.
A hook event whose harness session id matches no KG session no longer borrows the newest session in the project (its seen-set, full-read state and nudge throttle). It resolves only through its own binding, or through a session id its transcript shows it used; otherwise recall.jsonl records unresolved_session. Events without any id, from older hooks, keep the project fallback.
A fork no longer takes over a session no hook has bound yet (F12). When the preload never ran, kg_read registers a session that stays unbound until the first hook binds it. A fork (or resume) before that hook took the session over: the parent's hooks lost it, and the parent's reads counted as seen for the fork, so the fork was never shown those nodes. Recovery now clones the session for any new Claude session, as it already did for a bound one. The Lean model (formal/sessions/, roadmap 09) with this fix: dedup and hook identity hold under the new hook rule, with and without a preload.
Documentation
Current-source guides and wiki pages cover Codex rollout scouting and shell directories, server-owned projects, visual search and score inspection, user-only scope, current scoring and persistence semantics, and the Antigravity adapter's verified and open cases. Dated investigations retain their original observations with current-status notes.