memgineering 0.23.1 → 0.25.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
@@ -11,6 +11,144 @@ language the reader wants. The bilingual rule the monorepo applies to
11
11
 
12
12
  ## [Unreleased]
13
13
 
14
+ ## [0.25.0] — 2026-10-04
15
+
16
+ ### Added
17
+
18
+ - **Hosted recall says which search found each card.** Every card carries
19
+ `matched` (`words`, `meaning` or `both`), and a card found by meaning alone is
20
+ marked "matched by meaning only — none of the question's words are in this
21
+ note", in the terminal and in `brain_recall` alike.
22
+ - **Hosted brains label untouched starter templates too.** `recall` and `open`
23
+ say "not filled in yet" for a `01_BASE/` file that is still exactly the
24
+ template, as folder brains always did (`scaffolding` in `--json`).
25
+ - **`recall` says when one project filled the whole answer** — "All 8 cards are
26
+ from `owner/beta`. Also in this brain: `owner/alpha` — add `--scope <name>`"
27
+ (`scope_spread` in `--json`). Declared scopes only; folder names are not
28
+ projects.
29
+ - **`setup --help` says how a chat app reaches your brain** — ChatGPT, Claude.ai,
30
+ Claude Desktop and Cowork connect to a hosted brain at
31
+ `https://mcp.memgineering.com/mcp`, with no install on this machine.
32
+ - **`remember` shows the scope it stamped and where it came from** — the git
33
+ remote, the folder's name, `--scope`, or a name set with `memgineering
34
+ project` (`scope_via` in `--json`).
35
+
36
+ ### Changed
37
+
38
+ - **Common English words no longer count as a match.** `i`, `is`, `what`,
39
+ `about`, `do` and the like used to match first-person starter notes whatever
40
+ the question was about. Recall now matches on the words that carry the
41
+ question; Korean queries are unchanged, and a question made only of such
42
+ words ("who am I") still works.
43
+ - **At most two untouched starter templates per recall.** The rest are counted
44
+ and named as left out (`templates_withheld`); nothing you wrote is ever held
45
+ back. A mixed answer now says how many of its cards are still templates.
46
+ - **`resurface` ranks by what you opened and what answered, not by what was
47
+ merely listed.** A card that trailed at the bottom of many recalls no longer
48
+ climbs the page; the reason line reads "opened 2× · surfaced 10× in this
49
+ project" or "…, never opened".
50
+ - **`auto-update: on` now installs.** Once a day, when a newer version exists,
51
+ a global install updates itself in the background — never from a session hook,
52
+ never under CI, and never a project-local or npx copy (a project under a broad
53
+ npm prefix such as `prefix=$HOME` counts as project-local). One install runs
54
+ at a time: `memgineering update` typed while a background install runs says
55
+ so (`update_in_progress` in `--json`) instead of starting a second. A failed
56
+ attempt is reported on the next run with how to turn it off.
57
+ - **The setup reminder informs instead of ordering, and is shorter after the
58
+ first time.** It says what `setup --web` does — opens a setup screen in the
59
+ user's browser and returns at once — and asks the agent to check with the user
60
+ first unless they asked for setup. The old wording told the agent to run setup
61
+ without waiting, which fresh agent sessions reasonably read as a prompt
62
+ injection. The full text appears once per machine; every later command, and
63
+ `--version` / `--help` in a pipe, get two lines. The notice after an upgrade
64
+ ("the guidance in your agent tools is older") and the one asking for a brain
65
+ follow suit. The upgrade notice now says what a refresh overwrites and which
66
+ earlier choices a flag-less run would reset — auto-update, hooks, the tool list,
67
+ and a sign-in on a machine that is not signed in — names the flag that keeps
68
+ each, and no longer tells the agent to keep the refresh from you.
69
+
70
+ ### Fixed
71
+
72
+ - **A note whose path is `constructor`, `toString` or `__proto__` no longer
73
+ breaks `recall` and `open`.** On a hosted brain, every recall that returned
74
+ such a note failed.
75
+ - **`setup` reports what happened, not what was asked for**: "Registered with"
76
+ lists only tools whose guide was written, each hook is reported on the tools
77
+ that received it (Grok's end-of-turn hook is no longer described as a
78
+ session-start one), and a project-local copy is told its hooks and guide need
79
+ a global install to reach it.
80
+ - **`setup`'s refusals say how to get unstuck**: an unknown tool name and a
81
+ known tool that has not been opened yet get different answers, and the
82
+ supported tools are listed with their `--tools` names.
83
+
84
+ ### Agent guidance
85
+
86
+ - The setup skill now says a chat app with no shell can reach your hosted brain
87
+ through the connector at `https://mcp.memgineering.com/mcp` (ChatGPT and
88
+ Claude.ai steps included) — it used to say there was no connector — and that a
89
+ brain kept only as a folder needs both steps: move it up, then add the
90
+ connector. The hub itself now says ChatGPT and Claude.ai reach a hosted brain
91
+ through that connector.
92
+ - The recall skill covers the template cap, `matched`, `scope_spread`, and the
93
+ new resurface wording; the writing skill names the folder-name scope fallback;
94
+ the setup skill explains what auto-update does and to pass `--hook` when
95
+ turning it off.
96
+ - Restart your agent session after upgrading so it reads the new guidance.
97
+
98
+ ## [0.24.0] — 2026-09-12
99
+
100
+ ### Added
101
+
102
+ - **`memgineering rescope <ref>` changes which project a memory binds in.**
103
+ `scope` decides which of the two rule budgets a decision is drawn from — it
104
+ is the field that answers "does this bind me here" — and nothing could write
105
+ it. Moving one meant `supersede`, which retires the loser, so folding a
106
+ project-scoped rule into an unscoped one would have made the rule vanish
107
+ everywhere except the project it was scoped to.
108
+ Two flags, deliberately: `--scope <project>` narrows or moves,`--global`
109
+ widens. A rule that stops naming a project starts binding in every project,
110
+ and that is the change hardest to notice afterwards, so it is spelled rather
111
+ than being what happens when the scope is left off.
112
+ - **`memgineering expire <ref> --until <date>` gives a memory an end date, and
113
+ does not retire it.** Until that date it is current; after it, recall still
114
+ returns it — one step below what is current, and labelled. Recall has always
115
+ understood this; only the writer was missing. Reach for it when a memory was
116
+ always going to run out, rather than when a decision has been overtaken.
117
+ - **A hosted brain's rule list says how fresh each rule is** (`freshness` on
118
+ `POST /rules`), so an agent handed a rule whose end date has passed is told
119
+ so rather than reading it as current.
120
+
121
+ ### Fixed
122
+
123
+ - **Retiring a rule now stops it being pushed to agents on a hosted brain.**
124
+ The rule list filtered "is it marked as a rule" and nothing else, while the
125
+ local one has always dropped retired rules — putting a decision somebody
126
+ retired in front of an agent as binding is the tool arguing with them.
127
+ `retire` writes the status and leaves the marking alone, so nothing else
128
+ caught it: on a hosted brain, which is what a signed-in machine reads,
129
+ retiring a rule did not stop the before-edit hook showing it.
130
+ - **A date written into a note that states no claim is no longer ignored.**
131
+ Freshness read `valid_until` only off a stated claim, and most notes state
132
+ none — so an end date in such a note was read by nothing at all.
133
+ - **An upgrade now tells your agent that its guidance went stale.** The only
134
+ thing that ever said so was a `postinstall` script, and npm 12 blocks install
135
+ scripts by default — measured on 12.0.2, all it prints is `1 package had
136
+ install scripts blocked`, which does not say what the blocked script would
137
+ have said. So on that npm an upgrade left a new binary beside the hub and
138
+ skills an older release wrote, in `~/.claude`, `~/.codex` and `~/.gemini`,
139
+ and both halves reported success. The CLI now says it itself, before any
140
+ command, on a channel npm cannot block: run `memgineering setup` once and it
141
+ goes quiet. It stays out of `guard`, which runs on every file edit.
142
+
143
+ ### Agent guidance
144
+
145
+ `memgineering-rules` and `memgineering-writing` both changed: there are now
146
+ three ways a rule stops applying rather than two (`--no-rule`, `retire`,
147
+ `expire`), and `rescope` is how a rule moves between projects. **Restart your
148
+ agent session after upgrading** so the new guidance is loaded — or run
149
+ `memgineering setup`, which the CLI will now ask for by itself when the
150
+ installed guidance is older than the binary.
151
+
14
152
  ## [0.23.1] — 2026-09-11
