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
This commit was created on GitHub.com and signed with GitHub’s verified signature.
3.5.1 - 2026-11-10
Added
Z0 cost by task kind (scripts/token-eval/z0-cost-by-kind.mjs). One free, local command reruns the frozen round 3 analyzer's cost ratio on teach, first apply, later apply and set N tasks for seven arm pairs, with the dollars and the resolve difference beside each ratio, and stops unless the analyzer files, the inputs and round 3's H3 and H4 lines match the recorded hashes and numbers exactly.
Changed
3.5.1 ships everything in 3.5.0, which was tagged but never published to npm. The 3.5.0 publish stopped because a pull request merged after the release was cut left a changelog fragment unfolded. Upgrading from 3.4.0 brings every entry in this section and in the 3.5.0 section below. CI now runs the fragment check on any commit that changes the package version, so a release pull request fails on a stray fragment before it is tagged.
3.5.0 - 2026-11-10
Added
Z0 hook diet replay (scripts/token-eval/z0-hook-diet.mjs). One free, local command renders hippo's prompt hook block from Z0 round 3's saved A2 pre-session stores with and without pinnedInject.excludeTags, checks the no-list render against the block round 3 sent, and prices the cut against each session's real cache use.
pinnedInject.excludeTags leaves tagged rows out of the hook block.{"pinnedInject":{"excludeTags":["session-digest"]}} in .hippo/config.json drops every row carrying a listed tag from the pinned-only reads: pins, the recent-N backfill, prompt recall and hippo session-rules. Prompt recall cuts them in SQL before its candidate limit, so a kept match is not crowded out. The list is empty by default and the block stays byte-identical until you set it.
Changed
The website has no eyebrows, captions or taglines. Each heading and its content carry the section, so a page shows less text.
Command blocks that are safe to paste whole have a copy button. They are on the quickstart, Claude Code, Codex, Cursor and MCP pages. Example blocks have none, so one press never runs a sample command.
Every section of the website has a stable id. A person or an agent can link to one section. Links that stand alone have a 24px tap area, and motion uses two durations.
The website build guards itself.npm run build in website/ fails on a word glued to a link, a duplicate id, a DESIGN.md colour the code does not use, or visible text that differs from website/text-snapshot/. A Website workflow runs it on pull requests that touch website/ or README.md. website/AGENTS.md lists the rules for agents.
A blank superseded_by link now reads as live again, and storage keeps one spelling of "no successor". The store schema is now v63: opening a store sets memories.superseded_by to NULL wherever it was the empty string (a row with an unknown kind is left alone so the open cannot fail), and every row write stores NULL for an empty link. A memory with a blank link was hidden from recall and could be deleted or set aside by hippo sleep; after the first open it is returned and kept. The migration is one-way and touches no other column.
The sleep child's end is one value inside the server.POST /v1/sleep and the auto-sleep return the same HTTP codes and the same error text in every case, the deadline first included. A reply that is not a sleep result and a child that closes with no reply now have tests.
Fixed
The website keeps the space between a word and a link or inline code. 34 places on 10 pages read like "theMCP server page", because Astro 7 changed its HTML compression default. The site now sets compressHTML: true.
A superseding decision weakens the memory it replaces in the same write as the save.hippo decide --supersedes <memory-id> used to commit the new decision first and weaken the old memory afterwards, so a refused weaken left the decision recorded, the memory untouched and the exit code 0, and a retry then made a second decision. The weaken now runs inside the save: if the store refuses it, nothing is recorded, the command prints that the decision was NOT recorded and a retry is safe, and it exits 1. A retry records exactly one decision.
A decision superseded over HTTP or the SDK now weakens the old decision's memory.POST /v1/decisions/:id/supersede, a create with supersedesDecisionId and saveDecision left the replaced memory verified; it is now stale, tagged superseded and on half the half-life, as the CLI already did, and the audit log gains one remember row for it. The replies are unchanged. A decision whose mirror memory is already gone still supersedes and weakens nothing.
hippo resolve --forget and hippo reject no longer exit with a busy-store error after they removed the memory. Both stamp the archive row of a removed raw memory once its markdown mirror is deleted. A store that was busy at that last step made the command fail, although the memory was already gone and the conflict resolved. They now log one warning, exit 0 and leave the stamp to the mirror reaper, which sets it at the next open, as archiving a raw memory already did. All three paths now share one stamp writer, so the stored times keep the same format.
hippo hook install codex finishes an install that stopped after it moved the Codex launcher aside. If hippo stopped between the rename and the wrapper write, the codex command was gone and the next install could not find Codex. The install now finds the leftover *.hippo-real* backup beside the empty launcher slot and completes. hippo hook uninstall codex also puts the backup back when no metadata was written. A launcher slot that holds a real Codex is never touched.
The daily schedule entry is matched exactly. A commented-out line or a longer task name no longer counts as scheduled. A marked crontab line with an outdated command is rewritten in place and keeps your schedule; hippo init prints the old and the new line, and any duplicate marked line is removed and printed. The manual crontab line now carries the marker, so a pasted line is recognised next time. On Windows a schtasks /query timeout no longer falls through to a create.
A change to a shipped instruction block now fails CI until its hash is listed.scripts/checks/check-hook-block-hashes.mjs requires the hash of every current block text in the shipped list, so hippo init keeps refreshing unedited old blocks. One missing early OpenClaw block hash was added.
Two sleeps on one store no longer run at once. A sleep takes a claim on the store first (an operating system lock in the new empty file sleep.lock.db, freed if its holder dies). A second hippo sleep, auto-sleep or POST /v1/sleep that finds it held does nothing: hippo sleep prints A sleep is already running on this store (since <time>), so this one skipped consolidation. and exits 0, the server answers 200 with alreadyRunning and every count at 0, and an auto-sleep logs one line (the MCP stdio host also waits a minute before it tries again). Before, both sleeps sent the same memories to the model, so the model was paid twice and a fact it worded two ways could be stored twice. The hippo sleep steps before consolidation (git learn, agent-note import, compaction replay, repairs) still run, a dry run is never refused, and the library consolidate() is not guarded.
A write sent to a running hippo server that may have landed now says so, whatever the error. Before, an unreadable reply or an error hippo did not recognise was reported as "the server refused", with no warning that the write may already have been applied. The CLI now never replays such a write locally. It tells you the write may already have been applied and to check with hippo recall before you run it again.
A session-end worker that gives up with a request still queued now writes one line to the session log. After five rounds in which it could not take the queued request it stopped without a word, and a detached worker's warnings reach nobody. hippo last-sleep shows the new line at the next session start.
A local embedding package installed while hippo runs is now seen without a restart. The local embedder remembered a "not installed" answer for the life of the process, so embed kept returning an empty vector after you installed the package. It now asks again once every 5 minutes (the same window a failed model load waits), and a "installed" answer stays cached. The public isEmbeddingAvailable() export had the same cache and now resolves the package on every call, so a long-lived host sees an install at once; each call costs one package resolve.
hippo sleep --dry-run no longer counts a merge the real sleep refuses. When you had rejected the merged text of a cluster, the preview said it would merge the cluster and the real sleep skipped it. The preview now reads rejected values as the real sleep does, shows the same skipped-merge warning, and names the rows whose rejected text the real sleep would retire. It still writes no refusal row. A store with no rejected value prints the same preview as before.
hippo share <id> no longer writes a second global copy of text the global store already holds. The command (and the MCP share tool) now prints Already shared: the global store holds this text as [<id>]. and exits 0, as hippo share --auto already skipped such rows. --force still only skips the transfer-score check. The check counts your tenant's global rows, so another tenant's identical text is not a copy for you. Two shares that run at the same moment can still both write.
A compaction summary saved from the spool is now stored once. Before, if the spool file's claim could not be removed (an antivirus or indexer held it) or the process died right after the save, the next replay saved the same summary again as a second compactions record. Now the replay finds the first record and reuses it, so you see one record per summary.
Documentation
The README, the site and llms.txt lead with the Z0 round 3 result. Correct Claude Code once, and with hippo it repeats that mistake about half as often as with its built-in memory alone (11 against 21 times in 100, on 29 repositories), at the same cost. The FAQ answer on whether hippo helps an agent's work now gives that result.