@rayul/kordis 0.15.0 → 0.15.2

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.
@@ -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
@@ -194,11 +205,14 @@ next brain, and three of them said it out loud. Reading another brain does not
194
205
  move the machine's pointer.
195
206
 
196
207
  **Cards that are not answers.** A card marked `not filled in yet` is one of the
197
- five `01_BASE/` files, still byte-for-byte what `init` wrote. Nobody has answered
208
+ five `01_BASE/` files, still exactly what `init` wrote (line endings aside). Nobody has answered
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, plus any that is one side of a conflict, so both sides of a
214
+ conflict always show; the rest are counted (`templates_withheld`), never
215
+ silently dropped, and nothing anyone wrote is ever held back.
202
216
 
203
217
  The mark disappears once the user writes in the file. A filled-in base note is
204
218
  often the best answer in the brain: _who am I_, _what am I not allowed to do_,
@@ -219,8 +233,11 @@ On a hosted brain the folder counts too, as a name rather than a path: the CLI
219
233
  sends the folder's project — `owner/repo` from the git remote, or whatever
220
234
  `memgineering project` shows — and the server ranks what was asked about in
221
235
  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
236
+ in this project`, a card's reason reads `opened 1× · surfaced 2× in this project`
237
+ (or `surfaced 2× …, never opened`), and the footer names which project those
238
+ words mean. Only an open, or being the FIRST card of a recall, counts toward
239
+ the order; a card merely listed further down is counted in words but earns
240
+ nothing. Trust the footer over your
224
241
  assumption in the other cases as well — it says when this folder names no
225
242
  project (nothing was sent), and when the server does not rank by project yet
226
243
  (it was sent and ignored). A path never leaves the machine either way.
@@ -2,7 +2,7 @@
2
2
  name: memgineering-registry
3
3
  description: Use when the user wants judgment somebody else has already settled — "what do other people do about this", "is there a pattern for it", "read that judgment", "adapt that pattern to this repo", "fit it to our setup", "how do others handle X" — or when one of their own decisions should go out: "publish this decision", "share this rule", "put it on memgineering", "send it to the registry". Also when they ask whether what you read gets stored. Covers the public layer: reading somebody else's judgment into context, the transplant brief, publishing one claim out of this brain, lineage, why reading is never copying, and how author-controlled text is fenced.
4
4
  type: skill
5
- version: 0.20.0
5
+ version: 0.21.0
6
6
  allowed-tools: Bash(memgineering:*)
7
7
  ---
8
8
 
@@ -215,10 +215,17 @@ another machine leaves no record here.
215
215
 
216
216
  ## What is not here
217
217
 
218
- Installing files, stars, follows, comments, and withdrawing a release stay in
219
- the `kordis` CLI for one release window. The public layer's verbs are
220
- `registry search`, `registry info`, `registry read`, `registry adapt` and
221
- `registry publish`.
218
+ Stars, follows, comments, and withdrawing a release are still only in the
219
+ `kordis` CLI. Everything else has moved: the public layer's verbs are
220
+ `registry search`, `registry info`, `registry read`, `registry adapt`,
221
+ `registry publish`, `registry pull`, `registry update`, `registry outdated`,
222
+ `registry versions`, `registry diff` and `registry list`.
223
+
224
+ Installing has its own guide — `memgineering-installing` — because which tool a
225
+ project installs for, what a range resolves to, and what a merge refuses are a
226
+ different subject from choosing what to read.
222
227
 
223
228
  `memgineering pull` is unrelated: it is the brain verb for a hosted brain, not
224
- a registry install.
229
+ a registry install. So is `memgineering update`, which updates this CLI. Both
230
+ have a `registry` twin that means the other thing, which is why the namespace
231
+ exists.
@@ -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
  ---
@@ -69,6 +69,20 @@ A hosted brain answers this too, and `--rule` writes to one land marked. The
69
69
  marking lives in the note's own frontmatter either way, so a brain that was
70
70
  pushed from a folder keeps every rule it had.
71
71
 
72
+ **A rule saved from a chat app waits for the user.** ChatGPT, Claude.ai and
73
+ other connectors can write notes, but not rules: a rule asked for there is
74
+ kept as an ordinary note, and binds only once the user promotes it at a
75
+ terminal. Promoting binds the note's own text as the chat wrote it — `--claim`
76
+ changes the summary, not the words that bind — so they read it first with
77
+ `memgineering open <id> --detail full` (the card alone shows only the title and
78
+ summary, which a chat app may have rewritten), then `memgineering revise <id> --rule --claim "<what
79
+ the note says>"`. Worded differently, it is a new rule: `memgineering remember
80
+ "<the rule>" --rule`. A connector also cannot change or unmark an existing rule. Once
81
+ promoted, the rule says where its words came from — `(written by the ChatGPT
82
+ connector)` beside it in `memgineering rules` and in the before-edit hook, and
83
+ `written_by` in `--json`. Treat it as their rule; the label says which surface
84
+ it was first said on.
85
+
72
86
  **A rule also wins a tie in `recall` now.** Where an ordinary memory and a
73
87
  standing decision matched a query equally well, the decision is ranked first —
74
88
  the asymmetry being that a missed fact costs the reader some context, while a
@@ -85,12 +99,23 @@ alone earned — not that the top card is a rule, and not that it never could be
85
99
  since the engine noticing a note is decision-shaped is weaker evidence than its
86
100
  author saying it binds.
87
101
 
88
- One difference is worth knowing rather than discovering. The before-edit hook
89
- reads a brain **on this machine**, so on a machine pointed at a hosted brain it
90
- shows the local folder's rules, not the hosted brain's — a network call on the
91
- path of every file write is not a trade this makes. `memgineering rules` shows
92
- whichever brain the machine is pointed at; add `--local` to see what the hook
93
- will actually deliver.
102
+ **Rules arrive in two budgets, not one list.** What a session is shown is the
103
+ strongest few that hold everywhere, plus the strongest few scoped to the project
104
+ it is standing in — ten in total, and each half gives its unused room to the
105
+ other, so a brain with nothing scoped still fills the list. Rules scoped to a
106
+ DIFFERENT project are not shown to an agent working here at all; they bind
107
+ there. `memgineering rules` lists them separately under "scoped to other
108
+ projects", which is the one place to notice a scope with a typo in it — such a
109
+ rule binds nowhere and would otherwise appear nowhere.
110
+
111
+ Before the split there was one list ranked by use, and it did not work: measured
112
+ in a real repository, every slot went to rules about other things and a rule
113
+ written that morning about that project's own layout ranked 49th of 54.
114
+
115
+ The before-edit hook and `memgineering rules` read the same brain — the hosted
116
+ one when this machine is pointed at it, the folder on disk otherwise — so what
117
+ the hook will deliver is what the command shows. Add `--local` to read the
118
+ folder on this disk specifically.
94
119
 
95
120
  ## What the user's agent actually sees
96
121
 
@@ -135,11 +160,30 @@ a long list is fewer rules, not a longer one.
135
160
 
136
161
  Two consequences worth knowing before you mark things:
137
162
 
138
- - **Global habits crowd out project decisions.** A rule that has been recalled
139
- in other folders outranks a project rule written yesterday that nobody has
140
- reached for. If a user's own working preferences fill all eight slots, a new
141
- a rule written for the folder they are in may never be shown. Keep the
142
- standing set small.
143
- - **A retired rule stops being shown.** `memgineering retire <ref>` is the way
144
- out when a decision no longer holds — it stays visible in recall, ranked last
145
- and labelled, but it stops binding.
163
+ - **Global habits used to crowd out project decisions**, and the two budgets
164
+ are why they no longer can: a rule scoped to the project has its own room and
165
+ cannot lose every slot to whatever the user has been reaching for lately. It
166
+ still pays to keep the standing set small — ten is what a session reads.
167
+ - **Three ways out, and they are not the same.** `memgineering revise <ref>
168
+ --no-rule --reason "…"` says it was never a rule: it stops being shown before
169
+ an edit, and stays a perfectly ordinary current memory that recall returns.
170
+ `memgineering retire <ref>` says it no longer holds: it stops binding AND
171
+ drops to the bottom of recall, labelled. `memgineering expire <ref> --until
172
+ <date>` says it held until then: it KEEPS binding and recall keeps returning
173
+ it, ranked below what is current and labelled from that date. Reach for the
174
+ first when the marking was the mistake, the second when the decision has been
175
+ overtaken, and the third when it was always going to run out.
176
+ - **`memgineering rescope <ref>` changes WHERE a rule binds, not whether it
177
+ does.** `--scope <project>` binds it in that project alone — agents working
178
+ anywhere else stop being shown it. `--global` binds it everywhere, which is
179
+ the change hardest to notice afterwards, so it has a flag of its own rather
180
+ than being what happens when you leave the scope off. Nothing the note says
181
+ changes either way, and `memgineering undo` reverses it.
182
+ Ask before widening: a rule the user wrote about one repository, made global,
183
+ arrives in every session they open.
184
+ - **`--no-rule` on its own asks for nothing else.** No claim, no summary — the
185
+ conclusion, the summary and the title come back byte for byte, which is the
186
+ whole reason it exists. It used to go through `revise`, which requires a
187
+ claim, so taking a marking back meant restating a conclusion nobody had
188
+ changed, from text this CLI hands back truncated. Do not restate anything;
189
+ `memgineering undo` reverses it.
@@ -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
 
@@ -49,6 +66,17 @@ Three things to do after running it:
49
66
  picks it up on its own when they do. There is nothing to poll and nothing
50
67
  to wait for.
51
68
 
69
+ The link is the key to that screen, not the code: whoever holds the whole link
70
+ can drive it. Give it only to them, never paste it anywhere else — with
71
+ `--json`, `setup_url` is printed only when no browser opened.
72
+
73
+ If they chose to upload existing notes on the screen, this machine does NOT
74
+ upload them on its own: the next `memgineering` command shows which folder and
75
+ which account would receive them, with the `push` that sends them. Check with
76
+ them that the account is theirs before running it. And a machine already
77
+ signed in to a different account is never switched by `setup --web` — the
78
+ terminal says so; `logout` first if they really mean to switch.
79
+
52
80
  The screen asks everything `--agent` takes from flags — sign in, where the
53
81
  memory lives, which brain, which tools, auto-update, the session hook — with
54
82
  the recommended answer pre-selected. A person who is already signed in to
@@ -93,8 +121,16 @@ restart. (Measured: a fresh agent relayed "restart required" as fact, the user
93
121
  checked, and it was not one.)
94
122
 
95
123
  **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.
124
+ itself: once a day, when a newer version exists, a global install starts
125
+ `memgineering update` in the background and the next run uses it (a project-local
126
+ or npx copy is never touched — it only gets the notice; nor is anything installed
127
+ from a session hook or under CI). One install runs at a time: `memgineering
128
+ update` run while a background install is going answers `update_in_progress`
129
+ and installs nothing — wait a few minutes and run it again; it reports whether
130
+ that install worked. `update_claim_stuck` means a crashed install's leftover
131
+ could not be cleared; its hint names the folder to delete. `--hook on` means note
132
+ summaries and their standing rules reach an agent unasked. Recommend both, but
133
+ they are theirs to decide.
98
134
 
99
135
  **Error telemetry is theirs to decide too, and defaults to off.** With
100
136
  `--error-telemetry on`, the CLI sends an anonymous report when it ITSELF
@@ -146,6 +182,15 @@ answered, and the trust is recorded per hook CONTENT
146
182
  so an upgrade that changes a hook asks again. Somebody who is not told this
147
183
  reads the silence as an install that did not take.
148
184
 
185
+ **An update brings the hooks along.** The first `resurface` (session start)
186
+ after an update — or the next command anybody types — replaces memgineering's
187
+ own hook commands with the new version's, in both Claude Code and Codex, and
188
+ says so once. It replaces only a command memgineering itself shipped: a hook
189
+ someone edited (an absolute path, say), a removed hook, a symlinked or
190
+ unreadable settings file are left exactly as they are, and the last two are
191
+ named once. When a Codex hook changed this way, Codex asks for the review
192
+ above again at its next start — relay that, with the key.
193
+
149
194
  Grok is the case worth knowing, because the obvious guess is wrong: it has
150
195
  hooks, more events than either of those two, and `~/.grok/hooks/` needs no
151
196
  trust prompt — but a hook there cannot say anything to the model. Measured
@@ -441,9 +486,12 @@ as a next step rather than running it.
441
486
 
442
487
  ### What a hosted brain does that a folder does not
443
488
 
444
- Every verb works on either kind now, consolidation included. Two things are
489
+ Every verb works on either kind now, consolidation included. Three things are
445
490
  only true of a hosted brain.
446
491
 
492
+ **A chat app with no shell can reach it** — through the connector at the top of
493
+ this file. A folder brain is reached only by tools that can run `memgineering`.
494
+
447
495
  **Meaning is searched, if a model is configured for it.** That is what lets an
448
496
  English question reach a Korean note. It needs `BRAIN_EMBEDDING_URL` and
449
497
  `BRAIN_EMBEDDING_MODEL` set on the server; with neither, the brain searches text
@@ -475,7 +523,7 @@ answers without changing its name and the index has to be laid down again.
475
523
  ## Turning things off
476
524
 
477
525
  ```
