@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.
- package/NOTICE +1 -1
- package/assets/AGENTS.md +108 -0
- package/assets/KORDIS.md +72 -51
- package/assets/MEMGINEERING.md +9 -10
- package/assets/kordis-publishing/SKILL.md +18 -11
- package/assets/kordis-recommend/SKILL.md +2 -1
- package/assets/kordis-using/SKILL.md +11 -1
- package/assets/memgineering-installing/SKILL.md +184 -0
- package/assets/memgineering-recall/SKILL.md +21 -4
- package/assets/memgineering-registry/SKILL.md +13 -6
- package/assets/memgineering-rules/SKILL.md +59 -15
- package/assets/memgineering-setup/SKILL.md +61 -13
- package/assets/memgineering-writing/SKILL.md +77 -17
- package/dist/index.js +1085 -107
- package/package.json +2 -1
|
@@ -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
|
|
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 `
|
|
223
|
-
|
|
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.
|
|
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
|
-
|
|
219
|
-
|
|
220
|
-
`registry search`, `registry info`, `registry read`, `registry adapt
|
|
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
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
-
|
|
144
|
-
|
|
145
|
-
|
|
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**
|
|
18
|
-
| **
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
|
97
|
-
|
|
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.
|
|
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
|
|
27
|
-
(`
|
|
28
|
-
|
|
29
|
-
|
|
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
|
|
37
|
-
rule
|
|
38
|
-
|
|
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.
|
|
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
|
|
219
|
-
`contradiction`, a disagreement nobody settled; `semantic_similarity`,
|
|
220
|
-
meaning agreeing reciprocally; `shared_context`, one scope naming the
|
|
221
|
-
thing; `similar_title`; and
|
|
222
|
-
|
|
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
|
|
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
|
|
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.
|