15
153
 
16
154
  ### Fixed
@@ -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.23.1
5
+ version: 0.25.0
6
6
  ---
7
7
 
8
8
  # memgineering
@@ -83,6 +83,8 @@ at six skills, each of which loads on its own when its topic comes up:
83
83
  - `memgineering-registry` — the public layer
84
84
  - `memgineering-installing` — putting a package in their project, and updating it
85
85
 
86
+ Not shell-only: ChatGPT and Claude.ai reach a hosted brain via connector `https://mcp.memgineering.com/mcp`.
87
+
86
88
  A host short on room lists a skill by NAME ONLY, no description — measured on
87
89
  Claude Code. When you cannot see what it covers, READ
88
90
  `<tool-home>/skills/memgineering-<name>/SKILL.md` before deciding it is empty.
@@ -153,6 +153,11 @@ What you must not do is report what came back as everything the brain holds,
153
153
  which is exactly what a short answer looks like to anyone who does not read the
154
154
  line under it.
155
155
 
156
+ When every card with a project came from ONE project and the brain holds
157
+ others, recall says so (`scope_spread`: the project, and up to five others). If
158
+ the user meant one of those, ask again with `--scope <that project>` — the note
159
+ they want may be ranked just below a page full of the one the question named.
160
+
156
161
  ## Whether meaning was searched
