@rayul/kordis 0.15.1 → 0.15.2

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.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: memgineering-writing
3
- description: Use when you learn something durable and should record it, when a conclusion you already recorded turns out to have changed, when something needs undoing or retiring, when the brain has filled up with near-duplicates that want tidying, or when the user's `01_BASE/` files are still empty and only a conversation can fill them. Triggers include "remember this", "that didn't work", "this worked instead", "that's not right anymore", "undo that", "looks good", "set up my memory", "fill in my profile", "stop reading that note", "clean up my notes", "these two say the same thing", "is this a duplicate", "move my memories over", "bring my notes from the other tool", "don't save that", "never store that". Covers remember, revise, undo, log, retire, exclude, onboard, the consolidate/propose/approve flow, carrying facts in from another store, storage boundaries, and what to say before writing.
3
+ description: Use when you learn something durable and should record it, when a conclusion you already recorded turns out to have changed, when something needs undoing or retiring, when the brain has filled up with near-duplicates that want tidying, or when the user's `01_BASE/` files are still empty and only a conversation can fill them. Triggers include "remember this", "that didn't work", "this worked instead", "that's not right anymore", "undo that", "looks good", "set up my memory", "fill in my profile", "stop reading that note", "clean up my notes", "these two say the same thing", "is this a duplicate", "move my memories over", "bring my notes from the other tool", "don't save that", "never store that", "that's only true until <date>", "it stops being true after", "don't tell me that forever". Covers remember, revise, undo, log, retire, expire, exclude, onboard, the consolidate/propose/approve flow, carrying facts in from another store, storage boundaries, and what to say before writing.
4
4
  type: skill
5
5
  allowed-tools: Bash(memgineering:*)
6
6
  ---
@@ -23,24 +23,47 @@ reverse it. Do not ask permission for ordinary observations — write them, and
23
23
  mention it in a sentence.
24
24
 
25
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:
26
+ name comes from the folder's binding (`memgineering project` shows it), else the
27
+ git remote (`owner/repo`), else — in a repository with no remote — the checkout
28
+ folder's name. `remember` prints the scope and which of those it came from
29
+ (`scope_via` in `--json`); when it is the folder name, say so, because that is
30
+ the one nobody predicts. The stamp is automatic; an explicit `--scope` beats it;
31
+ a folder that names no project writes exactly what it always wrote. Two flags
32
+ are worth reaching for on purpose:
30
33
 
31
34
  ```
32
35
  memgineering remember "we always squash before merging" --rule --no-scope \
33
36
  --reason "they said from now on, about every repo — not this one"
34
37
  ```
35
38
 
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
+ - `--no-scope` for a decision that genuinely holds in every project — a
40
+ security rule, a way of writing commits, something about the person rather
41
+ than the work. It is a real answer, not the safe one: use it when it is true.
39
42
  - `--scope <name>` when the note is ABOUT a project you are not standing in.
40
43
 
44
+ **Prefer the project scope for a rule that is about one project.** `--no-scope`
45
+ used to be the advice for rules in general, on the reasoning that a scoped rule
46
+ drops out of other projects' answers — it does, and that is now the point. Rules
47
+ reach a session in two budgets, one for what holds everywhere and one for the
48
+ project in front of it, so a scoped rule is no longer competing with every other
49
+ rule in the brain for the same few slots. Measured before the split: in a real
50
+ repository all the slots went to rules about other things, and a rule written
51
+ that morning about that project's own layout ranked 49th of 54 — present,
52
+ enforced by nothing, invisible to the session it existed to stop.
53
+
41
54
  `--scope` and `--no-scope` together are refused — they answer the same
42
55
  question both ways.
43
56
 
57
+ **A rule has to say what it binds, and one of the two is required.** A `--rule`
58
+ write is refused when nothing names a scope and nothing can be derived — a
59
+ folder that is not a repository and has no bound project. Add `--scope "<the
60
+ project>"` or `--no-scope`, and retry; nothing was written. On the hosted API
61
+ (`brain_remember`, or `POST /remember` directly) the same refusal applies with
62
+ no derivation at all: send `scope`, or `"scope": "global"` for one that really
63
+ does hold everywhere. `global` is reserved and is stored as no scope, which is
64
+ what a machine-wide rule already looks like — so there is only ever one
65
+ spelling of it to search for.
66
+
44
67
  **`--reason` on every write.** It goes in the ledger and is the only part of the
45
68
  record that still means anything six months later. Every write verb takes it:
46
69
  `remember`, `revise`, `retire`, `exclude`, `undo`. The one on `undo` matters
@@ -183,17 +206,26 @@ it>"`.
183
206
  This rewrites only the memory block in frontmatter. The prose is the user's;
184
207
  neither the command nor you should rewrite it uninvited.
185
208
 
186
- ## Retiring versus excluding
209
+ ## Retiring versus expiring versus excluding
187
210
 
