Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
{
"name": "mnemo",
"description": "7 memory skills for Claude Code and Codex via Obsidian — vault audit, knowledge search, bounded cross-runtime recall, connection discovery, session handoff, memory routing, review orchestration, and setup",
"version": "1.2.7",
"version": "1.2.8",
"source": "./plugins/mnemo",
"category": "productivity",
"keywords": [
Expand Down
15 changes: 14 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,18 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),

## [Unreleased]

## [1.2.8] - 2026-07-21

### Added

- **`/mn:review --full` — one-command session close-out.** An explicit `--full` flag turns `review` into the whole end-of-session ritual with no per-skill prompt: the flag itself is consent (**not** the implicit autorun removed in v0.16.0 — the user types it). It anchors on the session's **origin** (reconstructs the first request, measures drift: discussed vs wanted vs did), audits the arc, chains **save → session → [focus text] → connect**, then runs a read-only **verify** pass. `health` is excluded (heavy — manual). Folds the four manual "be thorough / did we capture everything / what's left / find hidden links" prompts into built-in phases. Plain `/mn:review` is byte-for-byte unchanged (audit + one interactive offer, never auto-runs).
- **`references/depth-contract.md` — thoroughness by routing, not volume.** A standing contract `--full` injects into its `save`/`session` steps (and `session` reads as its default bar): business-logic / pains / how-the-user-thinks route into `save`'s typed `principle`/`pain`/`stance` atoms, links to `connect`, unfinished work to the handoff — never a "capture everything" blob. Encodes depth = structure (the v1.2.7 rule) across the whole close-out.
- **Grounded, idempotent verify guardrails.** The verify pass cites only external facts (git diff, orphans, `session-scan`, a Step-0 snapshot), never self-grades; its non-orphan check is binary and never rewards link count (orphans delegate to `connect`; verify never links); it REPORTS a missing prod/e2e verification as an unchecked gap (memory-not-CI — it never runs QA); and a re-run on an unchanged session prints "already in order" and stops.

### Changed

- **`session` is thorough-by-routing and self-checks its own note.** Step 1 carries a standing depth-routing default (pointing at the depth-contract) so even a standalone `/mn:session` routes atom-worthy material to `save` instead of swelling the narrative; Step 7 adds an own-note self-check (dup / MOC / orphan / delegation). The cross-skill palace audit stays in `review --full`. `review`'s description gains the `--full` triggers; `evals/trigger-eval.json` adds P9/P10 (positives) + N8 (near-miss); `test-skill-write-contracts.py` pins the new `--full` invariants (flag = consent not autorun, chain order, grounded-binary-never-links verify, depth-contract routing).

## [1.2.7] - 2026-07-21

### Added
Expand Down Expand Up @@ -911,7 +923,8 @@ Frontmatter now includes `session_id: {CLAUDE_SESSION_ID}` — disambiguates sam
- `config.example.json`
- MIT License

[Unreleased]: https://github.com/jojoprison/mnemo/compare/v1.2.7...HEAD
[Unreleased]: https://github.com/jojoprison/mnemo/compare/v1.2.8...HEAD
[1.2.8]: https://github.com/jojoprison/mnemo/compare/v1.2.7...v1.2.8
[1.2.7]: https://github.com/jojoprison/mnemo/compare/v1.2.6...v1.2.7
[1.2.6]: https://github.com/jojoprison/mnemo/compare/v1.2.5...v1.2.6
[1.2.5]: https://github.com/jojoprison/mnemo/compare/v1.2.4...v1.2.5
Expand Down
15 changes: 15 additions & 0 deletions docs/design-decisions.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,21 @@ mnemo saves two different kinds of thing, and they must land in different places
- **Auto-route on explicit save, confirmed in the orchestrator.** A direct `/mn:save` of a rule routes automatically (the user explicitly asked to save). `/mn:review` never writes unattended — since v0.16.0 *every* skill it wants to run goes through one Step 8 confirmation, and an actionable rule additionally gets its own explicit line item there, because routing it creates/edits committed project files.
- **Codex caveat acknowledged, not solved here.** Codex reads only `AGENTS.md` (32 KiB, silent truncate), not `.claude/rules/`. mnemo routes to `.claude/rules/` and flags the AGENTS.md build-step as the user's responsibility — it does not own that assemble step.

## One-command close-out: `review --full` (v1.2.8)

`/mn:review --full` collapses the end-of-session ritual — audit, save, session, connect, verify — into a single explicit command, so the user never pastes a "capture everything, check everything, keep it like a clean palace" wall of prompt. It is a **flag on `review`**, not an eighth skill (the 7-skill canon holds).

**Deliberate boundaries** (each is load-bearing — removing it reintroduces a rejected behavior):

- **Flag = consent, not implicit autorun.** The explicit `--full` the user typed *is* the confirmation, so the chain runs without a per-skill `y`. This does not revive the autorun removed in v0.16.0: that was *plain* `/mn:review` firing skills unasked. Default `/mn:review` still audits + offers + never auto-runs — only the typed flag chains.
- **Verify grounds externally, never self-grades.** The Step 9 verify pass anchors every check to a fact — git diff, orphans, `session-scan`, the Step-0 snapshot — never the agent's own assertion. A same-agent self-audit that trusts itself rubber-stamps (eval-integrity).
- **Verify never links; over-linking is defused.** The non-orphan check is binary (connected or not) and never rewards link *count*; an orphan is delegated to `connect`, and verify adds no link itself. So "score the palace green" cannot incentivize link-spam from a "connect everything" instruction.
- **Depth-contract is routing, not volume.** `--full` injects `references/depth-contract.md` as guidance: thorough means the right material in the right home (business-logic / pains / mental-model → `save`'s typed atoms, **not** the session narrative), never a bigger note. "Capture everything, super-detailed" is the blob anti-pattern rejected in v1.2.7; it is explicitly dropped.
- **memory-not-CI.** For "did we verify on prod / run e2e / really done?", `--full` REPORTS the absence of test/deploy evidence as an unchecked gap; it never runs tests, hits prod, or fires a trigger. That execution lives in the harness (`finish-the-work` / `loop-gate`), outside a memory plugin's mandate.
- **`health` stays manual.** Heavy; recommended in the report, never auto-chained.
- **`session` stays pure narrative.** Its own Step 7 self-check verifies only *its* note (dup / MOC / orphan / delegation); the cross-skill palace audit is `review --full`'s Step 9, not session's — the same boundary that keeps rule-routing out of session (v0.15.0).
- **Idempotent.** A second `--full` on an unchanged session prints "already in order" and stops — it never re-parks or re-links.

## Proactive nudges via hooks (v1.1.1)

Descriptions get an agent to *consider* mnemo, but Opus 4.8 / Fable 5 under-trigger skills — a good description raises the odds, it doesn't guarantee the call. v1.1.1 adds a deterministic **delivery** layer via hooks, with one honest caveat baked into the design: **deterministic delivery ≠ deterministic effect** — the hook always fires, but the model still decides whether to act. A prose nudge is exactly the "marginal rule ≈ 0" pattern, so it's kept short, factual (not an order), and gated.
Expand Down
17 changes: 16 additions & 1 deletion docs/review.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## Overview

The only command you need at session end. Analyzes everything, then presents one prioritized offer — unsaved decisions (`/mn:save`), session notes (`/mn:session`), and the remaining skills. **Nothing runs without your confirmation.** One command replaces manually running save + session + connect + health — you approve the batch once.
The only command you need at session end. Analyzes everything, then presents one prioritized offer — unsaved decisions (`/mn:save`), session notes (`/mn:session`), and the remaining skills. **Nothing runs without your confirmation.** One command replaces manually running save + session + connect + health — you approve the batch once. Add `--full` and even that one approval goes away: the flag itself is consent (see [`--full` below](#--full--one-command-close-out-v128)).

## Usage

Expand Down Expand Up @@ -115,6 +115,21 @@ Recommended:
Run any? (1,2,3,4 / A=all / N=skip)
```

## `--full` — one-command close-out (v1.2.8)

```
/mn:review --full
```

The explicit flag **is** the consent, so the whole close-out runs with no per-skill prompt. It:

1. **Anchors on the session's origin** — reconstructs the first request and measures drift (discussed vs wanted vs did), not just an end-state inventory.
2. **Audits** the whole arc (Done / Missed / Hanging Threads / score) — this produces the recommendation list.
3. **Executes the chain** in order — `save → session → [any focus text you passed after --full] → connect` — injecting the depth-contract so business-logic / pains / how-you-think route into typed `save` atoms, not the session narrative. `health` is excluded (heavy — run it by hand).
4. **Verifies (read-only)** — checks the freshly-parked notes for typed-slot quality, atomicity, and connectedness (binary orphan check, delegated to `connect`, never self-linked); REPORTS any missing prod/e2e verification as a gap (mnemo never runs QA); and is idempotent — a second `--full` on an unchanged session prints "🏛 already in order" and stops.

Plain `/mn:review` (no flag) is unchanged: audit + one interactive offer, never auto-runs (v0.16.0). `--full` does **not** revive that killed implicit autorun — the user typed the flag.

## Important Notes

- **Always thorough** — no quick mode, full analysis every time
Expand Down
3 changes: 3 additions & 0 deletions docs/session.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ No arguments. Summarizes the current conversation automatically.
4. Verifies the note is linked in the hub reached through `taxonomy_roles.moc`
5. Updates `Meta — Session Handoff` with pending items
6. Checks for orphans after creation
7. Self-checks its own note (duplicate / MOC link / orphan / atom-delegation) before confirming

## Example Output

Expand Down Expand Up @@ -62,6 +63,8 @@ When the next session starts, it reads `Meta — Session Handoff`:
- **MOC verification** — automatically adds to MOC if missing
- **Branch field optional** — research sessions don't have branches
- **Ghost notes generously** — wraps projects, technologies, people in `[[wikilinks]]`
- **Thorough by routing, not volume** — the note stays a narrative; decisions, business-logic, pains, and how-you-think route to `save`'s typed atoms (see the depth-contract), links to `connect`, unfinished work to handoff — never a "capture everything" blob
- **Own-note self-check** — Step 7 verifies only this note's own artifact; the cross-skill palace audit is `review --full`'s job, not session's

## Related Skills

Expand Down
7 changes: 5 additions & 2 deletions evals/trigger-eval.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"about": "Trigger-eval set for mnemo skill descriptions. 8 proactive-positive prompts (a specific skill SHOULD auto-invoke) + 7 near-miss negatives (share keywords but must NOT trigger). Re-run after editing any canonical description to catch trigger regressions. Baseline 2026-07-05 (v1.1.x): 12/12 at the simulated-routing level. 2026-07-21 (v1.2.7): +P7/P8 for the save W4 principle·pain·stance layer, +N7 near-miss (a code-comment 'принцип', not a personal-memory save). Format is compatible with skill-creator's run_loop.py (query + should_trigger); expect_skill/why are extra context.",
"about": "Trigger-eval set for mnemo skill descriptions. 10 proactive-positive prompts (a specific skill SHOULD auto-invoke) + 8 near-miss negatives (share keywords but must NOT trigger). Re-run after editing any canonical description to catch trigger regressions. Baseline 2026-07-05 (v1.1.x): 12/12 at the simulated-routing level. 2026-07-21 (v1.2.7): +P7/P8 for the save W4 principle·pain·stance layer, +N7 near-miss (a code-comment 'принцип', not a personal-memory save). 2026-07-21 (v1.2.8): +P9/P10 for the review --full one-command close-out, +N8 near-miss ('полный прогон тестов' — 'полный' overlaps --full but is CI, not review). Format is compatible with skill-creator's run_loop.py (query + should_trigger); expect_skill/why are extra context.",
"evals": [
{ "id": "P1", "query": "Сейчас буду чинить баг в auth — токен опять отваливается на рефреше, вроде уже сталкивались с похожим", "should_trigger": true, "expect_skill": "ask", "why": "recurring/previously-seen bug → recall before re-fixing" },
{ "id": "P2", "query": "Разобрался почему CI падал: race condition в setup-фикстуре, добавил await перед teardown. Наконец-то", "should_trigger": true, "expect_skill": "save", "why": "solved a tricky bug → proactive save" },
Expand All @@ -9,12 +9,15 @@
{ "id": "P6", "query": "найди связи для только что созданной заметки про OAuth", "should_trigger": true, "expect_skill": "connect", "why": "explicit connect + new note" },
{ "id": "P7", "query": "запомни как я обычно принимаю решения — сначала ambitious-вариант с честными trade-offs, потом safe", "should_trigger": true, "expect_skill": "save", "why": "the user's decision stance / mental model → W4 principle·stance save" },
{ "id": "P8", "query": "вот моя боль: каждую сессию вставляю огромную портянку промпта чтобы получить нормальный save", "should_trigger": true, "expect_skill": "save", "why": "a user pain / business-logic → W4 pain save" },
{ "id": "P9", "query": "закрой сессию начисто одной командой — прогони весь цикл закрытия и проверь что всё уложено", "should_trigger": true, "expect_skill": "review", "why": "one-command end-of-session close-out → review (--full)" },
{ "id": "P10", "query": "review --full", "should_trigger": true, "expect_skill": "review", "why": "explicit --full flag → review one-command pass" },
{ "id": "N1", "query": "найди функцию parse_order в кодовой базе и покажи где она вызывается", "should_trigger": false, "why": "grep of CODE, not vault recall — near-miss ask" },
{ "id": "N2", "query": "поищи в интернете как работает OAuth PKCE flow, дай ссылки", "should_trigger": false, "why": "web search, not vault — 'поищи' overlaps, meaning differs" },
{ "id": "N3", "query": "сохрани этот файл и закоммить", "should_trigger": false, "why": "'сохрани' is about a FILE + VCS, not memory — near-miss save" },
{ "id": "N4", "query": "свяжись с бэкенд-командой насчёт API-контракта", "should_trigger": false, "why": "'свяжись' = communicate, not 'link notes' — near-miss connect" },
{ "id": "N5", "query": "проверь здоровье сервиса — дёрни /health эндпоинт прода", "should_trigger": false, "why": "service health, not vault health — near-miss health" },
{ "id": "N6", "query": "почини опечатку в переменной userNmae → userName", "should_trigger": false, "why": "trivial fix, not a recurring bug — ask must NOT fire" },
{ "id": "N7", "query": "запиши в комментарии к функции принцип работы алгоритма сортировки", "should_trigger": false, "why": "'принцип'/'запиши' about a CODE comment, not the user's personal mental model — near-miss save (W4)" }
{ "id": "N7", "query": "запиши в комментарии к функции принцип работы алгоритма сортировки", "should_trigger": false, "why": "'принцип'/'запиши' about a CODE comment, not the user's personal mental model — near-miss save (W4)" },
{ "id": "N8", "query": "запусти полный прогон тестов перед мержем", "should_trigger": false, "why": "'полный' overlaps review --full but this is a CI test run, not a session close-out — near-miss review" }
]
}
2 changes: 1 addition & 1 deletion plugins/mnemo/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "mn",
"displayName": "mnemo",
"version": "1.2.7",
"version": "1.2.8",
"description": "Persistent memory layer for Claude Code and Codex via Obsidian — 7 skills for vault health, knowledge search, verified cross-runtime project recall, connection discovery, session continuity, memory routing, skill-aware session review, and interactive setup. Bundled JSON-stdin atomic vault writer, argv-safe indexed reads, dual-runtime helpers, hybrid model routing, parallel CLI calls, SessionStart prewarm, incremental JSONL parsing, shared references, and semantic taxonomy roles.",
"author": {
"name": "jojoprison",
Expand Down
2 changes: 1 addition & 1 deletion plugins/mnemo/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "mnemo",
"version": "1.2.7",
"version": "1.2.8",
"description": "Persistent memory layer for Codex and Claude Code via Obsidian: vault health, knowledge search, verified cross-runtime project recall, link discovery, session notes, memory routing, review orchestration, and setup.",
"author": {
"name": "jojoprison",
Expand Down
Loading
Loading