memgineering 0.2.0 → 0.3.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,181 @@ language the reader wants. The bilingual rule the monorepo applies to
11
11
 
12
12
  ## [Unreleased]
13
13
 
14
+ ## [0.3.0] — 2026-08-10
15
+
16
+ Recall says how old a memory is and why two of them disagree; a screen for
17
+ people who did not come here for flags; and seven places the tool was doing
18
+ something other than what it said.
19
+
20
+ ### Added
21
+
22
+ - **Cards carry an age.** `recall` prints `stated · 3 days ago`, and `--json`
23
+ carries `age_days`. Deciding whether to revise a memory or write a new one is
24
+ a recency judgement, and the card was missing the field that decides it.
25
+ - **Contradictions you can act on.** When two memories disagree, the block now
26
+ gives each side's date and quotes the reason recorded for its last change,
27
+ and names `retire` as the way to settle it. Previously it said only that they
28
+ disagreed, which left the reader to go and find out why.
29
+ - **`revise --title`.** `recall` renders the title as a card's heading, so a
30
+ superseded conclusion used to go on asserting itself in every heading while
31
+ the summary underneath said otherwise.
32
+ - **A warning when the prose stops agreeing with the conclusion.** After a
33
+ supersede, if the note's body still states the claim that was just replaced,
34
+ `revise` says so. It does not touch the body — that is yours — but an
35
+ invisible contradiction inside one note is worse than a visible one.
36
+ - **`setup --web` — setting it up on a screen, for someone who has never opened
37
+ a terminal.** The browser is asked one question at a time: which agents share
38
+ the memory, whether the tool keeps itself updated, whether note summaries are
39
+ handed to every new session, and which folder holds the notes. The folder step
40
+ shows what `link` shows — how many notes would be indexed, which files are
41
+ refused and why, with samples of the exact lines that would be stored — before
42
+ anything is read. Applying calls the same installer the flags do, so both doors
43
+ leave the same files behind. The page is self-contained and served on
44
+ `127.0.0.1` with a one-time key in its URL; it opens the browser itself
45
+ (`--print-url` where there is none) and closes when the setup is applied or
46
+ after ten idle minutes.
47
+
48
+ ### Fixed
49
+
50
+ - **One note could stop the tool for minutes.** The credential scanner's
51
+ short-secret pattern backtracked cubically on text that matched a label and
52
+ then failed at the digits: 200 spaces cost 12ms, 800 cost 279ms, 1,600 cost
53
+ 2.2 seconds — against a 20,000-character field. Bounded now, and flat: the
54
+ same input takes 0.01ms at 20,000 characters, with every short-secret shape
55
+ still detected and no new false positives.
56
+ - **`undo` could delete a note you did not name.** It resolved an operation id
57
+ by unchecked prefix and took the oldest match, so `undo 6` removed the oldest
58
+ note whose id began with a six and reported success. It now requires the same
59
+ five-character minimum `open` does and names the candidates when a prefix is
60
+ ambiguous.
61
+ - **`undo` on a damaged ledger reversed the wrong operation.** A line lost to an
62
+ interrupted write is normally the newest one, so "the last change" stops being
63
+ answerable — and a bare `undo` was then taking the change before it. It
64
+ refuses now and points at `log`; `undo <op_id>` still works, because that
65
+ record parsed and you said which one you meant.
66
+ - **`revise --action conflict` said "Revised" and wrote nothing.** Recording a
67
+ disagreement deliberately does not overwrite either conclusion, but reporting
68
+ a revision while discarding the claim you passed is the tool telling you
69
+ something untrue about your own brain. It now says what it did, says the claim
70
+ was not written, and names `--action supersede` for the other case.
71
+ - **Every read re-checked the same directories, once per note.** Resolving a
72
+ path refuses symlinks by walking it component by component, and in a brain
73
+ whose notes sit under `20_TIMELINE/observations/2026-08/` three of every four
74
+ checks were re-asking about the same three directories: 659ms per command at
75
+ twelve thousand notes, against 220ms for the identical guarantee. Directories
76
+ cleared during one command are not re-checked during that command; the memo
77
+ dies with the command, and the final component — the one the answer is about —
78
+ is always checked.
79
+ - **`resurface` presented `init`'s own boilerplate as something you had
80
+ written.** A base file nobody has filled in still carries the summary `init`
81
+ gave it — so a fresh brain answered "what should you already know here" with
82
+ "Tooling · recalled 14× in this folder · The tools, machines and commands I
83
+ actually use", for a file whose body is one empty bullet. It still surfaces,
84
+ because an unfilled base file is the most worth raising, but it is labelled
85
+ `not filled in yet` and says the line is a prompt. Judged by comparing the
86
+ file byte-for-byte against what `init` wrote: an exact match cannot be a false
87
+ positive, and the moment somebody touches the file it goes back to being their
88
+ note.
89
+ - **`revise` moved a memory's start date every time it ran.** `valid_from` is
90
+ when the fact became true, and it was being written as an edit timestamp — so
91
+ `reinforce`, whose whole job is "same conclusion, better support", walked the
92
+ date forward on every use. A tester added a reason to a memory and watched its
93
+ start date land a day after the thing it describes. `supersede` still stamps
94
+ now, because a replaced conclusion does start now; `reinforce` and `conflict`
95
+ leave it alone, and the new `--valid-from` sets it when the caller knows the
96
+ real date.
97
+ - **The contradiction footer told you to retire a side you had already
98
+ retired.** Two testers hit it independently: retire, run recall, and be
99
+ advised to retire. The disagreement is still shown — both notes are still in
100
+ the brain — but when every side is settled the footer says so.
101
+ - **The rules file written into your notes folder was in Korean.** Every other
102
+ string this tool emits is English on the theory that an agent re-renders for
103
+ its reader — but this one is a document left on disk among somebody's own
104
+ notes, with no agent standing between it and whoever opens it. It also still
105
+ called the tool Kordis.
106
+ - **`stated` was glossed as something it does not mean.** It reports that a
107
+ card's fields came from the note rather than from inference, which is why a
108
+ note carrying a `memgineering:` block but no claim is `stated` — and `open`
109
+ then printed `stated` in its header and "nothing here states a conclusion"
110
+ two lines below. Both sentences were right; the gloss was describing the
111
+ wrong thing, and now says "these fields came from the note".
112
+ - **`log` blamed an external edit it could not have known about.** Divergence
113
+ has more than one cause — an editor, or a write whose ledger entry never
114
+ landed — and the message asserted the first as fact.
115
+ - **A brain whose folder was deleted made every command ambiguous, forever.**
116
+ The linked list is written by `link` and was never re-checked, so one gone
117
+ path — a scratch folder, a moved vault — meant every verb refused until
118
+ somebody found and unlinked it. Missing folders no longer count toward
119
+ ambiguity, are listed as `(missing)` when it still is ambiguous, and are not
120
+ removed from the config: a folder that is absent today may be an unmounted
121
+ disk tomorrow.
122
+ - **`use` with no argument threw instead of answering.** It is the command you
123
+ run to find out why the others are refusing, and it was refusing the same
124
+ way. It now describes the situation, including when nothing resolves.
125
+ - **The `undo` line printed after a write can be pasted and run.** It carries
126
+ `--vault` when the command was given one — a tester copied it verbatim and
127
+ got "2 brains are linked, so this is ambiguous", from a process that knew
128
+ which brain it had just written to one line earlier.
129
+ - **`log` read the whole brain to print twenty lines.** Checking whether notes
130
+ still match the ledger was run over the entire history rather than the rows
131
+ being shown: 161ms at a hundred operations, 5.7 seconds at twenty thousand,
132
+ and worse with every use. Scoped to what is displayed, and the footer now says
133
+ "N of these 20" rather than a brain-wide count it did not pay for.
134
+ - **A reason attached to an undone operation was still being quoted.** `recall`
135
+ and `evidence` would explain a change the note no longer contains.
136
+ - **The `stated` gloss appeared under cards that did not say `stated`.**
137
+ Defining a word the card does not carry teaches the reader something false
138
+ about what they are looking at.
139
+
140
+ ### Changed
141
+
142
+ - `remember`'s two ids are labelled — `note:` and `undo:` — because a tester
143
+ tried the note id with `undo`.
144
+ - A bare `undo` now reports what it reversed and when, and cautions when that
145
+ operation is more than ten minutes old. With another agent or a session hook
146
+ writing to the same brain, "the last change" is not necessarily yours.
147
+
148
+ - **`memgineering onboard`** — what to ask so the brain knows who it belongs to.
149
+ It does not run the conversation, and that is the design: a CLI cannot ask
150
+ "what should I never do without asking you first" and understand the answer,
151
+ but the agent reading this output can. So it returns the work — which of the
152
+ five base files are still exactly what `init` wrote, what each is for, and
153
+ where to start asking — and reports that there is nothing to do once they are
154
+ written.
155
+ - **`init` now hands the base files to the agent instead of the user.** It used
156
+ to close with "Start by filling in 01_BASE/USER.md", which is homework nobody
157
+ does — and what goes in those files (who they are, how they want answers,
158
+ what to ask before doing) cannot be typed into a form. It comes out of a
159
+ conversation, so `init` asks the agent to have one, and the skill carries the
160
+ questions.
161
+
162
+ ### Agent guidance
163
+
164
+ - `memgineering-memory` covers reading a card's age and the contradiction block,
165
+ and asks for `--reason` on every write.
166
+ - `memgineering-memory` also covers filling in `01_BASE/` — the questions, how
167
+ to ask them, and the one narrow case where writing a brain file directly is
168
+ the right move.
169
+ - `memgineering-setup` covers `--web`: when to put a screen in front of a person
170
+ rather than answer setup's flags for them, and that the command does not
171
+ return until they have finished with it.
172
+
173
+ **Restart your agent session after upgrading** so the updated skills load.
174
+
175
+ ## [0.2.1] — 2026-08-09
176
+
177
+ ### Fixed
178
+
179
+ - **The language warning no longer fires on a query that worked.** On a brain
180
+ holding notes in more than one language, `recall "배포"` returned the Korean
181
+ note it was looking for and was told, above the result, that the query could
182
+ not reach the brain. A query that reached a note you wrote reached the brain,
183
+ whatever script it was in. It now stays quiet in that case, and still speaks
184
+ when everything that came back was `01_BASE/` scaffolding — which `init`
185
+ writes in English for everybody, so matching it is not evidence the query
186
+ landed. Found by using 0.2.0 against a real brain; a single-language fixture
187
+ could not produce it.
188
+
14
189
  ## [0.2.0] — 2026-08-09