157
162
 
158
163
  A hosted brain can match on meaning as well as words — the same idea in other
@@ -177,6 +182,12 @@ anything about what the user knows.
177
182
  If coverage says notes are missing entries, meaning was searched over part of
178
183
  the brain. Do not report that as a complete search.
179
184
 
185
+ When meaning was used, each card also says what reached it — `matched`:
186
+ `"words"`, `"meaning"`, or `"both"`. A `"meaning"` card (printed as _matched by
187
+ meaning only_) shares no word with the question. That is right for a note in
188
+ another language and wrong for one the model merely found nearby, so read its
189
+ summary before you answer from it — never quote it back on the label alone.
190
+
180
191
  ## Two answers that are answers
181
192
 
182
193
  **Nothing matched.** Say so, and do not go read their folder yourself to
@@ -198,7 +209,9 @@ five `01_BASE/` files, still byte-for-byte what `init` wrote. Nobody has answere
198
209
  it, so it is evidence of nothing — do not quote it back as what they think. When
199
210
  every card carries that mark, recall says so above them (`--json`:
200
211
  `scaffolding: true`), and that is the moment to offer to fill them in rather
201
- than answer from them — see `memgineering-writing`.
212
+ than answer from them — see `memgineering-writing`. At most two such cards come
213
+ back per answer; the rest are counted (`templates_withheld`), never silently
214
+ dropped, and nothing anyone wrote is ever held back.
202
215
 
203
216
  The mark disappears once the user writes in the file. A filled-in base note is
204
217
  often the best answer in the brain: _who am I_, _what am I not allowed to do_,
@@ -219,8 +232,11 @@ On a hosted brain the folder counts too, as a name rather than a path: the CLI
219
232
  sends the folder's project — `owner/repo` from the git remote, or whatever
220
233
  `memgineering project` shows — and the server ranks what was asked about in
