memgineering 0.5.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -11,6 +11,461 @@ language the reader wants. The bilingual rule the monorepo applies to
11
11
 
12
12
  ## [Unreleased]
13
13
 
14
+ ## [0.6.1] — 2026-08-16
15
+
16
+ ### Fixed
17
+
18
+ - **`memgineering setup` can change a hook it already installed.** It could
19
+ not, and 0.6.0 depended on it being able to. That release widened the
20
+ before-edit hook so a rule about a command — committing, deleting, deploying
21
+ — could be shown at all, and told people to re-run setup to pick it up.
22
+ Re-running setup did nothing: seeing its own hook already in your settings, it
23
+ reported success and left the old shape in place. So the fix reached only
24
+ machines that had never installed memgineering, and the changelog line telling
25
+ everyone else how to get it was wrong.
26
+
27
+ setup now brings a hook it owns up to the current version's shape, in place —
28
+ no duplicate group, and no rewrite when nothing differs. **If you installed
29
+ 0.6.0, run `memgineering setup` once more and restart the conversation**;
30
+ this time it will take.
31
+
32
+ ## [0.6.0] — 2026-08-16
33
+
34
+ ### Added
35
+
36
+ - **A memory can say it binds.** `memgineering remember "<the decision>" --rule`
37
+ marks something as a decision rather than a fact — a colour you will not use, a
38
+ step never to skip. `memgineering rules` lists what is marked. Ordinary
39
+ observations are untouched, and a note that never mentions this is stored
40
+ exactly as before.
41
+
42
+ - **Your rules turn up before an edit, not after somebody asks.** With the hooks
43
+ installed (`memgineering setup`, Claude Code and Codex), whichever agent is
44
+ working in a folder is handed your marked decisions the first time it goes near
45
+ a file in that session — once, capped at eight lines, silent for the rest of the
46
+ session. It never blocks an edit and never answers whether one is allowed; the
47
+ worst it can do is stay quiet.
48
+
49
+ This exists because the session-start summary alone was measured not to work.
50
+ Twice, a session was given a recorded decision — "this site uses no blue", hex
51
+ codes included — at session start, and shipped a blue page; adding a stronger
52
+ instruction to that opening made the next run worse. A decision has to arrive
53
+ when it is about to be broken.
54
+
55
+ - **`memgineering undo` works on a hosted brain for more than `remember`.** A
56
+ `revise`, `retire` or `unretire` made against a hosted brain could not be taken
57
+ back — the refusal said the reverse patch was "not written yet", which was true
58
+ of nothing: it had been recorded all along and nothing read it. A change to a
59
+ memory that cannot be reversed is the one thing this tool promises never to
60
+ make, and it was making it. The reversal is byte for byte, refuses if the note
61
+ has been written since, and will not run twice.
62
+
63
+ - **Rules work on a hosted brain.** `memgineering rules` lists them and
64
+ `remember --rule` creates them there; both used to answer "a hosted brain does
65
+ not store the marking yet", which was true of the schema and false of the note —
66
+ a hosted brain keeps the whole text, so the marking arrived with every push and
67
+ nothing read it. Pushing a brain holding five standing decisions produced a
68
+ rules list of zero. Rules already pushed are backfilled, so they appear without
69
+ anyone re-writing them.
70
+
71
+ The before-edit hook still reads a brain on this machine: a network call on the
72
+ path of every file write is not a trade worth making. On a machine pointed at a
73
+ hosted brain, `memgineering rules --local` is what the hook will actually
74
+ deliver.
75
+
76
+ - **A memory can become a rule after it was written**, on a brain in a folder or
77
+ a hosted one. `memgineering revise <ref> --rule` marks an existing memory as a
78
+ decision that binds, and `--no-rule` stops it being one; leaving both off
79
+ changes nothing, as before. Until now the marking was fixed at the moment a note
80
+ was created, which is the wrong moment — a conclusion usually becomes a rule
81
+ later, when it changes.
82
+
83
+ The hosted half briefly shipped as the worst version of this: the command took
84
+ the flag, sent nothing, and reported success, so a rule somebody had just turned
85
+ off was still a rule and nothing said so. It carries now.
86
+
87
+ - **`memgineering use --json` says where the next write goes.** `destination` is
88
+ `"hosted"`, `"local"`, or `"pending"` — the third meaning a sign-in is waiting
89
+ to be approved, so writes land in `brain` until then and in `hosted` after
90
+ (`destination_until_approved` names the first half). `hosted.sign_in_pending`
91
+ carries the same distinction as a boolean. `hosted.signed_in` alone cannot
92
+ answer the question: it is false for both the logged-out and the waiting
93
+ state, and those land in different places.
94
+
95
+ - **`memgineering log --json` carries `superseded` on every operation**, on a
96
+ brain in a folder and a hosted one alike. It is what the printed line uses to
97
+ decide whether to offer `undo`, and a caller reading the structured output had
98
+ no way to reach the same conclusion.
99
+
100
+ ### Changed
101
+
102
+ - **A large push is no longer stopped by the server's rate limit.** The server
103
+ allows 300 requests a minute and `push` sends one per note, in order, so a brain
104
+ past that size climbed to the ceiling and stopped part-way — some notes across,
105
+ some not. A refusal is now waited out and the note re-sent, up to a bounded
106
+ number of times, and the pause says why once rather than going quiet. Only
107
+ `429` is retried: it means the request was refused, so nothing was written and
108
+ repeating it cannot double anything.
109
+
110
+ - **A hook can no longer hold your session open.** Both callbacks now give up
111
+ after five seconds and print nothing, and the hook `setup` installs carries a
112
+ timeout for the host to enforce as well. Neither existed before, and the gap was
113
+ not theoretical: a brain kept in a folder the OS syncs to the cloud, whose notes
114
+ had been evicted and would not come back, blocked `resurface` for over two
115
+ minutes — at the start of every session, because that is when it runs. Run by
116
+ hand, `resurface` still waits as long as your brain takes; you asked for it and
117
+ you are watching.
118
+
119
+ - **`memgineering setup --agent --hook off` now removes the callbacks.** It used
120
+ to skip installing them, which is right on a machine that never had them and
121
+ wrong on every machine that did — so the hooks stayed armed under a report that
122
+ had just printed "Turn it back off with `--hook off`". Only the groups
123
+ memgineering wrote are taken out; every other hook and setting in that file is
124
+ left exactly as it was, and a settings file that cannot be parsed is reported
125
+ rather than passed over in silence.
126
+
127
+ - **A guide whose markers were deleted no longer duplicates in silence.** Without
128
+ `<!-- memgineering-start -->` and `<!-- memgineering-end -->` the file read as
129
+ "never installed", so a second copy of the whole guide was appended — into every
130
+ session, permanently, with nothing to detect it.
131
+
132
+ Where setup can prove it wrote that file, it now skips it, names it, finishes
133
+ the rest of the run, and exits non-zero. Where it cannot — an install from a
134
+ release before this one, or a machine whose config is gone — it installs anyway,
135
+ because refusing there would make a first install impossible for anyone whose
136
+ own notes happen to use the same two verbs, and says so: "Appended below an
137
+ unmarked guide", with what to check. Losing only the end marker still repairs
138
+ itself.
139
+
140
+ - **Replacing something you edited is said out loud.** setup owns the guide block
141
+ and the skill files, so an upgrade overwrites them; it now records what it wrote
142
+ and tells you when what it replaced was not that. Ordinary upgrades stay quiet.
143
+
144
+ - **A flag that does not exist now says what does.** An unknown option used to
145
+ answer with one line and nothing to act on, and the recovery — opening the help
146
+ page — costs ten times what the answer does. The error now lists the command's
147
+ flags inline, and near-misses get a "did you mean" as well.
148
+
149
+ - **Codex gets both callbacks too.** `memgineering setup --hook on` now writes
150
+ them to `~/.codex/hooks.json` as well as Claude Code's settings, with a matcher
151
+ naming the tools Codex actually reports (`apply_patch` and `Bash` — it has no
152
+ Read or Grep tool, so its reading is a shell call). Codex was previously listed
153
+ as unable to run either one; a live session showed otherwise, including that
154
+ the before-edit hook's context reaches the model. One difference worth knowing:
155
+ Codex asks you to review new hooks once, at the start of the next session, and
156
+ runs nothing until you answer — the setup report now says so.
157
+
158
+ - **Grok is a supported tool.** `memgineering setup` installs the guide into
159
+ `~/.grok/rules/memgineering.md` and the skills into `~/.grok/skills/`, and Grok
160
+ loads both on its own.
161
+
162
+ Your rules reach it at the end of a turn rather than before an edit, and that
163
+ is the most the host allows. Three of Grok's hook events were each tried with a
164
+ value the session could not otherwise know — `PreToolUse` with
165
+ `additionalContext`, `SessionStart` stdout, `UserPromptSubmit` with
166
+ `additionalContext` — and all three hooks ran while none of the three arrived.
167
+ `Stop` does arrive. So the rules land as the turn finishes: too late for what
168
+ that turn already wrote, in time for everything after it. It costs one extra
169
+ round, once a session, because speaking there keeps the agent working.
170
+ `resurface` gets no hook on Grok at all; the guide asks for it instead.
171
+
172
+ - **The third tool is called Antigravity now.** Gemini CLI is discontinued and
173
+ Antigravity CLI took its place, keeping the same home — a line planted in
174
+ `~/.gemini/GEMINI.md` came back out of an `agy` session word for word, and one
175
+ planted in `~/.antigravity/` did not. So nothing moves: the guide and the
176
+ skills install exactly where they did, `--tools gemini` still selects it, and
177
+ only the name shown to you changes. It still has no hooks, so its skills tell
178
+ its agent to run `resurface` and `rules` itself.
179
+
180
+ - `memgineering setup --hook on` now arms two callbacks instead of one, and the
181
+ report names both. `--hook off` still installs neither.
182
+
183
+ - `sync-rules` is described as copying the brain's **read/index exclusions**,
184
+ which is what it has always copied. "Rules" alone now has another owner.
185
+
186
+ - **The bundled skills are English throughout, including their trigger
187
+ phrases.** 0.5.0 shipped a handful of Korean phrases in those triggers, so a
188
+ Korean speaker's agent could match a skill from the words they actually used;
189
+ everyone else got a package with one arbitrary second language in it. Picking
190
+ the trigger language at `setup` time is the right answer and is not built yet,
191
+ so until it is, the phrases are English.
192
+
193
+ Measured before saying so: the same Korean request that used to open a skill
194
+ still opens it with only English phrases installed, and six Korean requests
195
+ across two shapes were all handled correctly. A description is read by a model
196
+ that knows the language either way — the phrases name the situation, not the
197
+ wording. Asking for your memory in Korean still works.
198
+
199
+ - **The guidance now says a fact has to be checked, not worked out.** A session
200
+ that reads an address, an identifier or a version and then reasons its way to a
201
+ different one can write that reasoning into the brain as fact, where every later
202
+ session recalls it as one. A guess in a file turns up in a diff; a guess in a
203
+ memory does not. Two sentences, in the hub and in `memgineering-writing`: a
204
+ decision is whatever the user says it is, and anything a command or a file could
205
+ confirm goes in verified or not at all.
206
+
207
+ - **Tools that nothing calls for them now get told so.** On Antigravity — which
208
+ loads no skills of its own, measured — the installed guide was a router
209
+ pointing at five skills that were never opened, so a brain full of answers went
210
+ unread across a whole session. `setup` now appends two lines to the guide it
211
+ writes for any tool with no session hook: run `memgineering resurface` when you
212
+ start work in a folder, and `memgineering rules` before changing a file. Tools
213
+ that do get called back are unchanged, and see nothing extra.
214
+
215
+ Measured on the same task before and after: no memory calls and a generic
216
+ answer, then `resurface` + `rules`, the right answer, and the decision recorded
217
+ as a rule without being asked.
218
+
219
+ ### Fixed
220
+
221
+ - **Everything on the install screen is drawn by the same hand.** The
222
+ comparison's row rules were 1px hairlines running directly underneath
223
+ hand-drawn frames — the only straight edges on the page, and the first thing
224
+ the eye found. Rules, the recommended badge and the checkboxes are drawn now,
225
+ and hovering a drawn control makes its outline quiver in place the way the
226
+ site's do, instead of repainting a background the way nothing else in the
227
+ product does. Reduced-motion settings hold it to a single frame.
228
+
229
+ - **The first install screen stops asking you to match a table to a pair of
230
+ cards.** It compared "this machine only" against "in an account" in a table,
231
+ and then offered the choice underneath as two cards — in the opposite order to
232
+ the columns, worded differently from the column headers. Someone seeing it for
233
+ the first time could not tell which card the left column was about, which is
234
+ the one thing that screen exists to make obvious. The two answers are now the
235
+ table's own column headers: picking one paints its whole column, so every row
236
+ is read against the answer it belongs to. The recommended one is first in both
237
+ senses, because there is only one order left to be first in.
238
+
239
+ - **The Korean install screen is written the way the rest of it should have
240
+ been.** Every sentence moved to 해요체 and lost the clauses it did not need —
241
+ the register a person deciding something is spoken to, rather than one being
242
+ informed of a decision. The draft terms moved with it; a policy nobody can read
243
+ is not a stricter policy.
244
+
245
+ - **A rule about a command now actually arrives.** The before-edit hook is
246
+ installed with a tool matcher, and `Bash` was not in it — so a decision about
247
+ committing, deleting or deploying could never be shown, because those are shell
248
+ calls. A fresh agent asked to make "never put emoji in commit messages" stick
249
+ ran its whole task through `Bash` and was handed that rule zero times. The
250
+ matcher already carried `Read`, `Glob` and `Grep`, none of which writes
251
+ anything, so waiting for a "file tool" was never waiting for a write.
252
+ **Re-run `memgineering setup` to pick this up** — the matcher lives in your
253
+ tool's settings and an upgrade alone does not rewrite it.
254
+
255
+ - **Renaming your notes folder no longer makes your rules disappear.** When the
256
+ brain you set as default is not on disk, everything falls through to the one
257
+ that is — deliberate, so an unmounted drive does not stop you working. Nothing
258
+ said it had happened, so `rules` answered from the other brain with "no
259
+ standing decisions recorded", which reads as "I never wrote any down" and gets
260
+ acted on by writing them again, into a brain that is not the one you lost.
261
+ `use` said "because it is the only brain linked" while two were linked.
262
+ `rules`, `use` and `resurface` now name the folder they could not reach, say
263
+ the answer came from somewhere else, say nothing is lost, and give the one
264
+ command that fixes it. Silent when your default is fine.
265
+
266
+ - **The sign-in screens are on memgineering.com.** Approving a sign-in used to
267
+ happen on `api.memgineering.com`, an API subdomain, on a page built from
268
+ colours that matched nothing else in the product. Approval, the refusals and
269
+ the "you're done" screen are now all at `memgineering.com/auth/device`, drawn
270
+ from the same stylesheet as the rest of the site. Nothing changes in the CLI —
271
+ `login` opens whichever address the server hands it.
272
+
273
+ - **The install screen draws itself again.** `memgineering setup --web` serves one
274
+ self-contained page under `default-src 'none'`, and that policy named no
275
+ `img-src` and no `font-src` — so the browser silently dropped every asset the
276
+ page was carrying inside itself. The hand-drawn borders around the cards, the
277
+ inputs and the buttons never painted, and neither did the typeface. On the
278
+ account step this cost the reader the way forward: the `Next` button is drawn
279
+ rather than filled with a colour, so it rendered as an invisible rectangle with
280
+ a label the same shade as the page. The policy now permits `data:` for images
281
+ and fonts, and nothing else — no host, no scheme, no wildcard — so the screen
282
+ still opens with the machine offline. A test now reads the page for the
283
+ schemes it actually uses and asks the policy about each one, which is the
284
+ comparison nobody was making: both files were correct about themselves.
285
+
286
+ - **A hosted brain shows why a memory changed, in the output you get without
287
+ asking.** Every write is told to carry a `--reason`, on the argument that it is
288
+ the only part of the record still worth anything six months later — and then
289
+ neither read command printed one. On a hosted brain, `memgineering evidence`
290
+ answered with `surfaced 8 · opened 4` and stopped, and `memgineering log` gave a
291
+ timestamp and a path. The reasons had been in the response all along, and in
292
+ `--json`, so nothing was lost; it was simply never shown, which for a default
293
+ output is the same thing.
294
+
295
+ Both commands now print the same report from a hosted brain that they print
296
+ from one on your disk: the title, the standing and what it means, the ledger,
297
+ and the reason quoted. `log` additionally shows who made each change, whether
298
+ it was already undone, and whether the note has moved on since — all of which
299
+ the server was sending and the client was discarding.
300
+
301
+ - **`memgineering use` named the wrong brain.** Signed in and pointed at a
302
+ hosted brain, it reported the folder on this disk — a real folder, that
303
+ nothing had written to in weeks — while every `recall` and `remember` went to
304
+ the server. Naming the wrong destination is the one thing this tool cannot do:
305
+ nothing about the answer looks wrong until somebody goes looking for a note
306
+ that was never written there.
307
+
308
+ It now answers with whichever brain the next command will actually use, in all
309
+ three states: the hosted one when signed in; the folder when the pointer is
310
+ there but the sign-in is not, because that is where writes land; and, when a
311
+ sign-in is merely waiting to be approved, both — the folder until somebody
312
+ approves it, the hosted brain after. It reads state off the disk, so it
313
+ answers with the server down and it never completes a sign-in as a side
314
+ effect of being asked a question. See the `--json` fields under Added.
315
+
316
+ - **`memgineering pull` uses the brain this machine is pointed at.** It was the
317
+ only hosted verb that could not answer "which brain" from state every other
318
+ verb reads, so on an account with two, the command somebody runs to back up
319
+ the brain they had been using all session answered "more than one hosted brain
320
+ — say which". `--brain` still wins, an unpointed machine with two brains still
321
+ gets the refusal, and the success line now names the brain it downloaded.
322
+
323
+ - **`memgineering pull` says which of your brains the folder does not contain.**
324
+ A tester pulled, was told 21 notes had arrived, and had no reason to doubt it —
325
+ the other 45 of their 66 were in a second hosted brain on the same account, and
326
+ a successful run never mentioned that it existed. A backup nobody knows is
327
+ partial is worse than one that failed. Both the real run and `--dry-run` now
328
+ name the other brains and give a command that fetches one; `--json` carries
329
+ `other_brains` and a hint saying not to call this a backup until each has been
330
+ pulled.
331
+
332
+ - **Asking where an install stands no longer means running the command that
333
+ installs.** There is no `status` verb, and the answer lives behind
334
+ `memgineering setup --agent --dry-run`, which writes nothing. A tester looking
335
+ for it either avoided `setup` — whose name says it installs — and got no
336
+ answer, or ran it and changed something to find out. `--help` now names the
337
+ dry run on the `setup` line, and the setup skill collects the three read-only
338
+ questions (`setup --dry-run`, `whoami`, `use`) in one place. It also names
339
+ `memgineering guard` as the hook's entry point, which stays out of `--help` on
340
+ purpose: it reads a hook payload on stdin and does nothing without one.
341
+
342
+ - **A question asked as a sentence is told what `recall` actually matched.**
343
+ "Only titles, aliases and summaries are searched" printed on zero results only
344
+ — the one case where there is nothing to misread. Asked as a whole sentence,
345
+ recall can return notes that share a single ordinary word with the question,
346
+ and every card reads `stated` with nothing to say the match was on "not"
347
+ rather than on the subject. That sentence now also appears under the results
348
+ when the query is a question or four words or more. It is not a warning: this
349
+ cannot know whether the results are any good, and a ⚠ over a right answer is
350
+ how a reader learns to skip the line.
351
+
352
+ - **A hosted card with no age no longer reads `NaN years ago`.** The guard
353
+ tested for `null` and a server that omits the field sends `undefined`, so a
354
+ real answer arrived wearing a number that was not one.
355
+
356
+ - **`memgineering recall` says which results are decisions you already made.**
357
+ `resurface` has labelled them "a standing decision" since rules existed, and
358
+ `recall` — the verb an agent reaches for far more often — returned a decision
359
+ and an ordinary observation looking identical. A brain with five standing
360
+ decisions in it could answer a question without saying which of the answers
361
+ the user had already committed to. The card now says so, and `--json` carries
362
+ a `binding` field on every card: present and `false` on an ordinary memory, so
363
+ a caller can tell "not a rule" from "this version does not say".
364
+
365
+ A hosted brain shows this once its server is updated; nothing breaks in the
366
+ meantime, the label is simply absent.
367
+
368
+ - **An id from `memgineering log` no longer looks like one from `recall`.** They
369
+ are the same length in the same alphabet, arrive in the same backticks, and
370
+ nothing said which was which — so an agent read an operation id off `log`, ran
371
+ `open` on it, and was told "nothing here matches — try searching". No search
372
+ can return an operation id. `log` now labels each one `undo:`, and `op:`
373
+ wherever `undo` would refuse it: an operation already undone, one that is
374
+ itself an undo, one whose note has been written since, or a verb that brain
375
+ cannot reverse — a hosted brain cannot reverse an `exclude`, and neither side
376
+ reverses an `import`. Fed one anyway, `open` says what the id is, which change
377
+ it names, the note it touched, and how to read that note; a truncated id works
378
+ there too, since `undo` accepts one.
379
+
380
+ - **`memgineering log` no longer warns that notes changed when they did not.**
381
+ It checked each operation's file through the note reader, which refuses
382
+ excluded and deny-listed paths — and read that refusal as "the file is gone".
383
+ So every `exclude` anybody ran was reported as changed (its target is
384
+ `.memgignore`, which is deny-listed), and so was the entire history of any
385
+ note that had been excluded. Separately, the divergence check was handed the
386
+ rows newest-first while it keeps the last one it sees per note, so it compared
387
+ against the OLDEST operation — an ordinary remember-then-revise reported the
388
+ note as edited outside the tool, about the tool's own write. Measured in each
389
+ case: the warning appeared and `undo` reversed the operation happily.
390
+
391
+ - **A crafted name from a hosted brain can no longer rewrite your terminal.**
392
+ Titles, paths, handles, brain names, account names, ranking reasons and server
393
+ hints were printed as they arrived, so a string containing terminal escape
394
+ sequences could erase the lines above it, move the cursor, or plant a
395
+ clickable link that goes somewhere else. `pull` was worse than a rendering
396
+ bug: with no destination given it names the folder after the brain, so a
397
+ crafted name created a directory on your disk carrying those bytes.
398
+
399
+ Every command that renders one of these strings now strips it — `recall`
400
+ (cards and the contradictions block), `open`, `evidence`, `log`, `resurface`,
401
+ `rules`, `remember`, `revise`, `undo`, `retire`, `unretire`, `exclude`,
402
+ `unexclude`, `use`, `whoami`, `push`, `pull`, `login`, `setup`'s sign-in step,
403
+ `update`, `link`'s previews, and the error output. Handles are stripped where
404
+ they are built rather than where they are printed, because a handle this tool
405
+ did not mint is the note's own `id:` field and there are a dozen places that
406
+ print one.
407
+
408
+ A brain in a folder gets the same treatment, and it took three passes to mean
409
+ it. The first sweep drove only each verb's hosted half, so a local note's
410
+ title, path, claim, scope, headings and ledger target still reached the
411
+ terminal. Patching those by hand missed five more, and the round after that
412
+ missed six — which is what finally replaced "check each one" with mutation
413
+ testing: break one strip, and a suite has to go red. `stripControl` says why
414
+ this is in scope at all — a folder brain can have synced from another machine
415
+ or be written by a team — and a note that arrived over Dropbox is as much
416
+ somebody else's writing as one that arrived over HTTPS.
417
+
418
+ Two suites drive it, one per brain, against notes and responses poisoned at
419
+ both ends of every string: eighteen local surfaces and eighteen hosted ones,
420
+ plus three server replies the fixture previously could not produce — a
421
+ reversal the server cannot describe, a curation that changed nothing, and a
422
+ recall carrying a contradiction.
423
+
424
+ Coverage is stated as measured rather than asserted. Breaking each of the 120
425
+ strips one at a time and re-running the suite, 92 are caught by a test. Of the
426
+ 28 that are not, most cannot be: `revise`'s diff renders YAML source, and the
427
+ serializer has already turned any control character into the four letters
428
+ `\x1b` before it reaches a screen; `open`'s claim line prints two enums;
429
+ `.memgignore` refuses a path with control characters before the branch that
430
+ would echo one; ids and error codes are excluded from the poisoned fixture on
431
+ purpose, since a caller passes an id back as a selector and branches on a code.
432
+ What is left genuinely untested is small and named: the browser consent screen,
433
+ which needs a terminal; the two `login` lines that need a browser to open and a
434
+ device flow to be approved; and a handful of second arms only a particular
435
+ server reply produces. Saying "every command is covered" was wrong four
436
+ releases running, so this says the number instead.
437
+
438
+ ### Agent guidance
439
+
440
+ - **Re-run `memgineering setup` after upgrading, then restart the
441
+ conversation.** Two things this release changes live outside the package: the
442
+ guidance block in your tool's instructions file, and the before-edit hook's
443
+ tool matcher — which gains `Bash`, without which a rule about a command is
444
+ never shown. Upgrading the CLI rewrites neither; `setup` does. The restart is
445
+ because the guidance is read once, when a conversation starts.
446
+
447
+ - **The block memgineering writes into your `CLAUDE.md` is now a third of the
448
+ size** — 178 lines to 52, and no command syntax at all. That block is in your
449
+ agent's context for every session forever, and it had grown into a second copy
450
+ of a manual that already existed as an on-demand skill. What it keeps is what
451
+ has to be true before any skill loads: what a brain is, which tools this
452
+ actually reaches, when to reach for it, and where the detail is.
453
+
454
+ - **Five skills instead of two.** `memgineering-memory` is now the map — which
455
+ verb answers which question — and points at `memgineering-recall` (recall,
456
+ open, evidence, resurface), `memgineering-writing` (remember, revise, undo,
457
+ retire, exclude, filling in `01_BASE/`), `memgineering-rules` (`--rule`, the
458
+ eight-slot budget, what the before-edit hook shows) and `memgineering-setup`,
459
+ which gains `push`/`pull`. Nothing was dropped; `resurface` had been explained
460
+ twice and now is explained once.
461
+
462
+ - `MEMGINEERING.md` 0.2.0 → 0.4.0, covering `--rule`: what counts as a decision,
463
+ and that a user saying "from now on" or "never" is making one without using
464
+ the word. **Restart your agent session after upgrading** so the new guidance
465
+ is read.
466
+
467
+ ## [0.5.0] — 2026-08-12
468
+
14
469
  ### Added