478
- memgineering setup --agent --auto-update off
526
+ memgineering setup --agent --auto-update off # the hook stays as this machine recorded it
479
527
  memgineering unlink # stop reading a brain; notes untouched
480
528
  memgineering unlink --purge # also delete the local index and undo snapshots
481
529
  ```
@@ -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,24 +23,47 @@ 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 \
33
36
  --reason "they said from now on, about every repo — not this one"
34
37
  ```
35
38
 
36
- - `--no-scope` for anything meant to hold machine-wide, rules especially: a
37
- rule stamped with one project's scope drops out of another project's
38
- `recall --scope` answers.
39
+ - `--no-scope` for a decision that genuinely holds in every project — a
40
+ security rule, a way of writing commits, something about the person rather
41
+ than the work. It is a real answer, not the safe one: use it when it is true.
39
42
  - `--scope <name>` when the note is ABOUT a project you are not standing in.
40
43
 
44
+ **Prefer the project scope for a rule that is about one project.** `--no-scope`
45
+ used to be the advice for rules in general, on the reasoning that a scoped rule
46
+ drops out of other projects' answers — it does, and that is now the point. Rules
47
+ reach a session in two budgets, one for what holds everywhere and one for the
48
+ project in front of it, so a scoped rule is no longer competing with every other
49
+ rule in the brain for the same few slots. Measured before the split: in a real
50
+ repository all the slots went to rules about other things, and a rule written
51
+ that morning about that project's own layout ranked 49th of 54 — present,
52
+ enforced by nothing, invisible to the session it existed to stop.
53
+
41
54
  `--scope` and `--no-scope` together are refused — they answer the same