221
234
  that project first. The response says so itself: `ranked_by` gains `asked about
222
- in this project`, a card's reason reads `recalled 2× in this project`, and the
223
- footer names which project those words mean. Trust the footer over your
235
+ in this project`, a card's reason reads `opened 1× · surfaced 2× in this project`
236
+ (or `surfaced 2× …, never opened`), and the footer names which project those
237
+ words mean. Only an open, or being the FIRST card of a recall, counts toward
238
+ the order; a card merely listed further down is counted in words but earns
239
+ nothing. Trust the footer over your
224
240
  assumption in the other cases as well — it says when this folder names no
225
241
  project (nothing was sent), and when the server does not rank by project yet
226
242
  (it was sent and ignored). A path never leaves the machine either way.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: memgineering-rules
3
- description: Use when the user settles something they expect to hold next time — a colour they will not use, a step never to skip, a way things get named here — or when you want to see what already binds you in this folder. A decision does not have to be announced as a rule to be one. Triggers include "from now on", "always", "never", "don't do that again", "let's go with X from here", "we always do it this way", "what rules do I have". Covers remember --rule, rules, and what the before-edit hook shows.
3
+ description: Use when the user settles something they expect to hold next time — a colour they will not use, a step never to skip, a way things get named here — or when you want to see what already binds you in this folder. A decision does not have to be announced as a rule to be one. Triggers include "from now on", "always", "never", "don't do that again", "let's go with X from here", "we always do it this way", "what rules do I have" — and, for moving one, "that should apply everywhere", "not just this project", "all my projects", "only in this repo from now on". Covers remember --rule, rules, rescope, and what the before-edit hook shows.
4
4
  type: skill
5
5
  allowed-tools: Bash(memgineering:*)
6
6
  ---
@@ -150,12 +150,23 @@ Two consequences worth knowing before you mark things:
150
150
  are why they no longer can: a rule scoped to the project has its own room and
151
151
  cannot lose every slot to whatever the user has been reaching for lately. It
152
152
  still pays to keep the standing set small — ten is what a session reads.
153
- - **Two ways out, and they are not the same.** `memgineering revise <ref>
153
+ - **Three ways out, and they are not the same.** `memgineering revise <ref>
154
154
  --no-rule --reason "…"` says it was never a rule: it stops being shown before
155
155
  an edit, and stays a perfectly ordinary current memory that recall returns.
156
156
  `memgineering retire <ref>` says it no longer holds: it stops binding AND
157
- drops to the bottom of recall, labelled. Reach for the first when the marking
158
- was the mistake and the second when the decision has been overtaken.
157
+ drops to the bottom of recall, labelled. `memgineering expire <ref> --until
158
+ <date>` says it held until then: it KEEPS binding and recall keeps returning
159
+ it, ranked below what is current and labelled from that date. Reach for the
160
+ first when the marking was the mistake, the second when the decision has been
161
+ overtaken, and the third when it was always going to run out.
162
+ - **`memgineering rescope <ref>` changes WHERE a rule binds, not whether it
163
+ does.** `--scope <project>` binds it in that project alone — agents working
164
+ anywhere else stop being shown it. `--global` binds it everywhere, which is
165
+ the change hardest to notice afterwards, so it has a flag of its own rather
166
+ than being what happens when you leave the scope off. Nothing the note says
167
+ changes either way, and `memgineering undo` reverses it.
168
+ Ask before widening: a rule the user wrote about one repository, made global,
169
+ arrives in every session they open.
159
170
  - **`--no-rule` on its own asks for nothing else.** No claim, no summary — the
160
171
  conclusion, the summary and the title come back byte for byte, which is the
161
172
  whole reason it exists. It used to go through `revise`, which requires a
@@ -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", "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, 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".
4
4
  type: skill
5
5
  allowed-tools: Bash(memgineering:*)
6
6
  ---
@@ -12,20 +12,37 @@ allowed-tools: Bash(memgineering:*)
12
12
  Answer this from here, not from a guess. The line is capability, not brand, so
13
13
  it does not move as products come and go:
14
14
 
15
- | | |
16
- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
17
- | **Any tool that can run a shell command** | Reads and writes the same brain. Nothing has to be built for a tool that does not exist yet. |
18
- | **Any tool that cannot** | **Not yet.** There is no connector. A hosted brain is reachable in principle and is not wired up in practice. |
15
+ | | |
16
+ | ------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
17
+ | **Any tool that can run a shell command** | Reads and writes the same brain. Nothing has to be built for a tool that does not exist yet. |
18
+ | **A chat app that takes a custom MCP connector, no shell** | Reads and writes the **hosted** brain on their account through `https://mcp.memgineering.com/mcp`, once they add that connector in the app and sign in with Google. Not a folder brain. |
19
+ | **Neither** | **Not yet.** |
19
20
 
