memgineering 0.3.0 → 0.4.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,105 @@ language the reader wants. The bilingual rule the monorepo applies to
11
11
 
12
12
  ## [Unreleased]
13
13
 
14
+ ## [0.4.1] — 2026-08-10
15
+
16
+ Security fixes in `setup --web`, from the 2026-08-09 audit
17
+ (`docs/security-audit-2026-08-09.md`). Every one was reproduced against
18
+ 0.3.0/0.4.0 rather than reasoned about. No command or flag changed.
19
+
20
+ ### Fixed
21
+
22
+ - **The setup screen no longer stays up for whoever is knocking.** Its idle
23
+ timer was reset before any request was checked, so anything that could reach
24
+ the port kept a writable install endpoint alive by pinging it — without ever
25
+ presenting the key. The timer now moves only for requests that passed the
26
+ origin and key checks, and there is a one-hour ceiling above it that nothing
27
+ can push back.
28
+ - **`--web` no longer reads a folder you did not mean.** Pointed at a system
29
+ directory it walked one and returned the title and first paragraph of every
30
+ markdown file under it. System folders are refused, the scan stops after
31
+ 5,000 notes rather than running for minutes on a large folder with no way to
32
+ cancel, and the folder step stops answering once the install is done.
33
+ - **A second submit no longer reports a failed install that succeeded.** Two
34
+ applies — the ordinary case of opening the setup link in a second tab —
35
+ both got past the already-applied guard, and the loser was told "Nothing
36
+ further was written" while everything had been written.
37
+ - **The screen cannot be embedded in another page**, and a request that changes
38
+ something must say where it came from.
39
+ - **`--web` no longer claims it opened a browser when it did not.** On a machine
40
+ with no default browser — or a sandbox, or `xdg-open` with nothing to hand it
41
+ — the opener exits non-zero and this reported success anyway, so an agent told
42
+ its user the screen was open while the desktop was unchanged and the printed
43
+ URL was the only way forward.
44
+
45
+ ## [0.4.0] — 2026-08-10
46
+
47
+ A template is not an answer, a revision that revises nothing is not written,
48
+ and linking a second brain no longer breaks the first one everywhere.
49
+
50
+ ### Added
51
+
52
+ - **`recall` tells a template apart from an answer.** A card that is one of the
53
+ five `01_BASE/` files and is still byte-for-byte what `init` wrote is marked
54
+ `not filled in yet`; when every card in a result carries that mark, one line
55
+ above them says nothing you have written matched, and points at `onboard`.
56
+ `--json` carries it as `scaffolding`. Nothing is removed from the result —
57
+ the label is a fact about the file, so an unfilled base note padding out a
58
+ weak answer is visible as padding instead of reading like a conclusion. The
59
+ mark disappears the moment the file is edited, which is also the moment a base
60
+ note starts being the best answer in the brain.
61
+
62
+ - **`revise` refuses a revision that revises nothing.** When the claim, summary
63
+ and title all match what the note already holds, nothing is written and the
64
+ reason is given — a user repeating an answer they had already given used to
65
+ become ledger entries recording no change. Saying `--reason` makes it a real
66
+ record again, which is what `reinforce` is for.
67
+ - **`revise` says when a conclusion landed above `init`'s instructions.** These
68
+ files take two steps — write the body, then record the claim — and doing only
69
+ the second leaves a note whose frontmatter concludes something while the prose
70
+ under it is still the form telling you what to write.
71
+
72
+ ### Changed
73
+
74
+ - **`revise --help` says which `--action` to pick and what it costs to pick
75
+ wrong.** Only `supersede` moves `valid_from`, so using it on a fact that was
76
+ true all along dates it from today. Filling in a blank `01_BASE/` file for the
77
+ first time is `reinforce`.
78
+
79
+ ### Fixed
80
+
81
+ - **Linking a second brain no longer breaks the first one everywhere.** With
82
+ more than one brain linked and no pointer in the current folder, every command
83
+ refused as ambiguous — so a scratch brain linked for an afternoon stopped
84
+ `recall` and `remember` working in every other directory, for every tool
85
+ sharing the config. The first brain linked is now the default and is used when
86
+ nothing more specific applies; `memgineering use --default <path>` changes it,
87
+ and `--vault`, a `.memgineering` pointer, and standing inside a brain all
88
+ still win. The ambiguity refusal remains for the case it was written for —
89
+ several brains and nothing ever said which — and now names the one-time fix.
90
+ Upgrading picks the brain you already had, not the next one you happen to
91
+ link.
92
+ - **The cross-language warning no longer fires over a base file the user wrote.**
93
+ It decided "did this query reach anything the person wrote" from the path — a
94
+ match under `01_BASE/` did not count — so somebody who had answered those five
95
+ questions could ask about their own preferences, get their own note, and be
96
+ told the query could not reach their brain. It now asks whether the file has
97
+ been touched, which is what it meant all along.
98
+
99
+ ### Agent guidance
100
+
101
+ - `memgineering-memory` covers the `not filled in yet` mark and the header above
102
+ a result made only of templates: what they mean, and that a card carrying one
103
+ is not evidence of anything.
104
+ - `memgineering-memory` spells out that filling in a base file is two steps —
105
+ write the body, then record the claim — why it is `--action reinforce` rather
106
+ than the default, and that re-recording something unchanged is refused.
107
+ - `memgineering-setup` covers the default brain, and says not to abandon a write
108
+ because the brain was ambiguous: a refused `remember` means the thing the user
109
+ asked you to keep was not kept.
110
+
111
+ **Restart your agent session after upgrading** so the updated skills load.
112
+
14
113
  ## [0.3.0] — 2026-08-10