15
470
 
16
471
  - **Every command works on a hosted brain.** `revise`, `resurface`, `retire`,
package/NOTICE CHANGED
@@ -9,6 +9,28 @@ terms. This NOTICE file must be included in redistributions and derivative
9
9
  works, per section 4(d) of that license.
10
10
 
11
11
 
12
+ BUNDLED FONT
13
+ ------------
14
+
15
+ The install screen (`memgineering setup --web`) carries a typeface inside the
16
+ program rather than fetching one. It is served over loopback under a policy
17
+ that allows no outbound request, so a webfont either arrives in the document or
18
+ does not arrive at all.
19
+
20
+ Jua
21
+ Copyright 2018 The BM JUA Project Authors
22
+ (https://github.com/googlefonts/jua)
23
+ Licensed under the SIL Open Font License, Version 1.1
24
+ (http://scripts.sil.org/OFL)
25
+
26
+ What ships is a SUBSET — 431 of the face's 2,520 glyphs, being the characters
27
+ the install screen's headings contain in Korean and English. It is embedded as
28
+ a WOFF2 in the program's own code and is not offered for download, sold, or
29
+ distributed on its own. The OFL permits both the subsetting and the embedding;
30
+ this notice is the attribution it asks for in return. The font is not renamed,
31
+ and no Reserved Font Name is claimed.
32
+
33
+
12
34
  UPDATES AND SUPPORT
13
35
  -------------------
14
36
 
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  One memory for the AI you connect.
4
4
 
5
5
  Your notes stay in a folder you own. Every agent you use — Claude Code, Codex,
6
- Gemini — reads and writes the same brain through one CLI, so what you told one
6
+ Antigravity — reads and writes the same brain through one CLI, so what you told one
7
7
  of them is there for the next one, tomorrow, and in whatever tool you move to
8
8
  after that.
9
9