memgineering 0.26.0 → 0.28.0

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.
package/CHANGELOG.md CHANGED
@@ -9,7 +9,243 @@ upgrade and by agents summarising a release, and both re-render it in whatever
9
9
  language the reader wants. The bilingual rule the monorepo applies to
10
10
  `@rayul/kordis` does not extend here.
11
11
 
12
- ## [Unreleased]
12
+ ## [0.28.0] — 2026-11-01
13
+
14
+ ### Added
15
+
16
+ - **`memgineering delete-account` deletes your account — the hosted brain
17
+ account and the registry account the same Google sign-in made — in one
18
+ command.** Brain first (every brain on it, every note, every token), then
19
+ the registry account (profile, stars, follows, comment text, sign-ins;
20
+ the account is renamed `deleted-…`, and its published packages and versions
21
+ stay at their existing addresses), then this machine is signed out. It is confirmed with the sentence `delete my account`: typed at
22
+ the prompt, or passed as `--confirm "delete my account"`. Without either and
23
+ with no terminal to ask in, it refuses; there is no dry run. Folders on this
24
+ disk are never touched.
25
+ - **Before deleting anything it checks both sign-ins work and are one
26
+ person's** — the two accounts' emails, or, when either account has no email
27
+ on record, this machine's registry sign-in, which the brain sign-in issued. `--json` reports which as `matched` (`email`, `federation`, or
28
+ `earlier-run`). Two different people answer `account_mismatch`; a machine
29
+ signed in to a brain with no registry half answers `not_linked`; a machine
30
+ signed in to nothing answers `not_signed_in` (a brain kept in a folder has
31
+ no account). Each refusal says nothing was deleted and how to go on,
32
+ including mailing support@memgineering.com.
33
+ - **A run that stops halfway can be finished.** If the registry fails after
34
+ the brain account is gone, the command answers `account_partly_deleted`
35
+ and keeps a progress file (`delete-account.json` in the memgineering home,
36
+ mode 600); running it again skips the brain and deletes only the registry
37
+ account, and the file is removed when both are done. An answer lost on the
38
+ way back is checked with the server rather than guessed. `--json` on success:
39
+ `{deleted, brain: {status, account_id, api_url}, registry: {status, user_id,
40
+ username, api_url}, matched, credentials_cleared, pointer_cleared,
41
+ local_folders, hint}`, where each `status` is `deleted` or `deleted-earlier`.
42
+ - **`memgineering logout --all` reports what it ended in the registry.** On a
43
+ server with "disconnect everything", `--all` also ends every registry sign-in
44
+ of the same Google account, and anything approved before that moment can no
45
+ longer finish. `--json` passes the server's `registry_sessions` (`revoked`
46
+ with a count, `not_linked`, or `unreachable` with a `hint`) and
47
+ `revoked_before` on unchanged, and the human output gives the registry result
48
+ its own line (none when there were no live registry sign-ins to end). The existing `registry` field keeps its meaning: this machine's
49
+ registry session.
50
+ - **`memgineering logout --all` with nothing signed in says how to do it** —
51
+ the website's "disconnect everything" button, or `memgineering login` and
52
+ then `logout --all` — in a `hint`, instead of only "nothing to do".
53
+
54
+ ### Changed
55
+
56
+ - **`logout --all` no longer ends this machine's registry session separately
57
+ when the server already ended every registry session.** An older server, an
58
+ unreachable registry, or an account the server found no registry link for
59
+ still gets this machine's session ended as before.
60
+
61
+ ### Fixed
62
+
63
+ - **`registry search` with nothing searchable in the query finds nothing**
64
+ (registry-side, every version). A query of only emoji or punctuation used to
65
+ return every package as a match; it now returns no results.
66
+
67
+ ### Known issue
68
+
69
+ - **An older CLI can report `registry: revoke-failed-expires-on-its-own` after
70
+ `logout --all` against an updated server.** The server has already ended the
71
+ registry session, so the old CLI's own attempt finds it gone and reports a
72
+ failure that did not happen. Upgrading fixes the report; nothing is left
73
+ signed in.
74
+
75
+ ### Agent guidance
76
+
77
+ - `memgineering-setup` describes `delete-account`: when to run it (only on an
78
+ explicit request), what it deletes and keeps, the refusals, and what to tell
79
+ the user after `account_partly_deleted`. Restart the agent session after
80
+ upgrading to pick it up.
81
+ - `memgineering-setup` also points a person with no terminal to the "Delete my
82
+ account" section at the bottom of memgineering.com/brain (one tick), which
83
+ deletes the same two accounts. Restart the agent session after upgrading to
84
+ pick it up.
85
+ - `memgineering-setup` now says a Google account that never opened a brain can
86
+ delete its registry account from the same page: the consent screen shows a
87
+ "Delete my account" section below the terms. Only an account that never
88
+ signed in with Google, and a brain account whose terms were never accepted,
89
+ are deleted by mail to support@memgineering.com. Restart the agent session
90
+ after upgrading to pick it up.
91
+ - `memgineering-setup` describes `logout --all` as "disconnect everything" and
92
+ what to tell the user for each `registry_sessions` answer. Restart the agent
93
+ session after upgrading to pick it up.
94
+ - `memgineering-setup` no longer says consent is asked only once. The terms
95
+ are agreed once per account; connecting a chat app asks on every connection
96
+ for two consents — to giving what it reads and writes to the company that
97
+ runs it, and to that company being in the United States — and without both
98
+ ticks the app is not connected. It says what the connect screen tells the
99
+ person (what is sent, automatically at the start of every conversation and
100
+ without asking each time it records; the company's purpose, model training
101
+ included; how long it keeps it), that a program on their own computer asks
102
+ for no tick, that a refused unknown app (`unknown_connector_recipient`) is
103
+ answered by suggesting Claude or Gemini, and that a "notice changed" screen
104
+ is reloaded and approved again. Restart the agent session after upgrading to
105
+ pick it up.
106
+ - `memgineering-setup` says **connecting ChatGPT is paused** for now
107
+ (`connector_recipient_paused`, while the notice about OpenAI is verified):
108
+ agents offer Claude or Gemini instead of walking the user through ChatGPT's
109
+ Developer mode. The hub and `memgineering setup --help` say the same beside
110
+ ChatGPT's route, which works again once the pause ends.
111
+
112
+ ## [0.27.0] — 2026-10-18
113
+
114
+ ### Added
115
+
116
+ - **`recall --json` says why nothing the user wrote came back.** An answer
117
+ with no card the user wrote — no cards at all, or only cards still exactly
118
+ what `init` wrote (`scaffolding: true`) — had no `hint`: most of the advice
119
+ the terminal footer gives was left out, and so was a hosted brain's own
120
+ `hint`. It now carries `hint`, the single most specific next step, and an
121
+ answer of template cards only keeps its cards; `hint` is absent whenever a
122
+ card the user wrote came back. First, a brain with nothing to search. One
123
+ with no notes yet (for a hosted brain, as its account listing reports) gets
124
+ the `remember` command that writes the first one there — or, after `--brain`
125
+ named a brain this machine does not point at, the `memgineering use --brain`
126
+ that makes it the target, since `remember` has no `--brain`. A folder brain
127
+ that left out everything it had gets "Nothing in this brain could be
128
+ searched: …", described below. After that: notes in a script the question is
129
+ not in, other brains that were not read (a `--brain` or `--vault` command for
130
+ each), meaning that was not searched (with the server's reason), the hosted
131
+ server's own advice, and last, what was searched in this brain and what to
132
+ try there — fewer or broader words, `--depth standard` after
133
+ `--depth exact`, or dropping `--scope`.
134
+ - **`reindex` and `push` name the symlinks they did not follow.** The walk
135
+ never follows a symlink, so notes in a folder behind one were counted
136
+ nowhere and named by nothing. `reindex`, and a `push` that has notes to
137
+ send, now list every symlink that is not itself a note — under `--json` as
138
+ the new `skipped_other_symlinks`, beside `excluded_folders` — and a left-out
139
+ count beside a non-empty one of either is a floor, not the whole answer. A
140
+ `push` with nothing to send still calls such a folder empty and names no
141
+ link.
142
+
143
+ ### Changed
144
+
145
+ - **`recall` says when a brain in a folder left notes out of the search, in
146
+ the terminal as well as in `--json`.** The notes it counts were excluded by
147
+ the user's rules, listed in `.memgdeny`, held back because the name looks
148
+ private, refused because the content looks like a credential, or sit behind
149
+ a symlink. Notes inside a folder the rules exclude are not among them: the
150
+ walk never looks inside such a folder, so they are neither searched nor
151
+ counted. Whenever no card the user wrote came back — no cards at all, or
152
+ only cards still exactly what `init` wrote — and one of those notes was left
153
+ out, the answer says how many and why, lists beside them any excluded
154
+ folders and other symlinks nobody looked inside, and says that
155
+ `memgineering reindex` names each one: in the terminal under
156
+ `_Nothing matched._`, or under the "Nothing you have written matched this."
157
+ header above template cards, and under `--json` at the start of `hint`.
158
+ Excluded folders and other symlinks on their own, beside notes that were
159
+ searched, change nothing. When every note was left out — nothing indexed,
160
+ and the walk left out notes, or only folders and links it never looked
161
+ inside, which are not evidence of a note — the answer says "Nothing in this
162
+ brain could be searched: …" and nothing more about the brain: that sentence
163
+ and the `reindex` command are the whole `hint`, and the terminal no longer
164
+ adds "try fewer or broader words". When other notes were searched and one of
165
+ the counted notes was left out, `hint` starts with "Not every note in this
166
+ brain was searched: …" and goes on with the step it would otherwise give,
167
+ whose last-resort sentence then reads "Within the rest of this brain, …".
168
+ Recall never names a held-back note or shows its content. In the terminal, a
169
+ folder with no notes and nothing left out, answers with at least one card
170
+ the user wrote, and empty answers where notes were searched and none of the
171
+ counted kinds was left out all look as they did.
172
+ - **An answer of template cards only now names the brains the recall did not
173
+ read.** In the terminal it lists them under its header, with the command
174
+ that reads each, as an empty answer always has — except when the notes being
175
+ in another script is the reason: then, as for an empty answer, the script
176
+ notice prints instead of that block, and `hint` carries the script sentence
177
+ rather than the other-brains step, after the left-out count when a note was
178
+ also left out.
179
+
180
+ ### Fixed
181
+
182
+ - **Two memgineering commands refreshing the registry sign-in at once no
183
+ longer cost one of them its link.** On a machine signed in to the registry,
184
+ a `memgineering registry` command refreshes that sign-in as it starts, and
185
+ the registry rotates the token on every refresh, so of two commands that
186
+ refresh together it refuses the second. That one used to report the link as
187
+ gone (`not_linked`, with "`memgineering login` re-links both"), or, for the
188
+ verbs that can read without an account — `registry search`, `read`, `pull`
189
+ and the like — carry on anonymously. It now waits up to about two seconds
190
+ for the token the winning command saved and retries once with it, never
191
+ with its own spent token. If the retry loses too — with three or more
192
+ commands started together, say — or no newer token turns up within those
193
+ two seconds, a command that needs the sign-in reports `not_authenticated`
194
+ with a hint to run it again, and one that can read without it reads
195
+ anonymously, as before. Running it again does not always work: when the
196
+ command that won was a `logout`, or its save never landed, the next run
197
+ finds no newer sign-in and reports `not_linked`.
198
+ - **A busy or unreachable registry no longer reads as an expired link.** A
199
+ command that needs the registry sign-in, such as `registry publish`, turned
200
+ every failed refresh into `not_linked` and pointed at `memgineering login`,
201
+ which fixes neither. A refresh that meets a rate limit, a server error or no
202
+ network now reports that: `rate_limited`, the registry's own code, or
203
+ `server_unreachable`.
204
+ - **The sign-in file is no longer briefly missing while it is written.**
205
+ `credentials.json` used to be deleted and then written again, so a command
206
+ that read it in between took this machine for signed out. Saving it now
207
+ writes a new file and renames it into place (still mode 600), and a stale
208
+ temp file left by a crash is swept by a later save; a sign-out still deletes
209
+ the file. Changes also take a lock, and a rotated registry token is saved
210
+ only while the file still holds the token its refresh spent, so a sign-in or
211
+ sign-out that lands while another command's refresh is out is kept rather
212
+ than overwritten. A change that cannot take the lock within two seconds goes
213
+ ahead without it, and a lock held for more than 30 seconds is taken over as
214
+ dead; in either case the two can still cross.
215
+ - **`logout` revokes the registry session even when a command beside it has
216
+ just refreshed it.** It reads the sign-in file again right before revoking,
217
+ and its refresh retries a lost race the same way, where it used to give up
218
+ and leave the session to expire on its own
219
+ (`"registry": "revoke-failed-expires-on-its-own"` under `--json`).
220
+
221
+ ### Agent guidance
222
+
223
+ - `memgineering-recall`: with `--json`, an answer with nothing the user wrote
224
+ in it — no cards, or only template cards (`scaffolding: true`), which are
225
+ what `init` wrote and not the user's notes — carries `hint`, the one next
226
+ step; read it before concluding anything from `cards: []` or from template
227
+ cards. A `memgineering use --brain` in a hint moves this machine's pointer
228
+ for every later command, so offer it to the user and run it only on their
229
+ yes. Held-back notes are counted in both modes. For a counted note, tell the
230
+ user that such a note exists and why — never that the brain is empty or that
231
+ they never wrote it down — and, to say where, run the printed `reindex` and
232
+ give them the path; do not open, print or read a held-back note unless they
233
+ ask what it says. An excluded folder or another symlink is a place nobody
234
+ looked inside, not evidence of a note: say that recall could not look inside
235
+ it and that `reindex` names it, and do not say a note was held back. An empty
236
+ answer is not proof that the user never wrote something: recall never looks
237
+ inside a folder their own rules exclude, so say what was searched and that
238
+ such folders were not, and do not open one yourself. An answer of template
239
+ cards only also names the brains it did not read; run that command before
240
+ saying the fact was never written down.
241
+ - `memgineering-setup`: `reindex` and `push` list `skipped_other_symlinks`;
242
+ read their left-out count together with it and `excluded_folders`, because
243
+ beside a non-empty one the count is a floor. A `recall` that brings back
244
+ nothing the user wrote counts the same set by reason — beside notes it did
245
+ search, only when a note is among them — and prints the `reindex` command,
246
+ never a path.
247
+
248
+ Restart your agent session after upgrading so it reads the new guidance.
13
249
 
14
250
  ## [0.26.0] — 2026-10-10
15
251
 
package/README.md CHANGED
@@ -185,6 +185,17 @@ automatically when a Claude Code session starts.
185
185
  | `brains` | list your hosted brains, and which one answers here |
186
186
  | `create` · `rename` · `delete-brain` | make, rename, or delete a hosted brain |
187
187
  | `push` · `pull` | carry a brain to your account, and back down again |
188
+ | `delete-account` | delete your account — brain and registry — for good |
189
+
190
+ `delete-account` deletes the hosted brain account (every brain, note and
191
+ token on it) and then the registry account the same Google sign-in made
192
+ (the account is renamed `deleted-…`; its published packages and versions
193
+ stay at their existing addresses), and signs this machine out. It asks for the sentence `delete my account` — typed at the prompt, or
194
+ `--confirm "delete my account"` — and checks first that both sign-ins work and
195
+ belong to one person (their emails match; if either account has no email, the
196
+ registry sign-in this machine got from the brain sign-in is the match). If it stops halfway, run it again: it finishes the side
197
+ that is left. Folders on this disk are never touched. Without a sign-in you
198
+ can use, mail support@memgineering.com from the address on the account.
188
199
 
189
200
  **System**
190
201
 
@@ -2,7 +2,7 @@
2
2
  name: memgineering
3
3
  description: Use whenever the user refers to something they told you before, asks what was decided, tells you something worth keeping, or settles something that should hold next time. The memory lives in their own folder and outlives this session; check it before answering from guesswork, and write to it when you learn something durable.
4
4
  type: skill
5
- version: 0.26.0
5
+ version: 0.28.0
6
6
  ---
7
7
 
8
8
  # memgineering
@@ -81,13 +81,13 @@ at six skills, each of which loads on its own when its topic comes up:
81
81
  - `memgineering-rules` — decisions that bind, and the before-edit hook
82
82
  - `memgineering-setup` — installing, which tools this reaches, accounts, moving a brain
83
83
  - `memgineering-registry` — the public layer
84
- - `memgineering-installing` — putting a package in their project, and updating it
84
+ - `memgineering-installing` — putting a package in a project, updating it
85
85
 
86
- Not shell-only: ChatGPT and Claude.ai reach a hosted brain via connector `https://mcp.memgineering.com/mcp`.
86
+ Not shell-only: Claude.ai reaches a hosted brain via connector `https://mcp.memgineering.com/mcp`; ChatGPT is paused for now.
87
87
 
88
88
  A host short on room lists a skill by NAME ONLY, no description — measured on
89
89
  Claude Code. When you cannot see what it covers, READ
90
90
  `<tool-home>/skills/memgineering-<name>/SKILL.md` before deciding it is empty.
91
91
 
92
- If `memgineering: command not found`, install with `npm i -g memgineering`, then
92
+ If `memgineering: command not found`, run `npm i -g memgineering`, then
93
93
  `memgineering setup --web`.
@@ -191,18 +191,72 @@ summary before you answer from it — never quote it back on the label alone.
191
191
  ## Two answers that are answers
192
192
 
193
193
  **Nothing matched.** Say so, and do not go read their folder yourself to
194
- compensate. At the default depth this has already searched every note body of
195
- **the brain it searched**, so "nothing" is real information about that brain
196
- rather than a hint to search harder — read `semantic` first, per above. Broader
197
- words are still worth one retry; `--depth exact` is not — it looks at strictly
198
- less.
194
+ compensate. At the default depth this has already searched the body of every
195
+ note recall could read in **the brain it searched**, so "nothing" is real
196
+ information about those notes rather than a hint to search harder — read
197
+ `semantic` first, per above. Broader words are still worth one retry;
198
+ `--depth exact` is not — it looks at strictly less.
199
+
200
+ In a brain in a folder, that is not a promise about every file. Notes it left
201
+ out are counted below, but recall never looks inside a folder the user's own
202
+ rules exclude (`.gitignore`, `.memgignore`, the rules file): notes in one are
203
+ neither searched nor counted, and an answer where other notes were searched does
204
+ not mention them. So an empty answer is not proof that the user never wrote
205
+ something down. Say what was searched, and that folders their rules exclude
206
+ were not, rather than telling them they never wrote it. Do not open such a
207
+ folder yourself.
199
208
 
200
209
  One brain is not the account. On a hosted account with more than one brain, an
201
- empty answer now names the brains that were NOT read and prints a runnable
202
- `--brain` command for each. Run it before you tell them the fact was never
203
- written down — four testers reached that conclusion about a note sitting in the
204
- next brain, and three of them said it out loud. Reading another brain does not
205
- move the machine's pointer.
210
+ empty answer — or one of template cards only — names the brains that were NOT
211
+ read and prints a runnable `--brain` command for each. Run it before you tell
212
+ them the fact was never written down — four testers reached that conclusion
213
+ about a note sitting in the next brain, and three of them said it out loud.
214
+ Reading another brain does not move the machine's pointer.
215
+
216
+ With `--json`, an answer with nothing the user wrote in it carries `hint`: no
217
+ cards, or only template cards (`scaffolding: true`, below) — those are what
218
+ `init` wrote, not the user's notes. `hint` is the one next step, the most
219
+ specific that applies. First, the brain had nothing to search: it has no notes
220
+ yet (the `remember` command that writes the first one into that brain — or,
221
+ after `--brain` named a brain this machine does not point at, the
222
+ `memgineering use --brain "<name>"` that makes it the target, since `remember`
223
+ has no `--brain`), or it is a folder whose every note was left out (how many,
224
+ why, and the `memgineering reindex` command that names each one). Then: its
225
+ notes are in a script the question is not (ask again in that language), another
226
+ brain was not read (the `--brain` or `--vault` command that reads it), meaning
227
+ was not searched (and the server's reason), the hosted server's own advice, or
228
+ fewer and broader words. Read it before you conclude anything from
229
+ `cards: []` or from template cards. A `memgineering use --brain` in a hint
230
+ moves this machine's pointer for every later command, not just the next one:
231
+ offer it to the user and run it only on their yes. `hint` is absent whenever a
232
+ card they wrote came back.
233
+
234
+ **Held-back notes are counted in both modes.** When an answer has nothing the
235
+ user wrote in it, recall counts what a brain in a folder left out, says why,
236
+ and prints the `memgineering reindex` command that names each one: in the
237
+ terminal right under `_Nothing matched._` or under the template cards' header,
238
+ and at the front of `hint`. It opens with "Nothing in this brain could be
239
+ searched: …" when no note could be searched at all, and with "Not every note in
240
+ this brain was searched: …" when other notes were searched and at least one
241
+ note of the first kind below was left out. Recall itself never names or shows a
242
+ left-out note. The counts come in two kinds, and they mean different things:
243
+
244
+ - **Notes**: excluded by the user's rules (`.gitignore`, `.memgignore`, the
245
+ rules file), listed in `.memgdeny`, held back because the name looks private,
246
+ refused because the content looks like a credential, or behind a symlink. A
247
+ note the user wrote exists and was left out on purpose. Do NOT tell them the
248
+ brain is empty or that they never wrote it down: tell them such a note exists,
249
+ and why; to say where it is, run that `reindex` — it lists each path and
250
+ changes no note — and give them the path. Do not open, print or read a
251
+ held-back note into the conversation unless they ask what it says: it was
252
+ held back because it may be private.
253
+ - **Places nobody looked inside**: an excluded folder ("not looked inside"), or
254
+ another symlink, which is never followed. These are not evidence of a note —
255
+ an ignored `images/` or `.venv/` holds none. Say that recall could not look
256
+ inside them and that `reindex` names them; do not say a note was held back.
257
+ When "Nothing in this brain could be searched" lists only these, the brain may
258
+ hold no notes at all. Beside notes that were searched they are not counted at
259
+ all — see **Nothing matched** above.
206
260
 
207
261
  **Cards that are not answers.** A card marked `not filled in yet` is one of the
208
262
  five `01_BASE/` files, still exactly what `init` wrote (line endings aside). Nobody has answered
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: memgineering-setup
3
- description: Use when installing or configuring memgineering, when moving a brain between a machine and an account, when renaming or deleting a hosted brain, or whenever the user asks WHICH of their AI tools can see this memory. Triggers include "set up memgineering", "connect my notes", "rename my brain", "delete that brain", "does my other AI see this too", "which of my tools can read this", "will it work in the app on my phone", "can I use this in ChatGPT", "does it work in Claude.ai", "no brain is linked".
3
+ description: Use when installing or configuring memgineering, when moving a brain between a machine and an account, when renaming or deleting a hosted brain, when the user wants their whole account deleted, or whenever the user asks WHICH of their AI tools can see this memory. Triggers include "set up memgineering", "connect my notes", "rename my brain", "delete that brain", "delete my account", "close my account", "does my other AI see this too", "which of my tools can read this", "will it work in the app on my phone", "can I use this in ChatGPT", "does it work in Claude.ai", "no brain is linked".
4
4
  type: skill
5
5
  allowed-tools: Bash(memgineering:*)
6
6
  ---
@@ -25,11 +25,15 @@ guessing from a list.
25
25
  So when someone names a tool and asks whether it remembers too, work it out from
26
26
  those rows and answer plainly — not a hedge, not a promise:
27
27
 
28
- - **ChatGPT** — Settings → **Developer mode** → add an MCP server with
29
- `https://mcp.memgineering.com/mcp`, then sign in with Google when it asks.
30
28
  - **Claude.ai, Claude Desktop, Cowork** — **Customize** → **Connectors** →
31
- **Add custom connector** → the same URL. One connector covers all three, and
32
- custom connectors are on every plan, the free one included.
29
+ **Add custom connector** → `https://mcp.memgineering.com/mcp`. One connector
30
+ covers all three, and custom connectors are on every plan, the free one
31
+ included. Then sign in with Google when it asks and tick both consents on the
32
+ connect screen (below).
33
+ - **ChatGPT** — **paused for now.** The connect screen refuses it with
34
+ `connector_recipient_paused` while the notice about OpenAI is verified. Say so
35
+ plainly, and offer Claude or Gemini instead, or trying again later; do not
36
+ walk them through Developer mode in the meantime.
33
37
  - It reaches the brain **on their account**. A brain that lives only as a folder
34
38
  on this machine is out of its reach until it is moved up (see "Moving a brain
35
39
  between this machine and their account").
@@ -110,8 +114,35 @@ the brain identity and a `registry:` line with the username. If the registry
110
114
  line says "not linked", the link simply did not happen at sign-in time (older
111
115
  server, registry briefly down); a fresh `logout` + `login` links it. Never
112
116
  treat a missing registry line as a failed brain sign-in — the brain token
113
- stands on its own. Consent is asked exactly once, when an account is first
114
- created.
117
+ stands on its own. Consent to the terms is asked once, when an account is
118
+ first created. Two other consents are asked on every chat-app connection
119
+ instead. Connecting Claude or Gemini gives the company that runs it what the app
120
+ reads from the brain — brain names, the questions asked, note titles,
121
+ summaries, claims and sources, the rules in force, opened notes in full — and
122
+ what it writes, automatically at the start of every conversation and without
123
+ asking each time it records; that company is in the United States. So the
124
+ connect screen names who receives it and how to reach them, what it is used for
125
+ (that company's model training included, as the app's own settings allow) and
126
+ how long it is kept, and asks for two ticks: one to the provision to that
127
+ company, one to the transfer abroad. Without both the app is not connected, and
128
+ nothing else changes; to connect, the user starts again from the app and ticks
129
+ both. If the screen says the notice changed, the user reloads it (or starts
130
+ again from the app) and approves again. A program on their own computer (a
131
+ connector redirecting to 127.0.0.1 or localhost) asks for no tick — what it
132
+ sends onward follows that program's own terms. An app whose recipient
133
+ memgineering has no notice for is refused (`unknown_connector_recipient`):
134
+ suggest Claude or Gemini.
135
+
136
+ **`logout --all` is "disconnect everything".** It ends every brain token on
137
+ the account (every machine, ChatGPT and Claude connections, the website), and
138
+ anything approved before that moment — a sign-in nobody collected yet, a half-
139
+ finished connection — can no longer finish. It also ends every registry
140
+ sign-in of the same Google account. `--json` carries `registry_sessions`:
141
+ `revoked` (with a count), `not_linked`, or `unreachable` with a `hint` — on
142
+ that one, tell the user the brain side is done and relay the hint (it names
143
+ `kordis logout`). Signing in again afterwards works as usual. With nothing
144
+ signed in on this machine, it says how to do it instead: the website's button,
145
+ or `login` first.
115
146
 
116
147
  **When the setup finishes, say what is true and no more.** Commands work
117
148
  immediately — `recall`, `remember`, the session hook. What waits is the
@@ -284,6 +315,45 @@ person to retype the brain's name; with no terminal it refuses rather than
284
315
  deciding. `unlink --brain` is the gentle sibling: it only stops this machine
285
316
  reading a brain and deletes nothing.
286
317
 
318
+ ### Deleting the whole account
319
+
320
+ `memgineering delete-account --confirm "delete my account"` deletes the
321
+ hosted brain account (every brain on it, every note, every token) and the
322
+ registry account the same Google sign-in made (profile, stars, follows,
323
+ comment text, sign-ins; the account is renamed `deleted-…`, and its
324
+ published packages and versions stay at their existing addresses), in that
325
+ order, then signs this machine out. Nothing comes back. Run it ONLY
326
+ when the person has explicitly asked for their account to be deleted, and
327
+ pass the sentence exactly as written; without `--confirm` in a real terminal
328
+ it asks them to type it, and with no terminal it refuses rather than
329
+ deciding. There is no dry run.
330
+
331
+ A person with no terminal can delete the same two accounts on the website:
332
+ signed in at memgineering.com/brain, the "Delete my account" section at the
333
+ bottom of the page, confirmed with one tick (there is no sentence to type). Point
334
+ them there when they ask; you cannot press it for them. A deletion that stopped
335
+ half way is finished from the same page ("Finish deleting"). A Google account
336
+ that never opened a brain can delete its registry account from the same page too:
337
+ signed in, the consent screen shows a "Delete my account" section below the terms,
338
+ with the same single tick. Only an account that never signed in with Google, and a
339
+ brain account whose terms were never accepted, are deleted by mail to
340
+ support@memgineering.com.
341
+
342
+ - **Before deleting anything** it checks both sign-ins work and belong to one
343
+ person: the two accounts' emails, or — when either account has no email on
344
+ record — this machine's registry sign-in, which the brain sign-in issued. `--json` says which in `matched`. Different people answer
345
+ `account_mismatch` and nothing is deleted.
346
+ - **It refuses rather than deleting half**: a machine signed in to a brain
347
+ with no registry half answers `not_linked` (`memgineering logout`, then
348
+ `memgineering login`, links it). A machine signed in to nothing answers
349
+ `not_signed_in`: a brain kept in a folder has no account, and this command
350
+ never touches folders on this disk.
351
+ - **Stopped halfway** — `account_partly_deleted` means the brain account is
352
+ gone and the registry account is not. Tell the person exactly that, then
353
+ run the same command again: it skips the brain and finishes the registry.
354
+ - Somebody who cannot sign in, or whose account never used Google, writes to
355
+ support@memgineering.com from the address on the account.
356
+
287
357
  **They already keep notes in a folder on this machine** — carry them up
288
358
  instead of starting empty:
289
359
 
@@ -506,17 +576,23 @@ by hand in the ordinary case — writes keep the index in step on their own.
506
576
  what is missing and clears stored rows for notes the brain has since been told
507
577
  not to read, reporting both; `--local` forces the folder brain. On a brain in a
508
578
  FOLDER it also names what it left out — notes a deny name, a `.memgignore` rule
509
- or a symlink kept from the index, and any folder a rule excluded whole — so "3
510
- notes rebuilt" is never the whole answer when a fourth was dropped. A hosted
511
- reindex cannot say that: the rules are applied on the machine that pushed, so
512
- the server only ever saw what arrived.
579
+ or a symlink kept from the index, any folder a rule excluded whole, and any other
580
+ symlink, which is never followed — so "3 notes rebuilt" is never the whole
581
+ answer when a fourth was dropped. A hosted reindex cannot say that: the rules are
582
+ applied on the machine that pushed, so the server only ever saw what arrived.
513
583
 
514
584
  Under `--json` that is `not_indexed` with `denied_by_name`, `denied_explicitly`,
515
- `excluded_by_rule`, `skipped_symlinks` and `excluded_folders`. **Read the count
516
- together with `excluded_folders`**: a rule that names a folder stops the walk at
517
- the folder, so nothing inside it is ever counted — `not_indexed: 0` beside a
518
- non-empty `excluded_folders` means the count is a floor, not the answer. `push`
519
- reports the same set with its total under `not_sent`. `--rebuild`
585
+ `excluded_by_rule`, `skipped_symlinks`, `excluded_folders` and
586
+ `skipped_other_symlinks`. **Read the count together with the last two**: a rule
587
+ that names a folder stops the walk at the folder, and a symlink is never
588
+ followed, so the notes in such a folder are never counted — `not_indexed: 0`
589
+ beside a non-empty `excluded_folders` or `skipped_other_symlinks` means the count
590
+ is a floor, not the answer. `push` reports the same set with its total under
591
+ `not_sent`. A `recall` that brings back nothing the user wrote — no cards, or
592
+ only templates — counts the same set by reason in both modes (beside notes it
593
+ did search, only when a note is among them) and prints this command, never a
594
+ path; what to tell the user then is in `memgineering-recall`.
595
+ `--rebuild`
520
596
  exists for one situation only, where an embedding model changed the shape of its
521
597
  answers without changing its name and the index has to be laid down again.
522
598