diff --git a/.cursor/skills/SKILL-GRAPH.md b/.cursor/skills/SKILL-GRAPH.md index 187ed81..d5a5cef 100644 --- a/.cursor/skills/SKILL-GRAPH.md +++ b/.cursor/skills/SKILL-GRAPH.md @@ -2,7 +2,7 @@ **Audience:** model. Wire SSOT: [memnet-format](memnet-format/SKILL.md) and `docs/grammar/gql-wire-profile.md`. Do **not** treat this file as the session graph. -This folder **vendors** the MemNet stack. Hatch **0.19.4** (last PyPI **`memnet-llm==0.19.3`** until upload). Cue then `pin_map`; `find` if ego unknown. **GQL only.** Package SemVer `a.b.c` (claim / usage-method revision / same-method cut): `docs/ROADMAP.md`. Do not invent 0.20. +This folder **vendors** the MemNet stack. Hatch and PyPI are both **0.19.4** (`memnet-llm==0.19.4`). Cue then `pin_map`; `find` if ego unknown. **GQL only.** Package SemVer `a.b.c` (claim / usage-method revision / same-method cut): `docs/ROADMAP.md`. Do not invent 0.20. ## Routing diff --git a/.cursor/skills/memnet-reference/SKILL.md b/.cursor/skills/memnet-reference/SKILL.md index 90f9216..f6521e3 100644 --- a/.cursor/skills/memnet-reference/SKILL.md +++ b/.cursor/skills/memnet-reference/SKILL.md @@ -19,7 +19,7 @@ Repo skill for **building** MemNet in **this** repository. Doctrine SSOT is `doc This checkout **vendors** agent skills under `.cursor/skills/` (core: `memnet-use` + MCP/format/nested/multitask). Load those when **using** MemNet; load **this** skill only when changing the engine, generic MCP, grammar, product SysML, or packaging. -**Product:** Hatch **0.19.4** (CLI `memnet`). PyPI **`memnet-llm==0.19.3`** until 0.19.4 upload. Version map: `docs/ROADMAP.md`. Shape: `docs/SHAPE.md`. **1.0** = 0.5–0.8 claimed (do not tag from this skill). +**Product:** Hatch and PyPI are both **0.19.4** (CLI `memnet`; `memnet-llm==0.19.4`). Version map: `docs/ROADMAP.md`. Shape: `docs/SHAPE.md`. **1.0** = 0.5–0.8 claimed (do not tag from this skill). **`a.b.c` (ROADMAP law).** `a` = claim / generation (`0` = 1.0 unclaimed; `1` = claim of 0.5–0.8). `a` moves only if the contract breaks (Recall=`pin_map` / Commit=`mutate`, GraphElement identity, GQL-only wire). `b` = usage-method revision (new required loop step, new product tool, cue/outline/identity law, new goldfish verb). Historical extras **0.10–0.19** were `b`. N-server (#47) is not a `b`. `c` = same-method cut (honesty, leftover naming, docs/skills, wheel/tag, caps, façade, faster same `cue → pin_map → mutate`). Efficiency on the current loop is **`0.19.c`**, not `0.20`. Do not invent a 0.20 extra. Do not claim 1.0. diff --git a/AGENTS.md b/AGENTS.md index 12314fb..23c5828 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,7 +4,7 @@ LLM hub for this system repo. Prefer in-repo skills and docs over ad-hoc inventi ## Mission -**MemNet** (Net of Memory) is **mission working memory** — a session graph (GQL **node**/vertex, **edge**/relationship, **property**) **between** LLM call pipelines and data search, not the corpus and not GraphRAG. Agents read a bounded **live pin map** each turn and write in the same **GQL (openCypher-shaped)** family — redefined **Write = display** via shaped subgraph emit ([`docs/grammar/gql-wire-profile.md`](docs/grammar/gql-wire-profile.md)). In-session recall is **serial**: kind/keyword cue, then `pin_map` neighbourhood. Primary read: MCP `pin_map` / CLI `query pin-map`; leftover `query_warm` / `query warm` are leftover aliases. Aims (MN-REQ-00): save wall-clock time and tokens while keeping factual accuracy. Aids **system**, **programme**, **software**, **firmware**, **hardware**, and **documentation**. Transport: **in-process first** (single-agent; TCP fallback). **Multitask** requires TCP serve or streamable-http MCP — see Multitask policy below. This repo is **engine + generic memnet-mcp** only — novel-writer dropped. Repo product **0.19.4** (Hatch SSOT); last published PyPI **`memnet-llm==0.19.3`** until 0.19.4 is uploaded. **1.0** = 0.5–0.8 claimed (unclaimed). See `README.md`, [`docs/SHAPE.md`](docs/SHAPE.md), and `docs/grammar/`. +**MemNet** (Net of Memory) is **mission working memory** — a session graph (GQL **node**/vertex, **edge**/relationship, **property**) **between** LLM call pipelines and data search, not the corpus and not GraphRAG. Agents read a bounded **live pin map** each turn and write in the same **GQL (openCypher-shaped)** family — redefined **Write = display** via shaped subgraph emit ([`docs/grammar/gql-wire-profile.md`](docs/grammar/gql-wire-profile.md)). In-session recall is **serial**: kind/keyword cue, then `pin_map` neighbourhood. Primary read: MCP `pin_map` / CLI `query pin-map`; leftover `query_warm` / `query warm` are leftover aliases. Aims (MN-REQ-00): save wall-clock time and tokens while keeping factual accuracy. Aids **system**, **programme**, **software**, **firmware**, **hardware**, and **documentation**. Transport: **in-process first** (single-agent; TCP fallback). **Multitask** requires TCP serve or streamable-http MCP — see Multitask policy below. This repo is **engine + generic memnet-mcp** only — novel-writer dropped. Repo product **0.19.4** (Hatch SSOT and PyPI **`memnet-llm==0.19.4`**; [#148](https://github.com/chouswei/MemNet/pull/148) nickname-off-`pin_map` honesty `c` is published). **1.0** = 0.5–0.8 claimed (unclaimed). See `README.md`, [`docs/SHAPE.md`](docs/SHAPE.md), and `docs/grammar/`. ## Where to look diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bb0491..2fd704c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,8 +10,8 @@ This project uses Semantic Versioning as **interpreted for MemNet**: package `a. ## [0.19.4] - 2026-09-04 ### Changed -- **Honesty `c` — nickname `id` off `pin_map` emit** — Shaped `pin_map` (outline, CueConflict, find hits, export) **MUST NOT** print nickname property `id` on nodes or edges. Same effect as `DROP_KEYS={id,hid}` on the wire text. Hid already stays off. Ranking still excludes nickname from the rank key ([#147](https://github.com/chouswei/MemNet/pull/147)). Cue / find / `match_nickname` MAY still look up a nickname the agent cues by — that is not identity and not emit. STM Prediction 3 generation half: RAW pin_map with nickname on wire failed under hid/CREATE-order/nickname permutation; canonical strip of `id`/`hid` passed. Package **0.19.4** patch on **0.19**. Numbered extras **0.10–0.19** unchanged. No 0.20 extra. `operatorCount` stays 2. Caps stay hard. Do not dump \(S\). Do not invent `rag_query`. **1.0** stays unclaimed. Git tag `v0.19.4` after merge. -- **Package identity 0.19.4** — Hatch / `project.toml` / `memnet.__version__` honesty cut on **0.19**. Last published PyPI wheel remains **`memnet-llm==0.19.3`** until upload. +- **Honesty `c` — nickname `id` off `pin_map` emit** — Shaped `pin_map` (outline, CueConflict, find hits, export) **MUST NOT** print nickname property `id` on nodes or edges. Same effect as `DROP_KEYS={id,hid}` on the wire text. Hid already stays off. Ranking still excludes nickname from the rank key ([#147](https://github.com/chouswei/MemNet/pull/147)). Cue / find / `match_nickname` MAY still look up a nickname the agent cues by — that is not identity and not emit. STM Prediction 3 generation half: RAW pin_map with nickname on wire failed under hid/CREATE-order/nickname permutation; canonical strip of `id`/`hid` passed. Package **0.19.4** patch on **0.19**. Numbered extras **0.10–0.19** unchanged. No 0.20 extra. `operatorCount` stays 2. Caps stay hard. Do not dump \(S\). Do not invent `rag_query`. **1.0** stays unclaimed. Published as **`memnet-llm==0.19.4`**. Git tag `v0.19.4` on the [#148](https://github.com/chouswei/MemNet/pull/148) merge (`1242c467`). +- **Package identity 0.19.4** — Hatch / `project.toml` / `memnet.__version__` honesty cut on **0.19**. Hatch and PyPI are both **0.19.4**; [#148](https://github.com/chouswei/MemNet/pull/148) nickname-off-`pin_map` honesty `c` is published. ## [0.19.3] - 2026-08-20 @@ -684,7 +684,8 @@ Initial public release. - Caps are configurable via `MEMNET_MAX_*` env vars. - Sessions live in process memory only. On `serve` restart, all sessions are gone unless saved via `session save`. -[Unreleased]: https://github.com/chouswei/MemNet/compare/v0.19.0...HEAD +[Unreleased]: https://github.com/chouswei/MemNet/compare/v0.19.4...HEAD +[0.19.4]: https://github.com/chouswei/MemNet/compare/v0.19.3...v0.19.4 [0.19.0]: https://github.com/chouswei/MemNet/compare/v0.9.0...v0.19.0 [0.9.0]: https://github.com/chouswei/MemNet/compare/v0.8.0...v0.9.0 [0.4.1]: https://github.com/chouswei/MemNet/compare/v0.4.0...v0.4.1 diff --git a/README.md b/README.md index 6719830..3aa1fd4 100644 --- a/README.md +++ b/README.md @@ -6,13 +6,13 @@ MemNet sits **between** LLM call pipelines and data search (MN-REQ-00). Corpus l This repo ships the engine + generic MCP only. **Product shape:** [`docs/SHAPE.md`](docs/SHAPE.md). **Pinned role:** working set of **a few technical documents** (atoms and locators, not PDF bytes) plus live `TSK`/`USR`/`MOD`, re-read fast. Tens of MiB typical; **hundreds of MiB still in role**; gigabytes = RAG/cabinet. -Package **`memnet-llm`** (CLI **`memnet`**). Python ≥ 3.11. Repo product **0.19.4**. Last published PyPI **`memnet-llm==0.19.3`** until 0.19.4 upload. **1.0** stays unclaimed. SemVer meaning (`a.b.c`): [`docs/ROADMAP.md`](docs/ROADMAP.md). +Package **`memnet-llm`** (CLI **`memnet`**). Python ≥ 3.11. Hatch and PyPI are both **0.19.4** (`memnet-llm==0.19.4`; [#148](https://github.com/chouswei/MemNet/pull/148) nickname-off-`pin_map` honesty `c`). **1.0** stays unclaimed. SemVer meaning (`a.b.c`): [`docs/ROADMAP.md`](docs/ROADMAP.md). ## Install + quick CLI ```bash pip install memnet-llm -# or pin: pip install memnet-llm==0.19.3 +# or pin: pip install memnet-llm==0.19.4 # optional extras (drivers only — not AgensGraph/Neo4j servers): # pip install 'memnet-llm[mcp]' # pip install 'memnet-llm[agensgraph]' diff --git a/docs/LLM-GUIDE.md b/docs/LLM-GUIDE.md index 8a582e6..4ae770b 100644 --- a/docs/LLM-GUIDE.md +++ b/docs/LLM-GUIDE.md @@ -1,6 +1,6 @@ # MemNet — Agent Playbook (for LLMs) -**Class:** developers — MemNet engine / MCP / GQL wire / agent operating doctrine. Index: [`docs/README.md`](README.md). Product shape: [`SHAPE.md`](SHAPE.md). **Product 0.19.4.** **1.0** = 0.5–0.8 claimed (unclaimed). Last PyPI **`memnet-llm==0.19.3`**. SemVer `a.b.c`: [`ROADMAP.md`](ROADMAP.md). +**Class:** developers — MemNet engine / MCP / GQL wire / agent operating doctrine. Index: [`docs/README.md`](README.md). Product shape: [`SHAPE.md`](SHAPE.md). **Product 0.19.4.** Hatch and PyPI are both **`memnet-llm==0.19.4`**. **1.0** = 0.5–0.8 claimed (unclaimed). SemVer `a.b.c`: [`ROADMAP.md`](ROADMAP.md). **Dialect teach = GQL only** — [`grammar/gql-wire-profile.md`](grammar/gql-wire-profile.md). ADR: [`adr/ADR-001-gql-agent-wire.md`](adr/ADR-001-gql-agent-wire.md). **M2 shipped:** engine/MCP accept openCypher-shaped GQL and emit shaped `pin_map`. Do **not** teach Layer / Tier A / `@TAG` pipe as agent wire. @@ -66,7 +66,7 @@ Formal wire: [`grammar/gql-wire-profile.md`](grammar/gql-wire-profile.md). | Mode | When | Setup | |------|------|-------| -| **MCP in-process** | Cursor / local agents (**primary**) | Register `memnet-mcp` in `.cursor/mcp.json`; extra `[mcp]`. `pip install 'memnet-llm[mcp]'` (Hatch **0.19.4**; last PyPI **0.19.3**). **No** `memnet serve` | +| **MCP in-process** | Cursor / local agents (**primary**) | Register `memnet-mcp` in `.cursor/mcp.json`; extra `[mcp]`. `pip install 'memnet-llm[mcp]'` (Hatch + PyPI **0.19.4**). **No** `memnet serve` | | **CLI + serve** | Scripts, TCP shared process | Terminal 1: `memnet serve`; Terminal 2: CLI with `MEMNET_SESSION` | | **MCP streamable-http** | Remote shared graph | `memnet-mcp --transport streamable-http` on `:18766/mcp` | diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index df42d74..543b285 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -4,9 +4,9 @@ **Audience:** product developers. Dialect teach = **GQL** ([`grammar/gql-wire-profile.md`](grammar/gql-wire-profile.md)). Product shape: [`SHAPE.md`](SHAPE.md). British English. -**Package now:** Hatch **0.19.4**. Numbered extras **0.10–0.19** are in this package (unchanged). PyPI **`memnet-llm==0.19.3`** is the last published wheel until 0.19.4 upload. GraphGlot parse front is on master (#109 @ 73a63c9b). Extra **0.14** claims `liveNeo4jClaimed=true`. **1.0** is still unclaimed (0.5–0.8). +**Package now:** Hatch and PyPI are both **0.19.4** (`memnet-llm==0.19.4`). Numbered extras **0.10–0.19** are in this package (unchanged). [#148](https://github.com/chouswei/MemNet/pull/148) nickname-off-`pin_map` honesty `c` is published. GraphGlot parse front is on master (#109 @ 73a63c9b). Extra **0.14** claims `liveNeo4jClaimed=true`. **1.0** is still unclaimed (0.5–0.8). -**Last updated:** 2026-09-04 (`a.b.c` law locked; package **0.19.4** honesty `c` — nickname `id` off `pin_map` emit; extras **0.10–0.19** unchanged; last PyPI **0.19.3** until upload; ranking honesty [#147](https://github.com/chouswei/MemNet/pull/147); do not claim **1.0**; do not invent a **0.20** extra). +**Last updated:** 2026-09-04 (`a.b.c` law locked; package **0.19.4** honesty `c` — nickname `id` off `pin_map` emit; extras **0.10–0.19** unchanged; Hatch + PyPI **0.19.4**; ranking honesty [#147](https://github.com/chouswei/MemNet/pull/147); do not claim **1.0**; do not invent a **0.20** extra). Patch notes: [`../CHANGELOG.md`](../CHANGELOG.md). CHANGELOG still follows Keep a Changelog. This file is how MemNet **interprets** SemVer — not a silent switch to npm-strict major=breaking for 0.x extras. @@ -99,8 +99,8 @@ Handoff = **session id** (+ cue / write scope). Peers **re-`pin_map`** from labe | **0.7.0** | Live AgensGraph hydrate/flush; `liveCabinetClaimed=true`. Server not vendored. Fake + skip unless `MEMNET_AGENSGRAPH_URL` | **Shipped** (`v0.7.0`) | | **0.8.0** | GQL-only **teach** + product **shape for people** (`SHAPE.md`, playbook, application-note contract, Multitask honesty). Docs only. **No** engine cut. Cabinet stays claimed | **Shipped** (`v0.8.0`) | | **0.9.0** | Neo4j `DurableStoreAdapter` client (`memnet-llm[neo4j]`); factory both-URL rule; [`cabinet/neo4j-buffer.md`](cabinet/neo4j-buffer.md). Live round-trip claimed later as extra **0.14**. Cabinet extra, **not** a 1.0 gate | **Shipped** (`v0.9.0` era; extras later packaged as 0.19.0) | -| **0.10–0.19** | Numbered extras (table below). Each row is one `b` (usage-method revision). Same pattern as 0.9: **not** 1.0 gates | **Packaged** (Hatch **0.19.3**; extras first shipped as 0.19.0) | -| **1.0.0** | **Claim** of **0.5 + 0.6 + 0.7 + 0.8**. Shape mature for people. Not GraphRAG. Not cabinet-only. Not a new engine. This is `a=1` | **Claim when coordinator tags** — package / PyPI **0.19.3** does not claim 1.0 | +| **0.10–0.19** | Numbered extras (table below). Each row is one `b` (usage-method revision). Same pattern as 0.9: **not** 1.0 gates | **Packaged** (Hatch + PyPI **0.19.4**; extras first shipped as 0.19.0) | +| **1.0.0** | **Claim** of **0.5 + 0.6 + 0.7 + 0.8**. Shape mature for people. Not GraphRAG. Not cabinet-only. Not a new engine. This is `a=1` | **Claim when coordinator tags** — package / PyPI **0.19.4** does not claim 1.0 | | **Later** | Grammar Open / hosted product / leftover ACL; N-server research (#47). GraphGlot parse-front is **shipped**. If **1.0 tags first**, remaining extras become **1.1, 1.2, …** with the same owns (`b` after the claim) | **Out** of 1.0 | **1.0 MAY ship from 0.9** (claim only). **0.10+ MAY ship before 1.0** as extras (`b` on `a=0`). Do not wait for the other. User-pack GQL rewrite is **sibling** (`chouswei/cursor-user-skills`), not this repo. diff --git a/docs/SHAPE.md b/docs/SHAPE.md index aa0b899..584d7ff 100644 --- a/docs/SHAPE.md +++ b/docs/SHAPE.md @@ -74,7 +74,7 @@ Do not call MemNet a “shaped RAG” or a “shaped Cypher proxy”. **0.8.0** is this shape **taught for people** in-repo: this file, GQL-only playbook, application-note contract, Multitask honesty (RSV + Path-B ingest shipped; full ACL modes still to-be). -**1.0.0** is **0.5 + 0.6 + 0.7 + 0.8** claimed — the shape is mature for people: one GQL dialect, goldfish `pin_map`, gated mutate, cue-then-shape (including find when there is no ego), optional **proven** cabinet so \(S\) can outlive a process. Not GraphRAG. Not cabinet-only. Map and **`a.b.c` law:** [`ROADMAP.md`](ROADMAP.md). **Honest install:** current package is **0.19.4** (extras 0.10–0.19; Neo4j client from 0.9; live claimed as extra **0.14**). Last published PyPI **`memnet-llm==0.19.3`** until 0.19.4 upload. Optional extras `[mcp]`, `[agensgraph]`, `[neo4j]` (drivers only). **1.0** stays unclaimed. +**1.0.0** is **0.5 + 0.6 + 0.7 + 0.8** claimed — the shape is mature for people: one GQL dialect, goldfish `pin_map`, gated mutate, cue-then-shape (including find when there is no ego), optional **proven** cabinet so \(S\) can outlive a process. Not GraphRAG. Not cabinet-only. Map and **`a.b.c` law:** [`ROADMAP.md`](ROADMAP.md). **Honest install:** Hatch and PyPI are both **0.19.4** (`memnet-llm==0.19.4`; extras 0.10–0.19; Neo4j client from 0.9; live claimed as extra **0.14**; [#148](https://github.com/chouswei/MemNet/pull/148) nickname-off-`pin_map` honesty `c` is published). Optional extras `[mcp]`, `[agensgraph]`, `[neo4j]` (drivers only). **1.0** stays unclaimed. ---