memgineering 0.11.1 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -11,6 +11,124 @@ language the reader wants. The bilingual rule the monorepo applies to
11
11
 
12
12
  ## [Unreleased]
13
13
 
14
+ ## [0.13.0] — 2026-08-28
15
+
16
+ ### Added
17
+
18
+ - **Widening a boundary is one word, not a retyped list.**
19
+ `revise <ref> --claim "…" --never-store-add "therapy"` adds words to a
20
+ note's declared boundary while keeping every word already there —
21
+ `--never-store` REPLACES the list, so the old remedy was to retype it
22
+ and one transcription slip silently narrowed a boundary. Only the new
23
+ words are validated; the declared ones are grandfathered, so a list an
24
+ older rule set accepted can still be widened. Refused: a note that
25
+ declares no boundary (start one with `--never-store`), the flag beside
26
+ `--never-store` / `--no-never-store` / `--input`, and an addition
27
+ where every word is already held. After a hosted widening the CLI
28
+ reads the note back and warns loudly — on the human line and as
29
+ `never_store_dropped` in `--json` — if the words did not land; honest
30
+ framing: on today's servers that read is drift-defense (a server that
31
+ rewrites or partially accepts the list), not version-skew protection,
32
+ because a server too old for boundaries makes the no-declaration
33
+ refusal fire first. If the read-back itself fails after the write
34
+ landed, the command reports "could not confirm" instead of failing a
35
+ revision the server already holds.
36
+ - **The semantic suggestion now recommends the additive form.** The
37
+ remedy command printed after a near-boundary write — human line and
38
+ `--json` hint alike — is built by the CLI and says `--never-store-add
39
+ "<the word>"`, so following it can no longer delete the words already
40
+ declared. The regression pin is a negative match, because
41
+ `--never-store-add` contains `--never-store` and a substring check
42
+ would pass on the destructive form.
43
+
44
+ ### Fixed
45
+
46
+ - **`proposals approve|reject|rebase --vault <path>` acts on the brain it
47
+ names.** The parent `proposals` command declares `--vault`/`--local`
48
+ for its own listing, and commander parses a parent's options out of
49
+ the whole argv — so the subcommands received nothing at ANY flag
50
+ position and fell through to the linked brain: on a machine signed in
51
+ to a hosted brain, an approval aimed at a folder went to the cloud.
52
+ The subcommands now hear the flags wherever they are written (the last
53
+ occurrence on the line binds), and the undo hint printed after an
54
+ approval names the brain the write actually landed on.
55
+ - **The local `revise --input` door screens `claim.scope`.** It was the
56
+ one user-prose field reachable through `--input` that the boundary
57
+ screen did not see. Honest framing: the engine currently discards
58
+ scope on this path, so this shuts a door rather than plugs a leak —
59
+ it guards against that internal list ceasing to be true.
60
+
61
+ ### Agent guidance
62
+
63
+ - The `memgineering-writing` skill's widening section changed: add a
64
+ word with `--never-store-add`, replace or narrow a list with
65
+ `--never-store`, and a repeated did-not-land warning means stop and
66
+ tell the user. Restart your agent session after upgrading so the new
67
+ guidance is what gets injected.
68
+
69
+ ## [0.12.0] — 2026-08-28
70
+
71
+ ### Added
72
+
73
+ - **A declared storage boundary now refuses the write that breaks it.**
74
+ `remember --never-store "health, hospital, …"` records the user's own
75
+ sentence plus the word list that enforces it (`--never-store` implies
76
+ `--rule`, so the declaration shows up in `memgineering rules` and the
77
+ before-edit hook). From then on, a write carrying a declared word is
78
+ refused with the matched word and the declaration quoted back — on a
79
+ hosted brain and on a folder alike, whether or not the agent read
80
+ anything first. Every door is screened: `remember`, `revise`'s claim /
81
+ summary / title, curation's free-text fields, a proposal's added lines,
82
+ and each note of a bulk `push` (one refusal no longer stops the batch;
83
+ the rest upload and the summary names what was refused). The failure
84
+ this closes was measured: a fast-tier agent wrote two health facts on
85
+ its first turn having opened nothing; in the round-12 rerun the same
86
+ agent was refused and the facts stayed out.
87
+ - **Refusal is lexical by measurement, not by preference.** Against the
88
+ production embedding profile, semantic similarity cannot separate what
89
+ must be refused from what must be allowed at any threshold
90
+ (`docs/research/boundary-matching-2026-08.md`) — so the words the user
91
+ chose are the entire law: deterministic, explainable, zero-latency,
92
+ identical hosted and local. The matcher sees words as written — no
93
+ stemmer, so declare nouns; one-character terms are refused at
94
+ declaration time because they match half the dictionary; CJK terms
95
+ match inside words (that is what makes particles work), Latin terms on
96
+ word boundaries.
97
+ - **What the words miss, a suggestion surfaces — and it never refuses.**
98
+ On a hosted brain with embeddings, a stored note that reads close to a
99
+ declared boundary while containing none of its words comes back with
100
+ one line naming the declaration and both actions: `undo`, or widen the
101
+ list. The catch rate on paraphrases is partial by measurement (a
102
+ 25–50% band on hand-built sets) and it interrupts rarely (4% of benign
103
+ writes measured) — it exists so the user learns their word list has a
104
+ hole, not to detect paraphrase. Any embedding failure drops the
105
+ suggestion silently, never the write. A brain with no declarations
106
+ pays one SQL lookup and nothing else — no matching, no extra
107
+ embedding call.
108
+ - **Curating a boundary.** `revise <ref> --never-store "<words>"`
109
+ REPLACES the word list (`--claim` required — the restated boundary is
110
+ part of the edit), `--no-never-store` lifts the list while keeping the
111
+ note, and retiring the declaration lifts the boundary entirely: a
112
+ retired or excluded declaration stops refusing.
113
+ - **Crossing a boundary on purpose leaves a mark.**
114
+ `remember --override-boundary <declaration-path> --reason "<why>"`
115
+ stores the write anyway. The path is only learnable from the refusal
116
+ itself, the reason is enforced server-side, and the ledger records the
117
+ crossing — visible in `memgineering log`, counted by `evidence`.
118
+ Declaring a boundary is itself marked in the ledger, so the audit
119
+ trail starts at the declaration. Honest limit: the override's
120
+ `--reason` is free text and unscreened; guidance forbids restating
121
+ blocked content there, but nothing enforces it.
122
+
123
+ ### Agent guidance
124
+
125
+ - The hub and the `memgineering-writing` skill changed substantially:
126
+ how to record a declaration (nouns, generous list, nothing
127
+ one-character), what to do when refused (the override is the user's
128
+ call, never a retry reflex), and why `--never-store` REPLACES rather
129
+ than adds. Restart your agent session after upgrading so the new
130
+ guidance is what gets injected.
131
+
14
132
  ## [0.11.1] — 2026-08-27
