memhouse 0.18.12 → 0.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/AGENTS.md +22 -151
  2. package/CHANGELOG.md +263 -29
  3. package/LICENSE +202 -22
  4. package/LICENSES/agentlytics-MIT.txt +21 -0
  5. package/LICENSES/memhouse-MIT-until-0.18.11.txt +22 -0
  6. package/LICENSES/models.dev-MIT.txt +22 -0
  7. package/NOTICE +28 -0
  8. package/README.md +42 -20
  9. package/SECURITY.md +21 -8
  10. package/bin/memhouse.js +2223 -311
  11. package/docs/README.md +11 -9
  12. package/docs/guides/admin-password.md +37 -10
  13. package/docs/guides/configuration.md +13 -6
  14. package/docs/guides/daemons.md +64 -3
  15. package/docs/guides/import-claude-ai.md +204 -0
  16. package/docs/guides/install.md +11 -6
  17. package/docs/guides/invite.md +21 -7
  18. package/docs/guides/operate.md +114 -7
  19. package/docs/guides/search-and-resume.md +72 -3
  20. package/docs/guides/share.md +91 -52
  21. package/docs/guides/storage.md +44 -4
  22. package/docs/guides/troubleshooting.md +121 -14
  23. package/docs/guides/uninstall.md +4 -3
  24. package/docs/guides/update.md +16 -0
  25. package/docs/guides/upgrade-to-0.20.md +188 -0
  26. package/docs/releases/README.md +2 -1
  27. package/docs/releases/v0.18.10.md +5 -5
  28. package/docs/releases/v0.18.11.md +3 -3
  29. package/docs/releases/v0.20.0.md +627 -0
  30. package/docs/releases/v0.20.1.md +114 -0
  31. package/docs/tutorials/01-first-house.md +10 -7
  32. package/docs/tutorials/02-join-a-house.md +24 -15
  33. package/docs/tutorials/03-share-your-memory.md +40 -31
  34. package/editors/antigravity.js +1 -80
  35. package/editors/base.js +463 -9
  36. package/editors/bridge.js +119 -0
  37. package/editors/claude.js +273 -105
  38. package/editors/codex.js +278 -52
  39. package/editors/copilot.js +1 -70
  40. package/editors/cursor.js +1 -75
  41. package/editors/derive-fingerprints.json +18 -0
  42. package/editors/harness-paths.js +69 -0
  43. package/editors/index.js +1 -20
  44. package/editors/normalise/agy.js +910 -0
  45. package/editors/normalise/copilot-cli.js +321 -0
  46. package/editors/normalise/cursor-agent.js +852 -0
  47. package/editors/normalise/cursor.js +474 -0
  48. package/editors/normalise/devin.js +575 -0
  49. package/editors/normalise/gemini-cli.js +602 -0
  50. package/editors/normalise/goose.js +673 -0
  51. package/editors/normalise/opencode.js +633 -0
  52. package/editors/normalise/vscode.js +549 -0
  53. package/editors/normalise/zed.js +473 -0
  54. package/editors/opencode-v4.js +119 -0
  55. package/editors/scope.js +14 -3
  56. package/editors/sessions-log.js +349 -0
  57. package/editors/sqlite.js +28 -1
  58. package/editors/vscode.js +1 -72
  59. package/editors/windsurf.js +1 -143
  60. package/examples/01-local-one-machine/README.md +24 -19
  61. package/examples/01-local-one-machine/run.sh +1 -1
  62. package/examples/02-existing-clickhouse/README.md +30 -22
  63. package/examples/02-existing-clickhouse/run.sh +5 -4
  64. package/examples/03-team-house/README.md +44 -37
  65. package/examples/03-team-house/run.sh +35 -18
  66. package/examples/04-self-hosted-team/README.md +29 -14
  67. package/examples/04-self-hosted-team/compose.yml +5 -2
  68. package/examples/04-self-hosted-team/smoke.sh +26 -12
  69. package/examples/README.md +8 -4
  70. package/examples/fixtures/README.md +4 -1
  71. package/examples/fixtures/make-sessions.js +8 -5
  72. package/memhouse/admin-secret.js +89 -24
  73. package/memhouse/argv-secrets.js +64 -0
  74. package/memhouse/channel.js +49 -9
  75. package/memhouse/codex-plugin.js +194 -0
  76. package/memhouse/delivery/AGENT-INSTALL-PROMPT.md +2 -1
  77. package/memhouse/delivery/AGENT-INSTALL.md +22 -11
  78. package/memhouse/delivery/INVITATION.md.tpl +44 -45
  79. package/memhouse/delivery/PROMPT.md +53 -5
  80. package/memhouse/delivery/UPGRADE.md.tpl +1 -1
  81. package/memhouse/delivery/codex/AGENTS-BLOCK.md +11 -0
  82. package/memhouse/delivery/codex/SKILL.md +50 -0
  83. package/memhouse/delivery/kernel-install.md +17 -9
  84. package/memhouse/delivery/plugin/.claude-plugin/plugin.json +2 -2
  85. package/memhouse/delivery/plugin/reference/HOUSE.md +168 -41
  86. package/memhouse/delivery/plugin/skills/access/SKILL.md +13 -5
  87. package/memhouse/delivery/plugin/skills/admin/SKILL.md +14 -6
  88. package/memhouse/delivery/plugin/skills/house/SKILL.md +25 -8
  89. package/memhouse/delivery/plugin/skills/recall/SKILL.md +66 -8
  90. package/memhouse/delivery/plugin/skills/sql/SKILL.md +66 -7
  91. package/memhouse/deploy.js +1 -1
  92. package/memhouse/flags.js +35 -18
  93. package/memhouse/help.js +37 -0
  94. package/memhouse/host.js +82 -2
  95. package/memhouse/house/HOUSE.md +2 -2
  96. package/memhouse/house/convert-profile.js +638 -0
  97. package/memhouse/house/convert-v3.js +742 -0
  98. package/memhouse/house/doctor-v3.js +324 -0
  99. package/memhouse/house/host-alias.js +85 -0
  100. package/memhouse/house/house.js +3 -3
  101. package/memhouse/house/migrate.js +2 -2
  102. package/memhouse/house/profile-dedupe.js +183 -0
  103. package/memhouse/house/profile-edges.js +554 -0
  104. package/memhouse/house/profile-house.js +430 -0
  105. package/memhouse/house/profile-rollup.js +190 -0
  106. package/memhouse/house/q-cli.js +863 -0
  107. package/memhouse/house/queries-v3.js +1013 -0
  108. package/memhouse/house/reconcile-v3.js +192 -0
  109. package/memhouse/house/records-to-profile.js +174 -0
  110. package/memhouse/house/records-to-rows.js +169 -0
  111. package/memhouse/house/relocate.js +2 -1
  112. package/memhouse/house/schema-choice.js +121 -0
  113. package/memhouse/house/schema-profile.js +290 -0
  114. package/memhouse/house/schema-profile.sql.tpl +398 -0
  115. package/memhouse/house/schema-v3.js +267 -0
  116. package/memhouse/house/schema-v3.sql.tpl +213 -0
  117. package/memhouse/import/claude-ai.js +420 -0
  118. package/memhouse/import/import.js +372 -0
  119. package/memhouse/import/pyjson.js +206 -0
  120. package/memhouse/import/records.js +64 -0
  121. package/memhouse/import/writer-profile.js +192 -0
  122. package/memhouse/import/writer-v3.js +240 -0
  123. package/memhouse/import/zip.js +112 -0
  124. package/memhouse/invitation.js +102 -0
  125. package/memhouse/invitefile.js +5 -2
  126. package/memhouse/plugin-copies.js +176 -0
  127. package/memhouse/provision.js +7 -2
  128. package/memhouse/release-hint.js +24 -0
  129. package/memhouse/resume.js +4 -4
  130. package/memhouse/server/api-v3.js +632 -0
  131. package/memhouse/server/dashboard-auth.js +181 -0
  132. package/memhouse/server/dashboard-port.js +91 -0
  133. package/memhouse/server/queries.js +30 -0
  134. package/memhouse/server/server.js +118 -20
  135. package/memhouse/service.js +1 -1
  136. package/memhouse/share.js +687 -1
  137. package/memhouse/shipper/adapter-capture.js +756 -0
  138. package/memhouse/shipper/capture.js +2571 -0
  139. package/memhouse/shipper/dedupe-profile.js +237 -0
  140. package/memhouse/shipper/dedupe-v3.js +1027 -0
  141. package/memhouse/shipper/forks.js +233 -0
  142. package/memhouse/shipper/log-adapter.js +219 -0
  143. package/memhouse/shipper/maintenance.js +49 -0
  144. package/memhouse/shipper/normalise-run.js +148 -0
  145. package/memhouse/shipper/passlog.js +68 -5
  146. package/memhouse/shipper/profile-capture.js +903 -0
  147. package/memhouse/shipper/ship.js +91 -8
  148. package/memhouse/shipper/snapshots.js +193 -0
  149. package/memhouse/shipper/source-roots.js +111 -0
  150. package/memhouse/version-notice.js +66 -0
  151. package/package.json +14 -7
  152. package/public/THIRD_PARTY_NOTICES.txt +2 -2
  153. package/public/assets/index-CcNnhfM3.js +78 -0
  154. package/public/index.html +1 -1
  155. package/ui/package-lock.json +56 -37
  156. package/ui/package.json +1 -0
  157. package/ui/src/App.jsx +29 -14
  158. package/ui/src/components/ChatSidebar.jsx +69 -12
  159. package/ui/src/lib/api.js +76 -0
  160. package/ui/src/lib/dashboard-token.js +41 -0
  161. package/ui/src/main.jsx +22 -5
  162. package/ui/src/pages/Dashboard.jsx +22 -36
  163. package/ui/third-party-notices.js +119 -0
  164. package/ui/vite.config.js +5 -1
  165. package/docs/releases/v0.18.12.md +0 -59
  166. package/memhouse/COMPETITION.md +0 -221
  167. package/memhouse/DESIGN.md +0 -222
  168. package/memhouse/RESUME-AND-UPDATE.md +0 -182
  169. package/public/assets/index-CnWzrjF3.js +0 -78
