diff --git a/memory-fixer.prose.md b/memory-fixer.prose.md index 46da583..48ebf6d 100644 --- a/memory-fixer.prose.md +++ b/memory-fixer.prose.md @@ -6,7 +6,7 @@ name: memory-fixer description: > Auto-fix low-hanging fruit in the RA-H OS knowledge graph. No judgment calls — only deterministic Level 1 operations. Escalate anything that needs Kwame's input. Executes confirmed Kwame decisions to completion (state + updated_at). -version: 2.0.0 +version: 2.1.0 --- --- @@ -69,13 +69,15 @@ FROM nodes WHERE json_extract(metadata, '$.namespace') IS NULL; ``` -### 3. Staleness Review Tagging +### 3. Staleness Review Tagging (refresh-suggested nodes only) Using the type-based windows from the memory-monitor contract, tag nodes stale beyond their window. **Only process a maximum of 10 nodes per run** to avoid overwhelming Kwame. Prioritize infrastructure first, then dynamic, then ephemeral. +**Archive-suggested nodes are NO LONGER tagged — they are archived outright (see Level 1 fix 4).** Tagging with `[REVIEW: refresh]` applies only to living nodes (infrastructure, deployment, system, system-health, business, philosophy, research, learning, investigation, analysis, project, agent, registry, policy). + **Exclusion Rules:** - Nodes with `state` = `review_pending`, `deprecated`, `archived`, or `not_processed` are NOT processed -- Nodes whose `description` already starts with `[REVIEW:` are NOT re-processed +- Nodes whose `description` already starts with `[REVIEW:` or `[ARCHIVED]` are NOT re-processed ```sql SELECT id, title, json_extract(metadata, '$.type') as node_type, @@ -104,9 +106,28 @@ LIMIT 10; For each identified node, call `updateNode(id, { description: "[REVIEW: action] " + originalDescription })`. +### 4. Stale-Node Archiving (Level 1 — standing Kwame directive, 2026-09-11) + +**Kwame's standing directive: stale nodes CAN be archived by the fixer. No per-batch escalation, no `[REVIEW: archive]` tagging — archive them.** + +For every node whose suggested action is `archive` (i.e. its type is NOT one of the living types in fix 3), archive it in a **single** `updateNode` call: + +```python +updateNode(id, { + "description": "[ARCHIVED] " + originalDescriptionWithoutReviewTag, + "metadata": {"state": "archived"} +}) +``` + +- `state` transitions **DO work through `updateNode`** (`archived`, and back to `active`). The former "state only accepts processed/not_processed, use SSH" claim was wrong — verified 2026-09-11 by archiving 7 nodes (#61, #373, #388, #465, #475, #526, #1476) over the bridge with `updated_at` auto-bumping. **SSH to the bridge host is a fallback, not a requirement**, and it is blocked from kagentz anyway. +- Pass `description` and `metadata` in the **same** call, and always keep the `updates` object nested: `{"id": N, "updates": {…}}`. +- Archiving is non-destructive: the node stays in the graph, marked `state: archived` + `[ARCHIVED] ` prefix. **Living nodes (refresh-suggested) are NEVER archived** without a specific Kwame decision — they are the cluster/agent/business canon. + +**Archive candidates are identified by the fix 3 query's `suggested_action = 'archive'` branch** (the `ELSE 'archive'` case: anything not an infrastructure/skill/documentation/strategic/audit type). + ## Level 2 Escalations (Kwame Decision Required) -1. **Stale nodes** flagged with `[REVIEW: …]` — Archive, refresh, or keep? +1. **Refresh-suggested stale nodes** flagged with `[REVIEW: refresh]` — refresh or keep? (Archive-suggested nodes are auto-archived under fix 4 and are not escalated.) 2. **Duplicate Nodes** (same title or >70% title overlap) — Merge or keep? 3. **Orphan Nodes >90 days old** — Archive or connect? @@ -144,7 +165,7 @@ Reply with: The fixer reads Kwame's previous response and **executes the decision to completion** — it must not leave a node in review-pending forever. Tagging alone is NOT enough; each confirmed decision must also update `state` and `updated_at` so the node drops out of the stale window on the next run. -> ⚠️ `updateNode` cannot set `state` to non-standard values (restricted to `processed`/`not_processed`) and cannot add metadata keys. For state transitions and `updated_at` bumps, use **direct SSH + SQLite** on the bridge host: +> ⚠️ **Corrected 2026-09-11:** `updateNode` DOES accept `state` changes — `{"updates": {"description": …, "metadata": {"state": "archived"}}}` works over the bridge, and `updated_at` bumps automatically. The old "use direct SSH + SQLite for state transitions" instruction was based on a wrong assumption; SSH is a fallback only (and is blocked from kagentz). Use one `updateNode` call for both the tag and the state. > ```bash > ssh root@192.168.68.65 "sqlite3 /root/.local/share/RA-H/db/rah.sqlite \"UPDATE nodes SET metadata = json_set(metadata, '$.state', ''), updated_at = datetime('now') WHERE id = ;\"" > ``` @@ -172,8 +193,9 @@ The result must be 0 rows when all decisions are executed. Report what was done. ## Checks - **State integrity:** archived nodes have `state: archived` + `[ARCHIVED]` prefix; kept nodes are `state: active` without a `[REVIEW:]` tag. +- **Auto-archive applied:** no node should ever be left tagged `[REVIEW: archive]` — that tag is retired. Any `[REVIEW: archive]` found means fix 4 was skipped; archive it and report. - **No review-pending forever:** after executing Kwame's decisions, `[REVIEW:%` node count must be 0. -- **Timestamps:** every executed decision bumps `updated_at`, so the node exits the stale window on the next run. +- **Timestamps:** every executed decision (and every auto-archive) bumps `updated_at`, so the node exits the stale window on the next run. ## Logging Every Level 1 fix logged to `~/.hermes/logs/memory-fixer/YYYY-MM-DD.md`