42
55
  question both ways.
43
56
 
57
+ **A rule has to say what it binds, and one of the two is required.** A `--rule`
58
+ write is refused when nothing names a scope and nothing can be derived — a
59
+ folder that is not a repository and has no bound project. Add `--scope "<the
60
+ project>"` or `--no-scope`, and retry; nothing was written. On the hosted API
61
+ (`brain_remember`, or `POST /remember` directly) the same refusal applies with
62
+ no derivation at all: send `scope`, or `"scope": "global"` for one that really
63
+ does hold everywhere. `global` is reserved and is stored as no scope, which is
64
+ what a machine-wide rule already looks like — so there is only ever one
65
+ spelling of it to search for.
66
+
44
67
  **`--reason` on every write.** It goes in the ledger and is the only part of the
45
68
  record that still means anything six months later. Every write verb takes it:
46
69
  `remember`, `revise`, `retire`, `exclude`, `undo`. The one on `undo` matters
@@ -183,17 +206,26 @@ it>"`.
183
206
  This rewrites only the memory block in frontmatter. The prose is the user's;
184
207
  neither the command nor you should rewrite it uninvited.
185
208
 
186
- ## Retiring versus excluding
209
+ ## Retiring versus expiring versus excluding
187
210
 
188
211
  ```
189
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
190
214
  memgineering exclude path/to/note.md --reason "it has someone's phone number in it" # stop reading it
191
215
  memgineering retract --actor "mcp:ChatGPT" --since 2026-09-01 # SHOWS what one writer / window wrote
192
216
  memgineering retract --actor "mcp:ChatGPT" --since 2026-09-01 --yes # retires all of it, one ledger row each
193
217
  ```