15
114
 
16
115
  Recall says how old a memory is and why two of them disagree; a screen for
@@ -74,6 +74,29 @@ Say so. Only titles, aliases and summaries are searched, so suggest broader
74
74
  words — but do not go read their folder yourself to compensate. A brain that
75
75
  answers "nothing" is giving you real information.
76
76
 
77
+ ### Cards that are not answers
78
+
79
+ A card marked `not filled in yet` is one of the five `01_BASE/` files, still
80
+ byte-for-byte what `init` wrote. Nobody has answered it, so it is evidence of
81
+ nothing — do not quote it back as if it were what they think.
82
+
83
+ When every card carries that mark, recall says so above them:
84
+
85
+ ```
86
+ ⚠ Nothing you have written matched this.
87
+ Every card below is still the template `init` wrote
88
+ ```
89
+
90
+ That is the moment to offer to fill them in rather than to answer from them —
91
+ `memgineering onboard` prints the questions. The cards are still listed, because
92
+ the label is a claim about the file, not a decision about what you may see;
93
+ `--json` carries the same fact as `scaffolding: true`.
94
+
95
+ The mark disappears the moment the user writes in the file. A base note they
96
+ have filled in is an ordinary note of theirs and often the best answer in the
97
+ brain — `who am I`, `what am I not allowed to do`, `where does everything live`
98
+ are all answered from `01_BASE/`.
99
+
77
100
  ## Filling in the base files, which only you can do
78
101
 
79
102
  `init` creates five files in `01_BASE/` and leaves them empty, because what
@@ -114,17 +137,30 @@ answers thin out — three good lines beat a filled-in template. Take what they
114
137
  say in passing during ordinary work too; most of `TOOLING.md` gets written by
115
138
  noticing, not by asking.
116
139
 
117
- **How to write it.** These files' bodies are prose, and `revise` only touches
118
- frontmatter so write the body with your normal file tools, then set the
119
- summary so recall shows the real thing rather than the prompt:
140
+ **How to write it both halves.** `revise` only touches frontmatter, so it
141
+ takes two steps, and skipping the first is the common failure: write the body
142
+ with your normal file tools FIRST, replacing `init`'s instructions with what
143
+ they actually said, then record the conclusion.
120
144
 