20
21
  `memgineering setup` writes its guidance into the agent tools it finds on the
21
22
  machine, and `setup --dry-run` names the ones it actually found rather than
22
23
  guessing from a list.
23
24
 
24
25
  So when someone names a tool and asks whether it remembers too, work it out from
25
- that line and answer **not yet, and here is what does** — not a hedge, not a
26
- promise. "You are signed in, so it works everywhere" is the specific wrong
27
- answer: the account syncs the brain between machines, it does not add a surface
28
- that can read it.
26
+ those rows and answer plainly — not a hedge, not a promise:
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
+ - **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.
33
+ - It reaches the brain **on their account**. A brain that lives only as a folder
34
+ on this machine is out of its reach until it is moved up (see "Moving a brain
35
+ between this machine and their account").
36
+ - Moving it up does NOT make it appear in the chat app by itself. When their
37
+ brain is still a folder, the answer is both steps, in order: move it up, then
38
+ add the connector above in their app. An answer that stops at the first step
39
+ leaves them with an account brain and no way in.
40
+ - `npx memgineering-mcp` — the local, stdio server — is **registry-only**. It has
41
+ no memory tools; for memory from a chat app, the URL above is the way.
42
+
43
+ "You are signed in here, so it works everywhere" is still the wrong answer: the
44
+ account syncs the brain between machines, and each chat app needs the connector
45
+ added in that app, once.
29
46
 
30
47
  ## 1. Register with the agents
31
48
 
@@ -93,8 +110,15 @@ restart. (Measured: a fresh agent relayed "restart required" as fact, the user
93
110
  checked, and it was not one.)
94
111
 
95
112
  **Ask before setting policy for them.** Auto-update means the tool updates
96
- itself; `--hook on` means note summaries and their standing rules reach an agent
97
- unasked. Recommend both, but they are theirs to decide.
113
+ itself: once a day, when a newer version exists, a global install starts
114
+ `memgineering update` in the background and the next run uses it (a project-local
115
+ or npx copy is never touched — it only gets the notice; nor is anything installed
116
+ from a session hook or under CI). One install runs at a time: `memgineering
117
+ update` run while a background install is going answers `update_in_progress`
118
+ and installs nothing — wait a few minutes and run it again; it reports whether
119
+ that install worked. `--hook on` means note
120
+ summaries and their standing rules reach an agent unasked. Recommend both, but
121
+ they are theirs to decide.
98
122
 
99
123
  **Error telemetry is theirs to decide too, and defaults to off.** With
100
124
  `--error-telemetry on`, the CLI sends an anonymous report when it ITSELF
@@ -441,9 +465,12 @@ as a next step rather than running it.
441
465
 
442
466
  ### What a hosted brain does that a folder does not
443
467
 
444
- Every verb works on either kind now, consolidation included. Two things are
468
+ Every verb works on either kind now, consolidation included. Three things are
445
469
  only true of a hosted brain.
446
470
 
471
+ **A chat app with no shell can reach it** — through the connector at the top of
472
+ this file. A folder brain is reached only by tools that can run `memgineering`.
473
+
447
474
  **Meaning is searched, if a model is configured for it.** That is what lets an
448
475
  English question reach a Korean note. It needs `BRAIN_EMBEDDING_URL` and
449
476
  `BRAIN_EMBEDDING_MODEL` set on the server; with neither, the brain searches text
@@ -475,7 +502,7 @@ answers without changing its name and the index has to be laid down again.
475
502
  ## Turning things off
476
503
 
477
504
  ```
478
- memgineering setup --agent --auto-update off
505
+ memgineering setup --agent --auto-update off --hook <on|off> # --agent sets both; keep the hook as it was
479
506
  memgineering unlink # stop reading a brain; notes untouched
480
507
  memgineering unlink --purge # also delete the local index and undo snapshots
481
508
  ```
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: memgineering-writing
3
- description: Use when you learn something durable and should record it, when a conclusion you already recorded turns out to have changed, when something needs undoing or retiring, when the brain has filled up with near-duplicates that want tidying, or when the user's `01_BASE/` files are still empty and only a conversation can fill them. Triggers include "remember this", "that didn't work", "this worked instead", "that's not right anymore", "undo that", "looks good", "set up my memory", "fill in my profile", "stop reading that note", "clean up my notes", "these two say the same thing", "is this a duplicate", "move my memories over", "bring my notes from the other tool", "don't save that", "never store that". Covers remember, revise, undo, log, retire, exclude, onboard, the consolidate/propose/approve flow, carrying facts in from another store, storage boundaries, and what to say before writing.
3
+ description: Use when you learn something durable and should record it, when a conclusion you already recorded turns out to have changed, when something needs undoing or retiring, when the brain has filled up with near-duplicates that want tidying, or when the user's `01_BASE/` files are still empty and only a conversation can fill them. Triggers include "remember this", "that didn't work", "this worked instead", "that's not right anymore", "undo that", "looks good", "set up my memory", "fill in my profile", "stop reading that note", "clean up my notes", "these two say the same thing", "is this a duplicate", "move my memories over", "bring my notes from the other tool", "don't save that", "never store that", "that's only true until <date>", "it stops being true after", "don't tell me that forever". Covers remember, revise, undo, log, retire, expire, exclude, onboard, the consolidate/propose/approve flow, carrying facts in from another store, storage boundaries, and what to say before writing.
4
4
  type: skill
5
5
  allowed-tools: Bash(memgineering:*)
6
6
  ---
@@ -23,10 +23,13 @@ reverse it. Do not ask permission for ordinary observations — write them, and
23
23
  mention it in a sentence.
24
24
 
25
25
  **A note born in a project folder carries that project as its `scope`** — the
26
- name comes from the git remote (`owner/repo`), or from the folder's binding
27
- (`memgineering project` shows it). The stamp is automatic; an explicit
28
- `--scope` beats it; a folder that names no project writes exactly what it
29
- always wrote. Two flags are worth reaching for on purpose:
26
+ name comes from the folder's binding (`memgineering project` shows it), else the
27
+ git remote (`owner/repo`), else — in a repository with no remote — the checkout
28
+ folder's name. `remember` prints the scope and which of those it came from
29
+ (`scope_via` in `--json`); when it is the folder name, say so, because that is
30
+ the one nobody predicts. The stamp is automatic; an explicit `--scope` beats it;
31
+ a folder that names no project writes exactly what it always wrote. Two flags
32
+ are worth reaching for on purpose:
30
33
 
31
34
  ```
32
35
  memgineering remember "we always squash before merging" --rule --no-scope \
@@ -203,17 +206,26 @@ it>"`.
203
206
  This rewrites only the memory block in frontmatter. The prose is the user's;
204
207
  neither the command nor you should rewrite it uninvited.
205
208
 
206
- ## Retiring versus excluding
209
+ ## Retiring versus expiring versus excluding
207
210
 
208
211
  ```
209
212
  memgineering retire <ref> --reason "the date moved" # no longer current, still visible
213
+ memgineering expire <ref> --until 2026-10-31 --reason "the phase ends then" # NOT retired
210
214
  memgineering exclude path/to/note.md --reason "it has someone's phone number in it" # stop reading it
211
215
  memgineering retract --actor "mcp:ChatGPT" --since 2026-09-01 # SHOWS what one writer / window wrote
212
216
  memgineering retract --actor "mcp:ChatGPT" --since 2026-09-01 --yes # retires all of it, one ledger row each
213
217
  ```
214
218
 
215
219
  Retiring keeps the note in recall, ranked last and labelled. Excluding takes it
216
- out of the index and never touches the file. If the user says "delete", ask
220
+ out of the index and never touches the file.
221
+
222
+ **`expire` is not a retirement, and the difference only shows up later.** It
223
+ gives a memory an end date: until then it is current, and after it recall still
224
+ returns it — one step below what is current, labelled with the date. Reach for
225
+ it when the memory was always going to run out ("Phase 1 lands by the end of
226
+ October", a key that rotates, a plan with a deadline in it) rather than when a
227
+ decision has been overtaken. Retiring such a note says something untrue about
228
+ it; leaving it says something untrue too. If the user says "delete", ask
217
229
  which they mean.
218
230
 
219
231
  ## Tidying up a brain: detect, draft, approve