15
190
 
16
191
  The record can say why, and you can see what a memory is actually worth.
@@ -46,9 +221,8 @@ The record can say why, and you can see what a memory is actually worth.
46
221
  however it is worded — and the old zero-result footer suggested broader
47
222
  wording, the one remedy that cannot work. Four testers hit this and came
48
223
  within one command of telling their user the brain held nothing on a subject
49
- it had notes about. The warning also appears above results, because the
50
- failure is rarely a clean zero: a couple of English scaffolding notes match
51
- and look like an answer.
224
+ it had notes about. It appears above results too, since the failure is rarely
225
+ a clean zero: a couple of scaffolding notes match and look like an answer.
52
226
  - **`use` with no argument now says which brain you are on**, and how it
53
227
  resolved — by pointer, by containment, or by being the only one linked. Its
54
228
  own help had always promised this; it reported only whether a pointer file
package/NOTICE CHANGED
@@ -1,7 +1,7 @@
1
1
  memgineering
2
- Copyright 2026 memgineering
2
+ Copyright 2026 Chang Do Geon ("Rayul", 장도건)
3
3
 
4
- This product includes software developed by memgineering
4
+ This product includes software developed for memgineering
5
5
  (https://memgineering.com).
6
6
 
7
7
  Licensed under the Apache License, Version 2.0. See LICENSE for the full
@@ -26,6 +26,21 @@ No query — it ranks by what has been recalled here before, how recently, and
26
26
  which of their core notes have gone unread. It is the answer to a vague
27
27
  question that recall cannot serve, because there is nothing to search for yet.
28
28
 
29
+ **Fill in their base files when they are still empty.** `init` leaves five
30
+ files in `01_BASE/` as templates, and `resurface` marks an untouched one
31
+ `not filled in yet`. What goes in them — who they are, how they want answers,
32
+ what to ask before doing — only comes out of a conversation, and every session
33
+ starts from zero until it exists. Offer once, ask one question at a time; the
34
+ `memgineering-memory` skill has the questions and how to write the answers.
35
+ They can also ask for it directly — "set up my memory", "내 정보 채워줘" — and
36
+ that is the same job.
37
+
38
+ ```
39
+ memgineering onboard
40
+ ```
41
+
42
+ Says which are still untouched and what to ask for each.
43
+
29
44
  **Recall before answering** anything that sounds like it was settled before:
30
45
 
31
46
  - "what did we decide about…", "how do I deploy this again", "왜 이렇게 했더라"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: memgineering-memory
3
- description: Use when the user asks about something they told you before, refers to a past decision, wants their own notes searched, or says something worth keeping. Triggers include "what did I decide about X", "check my notes", "how do we deploy again", "remember this", "is this still true", "which one do I go with", "예전에 뭐라고 정했더라", "내 노트에서 찾아줘", "이거 기억해둬", "what do you know about my setup". Covers recall, open, evidence, remember, revise, undo, and resurface against the user's own brain folder.
3
+ description: Use when the user asks about something they told you before, refers to a past decision, wants their own notes searched, says something worth keeping, or wants their memory set up so it knows who they are. Triggers include "what did I decide about X", "check my notes", "how do we deploy again", "remember this", "is this still true", "which one do I go with", "set up my memory", "fill in my profile", "teach it about me", "예전에 뭐라고 정했더라", "내 노트에서 찾아줘", "이거 기억해둬", "내 정보 채워줘", "나에 대해 알려줘", "what do you know about my setup". Covers recall, open, evidence, remember, revise, undo, resurface, and filling in the `01_BASE/` files by asking.
4
4
  type: skill
5
5
  allowed-tools: Bash(memgineering:*)
6
6
  ---
@@ -74,6 +74,67 @@ 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
+ ## Filling in the base files, which only you can do
78
+
79
+ `init` creates five files in `01_BASE/` and leaves them empty, because what
80
+ goes in them cannot be typed into a form. Who the user is, how they want
81
+ answers, what you must ask before doing, what would be expensive to get wrong,
82
+ what they actually run — those come out of a conversation.
83
+
84
+ They matter more than any single memory: `resurface` puts these at the top of a
85
+ new session, and an empty one teaches the next agent nothing. A brain whose
86
+ base is untouched is a brain that starts every session from zero.
87
+
88
+ **Offer once, at the natural moment** — right after `init`, or the first time
89
+ `resurface` marks one `not filled in yet`.
90
+
91
+ ```
92
+ memgineering onboard
93
+ ```
94
+
95
+ Says which of the five are still untouched and what to ask for each. Run it
96
+ first rather than working from the list below; it knows what has already been
97
+ done, and asking somebody a question they have answered is its own kind of
98
+ forgetting. Then follow their answers rather than the script.
99
+
100
+ They may also ask for it outright — "set up my memory", "fill in my profile",
101
+ "내 정보 채워줘". Same job, and it is the only entry point that works when you
102
+ did not offer.
103
+
104
+ ```
105
+ 01_BASE/USER.md who they are, what they work on, what they are trying to do
106
+ 01_BASE/PREFERENCES.md how they like answers, code, decisions — length, tone, how much checking in
107
+ 01_BASE/BOUNDARIES.md what you must ask before doing. The one they will regret not saying
108
+ 01_BASE/CRITICAL_FACTS.md what is expensive to get wrong — deploy, money, data, people
109
+ 01_BASE/TOOLING.md editors, languages, machines, the commands they actually run
110
+ ```
111
+
112
+ **How to ask.** One question at a time, in their words, and stop when the
113
+ answers thin out — three good lines beat a filled-in template. Take what they
114
+ say in passing during ordinary work too; most of `TOOLING.md` gets written by
115
+ noticing, not by asking.
116
+
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:
120
+
121
+ ```
122
+ memgineering revise 01_BASE/USER.md \
123
+ --action reinforce \
124
+ --claim "<one line: who they are>" \
125
+ --summary "<the line recall should show>"
126
+ ```
127
+
128
+ This is the ONE place you edit a brain file directly, and the boundary is
129
+ narrow: `01_BASE/` only, and only while the file is still the template `init`
130
+ wrote. Nothing is lost — there is no history to break and nothing to undo — and
131
+ after that first pass these files are theirs like any other note, changed
132
+ through `revise` and never behind their back.
133
+
134
+ **What not to do.** Do not invent an answer to move on, and do not fill a file
135
+ because it is empty. `BOUNDARIES.md` guessed at is worse than blank: the next
136
+ agent will read it as something the user said.
137
+
77
138
  ## Deciding which one to trust
78
139
 
79
140
  When two memories disagree, or one looks old enough to doubt, do not settle it
@@ -40,7 +40,32 @@ updates itself. Recommend `on` — old versions can lose access to hosted
40
40
  features later — but it is theirs to decide.
41
41
 
42
42
  If the user would rather click than type, `memgineering setup --human` gives
43
- them a checkbox screen. Run it and let them drive; do not answer for them.
43
+ them a checkbox screen in your terminal. Run it and let them drive; do not
44
+ answer for them.
45
+
46
+ ### When a person needs a screen, not flags
47
+
48
+ ```
49
+ memgineering setup --web
50
+ memgineering setup --web --print-url # no browser here — hand over the link
51
+ ```
52
+
53
+ `--web` opens a page in their own browser and asks the same questions there,
54
+ one at a time, in plain language. Reach for it when the user is not reading
55
+ your terminal at all — they have never opened one, or they are the one who has
56
+ to decide and a checkbox screen you are driving is not where they can.
57
+
58
+ It covers step 2 as well: the page offers the notes folders it finds on the
59
+ machine, and shows the same disclosure `link --dry-run` prints — how many notes
60
+ would be indexed, which ones are refused and why, with samples of the lines
61
+ that would be stored — before anything is read. When they finish, both steps
62
+ are done and there is nothing left for you to run.
63
+
64
+ The page is served on `127.0.0.1` with a one-time key in the URL, and closes
65
+ itself when the setup is applied or after ten idle minutes. **The command does
66
+ not return until then.** Run it, tell the user to look at their browser, and
67
+ wait for it — a setup screen nobody answered has not set anything up, so do not
68
+ report it as done until the command comes back.
44
69
 
45
70
  **After setup, the agent session has to restart** for the guidance to load.
46
71
  Say so — the user will otherwise wonder why nothing changed.