188
211
  ```
189
212
  memgineering retire <ref> --reason "the date moved" # no longer current, still visible
213
+ memgineering expire <ref> --until 2026-10-31 --reason "the phase ends then" # NOT retired
190
214
  memgineering exclude path/to/note.md --reason "it has someone's phone number in it" # stop reading it
191
215
  memgineering retract --actor "mcp:ChatGPT" --since 2026-09-01 # SHOWS what one writer / window wrote
192
216
  memgineering retract --actor "mcp:ChatGPT" --since 2026-09-01 --yes # retires all of it, one ledger row each
193
217
  ```
194
218
 
195
219
  Retiring keeps the note in recall, ranked last and labelled. Excluding takes it
196
- out of the index and never touches the file. If the user says "delete", ask
220
+ out of the index and never touches the file.
221
+
222
+ **`expire` is not a retirement, and the difference only shows up later.** It
223
+ gives a memory an end date: until then it is current, and after it recall still
224
+ returns it — one step below what is current, labelled with the date. Reach for
225
+ it when the memory was always going to run out ("Phase 1 lands by the end of
226
+ October", a key that rotates, a plan with a deadline in it) rather than when a
227
+ decision has been overtaken. Retiring such a note says something untrue about
228
+ it; leaving it says something untrue too. If the user says "delete", ask
197
229
  which they mean.
198
230
 
199
231
  ## Tidying up a brain: detect, draft, approve
@@ -215,11 +247,30 @@ it is about without opening them. It does not carry their claims, so deciding
215
247
  which of a pair is right still means reading them: two notes can share a title
216
248
  and hold opposite conclusions, which is exactly the case a proposal exists for.
217
249
  It returns them with the evidence that caught them and the action it would
218
- suggest, under six rules: `declared_supersession`, a replaced note still active;
219
- `contradiction`, a disagreement nobody settled; `semantic_similarity`, indexed
220
- meaning agreeing reciprocally; `shared_context`, one scope naming the same
221
- thing; `similar_title`; and `kind_promotion`, a binding note filed as something
222
- other than a decision. Semantic detection reuses a complete, calibrated hosted
250
+ suggest, under eight rules: `declared_supersession`, a replaced note still
251
+ active; `contradiction`, a disagreement nobody settled; `semantic_similarity`,
252
+ indexed meaning agreeing reciprocally; `shared_context`, one scope naming the
253
+ same thing; `similar_title`; and three that read a note against itself, where
254
+ its `binding` flag and its `kind` disagree. `rule_demotion` is a binding note
255
+ the author classified as a fact, a procedure, an episode or a goal — two
256
+ deliberate fields contradicting each other, and the marking is the one to
257
+ doubt. `binding_unclassified` is a binding note with no kind at all, and it
258
+ names BOTH moves rather than picking one, because the tool reads fields and not
259
+ prose: it is either a decision nobody classified or something that was never a
260
+ rule, and only somebody who reads it can say which. (`kind_promotion` remains
261
+ in the vocabulary and no longer fires.)
262
+
263
+ That neutrality was measured rather than chosen for balance. On a real brain,
264
+ 55 of 57 binding notes had no kind and every one was answered "promote this to
265
+ a decision" — including the thirteen that turned out not to be rules, where
266
+ approving the suggestion would have hardened the mistake.
267
+
268
+ **The page is shared between the signals.** One rule used to take the whole
269
+ list — 55 of 57 candidates — so the duplicate and the contradiction underneath
270
+ got a line each. Candidates now round-robin across the rules that found
271
+ something, and `by_rule` reports how many each found in total, which the page
272
+ can no longer tell you. Raising `--limit` widens the page rather than returning
273
+ more of one rule. Semantic detection reuses a complete, calibrated hosted
223
274
  vector generation and never calls a model during consolidation. Authored
224
275
  scope/entity context permits reciprocal neighbours; without it, evidence must
225
276
  form a stricter three-note semantic triangle.
@@ -308,7 +359,7 @@ so an empty one costs something every time.
308
359
  memgineering onboard
309
360
  ```
310
361
 
311
- Says which are still untouched and what to ask for each. Run it first rather
362
+ Says which still have no body written and what to ask for each. Run it first rather
312
363
  than working from a script — asking somebody a question they already answered is
313
364
  its own kind of forgetting. They may also ask outright ("set up my memory", "fill in my profile"); same job.
314
365
 
@@ -353,7 +404,7 @@ always true and you have only just been told them, so dating them today is wrong
353
404
  in the one field a memory store exists to get right.
354
405
 
355
406
  **This is the ONE place you edit a brain file directly** — `01_BASE/` only, and
356
- only while it is still the template. After that first pass these are theirs like
407
+ only while its body has not been written yet. After that first pass these are theirs like
357
408
  any other note.
358
409
 
359
410
  **Do not invent an answer to move on, and do not fill a file because it is