You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: PROGRAM.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -54,7 +54,7 @@ Extract only things that will be useful **across sessions** — facts that a fut
54
54
55
55
**Commitments and action items** — things promised to people, deadlines agreed to, follow-ups needed.
56
56
57
-
-*Example:* "Alice will follow up with legal about copyright clearance." → ActionItem.
57
+
-*Example:* "Alice will follow up with legal about the licensing review." → ActionItem.
58
58
-*Example:* "Q3 Marketing Launch due Week 10 (April 14)." → ActionItem linked to project/marketing-launch.
59
59
60
60
### Sometimes extract
@@ -299,7 +299,7 @@ The canonical form of an entity reference is **lowercase, hyphens-not-spaces, `k
299
299
300
300
- `person/alice-smith`(not `Person/Alice Smith`, not `alice_smith`, not `alice smith`)
301
301
- `project/palinode`
302
-
- `decision/tools-over-pipeline`
302
+
- `decision/reviewability-over-speed`
303
303
- `insight/curation-beats-volume`
304
304
305
305
The body `[[wikilink]]` may be the human-readable label (`[[Alice Smith]]`) or the slug (`[[alice-smith]]`) — both resolve to the same target file. Whichever you write, the corresponding `entities:` value is always the canonical `kind/slug` form. A body line `Met with [[Alice Smith]] about Q3 planning` requires `entities: [person/alice-smith]` in the frontmatter.
LLM (suggests updates → Palinode validates and writes them → git commits)
46
46
```
47
47
48
48
That's the whole architecture. One directory of `.md` files, one SQLite database, one API server. No Postgres, no Redis, no cloud dependency.
@@ -82,7 +82,7 @@ That's the entire client config. Works with Claude Code, Claude Desktop, Cursor,
82
82
83
83
**Search** — Hybrid BM25 + vector search merged with Reciprocal Rank Fusion. Keyword precision when you need exact terms, semantic recall when you don't. Optional associative entity graph and prospective triggers.
84
84
85
-
**Compact** — Weekly consolidation where an LLM proposes structured operations (KEEP / UPDATE / MERGE / SUPERSEDE / ARCHIVE) and a deterministic executor applies them. The LLM never touches your files directly. Every compaction is a git commit you can review, blame, or revert.
85
+
**Compact** — Weekly consolidation where an LLM suggests structured memory updates and Palinode applies the validated result to your files. Every compaction is a git commit you can review, blame, or revert.
86
86
87
87
**Audit** — `git blame` any fact. `git diff` any change. `rollback` any mistake. These aren't just git-compatible files — `palinode_diff`, `palinode_blame`, and `palinode_rollback` are first-class tools your agent can call.
88
88
@@ -369,7 +369,7 @@ Optional: a chat model for consolidation (any 7B+ works), OpenClaw for agent plu
369
369
- **Your data, your files** — No accounts, no cloud dependency, no vendor lock-in. Your memory is markdown files in a directory you control. Export is `cp`. Backup is `git push`. Whatever happens to any tool in this ecosystem, your data is plain text on your filesystem.
370
370
- **Cross-IDE memory** — Your memory lives in one place. Connect from Claude Code, Cursor, Windsurf, Zed, or any MCP-compatible editor. Switch IDEs without losing context.
371
371
- **Git operations as agent tools** — `diff`, `blame`, `rollback`, `push` exposed via MCP. No other system makes git ops callable by the agent.
372
-
- **Operation-based compaction** — KEEP/UPDATE/MERGE/SUPERSEDE/ARCHIVE DSL. The LLM proposes structured operations and the deterministic executor applies them. Every compaction is a reviewable git commit.
372
+
- **Reviewable compaction** — The LLM suggests structured memory updates and Palinode applies validated changes with full git history. Every compaction is a reviewable git commit.
373
373
- **Per-fact addressability** — `<!-- fact:slug -->` IDs inline in markdown, invisible in rendering, preserved by git, targetable by compaction.
Copy file name to clipboardExpand all lines: docs/CHANGELOG.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -118,7 +118,7 @@ Bug-fix release with small UX additions. Brings the public repo up to date with
118
118
119
119
## [0.5.0] — 2026-04-10
120
120
121
-
First tagged release. Persistent memory for AI agents with git-versioned markdown as source of truth, hybrid SQLite-vec + FTS5 search, and LLM-driven consolidation applied by a deterministic executor.
121
+
First tagged release. Persistent memory for AI agents with git-versioned markdown as source of truth, hybrid SQLite-vec + FTS5 search, and LLM-driven consolidation with reviewable git-backed updates.
122
122
123
123
### Added
124
124
@@ -129,7 +129,7 @@ First tagged release. Persistent memory for AI agents with git-versioned markdow
129
129
- File watcher daemon with debounced reindex and fault isolation
130
130
131
131
**Consolidation and compaction**
132
-
-Deterministic executor applying `KEEP` / `UPDATE` / `MERGE` / `SUPERSEDE` / `ARCHIVE` operations proposed by an LLM
132
+
-Reviewable consolidation engine applying structured memory updates proposed by an LLM
133
133
- Weekly full-corpus consolidation with configurable LLM backend
134
134
- Nightly lightweight consolidation pass (`--nightly` flag) bounded to `UPDATE`/`SUPERSEDE` for safer incremental updates
135
135
- Model fallback chains — primary → fallback → fallback on timeout or HTTP error
@@ -161,7 +161,7 @@ First tagged release. Persistent memory for AI agents with git-versioned markdow
161
161
- Exclude-paths list prevents search results from surfacing files in `.secrets`, `credentials`, etc.
162
162
163
163
**Documentation**
164
-
-Architecture decision records covering the deterministic executor design
164
+
-Design and setup docs covering consolidation, provenance, and deployment
165
165
- Remote MCP setup guides for Claude Code, Claude Desktop, Cursor, Zed
166
166
- Example memory files (`examples/people/`, `examples/projects/`, `examples/decisions/`, `examples/insights/`)
167
167
- Compaction walkthrough (`examples/compaction-demo/`) — a memory file across 3 passes with blame + diff output
Copy file name to clipboardExpand all lines: docs/OBSIDIAN.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -158,7 +158,7 @@ Given a draft about to be saved, returns the top-K existing files whose embeddin
158
158
159
159
### `palinode_orphan_repair`
160
160
161
-
Given a `[[wikilink]]` whose target file does not exist, returns existing files semantically near the link target text. The LLM proposes a redirect to one of those files, or creates the target with the candidate's content as scaffolding rather than starting cold.
161
+
Given a `[[wikilink]]` whose target file does not exist, returns existing files semantically near the link target text. The agent can redirect to one of those files, or create the target with the candidate's content as scaffolding rather than starting cold.
162
162
163
163
-**Default threshold:** ≥ 0.65 cosine — more permissive than dedup because a wider candidate slate helps the LLM choose.
Copy file name to clipboardExpand all lines: examples/compaction-demo/README.md
+4-4Lines changed: 4 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# Compaction Demo — Watching a Memory File Consolidate
2
2
3
-
This directory walks through a realistic scenario: a team debating REST vs GraphQL for a new checkout API over several weeks, with the decision recorded as it evolves. You see the raw daily-note accretion, then the deterministic executor applying consolidation operations, and finally the clean state.
3
+
This directory walks through a realistic scenario: a team debating REST vs GraphQL for a new checkout API over several weeks, with the decision recorded as it evolves. You see the raw daily-note accretion, then Palinode applying reviewable consolidation updates, and finally the clean state.
4
4
5
5
The key thing to notice: **every change is a git commit, and every line can be blamed back to the session where the fact was first recorded.** That's the "git your agent's brain" pitch, made concrete.
6
6
@@ -22,13 +22,13 @@ Alice and Bob are building a mobile checkout flow (`projects/my-app.md`). Over t
22
22
23
23
Start with `pass-0-initial.md` and notice the mess — every session-end hook append adds another status line, contradictions don't resolve themselves, and old `[ ]` todos stick around long after they're done.
24
24
25
-
Then open `pass-1-after-update-supersede.md` side-by-side. The executor preserved every original line's provenance but corrected outdated claims (SUPERSEDE) and tightened wording (UPDATE). Note the `<!-- supersede: ... -->` comments — those aren't just documentation, they're structured metadata the executor writes so that the next pass knows what it's looking at.
25
+
Then open `pass-1-after-update-supersede.md` side-by-side. Palinode preserved every original line's provenance but corrected outdated claims (SUPERSEDE) and tightened wording (UPDATE). Note the `<!-- supersede: ... -->` comments — those aren't just documentation, they're structured metadata the system writes so that the next pass knows what it's looking at.
26
26
27
27
Then `pass-2-after-merge-archive.md` shows what you'd actually want to read if you opened the file fresh. Related facts have been merged into single lines. Archived entries are gone from this file but preserved in `archive/2026/my-app-status.md` — nothing is deleted, just moved out of the way.
28
28
29
29
Finally `blame-output.txt` is the demo's money shot: **every line has a commit, and every commit has a session.** You can answer "when did we decide X?" and "which session first mentioned Y?" without remembering — git remembers for you.
30
30
31
-
## What the executor actually did
31
+
## What the system actually did
32
32
33
33
Between pass 0 and pass 1 (13 operations):
34
34
- 6 × `UPDATE` — tightened wording on stale-but-still-true status lines
@@ -41,7 +41,7 @@ Between pass 1 and pass 2 (9 operations):
41
41
- 4 × `ARCHIVE` — moved superseded entries to `archive/2026/my-app-status.md`
42
42
- 2 × `UPDATE` — final wording pass on merged lines
43
43
44
-
All 22 operations were **proposed by an LLM**but **applied by deterministic Python** (`palinode/consolidation/executor.py`). The LLM never touches the file directly — it only emits JSON like `{"op": "SUPERSEDE", "id": "f-0317-1", "superseded_by": "f-0324-2", "reason": "stripe integration actually shipped on the 24th"}` and the executor validates and applies it. That's the core tools-over-pipeline invariant in action.
44
+
All 22 operations were **proposed by an LLM**and then **validated and applied by Palinode's consolidation code** (`palinode/consolidation/executor.py`). The LLM never touches the file directly — it only emits JSON like `{"op": "SUPERSEDE", "id": "f-0317-1", "superseded_by": "f-0324-2", "reason": "stripe integration actually shipped on the 24th"}` and Palinode turns that into reviewable file changes.
0 commit comments