diff --git a/.claude/memory/MEMORY.md b/.claude/memory/MEMORY.md index bc39496..d3ed9b1 100644 --- a/.claude/memory/MEMORY.md +++ b/.claude/memory/MEMORY.md @@ -128,3 +128,4 @@ - [Autonomy scope](feedback_autonomy_scope.md) — confirm only for client-affecting actions; internal docs/wiki/ClaudeTools = act autonomously - [Check for client-slug fragmentation](feedback_client_slug_fragmentation.md) — Before concluding a client has no records, grep broadly (company/owner/initials/hostname/"Last, First") across clients/, wiki/, session-logs/, vault — one client gets split across slug variants (Wolkin was 4: wolkin/wolkin-law/rswolkin/robert-wolkin). Consolidate to one canonical slug; action prior logs' Pending items. - [RMM user_session = false SMB failures](feedback_rmm_user_session_smb_false_negative.md) — GuruRMM net use/net view/Add-Printer to a remote \HOST fail with error 67 / RPC 1702 (even with valid creds) because user_session is a WTS-impersonated non-interactive token that can't do authenticated SMB. The share/printer may work fine interactively. Treat RMM SMB results as "can't tell"; verify via ScreenConnect. +- [Broken [[backlinks]] = write-me-later markers](feedback_broken_backlinks_are_writeme_markers.md) — A [[name]] with no matching file is an intentional "worth writing" marker, not breakage. Flesh the missing memory out from session history/logs and index it; never strip the link to silence the warning. memory-dream reports these as INFO candidates, not errors. diff --git a/.claude/memory/feedback_broken_backlinks_are_writeme_markers.md b/.claude/memory/feedback_broken_backlinks_are_writeme_markers.md new file mode 100644 index 0000000..3f4fa6c --- /dev/null +++ b/.claude/memory/feedback_broken_backlinks_are_writeme_markers.md @@ -0,0 +1,25 @@ +--- +name: Broken [[backlinks]] are write-me-later markers — flesh out from session history, don't delete +description: A [[name]] link in a memory body whose target file doesn't exist is NOT an error to clean up — it's an intentional marker that that memory is worth writing. When you hit one (or memory-dream lists them), flesh the missing memory out from the session logs / session history, don't strip the link. +type: feedback +--- + +A `[[some-name]]` reference in a memory body that has no matching `some-name.md` file is an +**intentional placeholder**, per the harness memory convention (CLAUDE.md: "a `[[name]]` that +doesn't match an existing memory yet is fine; it marks something worth writing later, not an +error"). Leave the link in place. + +**Why:** Mike, 2026-06-11. `memory-dream` flags ~16 of these as "broken backlinks." They are not +breakage — each is a pointer to a memory worth creating. Stripping them loses the signal of what's +worth capturing. + +**How to apply:** +- When you encounter a dangling `[[X]]` (or memory-dream lists one), treat it as a TODO: **the + facts for that memory live in the session history / session logs** — grep `session-logs/` and + `clients/*/session-logs/` for the topic, then write `X.md` and index it in `MEMORY.md`. That + resolves the link by creating the target, not by deleting the reference. +- Do NOT delete the `[[X]]` reference just to silence the warning. +- `memory-dream` reports these informationally (candidates to write), not as errors to fix. +- Examples seen 2026-06-11: `[[universal-minerals]]`, `[[365-remediation-tool-reference]]`, + `[[SPEC-017]]`, `[[power-failure-runbook]]`, `[[feedback_syncro_html]]` — each is a real memory + someone should flesh out from the relevant session logs when next working that area. diff --git a/.claude/skills/memory-dream/scripts/memory_dream.py b/.claude/skills/memory-dream/scripts/memory_dream.py index 71b9fb5..d05703c 100644 --- a/.claude/skills/memory-dream/scripts/memory_dream.py +++ b/.claude/skills/memory-dream/scripts/memory_dream.py @@ -640,11 +640,15 @@ def run(args) -> int: ref_slug = slugify_link_target(ref) if ref_slug not in known_slugs and ref not in known_slugs: broken_backlinks.append((m.filename, ref)) - rpt.add(f"### Broken backlinks: {len(broken_backlinks)}") + rpt.add(f"### Dangling [[backlinks]] — write-me-later candidates: {len(broken_backlinks)}") + if broken_backlinks: + rpt.add(" (NOT errors — intentional markers per the memory convention. Flesh each missing") + rpt.add(" memory out from the session history/logs; do NOT strip the link. See") + rpt.add(" feedback_broken_backlinks_are_writeme_markers.md.)") for fn, ref in broken_backlinks: - rpt.add(f"- [WARNING] {fn}: [[{ref}]] has no matching memory file") + rpt.add(f"- [INFO] {fn}: [[{ref}]] — memory not yet written (flesh out from session logs)") if not broken_backlinks: - rpt.add("- [OK] no broken backlinks found") + rpt.add("- [OK] no dangling backlinks") rpt.add("") # ----- 3. REFERENCED-ARTIFACT VALIDITY -----