194
218
 
195
219
  Retiring keeps the note in recall, ranked last and labelled. Excluding takes it
196
- 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
197
229
  which they mean.
198
230
 
199
231
  ## Tidying up a brain: detect, draft, approve
@@ -215,11 +247,30 @@ it is about without opening them. It does not carry their claims, so deciding
215
247
  which of a pair is right still means reading them: two notes can share a title
216
248
  and hold opposite conclusions, which is exactly the case a proposal exists for.
217
249
  It returns them with the evidence that caught them and the action it would
218
- suggest, under six rules: `declared_supersession`, a replaced note still active;
219
- `contradiction`, a disagreement nobody settled; `semantic_similarity`, indexed
220
- meaning agreeing reciprocally; `shared_context`, one scope naming the same
221
- thing; `similar_title`; and `kind_promotion`, a binding note filed as something
222
- other than a decision. Semantic detection reuses a complete, calibrated hosted
250
+ suggest, under eight rules: `declared_supersession`, a replaced note still
251
+ active; `contradiction`, a disagreement nobody settled; `semantic_similarity`,
252
+ indexed meaning agreeing reciprocally; `shared_context`, one scope naming the
253
+ same thing; `similar_title`; and three that read a note against itself, where
254
+ its `binding` flag and its `kind` disagree. `rule_demotion` is a binding note
255
+ the author classified as a fact, a procedure, an episode or a goal — two
256
+ deliberate fields contradicting each other, and the marking is the one to
257
+ doubt. `binding_unclassified` is a binding note with no kind at all, and it
258
+ names BOTH moves rather than picking one, because the tool reads fields and not
259
+ prose: it is either a decision nobody classified or something that was never a
260
+ rule, and only somebody who reads it can say which. (`kind_promotion` remains
261
+ in the vocabulary and no longer fires.)
262
+
263
+ That neutrality was measured rather than chosen for balance. On a real brain,
264
+ 55 of 57 binding notes had no kind and every one was answered "promote this to
265
+ a decision" — including the thirteen that turned out not to be rules, where
266
+ approving the suggestion would have hardened the mistake.
267
+
268
+ **The page is shared between the signals.** One rule used to take the whole
269
+ list — 55 of 57 candidates — so the duplicate and the contradiction underneath
270
+ got a line each. Candidates now round-robin across the rules that found
271
+ something, and `by_rule` reports how many each found in total, which the page
272
+ can no longer tell you. Raising `--limit` widens the page rather than returning
273
+ more of one rule. Semantic detection reuses a complete, calibrated hosted
223
274
  vector generation and never calls a model during consolidation. Authored