package/AGENTS.md CHANGED
@@ -1,149 +1,8 @@
1
- # Working on memhouse
1
+ # Installing and deploying memhouse (for agents)
2
2
 
3
- Conventions for any coding agent in this repository — Claude Code, Codex, Gemini CLI,
4
- OpenCode, whatever comes next. `CLAUDE.md` points here; this file is the canonical copy.
5
-
6
- Constellation-wide rules (worktrees, branch naming, which remotes are frozen) live in the
7
- parent directory's [`CLAUDE.md`](../CLAUDE.md) and are not repeated here.
8
-
9
-
10
- ## Release lines — read before tagging, publishing, or merging a release
11
-
12
- memhouse shipped two lines while the first production house ran the pre-0.18 layout. Since
13
- its conversion there is one line; the rules below are kept because a second line can happen again.
14
-
15
- | line | git branch | npm dist-tag | versions | who installs it |
16
- |---|---|---|---|---|
17
- | the 0.18 line | `release/0.18` (cut at v0.18.11; `main` stays the default branch) | `latest`, and `team` as an alias | 0.18.x | everyone — `npm install -g memhouse` (the production house was converted to the one layout with `memhouse convert`; `release/0.17` is retired) |
18
-
19
- Rules, each learned once:
20
-
21
- - **Tag on the line's branch, publish from the tag, from the primary checkout.** A 0.17.1 was
22
- built on `master` (the retired default) and published from a worktree: the branch and the
23
- registry disagreed for a day, and the package lost its `gitHead`. `misc/publish-guard.js`
24
- runs as `prepublishOnly` and refuses a publish whose version, `--tag`, branch, or HEAD tag
25
- disagree with this table. If you need a new line (0.19.x), edit the table **and** the
26
- guard's `LINES` in the same commit.
27
- - **A fix lands on one line.** Porting to the other is a deliberate merge or cherry-pick with
28
- its own CHANGELOG entry, never assumed. The one-layout (0.18) renamed every room to
29
- `<member>_*`; anything touching room names ports with care (`house/HOUSE.md`).
30
- - **`memhouse update` follows the channel a machine was installed from** (`MEMHOUSE_CHANNEL`),
31
- so a machine on the old line never receives a team build by accident, and vice versa.
32
- - **`master` is retired.** It was the pre-0.18 default; `main` is the default now. Do not
33
- branch from it, tag on it, or push to it.
34
- - **A publish is live when `npm view` says so.** `npm publish` prints `+ memhouse@x.y.z`;
35
- confirm with `npm view memhouse dist-tags --prefer-online`. A version that seems missing
36
- right after a publish is registry lag or a stale local npm cache (`npm cache verify`),
37
- not a "staged" publish. That misdiagnosis cost three releases.
38
- - **Which token.** The publish token is a secret reference, resolved at the moment of use
39
- and lent to the one `npm publish` (a temporary userconfig); never print it.
40
- - **One owner per line at a time.** Before releasing, check for another
41
- session working on the same repo and agree who cuts it; the release record lives in `CHANGELOG.md`
42
- on the line's branch and in `drills/`.
43
-
44
- ## What memhouse is
45
-
46
- A local shipper parses coding-agent sessions (16 adapters covering 18 apps) and writes them as typed rows
47
- into a ClickHouse database the user owns. A **house** is a database; its **rooms** are
48
- tables, one set per **member** and named for them (`mem.alice_messages`). A member holds
49
- one grant — `ON mem.alice_*` — and nothing else in the database; nobody is ever granted the
50
- database itself. `roomNames()` in `memhouse/house/house.js` is the only place a table name
51
- is produced, and `memhouse/provision.js` is the only description of what a member is
52
- granted — the live path executes it and `--print-sql` prints it.
53
- The ClickHouse is whichever one the user points at — local container, their own server,
54
- or ClickHouse Cloud; memhouse runs no service of its own and proxies nothing. There is no
55
- LLM anywhere in the write or read path.
56
-
57
- `memhouse/DESIGN.md` argues the design. `TERMINOLOGY.md` is the canon for names — if a
58
- thing has a name there, use it and do not invent another.
59
-
60
- ## The three instruments, and what each cannot see
61
-
62
- | instrument | asks | blind to |
63
- |---|---|---|
64
- | `npm test` | is the logic right | anything needing a server |
65
- | `misc/invite-matrix.sh` | does it work against a real ClickHouse | anything a person has to read |
66
- | **a drill** | can someone actually use it | nothing — which is why it is slow |
67
-
68
- **[`drills/DRILLS.md`](drills/DRILLS.md) is the drill protocol**, borrowed from
69
- [`kernel`](https://github.com/agent-realm/kernel). A drill is memhouse being used by
70
- agents in real roles who have **not read this repository**. Four things it is easiest to
71
- get wrong:
72
-
73
- - **Write a plan first** — roles staffed, and the situation to create.
74
- - **A plan must contain no expected results**, or it is a test that knows the answer.
75
- - **Agents must run where this repo is unreachable**, or they read the source instead of
76
- reporting the confusion. The installed package's `README.md` and the `/mem:*` skills
77
- *are* in scope; a real user has those.
78
- - **Never fix memhouse mid-drill**, or the record describes a build that never existed.
79
-
80
- Run one after the matrix passes, and before any release that changes a surface a person
81
- touches.
82
-
83
- ## Things this codebase has learned the hard way
84
-
85
- Each of these cost a real incident. They are in the commit log with the measurements.
86
-
87
- - **A probe that says yes to everyone is worse than no probe.** `invite` tested
88
- `SELECT 1 FROM system.users`, which every member passes since they all hold `SHOW USERS`
89
- — so it announced success and then failed at `CREATE DATABASE`.
90
- - **Scope is part of a privilege.** A member holds `CREATE DATABASE` inside their own
91
- database and can mint nothing. Match the grant *and* its scope, never the name alone.
92
- - **A flag that is ignored rather than refused** is how a `--dry-run` typo becomes a real
93
- migration. Every command declares its options in `memhouse/flags.js`.
94
- - **One `data` event is not one keystroke.** Reading a hidden password chunk-at-a-time
95
- hung forever the moment anyone pasted.
96
- - **Row policies are OR'd, so a permissive catch-all fails open.** A second scoped share
97
- saw everything. See `memhouse/share.js`.
98
- - **A skill that reasons about privileges in prose gets it wrong.** Put the logic in a
99
- command and have the skill call it — that is why `memhouse whoami` and `memhouse share`
100
- exist.
101
- - **Never print a credential.** memhouse ships this transcript into the house being
102
- administered, and the archive is insert-only. Expand a shell variable; never a literal.
103
-
104
- ## Testing before you claim it works
105
-
106
- ```bash
107
- npm test # syntax gate + unit checks
108
- misc/invite-matrix.sh <url> <admin-user> <password> # against a real ClickHouse
109
- misc/origin-matrix.sh … # the import/ship data guarantees
110
- memhouse nightly --out /tmp # a real installable tarball
111
- ```
112
-
113
- `node bin/memhouse.js` from a checkout is **not** the product — the files are laid out
114
- differently and the design is sitting next to it. Anything about installation, first run,
115
- or what a user sees must be verified from a built package on a machine without a checkout.
116
-
117
- CI runs `npm test`, both matrices and a headless e2e across ClickHouse 25.11 and 26.7, on
118
- ubuntu only. macOS and Windows are untested there; say so rather than implying coverage.
119
-
120
- ## Releasing
121
-
122
- Version lives in `package.json`, `package-lock.json` and the plugin manifest
123
- (`memhouse/delivery/plugin/.claude-plugin/plugin.json`). All three move together, along
124
- with the memhouse.io badges. `## Unreleased` in `CHANGELOG.md` becomes
125
- `## <version> — <date>`. Tag `v<version>`, push the tag, then publish. A new user-facing
126
- capability is a **minor** bump; so is a behaviour change like refusing a flag that used
127
- to be ignored.
128
-
129
- Every release also has:
130
-
131
- - **A release document**, `docs/releases/v<version>.md`: what changed, what a user must
132
- do, the upgrade steps, deprecations with their removal version, and what was deferred.
133
- The CHANGELOG entry links to it, and the GitHub release uses it as its notes
134
- (`gh release create v<version> --notes-file docs/releases/v<version>.md`).
135
- - **The documentation standard:**
136
- - a short README (what, why, how);
137
- - `docs/`, with tutorials and guides for common operations;
138
- - `examples/`, from smallest to full, each with its own README;
139
- - the agent install section below.
140
-
141
- A change to a command, a flag or a default updates the guide that describes it in the
142
- same PR.
143
- - **A drill** when the release changes a surface a person touches (see above), recorded
144
- in `drills/`.
145
-
146
- ## Installing and deploying memhouse (for agents)
3
+ This file ships with the npm package. It is for an agent installing memhouse for its
4
+ principal. Working on memhouse itself? The conventions for this repository are in its
5
+ `CONTRIBUTING.md`, which is not part of the package.
147
6
 
148
7
  How an agent installs memhouse for its principal, unattended. Every command takes `--yes`
149
8
  and most take `--json`. Follow the first route that applies, and never invent a house.
@@ -166,7 +25,7 @@ with-secret MEMHOUSE_ADMIN_PASSWORD=<reference> -- \
166
25
  memhouse deploy --local --yes
167
26
 
168
27
  # Then verify, and keep it running:
169
- memhouse status --json # connection, rooms, last pass
28
+ memhouse status --json # connection, schema, tables, last pass
170
29
  memhouse whoami --json # which credential, and what it may do
171
30
  memhouse service install # survive reboots
172
31
  memhouse plugins install claude --yes
@@ -175,19 +34,31 @@ memhouse plugins install claude --yes
175
34
  `memhouse prompt --install` prints an install prompt rendered for the current machine,
176
35
  with its state and the one route that applies.
177
36
 
37
+ Which layout an install lands on is not yours to choose: a new house is schema 3, a house
38
+ on the 0.18 rooms keeps them, and an ambiguous house refuses. Moving a 0.18 house to
39
+ schema 3 is an administrator's procedure, in order: `memhouse migrate --v3-prepare`,
40
+ `--v3-convert`, `--v3-reconcile`, `--v3-shares` (as the admin: `MEMHOUSE_ADMIN_USER` and
41
+ `MEMHOUSE_ADMIN_PASSWORD`, like `invite`), then `--v3-switch` on every machine, as its member
42
+ ([`docs/guides/upgrade-to-0.20.md`](docs/guides/upgrade-to-0.20.md)). `memhouse update`
43
+ never does it.
44
+
178
45
  Rules:
179
46
 
180
47
  - **Never put a secret in the conversation, in argv, or in a file you write.** memhouse
181
48
  ships transcripts into the house, and the archive is insert-only. Take passwords by
182
49
  reference (`with-secret`, `MEMHOUSE_ADMIN_PASSWORD`, `--admin-password-file -`). Never
183
- print `~/.memhouse/env`. If a secret reaches a transcript, say so and recommend rotation.
50
+ print `~/.memhouse/env`, nor the dashboard's `~/.memhouse/dashboard-token` and
51
+ `~/.memhouse/dashboard.html` (`memhouse dashboard` opens the dashboard without showing the
52
+ token). If a secret reaches a transcript, say so and recommend rotation.
184
53
  - **Never guess a house.** With no URL from the principal and no invite file, stop and ask.
185
54
  Do not point at `localhost:8123` because something answers there.
186
55
  - **Destructive commands need the principal's explicit yes, for that object:**
187
56
  `memhouse reset`, `deploy --down` (deletes the local house's data),
188
- `uninstall --full-removal`, and any `DROP`/`DELETE` in SQL. Look first, report the
189
- counts, then ask.
190
- - **Verify from the outside.** `status --json` and a row count in `mem.<member>_messages`
191
- are the evidence that it works. A started daemon is not.
57
+ `uninstall --full-removal`, the `migrate --v3-*` steps (they fence writers, rename a
58
+ member's rooms and move its grants), and any `DROP`/`DELETE` in SQL. Run the `--dry-run`
59
+ first, report the counts, then ask.
60
+ - **Verify from the outside.** `status --json` and a row count in
61
+ `mem.<member>_sessions FINAL` (schema 3) or `mem.<member>_messages` (the 0.18 rooms) are
62
+ the evidence that it works. A started daemon is not.
192
63
 
193
64
  The user-facing version of all this is in [`docs/guides/install.md`](docs/guides/install.md).
package/CHANGELOG.md CHANGED
@@ -4,18 +4,252 @@ Versions before 0.8.0 were beta-only. Beta installs of 0.7.x and earlier should
4
4
  uninstall and reinstall — the 0.8.0 layout is new, and an in-place `update` +
5
5
  migration path is planned work, not a promise the old versions can cash.
6
6
 
7
- ## 0.18.12 — 2026-10-29
8
-
9
- Release notes: [`docs/releases/v0.18.12.md`](docs/releases/v0.18.12.md).
10
-
11
- - **Skills:** each `/mem` skill's `allowed-tools` is restricted to the read-only memhouse
12
- commands it teaches, instead of `Bash` as a whole. Any other command goes through the
13
- normal permission prompt. `memhouse update` refreshes installed skills; then
14
- `/reload-plugins`.
15
- - `misc/skill-allowlist-test.js` and `misc/env-guard-test.js` join `npm test`. Test tooling
16
- reads its deploy targets from an untracked `deploy/targets.env`, and fixtures use stand-ins.
17
- - The 0.18 line is cut from `release/0.18`.
18
- - No drill was run for this patch release.
7
+ ## 0.20.1 — 2026-11-02
8
+
9
+ Release notes: [`docs/releases/v0.20.1.md`](docs/releases/v0.20.1.md).
10
+
11
+ - **Dashboard: a browser that refuses sessionStorage still opens it.** The page keeps the token
12
+ in memory for that load when sessionStorage is refused; it used to show the "open it with
13
+ `memhouse dashboard`" page instead.
14
+ - **doctor names the channel when it says a release is the latest.** An unpriced model's hint now
15
+ says "the latest release on '<channel>'", so an install pinned to another line is not told it
16
+ is on the newest release overall. Offline, the hint no longer claims the install is current.
17
+ - **/mem skills: the raw-SQL recipe runs `memhouse room-sql` as written.** The reference's
18
+ schema-2 recipe wrapped it in a `q()` shell function, so every call asked for approval despite
19
+ the skills' pre-approval. It now runs `memhouse room-sql <<'SQL'` directly.
20
+ - **install, invite and `deploy --local` name a refused credential up front.** When the server
21
+ refuses the credential (ClickHouse code 516, or 194 for a missing password), they now stop
22
+ before writing anything with "could not authenticate as '<user>' at <url>", instead of reading
23
+ the house as new and failing at the next step. Code 194 counts as an authentication failure
24
+ everywhere 516 does.
25
+ - **`memhouse <command> --help` prints that command's help.** It used to print the whole page
26
+ for every command. A command with no entry of its own still gets the whole page, and
27
+ `memhouse q --help` lists the named queries (the same as `memhouse q list`).
28
+ - **`memhouse share --list` also lists the shares you received.** Beside who reads your
29
+ sessions, it names each member whose sessions this credential can read, with the command
30
+ that reads them (`memhouse q recent --member <them>`); `--json` adds `received`. An
31
+ administrator is told it reads every member's sessions instead.
32
+ - **`memhouse discover` flags an unreachable house only when it is this install's.** The
33
+ default local address (`http://localhost:8123`) is probed as a discovery; when nothing
34
+ answers there and nothing is configured to use it, it is a plain line, not a ✗. `--json`
35
+ marks each endpoint `configured`.
36
+ - **`memhouse update` on a machine with no member install checks no house.** An
37
+ administrator's machine (only `MEMHOUSE_URL` and the admin variables) used to run the schema
38
+ heal and the migration check as the default member and print its authentication failures as
39
+ the house's state. It now says there is no member install here and skips those steps.
40
+ - **`memhouse members` tells a share from a member's own tables.** Each account's line names its
41
+ own tables, then each member whose sessions it reads ("reads alice's sessions (a share,
42
+ scoped)" or "full", where the row policies can be listed), then any other grant, which
43
+ memhouse does not make itself. A scoped share used to read as a plain list of another
44
+ member's tables. `--json` adds `own`, `shares` and `other`.
45
+ - **A new minor version's first run says so.** The first CLI call of a newer major.minor on a
46
+ machine prints one line to stderr, naming the version it replaces and the shipped release
47
+ notes to read. Patch releases, downgrades and fresh installs say nothing; a stamp in the
48
+ memhouse home (`version-seen`) records the last version that ran. An install from before the
49
+ stamp is read from its home: a 0.18 install moving to 0.20.1 is told "it ran 0.18 or
50
+ earlier".
51
+ - **`memhouse plugins install codex`.** Codex gets a short, marker-delimited block in its
52
+ `AGENTS.md` (never read or print the env file or a `MEMHOUSE_*` value; `MEMHOUSE_URL` is the
53
+ house, `MEMHOUSE_PORT` the dashboard; past sessions go to the skill) and a `memhouse` skill with
54
+ the read recipes, under `CODEX_HOME` or `~/.codex`. `plugins remove codex` takes out exactly
55
+ those: the rest of `AGENTS.md` stays byte-identical, and a `skills/memhouse` that memhouse did
56
+ not install is left alone. Opt-in: nothing is written there unless it ran; the first run of a
57
+ new version refreshes a copy it finds installed. The `/mem` skills stay Claude Code's.
58
+ - **An invite's password expires.** `memhouse invite` sets the new member's password to stop
59
+ working after 7 days (`--expires <days>`, 1 to 365), by the server's clock. The invite's
60
+ output, the invite file and `MEMHOUSE-INVITATION.md` say when. `install --env` lifts the
61
+ expiry when it changes the password, and when `--keep-password` keeps it. An expired invite
62
+ is refused at install with "this invite expired at … ask whoever invited you for a new one",
63
+ before anything is contacted or written. Inviting the same name again says the unused
64
+ account must be removed first (`DROP USER <name>`); its tables are kept and reused.
65
+ `invite --print-sql` prints the same expiry, with a placeholder for the date.
66
+
67
+ ## 0.20.0 — 2026-10-29
68
+
69
+ Release notes: [`docs/releases/v0.20.0.md`](docs/releases/v0.20.0.md). Read its "Read this
70
+ before upgrading" first: `memhouse update` installs 0.20 and does not convert the house to schema 3;
71
+ converting a 0.18 house is an admin step, and a house in daily use is converted on its own
72
+ schedule.
73
+
74
+ - **Schema 3.** A session is keyed by its store (machine, editor, the editor's data folder or,
75
+ for OpenCode, its database file, and the session's id). Each member has the six conversation
76
+ tables of the harness-sessions-sql profile (`<m>_session_parts`, `_session_usage`, `_session_links`,
77
+ `_session_lifecycle`, `_calls`, `_sessions`), plus a capture archive in `<db>_archive`
78
+ (`<m>_session_units`, `_session_sources`) holding every byte as captured. A new house is
79
+ schema 3; joining a house follows its layout.
80
+ - **Ten editors through normalisers** (agy, Copilot CLI, Cursor, cursor-agent, Devin, Gemini
81
+ CLI, Goose, OpenCode, VS Code, Zed); Claude Code and Codex natively; the rest through the
82
+ 0.18 readers.
83
+ - **The host** is sessions-model/host/v0. The 0.18 id is kept as this machine's alias.
84
+ - **Upgrade commands:** `memhouse migrate --v3-prepare`, `--v3-convert`, `--v3-reconcile`,
85
+ `--v3-shares`, `--v3-switch`; each has `--dry-run` and refuses before changing anything.
86
+ `status` calls a shipper that started before the switch or the install stale, repeats
87
+ `memhouse stop && memhouse start`, and exits 1 while its passes fail; `instance` says when an
88
+ install is stranded on the 0.18 rooms; `q schema` says `none` with no house configured.
89
+ - **Share on schema 3** is `SELECT` on exactly the six conversation tables, full or scoped. It
90
+ never reaches meta, events or the archive. The share commands fail closed.
91
+ - **`MEMHOUSE_URL` is the house, `MEMHOUSE_PORT` the dashboard.** `--help`, the env file and the
92
+ configuration guide say so; the house's port is part of `MEMHOUSE_URL`. The `/mem` skills
93
+ install into Claude Code only, and `--help` and the install guide say how other agents read
94
+ the house (`memhouse q`, `memhouse room-sql`).
95
+ - **Security: member names that collide are refused.** `mem.bob_*` also matches `bob_smith`'s
96
+ tables (read and write; true on 0.18 too). install and invite refuse such a name, doctor
97
+ names an existing pair. Admins: check your members.
98
+ - **Security:** The dashboard now requires a per-user token; a loopback connection alone is no
99
+ longer enough. Open it with `memhouse dashboard`.
100
+ - When the dashboard's port is in use, possibly by another account on this machine, the
101
+ dashboard takes the next free port up to 10 above and says which (`memhouse status` and
102
+ `memhouse dashboard` use it); a dashboard that cannot start is a warning from
103
+ `memhouse start`, not a failure.
104
+ - **Reading an editor's SQLite store never writes into it** (0.18 could leave `-wal`/`-shm`
105
+ files in an editor's folder).
106
+ - **`memhouse import claude-ai`** stores a claude.ai data export in the house: the `.zip`, the
107
+ unpacked export, or an archive folder filed by project. Each conversation becomes a
108
+ `claude-ai` session with origin `import`, in one batch per run.
109
+ - **A dry run unless `--write`.** It prints counts only.
110
+ - **A later export adds only conversations the house does not hold.** `--update` also
111
+ replaces the ones changed since.
112
+ - **Batches.** Each batch is recorded in the member's meta. `--list` shows them, and
113
+ `--undo <batch> --write` tombstones one.
114
+ - **Changed at the same `updated_at`.** A conversation whose content differs from what the
115
+ house holds, at the same `updated_at` (a summary claude.ai added later, a rename), counts as
116
+ changed. An export older than the house's copy never replaces it.
117
+ - **The export's part zips** (`conversations-000.zip`, `design_chats-000.zip`, …) are read as
118
+ given, or from their folder; the older single zip still works.
119
+ - **On the profile tables** (`<m>_session_parts`, `_calls`, `_sessions`) a conversation is a
120
+ session in the service's store: host `s-` plus 32 hex (sessions-model's service host for
121
+ `claude.ai`), `harness_path` `https://claude.ai`, adapter `memhouse-import`. The keys are the
122
+ parser's, as on layout 3.2, and so are the digest and `--update`. A development house's 3.2
123
+ tables are still written; a member with both is written on the profile.
124
+ - **A run that stops part way is finished by the next.** Sessions whose totals were not
125
+ filled are refreshed by the next `--write`, and a batch whose rows all went in then reads
126
+ `applied`. An undo records `undoing` before it starts, so a stopped undo is never taken for a
127
+ stopped write; running it again finishes it.
128
+ - Guide: [`docs/guides/import-claude-ai.md`](docs/guides/import-claude-ai.md).
129
+ - `memhouse q` named queries; `q removed`; the dashboard and `/mem` skills read schema 3.
130
+ - The `/mem` skills write every command as plain `memhouse …`, the form their pre-approved read
131
+ commands match, so those run without a prompt; a share you received is found with `SHOW TABLES`
132
+ and read with `memhouse q … --member <them>`, not looked for with `SHOW DATABASES`.
133
+ - **Deleted sessions on the profile layout** (Claude Code and Codex in 0.20) are recorded as gone,
134
+ their records kept, only when the editor's reader answers that they are not there: a session
135
+ a short list leaves out but the reader still finds is captured as usual. Only a store whose list
136
+ names none of the sessions the house holds of it is refused whole.
137
+ - **The shipper log and doctor say so.** A store the pass refused prints a `vanish refused:`
138
+ line after the pass line and fails `memhouse doctor` until a later pass is clean; a listed
139
+ session's source the list left out that still reads is a `vanish warning:`, shown by doctor
140
+ without failing.
141
+ - **doctor: an unpriced model is a warning.** It no longer fails `memhouse doctor`, and its hint
142
+ names `memhouse update` only when a newer release exists; on the latest release it says the
143
+ model's cost stays unknown until a release prices it.
144
+ - **`memhouse doctor --confirm-empty-store <editor>:<store>`** confirms a store whose every
145
+ session was deleted (an empty list is refused, since an unreadable store gives one too), for
146
+ the sessions its last pass refused.
147
+ - **The archive write** of a pass carries one `captured_at` set by the capture, and writes its
148
+ units before its read manifests, so a replay from the archive alone sees the pass it was.
149
+ - Guide: [`docs/guides/daemons.md`](docs/guides/daemons.md) (Logs).
150
+ - Fixed in the release work: `invite` follows the house's layout; `deploy --local` builds the
151
+ schema-3 tables; a machine without Claude Code or Codex ships its other editors; example 04
152
+ backs up the archive; Gemini CLI tokens use the house split (cached tokens were charged
153
+ twice and thoughts not at all), through the usage flags `input_includes_cache` and
154
+ `output_includes_reasoning` (sessions-model §2.4); `--v3-convert` takes the cached tokens out
155
+ of 0.18's Gemini CLI input, where 0.18 counted them twice (0.18 never stored Gemini's
156
+ thoughts, which cannot be recovered).
157
+ - The invitation page `invite` writes (`MEMHOUSE-INVITATION.md`) lists the tables the invite
158
+ created, by the house's layout, and names the env file the invite wrote (`--out` included)
159
+ instead of `ls invite-*.env`.
160
+ - Fixed in the normalisers: Zed usage is the thread's `cumulative_token_usage`, one per-session
161
+ series kept as appended increments (it took only each turn's last request); Copilot CLI keeps
162
+ a capped reply's usage record and a compaction's own tokens; an unknown Zed message keeps its
163
+ place, so the anchored ids after it do not shift; a Copilot CLI fork ignores the markers it
164
+ copied from its origin. Both normalisers' `VERSION` rose, so a machine that ran a pre-release
165
+ re-derives its Zed and Copilot CLI sessions.
166
+ - Known issues, retired when memhouse reads editors through the harness-session-adapters package: Devin
167
+ token totals exclude abandoned branches in 0.20; seven low-impact normaliser differences
168
+ (Copilot CLI effort, orphan tool results and encrypted reasoning; a VS Code synthetic call id;
169
+ an OpenCode redaction marker and v2 usage basis; optional fields left empty). See the release
170
+ notes.
171
+ - Known issue: a session whose capture state (its `files` row and the machine's capture cache)
172
+ is lost after its log was rewritten repeats its time-less records in `turns`; its totals are
173
+ not affected. See the release notes.
174
+ - Known issue: `memhouse import claude-ai` takes no lock. Run one import or undo per member at a
175
+ time; two at once can split a conversation between two batches or leave a batch's recorded
176
+ status wrong. See the release notes.
177
+ - **Apache-2.0** from this release (below).
178
+
179
+
180
+ - **A fork's copied prefix is billed once.** Forks copy their origin's messages, usage included.
181
+ The house used to bill them in both sessions; now the copies are verified on full content and
182
+ billed only in the origin.
183
+ - Explicit links: agy, Copilot CLI. On the profile tables memhouse resolves each into one
184
+ engine edge on the fork (`session_links`, owner `engine`), verifies it, and the rollup leaves
185
+ the fork's copied usage out of its totals. A fork captured before its origin is verified when
186
+ the origin arrives; a rewound origin gives the copies back.
187
+ - Forks without a pointer, found by content (OpenCode, VS Code, cursor-agent, Cursor, Goose):
188
+ a session whose first reply is an earlier session's in the same store is nominated, verified
189
+ the same way, and recorded as an inferred edge; it ends when the verification no longer
190
+ holds. A pass verifies at most 100 nominated forks and owes the rest to the next.
191
+ - The copies stay messages of the fork.
192
+ - A link an editor states (sub-agent, fork, rewind copy, clear, continuation) whose two sessions
193
+ are both in the same store is resolved into one engine edge on the profile tables
194
+ (harness-sessions-sql §4.5), stated on the child's side, the origin's or both. Only forks and rewind
195
+ copies are verified and billed once; the others are lineage. A link to another store gets no
196
+ edge, nor does one whose child cannot be named in the store (not stored by the editor, or an
197
+ id with two lives); one whose origin cannot be resolved gets an unverified edge.
198
+ - **Removed content in view.** `memhouse doctor` reports what is kept as removed versions (a
199
+ revert, a rewind, a message deleted at the source), and the forks billed once.
200
+ `memhouse q removed` lists those messages.
201
+
202
+ - **Read manifests (harness-sessions-sql §4.1).** Every read that opens a generation, or moves a cursor,
203
+ archives a manifest row beside its records. It lists the units the read delivered, so the
204
+ archive alone replays an emptied or shrunk source correctly: before this, a rewrite to empty
205
+ left no row in its generation, and a replay took the previous one. `replayArchive` is that
206
+ replay.
207
+ - A session file the harness deleted stays in the house, and is recorded once as
208
+ `source_gone` with `"policy": "kept"`.
209
+ - A file that comes back is read again from the start.
210
+ - Details: `docs/design/sessions-engine.md` (repository) item 8.
211
+ - **A pass that stops and is run again archives its read once.** A source the stopped pass read
212
+ from scratch (no cursor yet, or a reset) was read again from scratch and archived under a new
213
+ generation, so the archive held the same units twice. A re-read that delivers exactly what the
214
+ generation the stopped pass opened holds now stays in it and moves only its position; other
215
+ content, or a source that vanished in the stopped pass, still opens the next generation.
216
+ Streams, snapshots and empty delta sources were affected.
217
+ - **The profile tables follow harness-sessions-sql v1's types.** `adapter_ver` is the version string an
218
+ adapter states (`0.2.0`), not a number; a link's `child_stored` is null when its statement does
219
+ not say; an archive unit with no original bytes has a null `orig_sha256`. The schema step brings
220
+ an older table to these types (`MODIFY COLUMN`, these three columns only, and the old defaults
221
+ removed). A member retypes its conversation tables itself; the two archive tables need an admin
222
+ (`memhouse install --schema 3 --admin-user …`), and until then the capture writes them in the
223
+ old types and `--ensure-schema` says so. The capture reads an old numeric `adapter_ver` back as
224
+ the version it encodes. Versions have no order, so a row another version of the same adapter
225
+ wrote is an upgrade's, whichever is newer.
226
+ - **An adapter upgrade re-derives a session from its archive, removed versions included.** The
227
+ first pass under a new adapter version replays the session's archived passes one by one under
228
+ that version (harness-sessions-sql §8, "Re-derive from the archive"):
229
+ - every record the new version makes is written again above the house's revs, at the new
230
+ version, whether it is current or a removed version;
231
+ - every key the new version no longer makes is deleted, a removed version included (before
232
+ this, removed versions kept the old version and the old keys, and an old removed key was never
233
+ deleted);
234
+ - a pass that also reads a change replays up to each cursor, then applies the change.
235
+
236
+ - **memhouse is relicensed from MIT to Apache-2.0, from 0.19.0.** That covers the whole
237
+ repository: CLI, shipper, dashboard, tools and docs. Releases up to and including 0.18.11
238
+ remain MIT; that text is kept in `LICENSES/memhouse-MIT-until-0.18.11.txt`.
239
+ - `LICENSE` is the Apache License 2.0, verbatim from apache.org.
240
+ - `NOTICE` credits:
241
+ - agentlytics (Fatih Kadir Akın, MIT as declared in its README;
242
+ `LICENSES/agentlytics-MIT.txt`).
243
+ Every commit by an author other than Ramazan Polat predates the fork at `4cba3d8`
244
+ (2026-06-21);
245
+ - models.dev, the source of `pricing.json` (MIT; `LICENSES/models.dev-MIT.txt`);
246
+ - the dashboard's bundled packages, via `public/THIRD_PARTY_NOTICES.txt`.
247
+ - `package.json` and `ui/package.json` declare `Apache-2.0`. The npm package now also
248
+ ships `NOTICE` and `LICENSES/`, and CI's tarball audit checks for both.
249
+
250
+ - **Security reports go to security@memhouse.io.** `SECURITY.md` and the troubleshooting
251
+ guide name it, and `package.json`'s `bugs` field carries it. `package.json` no longer names
252
+ a repository while the repository is private.
19
253
 
20
254
  ## 0.18.11 — 2026-10-10
21
255
 
@@ -84,7 +318,7 @@ subagents once.
84
318
  update for this install" (a tarball is on no registry tag), exited 1, and left the old
85
319
  shipper running the old code in memory. `--no-install` no longer needs a channel: the
86
320
  files are already in place, and the restart, migrations and schema check run. Found while
87
- upgrading testbed from 0.18.9 to a nightly of this release.
321
+ upgrading a test VM from 0.18.9 to a nightly of this release.
88
322
 
89
323
  - **A subagent caught before its first line is written holds its session for one pass.**
90
324
  A subagent with no timestamped line ranked last. When its first line then landed with an
@@ -120,7 +354,7 @@ subagents once.
120
354
  - An admin given for this command (`--admin-user` or an exported
121
355
  `MEMHOUSE_ADMIN_USER`, with its password from a file, stdin, the environment or a
122
356
  prompt) still provisions at `--url`.
123
- - `misc/invite-matrix.sh` points `--url` at a spy server and asserts it receives
357
+ - `misc/invite-matrix.sh` (repository) points `--url` at a spy server and asserts it receives
124
358
  nothing but a ping.
125
359
  - **The dashboard no longer goes empty on a quiet house (G11).** The stats tables carry a
126
360
  one-day TTL and were refreshed only by a pass that shipped something. So a house whose
@@ -141,7 +375,7 @@ subagents once.
141
375
  by `seq` arithmetic, which a subagent's block numbering defeats.
142
376
  - **`HOUSE.md`'s subagent queries keep to the current parse (A3).** They had no epoch
143
377
  filter, so a re-parsed session doubled each subagent's turns.
144
- - `misc/skill-recipe.sh` now runs these queries verbatim, extracted from the docs, against
378
+ - `misc/skill-recipe.sh` (repository) now runs these queries verbatim, extracted from the docs, against
145
379
  fixture rows with a superseded parse and a subagent block.
146
380
 
147
381
  ## 0.18.10 — 2026-10-08
@@ -167,7 +401,7 @@ changed, the upgrade steps, and the status of the 0.18.10 pre-tag list.
167
401
  it. They also print the env-file lines to hand over, with `MEMHOUSE_INVITE=1` from
168
402
  `invite`, so the member's `install --env` offers rotation. A `--member-password` given
169
403
  with `--print-sql` is not echoed.
170
- - `misc/invite-matrix.sh` checks the output of every install, invite and passwd path
404
+ - `misc/invite-matrix.sh` (repository) checks the output of every install, invite and passwd path
171
405
  against the real passwords. A unit test fails on any print call that interpolates a
172
406
  password variable.
173
407
  - **Docs:** `memhouse passwd --member` does not exist. `--member` was accepted and ignored
@@ -295,7 +529,7 @@ The first release on **one line**: published to `latest` and `team` alike. The f
295
529
  - **A member's env repairs itself after the move.** `memhouse update` and the shipper's
296
530
  startup both notice that `<db>.messages` is gone and `mem.<name>_messages` exists, and
297
531
  rewrite `MEMHOUSE_DB=mem`; `doctor` names it. So the member's whole upgrade is one
298
- command. Rehearsed by `misc/convert-matrix.sh`: a real 0.17.1-built house on 26.7,
532
+ command. Rehearsed by `misc/convert-matrix.sh` (repository): a real 0.17.1-built house on 26.7,
299
533
  converted, shares intact, isolation intact, the member's old env adopted, 24/24.
300
534
 
301
535
  ## 0.18.4 — 2026-09-17
@@ -385,7 +619,7 @@ the drill taught:
385
619
  — restart it: memhouse stop && memhouse start`, and a `✗` in doctor.
386
620
  - The invitation guide says what to do when an agent's `npm install -g` is blocked by a
387
621
  permission classifier: the person runs step 1, the agent continues from step 2.
388
- - `drills/DRILLBOOK-team-arrival-2026-09-10.md` and the drill record.
622
+ - `drills/DRILLBOOK-team-arrival-2026-09-10.md` and the drill record (repository).
389
623
 
390
624
  ## 0.18.1 — 2026-09-08
391
625
 
@@ -591,7 +825,7 @@ possible.
591
825
  is left alone so a shared room still reads.
592
826
 
593
827
  Written with `[[:space:]]` classes, not `\b`: **BSD `sed` does not support `\b`**, and
594
- the first version matched nothing on macOS. `misc/prefix-skill-recipe.sh` extracts
828
+ the first version matched nothing on macOS. `misc/prefix-skill-recipe.sh` (repository) extracts
595
829
  `q()` from the reference and runs it against both layouts — the doc is executable
596
830
  because it is load-bearing.
597
831
 
@@ -634,7 +868,7 @@ possible.
634
868
  the skill most likely to produce a number someone acts on, never mentioned it. Schema,
635
869
  connection, the three traps and the known measurement gaps now live in one file every
636
870
  skill points at. 11,388 words became 5,854.
637
- - **`/mem:recall` restores a name the canon already carried** (`TERMINOLOGY.md`: `memorecall`
871
+ - **`/mem:recall` restores a name the canon already carried** (`TERMINOLOGY.md`, repository: `memorecall`
638
872
  retired in favour of `/mem:recall`, 2026-07-29). Its description carries every trigger
639
873
  phrase the three skills it replaces had, so auto-triggering does not narrow.
640
874
  - **The CLI no longer advertises a directory as a skill.** `plugins` listed
@@ -847,7 +1081,7 @@ possible.
847
1081
 
848
1082
  - **`memhouse relocate --to <url>` moves a whole house to a new ClickHouse.** The copy is
849
1083
  a server-to-server `remoteSecure()` INSERT SELECT — the destination pulls each room
850
- directly from the source over the native protocol, so the pilot's laptop is never in the
1084
+ directly from the source over the native protocol, so the user's laptop is never in the
851
1085
  data path and, crucially, **the shipper never re-ingests**: once the new host holds a
852
1086
  faithful copy, the shipper's skip predicate sees every old session already present and
853
1087
  ships only genuinely new work. Provenance is carried, not restamped
@@ -858,12 +1092,12 @@ possible.
858
1092
  SOURCE is only ever read — a failed run leaves the old house intact — and a hard
859
1093
  row-count gate must pass before the local config is repointed (the previous env is kept
860
1094
  as `env.pre-relocate`). Flags: `--to-user/--to-password/--to-db`, `--from-native-host`
861
- (when the destination's route to the source differs from the pilot's URL),
1095
+ (when the destination's route to the source differs from the user's URL),
862
1096
  `--from-native-port` (default 9440 TLS), `--insecure-native` (`remote()` + 9000),
863
1097
  `--keep-shipper`, `--dry-run`, `--yes`. The source password reaches the destination's
864
1098
  `query_log` (never this transcript) — rotate it after if those logs are not yours.
865
1099
  - This is the host-to-host data-copy piece named in
866
- `docs/design/host-repoint-reconciliation.md`; the reconciliation gate (detecting an
1100
+ `docs/design/host-repoint-reconciliation.md` (repository); the reconciliation gate (detecting an
867
1101
  *accidental* repoint at an empty host) remains deferred.
868
1102
 
869
1103
  ## 0.11.3 — 2026-08-20
@@ -954,7 +1188,7 @@ possible.
954
1188
  it detects what the house needs: `--migrate` (or `--yes`) runs them unasked,
955
1189
  an interactive session is asked once (the inner confirm is not repeated), and a
956
1190
  non-interactive run only names them and prints the command — a cron must never start
957
- a house-wide copy on its own. `update --no-install` skips the npm/git step for pilots
1191
+ a house-wide copy on its own. `update --no-install` skips the npm/git step for users
958
1192
  who already upgraded by hand and want the half a bare `npm i -g` leaves undone.
959
1193
  - **`memhouse uninstall` asks first.** It used to start removing the service the moment
960
1194
  it was typed. It now prints exactly what the chosen tier removes and keeps (the house
@@ -979,8 +1213,8 @@ possible.
979
1213
  a pre-0.10 machine still writing.
980
1214
  - **The plugin is `mem` now, and it answers questions.** Skills install as `/mem:ask`,
981
1215
  `/mem:search`, `/mem:sessions`, `/mem:sql` (the `mem` short name belonged to the
982
- retired memory-house and moves to the living product). `/mem:ask` is new: retrieve the
983
- relevant past sessions, read the transcripts, answer with citations — the synthesis is
1216
+ retired memory-house, the predecessor tool of memhouse, and moves to the living product).
1217
+ `/mem:ask` is new: retrieve the relevant past sessions, read the transcripts, answer with citations — the synthesis is
984
1218
  the agent's; memhouse itself still runs no LLM anywhere. The installer removes a
985
1219
  pre-0.10 `skills/memhouse/` copy (only when it is provably ours) so the old and new
986
1220
  namespaces never load side by side.
@@ -1005,7 +1239,7 @@ possible.
1005
1239
  looks for `origin`), but its delete-before-reinsert reaches every retained parse of a
1006
1240
  session it re-ships. `memhouse migrate` warns about this at migration time.
1007
1241
  - **`memhouse migrate-rooms`** rebuilds rooms whose sorting key predates this version:
1008
- copy, one atomic `RENAME`, old room kept as `<room>_pre_epoch` for the pilot to drop.
1242
+ copy, one atomic `RENAME`, old room kept as `<room>_pre_epoch` for the user to drop.
1009
1243
  Nothing is deleted, and `user_id` is carried across explicitly rather than restamped —
1010
1244
  it is `MATERIALIZED currentUser()`, so a plain `INSERT SELECT` would reassign every row
1011
1245
  in a shared house to whoever ran the migration. Rows a running shipper writes during the
@@ -1031,7 +1265,7 @@ now the whole install.
1031
1265
  - **`--allow-scripts=better-sqlite3` is retired.** It was required on every install and
1032
1266
  every upgrade, npm never remembered it, and omitting it left cursor, zed, opencode,
1033
1267
  goose and antigravity reading zero sessions — indistinguishable from editors the
1034
- pilot does not have. That failure class no longer exists, so the probe that reported
1268
+ user does not have. That failure class no longer exists, so the probe that reported
1035
1269
  it (`MISSING_BINDING`, `probeSqlite`) and the `missingBinding` flag on every
1036
1270
  `getAdapterErrors()` entry are removed. Per-store failures — locking, permissions,
1037
1271
  corruption, schema drift — are reported exactly as before.
@@ -1100,7 +1334,7 @@ now the whole install.
1100
1334
  messages/tool_calls sorting keys and bound in the shipper's clear. The bug this fixed
1101
1335
  destroyed 27,948 imported messages in a single pass.
1102
1336
  - Local house delivery (`deploy --local`, docker/podman), OS service integration,
1103
- the herdr-driven acceptance suite, `memhouse.io`.
1337
+ the herdr-driven acceptance suite (repository), `memhouse.io`.
1104
1338
 
1105
1339
  ## 0.3.x — 2026-07-22 → 2026-07-31
1106
1340