121
145
  ```
146
+ # 1. replace the body — their words, not the template's prompt
147
+ # 2. then:
122
148
  memgineering revise 01_BASE/USER.md \
123
149
  --action reinforce \
124
150
  --claim "<one line: who they are>" \
125
151
  --summary "<the line recall should show>"
126
152
  ```
127
153
 
154
+ A claim written above the untouched template leaves the file reading as a form
155
+ somebody half-filled — the conclusion in the frontmatter, the instructions for
156
+ writing one still underneath. `revise` warns when you do this; the warning means
157
+ go back and write the body.
158
+
159
+ `--action reinforce`, not the default, and the reason is the date. `supersede`
160
+ stamps `valid_from` with now because a replaced conclusion starts now — but
161
+ these facts were always true and you have only just been told them. Dating them
162
+ today is wrong in the one field a memory store exists to get right.
163
+
128
164
  This is the ONE place you edit a brain file directly, and the boundary is
129
165
  narrow: `01_BASE/` only, and only while the file is still the template `init`
130
166
  wrote. Nothing is lost — there is no history to break and nothing to undo — and
@@ -221,11 +257,24 @@ memgineering revise deploy-manual \
221
257
  --summary "manual only, no CD"
222
258
  ```
223
259
 
224
- - `--action supersede` (default) replaces the conclusion
225
- - `--action reinforce` keeps it and adds support
226
- - `--action conflict` records that two notes disagree without picking a winner
260
+ - `--action supersede` (default) the conclusion CHANGED. Stamps `valid_from`
261
+ with now, because a replaced conclusion starts now.
262
+ - `--action reinforce` the SAME conclusion, new support. Leaves `valid_from`
263
+ alone. Use it when nothing about the fact changed, only your evidence.
264
+ - `--action conflict` — two notes DISAGREE. Records the edge, leaves both
265
+ standing, and deliberately does not write the claim you passed.
227
266
  - `--dry-run` shows the diff and writes nothing
228
267
 
268
+ Pick by what changed, not by habit: `supersede` on a fact that was true all
269
+ along dates it from today, and the date is the field this is all for.
270
+
271
+ **Re-recording something unchanged is refused.** If the claim, summary and title
272
+ all match what the note already holds, `revise` writes nothing and says so —
273
+ otherwise a user repeating themselves turns into ledger entries that record no
274
+ change. When you do mean "this still holds", say what confirms it:
275
+ `--action reinforce --reason "<what confirms it>"`. Check with `open <ref>`
276
+ before rewriting something you may already have.
277
+
229
278
  This only ever rewrites the memory block in a note's frontmatter. The prose is
230
279
  the user's; neither this command nor you should rewrite it uninvited.
231
280
 
@@ -137,8 +137,9 @@ one answers is decided by where you are, in this order:
137
137
  2. a `.memgineering` pointer file, found by walking up from the cwd
138
138
  3. the brain the current directory is inside
139
139
  4. the only one linked
140
+ 5. their default brain — the first one they linked, unless they changed it
140
141
 
141
- If it says the choice is ambiguous, bind the directory once:
142
+ Bind a directory to one brain when that directory belongs to it:
142
143
 
143
144
  ```
144
145
  memgineering use ~/brains/work
@@ -147,6 +148,19 @@ memgineering use ~/brains/work
147
148
  Inside a repository this writes a relative path, so it can be committed and
148
149
  will resolve for a teammate who links the same brain.
149
150
 
151
+ If it still says the choice is ambiguous — several brains, and nothing has ever
152
+ said which is theirs — that is a question for them, not a guess for you. Show
153
+ the list it printed and offer the one-time fix:
154
+
155
+ ```
156
+ memgineering use --default ~/brains/work
157
+ ```
158
+
159
+ **Do not give up on a write because of this.** A refused `remember` means the
160
+ thing they asked you to keep was not kept, and "I could not tell which brain"
161
+ is a solvable problem — ask which one, or use `--vault` for the write and raise
162
+ the default with them afterwards.
163
+
150
164
  ## Checking it worked
151
165
 
152
166
  ```