15
133
 
16
134
  ### Added
@@ -22,8 +140,9 @@ language the reader wants. The bilingual rule the monorepo applies to
22
140
  guidance tells an agent to check the file before recording anything in a
23
141
  commonly guarded domain. Honest limit, measured in fresh-session rounds: the
24
142
  check holds for agents that read before writing; a fast-tier agent that fires
25
- `remember` reflexively can still miss it — a server-side advisory at write
26
- time is the planned follow-up.
143
+ `remember` reflexively can still miss it — closed in 0.12.0, where a declared
144
+ boundary refuses the write itself (this entry originally promised an
145
+ "advisory"; what shipped is a refusal).
27
146
  - **A fact carried in from another store names its source.** New guidance
28
147
  section: when memories are migrated from another tool's files or a pasted
29
148
  document, the `--reason` names the source file — never a confirmation that
@@ -2,7 +2,7 @@
2
2
  name: memgineering
3
3
  description: Use whenever the user refers to something they told you before, asks what was decided, tells you something worth keeping, or settles something that should hold next time. The memory lives in their own folder and outlives this session; check it before answering from guesswork, and write to it when you learn something durable.
4
4
  type: skill
5
- version: 0.11.1
5
+ version: 0.13.0
6
6
  ---
7
7
 
8
8
  # memgineering
@@ -322,20 +322,108 @@ what must never be WRITTEN into this brain at all. "Do not keep anything about
322
322
  my health here" is the second kind — the user's own sensitive-topics control,
323
323
  except they name the topics.
324
324
 
