memgineering 0.14.0 → 0.15.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,12 +11,93 @@ language the reader wants. The bilingual rule the monorepo applies to
11
11
 
12
12
  ## [Unreleased]
13
13
 
14
+ ## [0.15.1] — 2026-08-29
15
+
16
+ ### Fixed
17
+
18
+ - The 128-character cap on `scope` and `asked_from` is now spelled once, in
19
+ the engine both sides already read, instead of living as three hand-copies
20
+ that each admitted nothing would catch their drift. Same number everywhere;
21
+ no behaviour change.
22
+
23
+ ### Agent guidance
24
+
25
+ - The hub's reflex table gains a fourth row: a vague opening — a new folder,
26
+ "where were we", picking work back up — is now a `memgineering resurface`
27
+ reflex, not just a bullet further down. Measured before and after on a
28
+ fast-tier model in the lab: the same session that skipped resurface twice
29
+ runs it first with the row in place, and the project-aware opening lands.
30
+ Restart your agent session after upgrading so the new hub is what gets read.
31
+
32
+ ## [0.15.0] — 2026-08-29
33
+
34
+ ### Added
35
+
36
+ - **A folder knows which project it is.** `memgineering project` names the
37
+ project the current folder counts as — derived from the git remote
38
+ (`owner/repo`), else the checkout's folder name, else nothing; worktrees
39
+ and subfolders of one checkout answer the same. `memgineering project
40
+ <name>` binds your own name to the repository and `--unset` returns to the
41
+ derived one. Renaming does not move history: what was recalled under the
42
+ old name stays recorded there, and the command says so whenever it
43
+ changes anything. Derivation reads `.git/config` directly — no
44
+ subprocess, so the session-start hook's deadline is never spent on it.
45
+ - **A note remembers the project it was born in.** `remember` inside a
46
+ project folder stamps that project as the note's `scope` automatically.
47
+ An explicit `--scope` still wins; the new `--no-scope` writes a
48
+ machine-wide note on purpose — rules especially, since a rule stamped
49
+ with one project's scope drops out of another project's `--scope`
50
+ recalls. A derived name the server would refuse (over 128 chars, or
51
+ nothing once normalized) is skipped silently and the note is written
52
+ unscoped — an ambient signal never fails a command. The `YYYY-MM` noise
53
+ scope that path inference used to give observations is gone for new
54
+ notes.
55
+ - **Reads say where they were asked from — as a name, never a path.**
56
+ recall, open and resurface now send `asked_from`, the folder's project
57
+ name, and a hosted brain records it beside what was returned. The local
58
+ event log records the same name next to the `context_dir` it always
59
+ kept. The working directory itself still never leaves the machine; the
60
+ privacy page names the new field, what it holds, and its 90-day window.
61
+ - **A hosted resurface finally ranks by "asked about here."** When the
62
+ session's folder names a project, the hosted ranking weighs what was
63
+ asked about in that project first — the same weight a folder brain has
64
+ always given "in this folder" — and says so honestly: `ranked_by` gains
65
+ `asked about in this project`, a card's reason reads `recalled 2× in
66
+ this project`, and the footer names which project those words mean. A
67
+ brain with no history yet ranks exactly as before and claims nothing.
68
+
69
+ ### Changed
70
+
71
+ - The hosted resurface footer no longer claims a hosted brain cannot know
72
+ where a question was asked from. It now tells one of three truths: which
73
+ project the ranking used; that this folder names no project, so nothing
74
+ was sent; or that the server was sent the signal and does not rank by
75
+ project yet. `resurface --json` carries `asked_from` so a machine reader
76
+ can tell those cases apart too.
77
+
78
+ ### Compatibility
79
+
80
+ - An older server ignores `asked_from` entirely (unknown fields are
81
+ dropped); the CLI reads the three-entry `ranked_by` and says the server
82
+ does not rank by project yet, rather than letting the silence read as an
83
+ empty folder signal. An older CLI against the new server sends nothing
84
+ and behaves exactly as before. Event lines written before the field
85
+ existed still parse and still rank.
86
+
87
+ ### Agent guidance
88
+
89
+ - `memgineering-recall` (what the project signal means and which footer to
90
+ trust), `memgineering-writing` (the automatic scope stamp, and
91
+ `--no-scope` for machine-wide rules) and `memgineering-setup` (the
92
+ `project` verb) were updated. Restart your agent session after upgrading
93
+ so the new guidance is what gets read.
94
+
14
95
  ## [0.14.0] — 2026-08-29
15
96
 
16
97
  ### Added
17
98
 
18
99
  - **A hosted brain's base files can finally be written.** `memgineering
19
- base-write 01_BASE/USER.md --input <file|-|text>` fills or replaces the
100
+ base-write 01_BASE/USER.md --input <file|-|text>` fills or replaces the
20
101
  body of a `01_BASE/` file on a hosted brain — the files `onboard` points
21
102
  at, which until now could only be filled on a folder and left a hosted
22
103
  brain reading as a blank form forever. The `memgineering:` block above
@@ -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.14.0
5
+ version: 0.15.1
6
6
  ---
7
7
 
8
8
  # memgineering
@@ -26,19 +26,19 @@ rule; an instruction scoped to "this file" or "here" ends with the task). Judge
26
26
  | they settled something that should hold beyond this session (however phrased — e.g. "from now on…", "always…", "never…") | `memgineering remember "<their words>" --rule --reason "<why>"` |
27
27
  | they corrected what you made, for this task (e.g. "again", "no, like this", showed the right way) | `memgineering remember "<what turned out right>" --reason "<their correction>"` — and if the correction is meant to hold beyond this session, that is the row above: add `--rule` |
