a43a35bd10
WM continuity (the significant one). A node reached by the current query but scoring under its type threshold was zeroed outright, while a node the query did NOT reach got the full ACT-R carry-over treatment. Being found was punished relative to not being found. Measured consequence: WM turned over 100% every call — three activations of a byte-identical query gave |A∩B| = |B∩C| = 0 — and wm_evicted stayed 0 the whole time because that path never counted. WM was not a working set; it was six suppression-breakthrough nodes re-drawn per call. Both exits from a WM slot now share one extracted retention rule. Result: WM 6 -> 24 nodes (the designed Cowan capacity), top weight 0.097 -> 0.748 (natural promotion, not the breakthrough floor), and contents that are actually query-relevant. Hebbian learning. Edge weights were written once at engram_connect and never changed; last_fired's only writer in 12.5k lines was an unrelated dharma path. Every learning mechanism operated on nodes — the wiring between them was frozen. Adds co-activation potentiation (HeLa-Mem arXiv:2604.16839) in a separate `hebb` field so authored structure is never mutated, with homeostatic per-node scaling the source lacks (PNAS 2422602122) to prevent hub saturation. Measuring it produced the finding that mattered: zero edges existed between co-active WM members, so reweighting existing edges was a no-op. This graph's 41k edges were all authored by explicit tool calls — nothing had ever formed an association from experience. So Hebb literally: if the wire is absent, grow it. Consolidation is gated hard (sustained EWMA past 0.15, <=2/call, 5% ceiling, in-memory candidates discarded on restart) because it permanently mutates the graph. Two bugs caught only by instrumenting rather than assuming: the snap-to-zero floor sat above the per-step increment, so nothing could ever accumulate; and the reached-but-sub-threshold eviction above. Verified live end to end — 53 links formed under load, then discarded with the test snapshot. Also exposes engram_act_stats_json over GET /api/act-stats. It had existed since 2026-07-27 but was reachable only through the soul daemon, so diagnosing the activation layer required a working soul. This review needed it and could not get at it.