224
275
  scope/entity context permits reciprocal neighbours; without it, evidence must
225
276
  form a stricter three-note semantic triangle.
@@ -308,7 +359,7 @@ so an empty one costs something every time.
308
359
  memgineering onboard
309
360
  ```
310
361
 
311
- Says which are still untouched and what to ask for each. Run it first rather
362
+ Says which still have no body written and what to ask for each. Run it first rather
312
363
  than working from a script — asking somebody a question they already answered is
313
364
  its own kind of forgetting. They may also ask outright ("set up my memory", "fill in my profile"); same job.
314
365
 
@@ -353,7 +404,7 @@ always true and you have only just been told them, so dating them today is wrong
353
404
  in the one field a memory store exists to get right.
354
405
 
355
406
  **This is the ONE place you edit a brain file directly** — `01_BASE/` only, and
356
- only while it is still the template. After that first pass these are theirs like
407
+ only while its body has not been written yet. After that first pass these are theirs like
357
408
  any other note.
358
409
 
359
410
  **Do not invent an answer to move on, and do not fill a file because it is
@@ -493,3 +544,12 @@ and mention it in a sentence.
493
544
  passage that says those words. See `memgineering-recall`.
494
545
  - **Store full ids, not short handles**, anywhere durable. `open` prints the
495
546
  full `id:` for exactly this.
547
+
548
+ ## Where a durable fact goes
549
+
550
+ Durable user facts never go in this tool's own memory files — the brain is the
551
+ store every tool they use shares. A note written into one assistant's private
552
+ memory is invisible to every other tool the user talks to, which is the whole
553
+ problem the brain exists to solve. Moved here from the hub when the public
554
+ layer grew an install verb and the hub ran out of room; it is a rule about
555
+ writing, and this is the file about writing.