feat(soul): memories form connections when written
The design rejects what this system did: promotion must link candidates 'using
typed semantic edges rather than appending as unlinked content' (CCR claim 29).
Unlinked append was the only behaviour we had. Measured 2026-08-09: 14,214 edges
over 80,936 nodes, 5% of nodes connected to anything, and no edge created by any
write since 2026-07-19 across 27,000+ new nodes. A memory with no connections is
unreachable by spreading activation, so retrieval degrades to literal matching.
On write, a memory is now linked to its top related existing memories.
Bounds, each bought with a specific failure:
- max 3 edges per memory (link_memories.py's cap: precision over spray)
- never link to identity. The existing policy is explicit that 'memories must
not pollute the self traversal by similarity; only an explicit citation may
touch identity'.
- never link telemetry (state-event, soul-response, boot_count, loop-outcome,
search-result): ~97% of daily write volume. Linking it would add thousands of
noise edges a day and re-flatten the graph in the name of connecting it.
- fail-soft: a failed association never fails the write
- associate only AFTER durability, so no edge points at a node that did not
persist — that is the dangling-edge defect the 08-09 cleanup removed 830 of
Two defects found by measuring rather than reading, both fixed here:
1. Hooking mem_store alone produced ZERO edges across four real writes. The HTTP
memory route writes via wt_node directly; mem_store serves only the awareness
telemetry paths we refuse to link.
2. A lowercase-only identity check let a memory link to 'Self — Values
(grounded)' — the exact pollution the policy forbids. My verification shared
the blind spot and printed PASS. Now uses str_lower.
Measured, lab, same corpus: ~1-2 edges per memory; identity edges unchanged at
475; zero identity leaks post-fix including an adversarial batch of six memories
written about values. Edges route through wt_edge so they reach the owner.
Rung: E2E-VERIFIED in an isolated lab. Not deployed.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -380,6 +380,13 @@ fn handle_api_remember(body: String) -> String {
|
||||
sal, sal, el_from_float(0.9),
|
||||
"Episodic", final_tags)
|
||||
if !api_persisted(id) { return api_not_persisted(id) }
|
||||
// Associate on write (2026-08-09). THIS CALL MUST BE HERE, not only in mem_store.
|
||||
// The HTTP memory route writes via wt_node directly; mem_store serves only the
|
||||
// awareness paths (soul-response, search-result, activation-result) which are
|
||||
// exactly the telemetry we refuse to link. Hooking mem_store alone produced
|
||||
// ZERO edges across four real writes — measured, not assumed, which is the only
|
||||
// reason it was caught before shipping.
|
||||
mem_associate(id, content, "memory:remembered")
|
||||
return "{\"id\":\"" + id + "\",\"ok\":true}"
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user