28
28
  | they asked about something that sounds already settled (e.g. "what did we decide", "how do we do this again") | `memgineering recall "<their words>"` FIRST, answer second |
29
+ | they opened vaguely — a new folder, "where were we", picking work back up | `memgineering resurface` FIRST — no query; answer from it |
29
30
 
30
31
  When the words could mean just-this-task or from-now-on, do not guess a
31
32
  binding rule: record it WITHOUT `--rule`, do the task, and ask in one line
32
33
  whether it should hold from now on. A wrong rule silently binds every future
33
34
  session; the question costs a second.
34
35
 
35
- These are SHELL commands — run them with your shell tool. Opening a memgineering
36
- skill page saves nothing; measured: a model passed the command as
37
- a skill argument, told the user it was saved, and nothing was stored. Done
38
- means the CLI printed `Remembered.` and an undo id.
36
+ These are SHELL commands — run them with your shell tool; measured: a model
37
+ passed one as a skill argument and told the user it was saved when nothing was
38
+ stored. Done means the CLI printed `Remembered.` and an undo id.
39
39
 
40
- Durable facts about the user never go into this tool's own memory files —
41
- the brain is the one store every tool they use shares.
40
+ Durable user facts never go in this tool's own memory files — the brain is
41
+ the store every tool they use shares.
42
42
 
43
43
  ## When to reach for it
44
44
 
@@ -51,7 +51,6 @@ the brain is the one store every tool they use shares.
51
51
  what you did and said it was right: `memgineering remember "<it>" --reason
52
52
  "<why>"`. Reversible by design, so do not ask permission for ordinary
53
53
  observations — but first `open boundaries`: it says what never to store.
54
- - **A new folder, or "where were we"** — `memgineering resurface`, no query.
55
54
  - **Their notes have piled up** — duplicates, notes that disagree:
56
55
  `memgineering consolidate` finds candidates and changes nothing; changes are
57
56
  proposed, then approved by them.
@@ -215,6 +215,16 @@ and which base notes have gone unread — what you should already know here befo
215
215
  they have to tell you again. It is the answer to a vague opening that recall
216
216
  cannot serve, because there is nothing to search for yet.
217
217
 
218
+ On a hosted brain the folder counts too, as a name rather than a path: the CLI
219
+ sends the folder's project — `owner/repo` from the git remote, or whatever
220
+ `memgineering project` shows — and the server ranks what was asked about in
221
+ that project first. The response says so itself: `ranked_by` gains `asked about
222
+ in this project`, a card's reason reads `recalled 2× in this project`, and the
223
+ footer names which project those words mean. Trust the footer over your
224
+ assumption in the other cases as well — it says when this folder names no
225
+ project (nothing was sent), and when the server does not rank by project yet
226
+ (it was sent and ignored). A path never leaves the machine either way.
227
+
218
228
  ## Deciding which one to trust
219
229
 
220
230
  ```
@@ -255,6 +255,24 @@ memgineering use --default ~/brains/work
255
255
  Inside a repository `use` writes a relative path, so it can be committed and
256
256
  resolves for a teammate who links the same brain.
257
257
 
258
+ ### Which project a folder is
259
+
260
+ ```
261
+ memgineering project # what this folder answers to, and how it was decided
262
+ memgineering project acme/site # bind a name of your own to this repository
263
+ memgineering project --unset # back to the derived name
264
+ ```
265
+
266
+ Derived without asking: the git remote's `owner/repo`, else the checkout's
267
+ folder name, else nothing — a folder outside any repository names no project
268
+ until somebody sets one. The name follows the repository, so worktrees and
269
+ subfolders of one checkout answer the same. It is what `remember` stamps as a
270
+ note's scope and what the reads send as `asked_from`, so a hosted resurface
271
+ can rank what was asked about here — as a name; the folder's path never
272
+ leaves the machine. Renaming does not move history: what was recalled under
273
+ the old name stays recorded there and the new name starts fresh, which the
274
+ command says out loud whenever it changes anything.
275
+
258
276
  **An account can hold several hosted brains. `brains` lists them and
259
277
  `use --brain <name>` switches.**
260
278
 
@@ -22,6 +22,25 @@ trade is permission-before for correction-after, and every write records how to
22
22
  reverse it. Do not ask permission for ordinary observations — write them, and
23
23
  mention it in a sentence.
24
24
 
25
+ **A note born in a project folder carries that project as its `scope`** — the
26
+ name comes from the git remote (`owner/repo`), or from the folder's binding
27
+ (`memgineering project` shows it). The stamp is automatic; an explicit
28
+ `--scope` beats it; a folder that names no project writes exactly what it
29
+ always wrote. Two flags are worth reaching for on purpose:
30
+
31
+ ```
32
+ memgineering remember "we always squash before merging" --rule --no-scope \
33
+ --reason "they said from now on, about every repo — not this one"
34
+ ```
35
+
36
+ - `--no-scope` for anything meant to hold machine-wide, rules especially: a
37
+ rule stamped with one project's scope drops out of another project's
38
+ `recall --scope` answers.
39
+ - `--scope <name>` when the note is ABOUT a project you are not standing in.
40
+
41
+ `--scope` and `--no-scope` together are refused — they answer the same
42
+ question both ways.
43
+
25
44
  **`--reason` on every write.** It goes in the ledger and is the only part of the
26
45
  record that still means anything six months later. Every write verb takes it:
27
46
  `remember`, `revise`, `retire`, `exclude`, `undo`. The one on `undo` matters