325
- **Check before you record, not after.** Before writing something in a domain
326
- people commonly guardhealth, beliefs, relationships, politics, sexuality,
327
- money trouble run `memgineering open boundaries` first, unless this session
328
- has already read that file. The card shows a base file's whole body, and the
329
- boundaries live in the body a recall card or a resurface line may name the
330
- file without quoting them, and an empty-looking card is not permission. A declared storage boundary beats every
331
- "write it down" trigger in this skill: skip the write and say in one sentence
332
- why. If nothing is declared and the remark still feels sensitive, the section
333
- below applies record, but say so once, plainly.
334
-
335
- When the user declares one ("never write anything about my family"), it is
336
- worth two writes: the line itself into `BOUNDARIES.md` — their file, their
337
- words and, since it should hold next time, a `--rule`; see
338
- `memgineering-rules`.
325
+ **The second kind is enforced, not advised.** A write carrying a declared word
326
+ is refused by the product at every door, on a hosted brain and on a folder,
327
+ whether or not you read anything first. That is deliberate: guidance only
328
+ reaches the agent that reads, and the failure this answers was a session that
329
+ wrote two health facts on its first turn having opened nothing.
330
+
331
+ ### Recording one
332
+
333
+ When the user says "never write anything about my health here", it takes one
334
+ write and a word list:
335
+
336
+ ```bash
337
+ memgineering remember "Nothing about my health gets written into this brain" \
338
+ --never-store "health, hospital, clinic, diagnosis, symptom, medication" \
339
+ --reason "they said it twice and it keeps getting missed"
340
+ ```
341
+
342
+ The sentence is theirs and stays their words. The LIST is what refuses, so:
343
+
344
+ - **Nouns, not verbs.** There is no stemmer: a verb will not be caught in
345
+ another tense, in any language.
346
+ - **Nothing one character long** — refused at the door. A single Korean
347
+ syllable, or an English letter, matches half the dictionary.
348
+ - **Be generous.** A word costs nothing until it matches, and a topic the list
349
+ misses is a fact that lands silently.
350
+ - A term in a language written without spaces between words matches INSIDE a
351
+ word — which is what makes it work at all where particles attach to nouns,
352
+ and also means it catches compounds the user may not have pictured. Latin
353
+ terms match on word boundaries instead: "med" will not catch "media".
354
+
355
+ `--never-store` implies `--rule`, so the declaration appears in
356
+ `memgineering rules` and in the before-edit hook — which is where the user sees
357
+ what they have declared.
358
+
359
+ ### Widening, narrowing, lifting
360
+
361
+ To add a word, name ONLY the new word — the note's words stay:
362
+
363
+ ```bash
364
+ memgineering revise <ref> \
365
+ --claim "<the boundary, restated to cover the new word>" \
366
+ --never-store-add "therapy"
367
+ ```
368
+
369
+ `--claim` is required, and an unchanged claim is refused — restate the boundary
370
+ rather than copying the line already there. A note that declares no boundary
371
+ refuses `-add` and points you at `--never-store` — that is also what you will
372
+ see for every note on a hosted brain older than boundaries, where there is
373
+ nothing to widen yet. After a hosted widening the CLI reads the note back and
374
+ warns out loud if the words did not land; if that warning repeats on a retry,
375
+ the server is not storing what it accepts — stop and tell the user.
376
+
377
+ To narrow or rewrite the list, `--never-store` **REPLACES** it wholesale — name
378
+ every word the note should still hold, because a word you leave out is a word
379
+ the boundary loses. That is what makes it the narrowing verb and the wrong verb
380
+ for adding: **with `--never-store`, naming only the new word deletes the words
381
+ already declared.** The CLI refuses the two flags together rather than guessing
382
+ which you meant.
383
+
384
+ To lift a boundary entirely: `memgineering retire <the declaration>`. That is
385
+ the un-declare path, and it is the user's decision, never yours.
386
+
387
+ On a hosted brain the declaration NOTE is the record — there is no route that
388
+ edits a base file's body, so mirroring the sentence into `BOUNDARIES.md` is a
389
+ folder-brain and onboarding-time thing.
390
+
391
+ ### When a write is refused
392
+
393
+ The refusal names the word and quotes the declaration. What it means is that
394
+ the person whose brain this is already decided, so:
395
+
396
+ - **Record everything else** you learned, leaving that fact out, and carry on.
397
+ A refusal is not a failed task.
398
+ - **Do not send it again with the word taken out.** The boundary is about the
399
+ fact, not the spelling.
400
+ - **Do not put what was blocked into `reason`, a title, a scope, or any other
401
+ field.** The ledger is stored too; moving it is storing it.
402
+ - **Do not attach `--never-store` to get past the screen.** A write that
403
+ declares a boundary is exempt from screening, which makes that a bypass — and
404
+ it is recorded in the ledger as one, at every door.
405
+ - There IS an exception flag, and it is not yours to reach for. It exists for
406
+ the user saying "no, keep this one". If they did not say that in this
407
+ conversation, the answer is to leave the fact out.
408
+
409
+ ### The suggestion, and what silence from it is worth
410
+
411
+ A write can be plainly on a declared topic while carrying none of the declared
412
+ words, and words cannot see that. When the server notices one it says so after
413
+ storing it — it never refuses — and offers the two things worth doing: take the
414
+ note back with `undo`, or widen the list so next time it is refused properly.
415
+
416
+ Measured, it notices roughly a third to a half of them, and it is skewed: a
417
+ topic with broad vocabulary is caught more often than a narrow one. **So
418
+ silence from it is not permission.** It is a prompt to widen a list, not a
419
+ clean bill of health, and telling the user what it said is usually the right
420
+ move — the decision is theirs.
421
+
422
+ ### What the enforcement does not cover
423
+
424
+ The word list is checked on every write that carries user prose. It is NOT
425
+ checked on `reason` — say so plainly if that matters to them — and a brain in a
426
+ folder can always be edited outside this tool, which no CLI can prevent.
339
427
 
340
428
  ## What to raise with the user
341
429