9f1db8278c
Hebbian consolidation was inert. Census over the live graph (41,213 edges, 13,091 nodes, 23h44m uptime): strongest association hebb=0.000799 against a 0.15 consolidation threshold, and zero hebbian-associate edges ever formed. Since the awareness loop calls engram_connect nowhere, this was the only path by which the graph could grow its own structure — every edge was authored or imported, none learned. The defect was the event, not the rate. hebb is an EWMA whose fixed point is P(event); raising ETA changes convergence speed, never the plateau. The event was "both endpoints in WM in the same activate call" — demanded exact simultaneity from a working memory that inhibition-of-return, breakthrough rotation and the 24-slot global cap are all engineered to keep turning over (~142 evictions/60s). The three mechanisms that make WM healthy are the ones that made this measurement empty. Replaced with three-factor eligibility traces (Sutton & Barto ch.7; Gerstner et al. 2018; PLOS Comp Biol 2018 differential Hebbian learning): a node entering WM sets a trace to 1.0, the trace decays exponentially in wall-clock time (TC=300s, chosen against the measured ~31s scan cadence), and the increment becomes ETA·trace(a)·trace(b). Strict generalization — co-resident pairs read 1.0 on both ends and get exactly ETA, bit-identical to before. warm×warm is deliberately not paired: eligibility must gate on something happening now. Homeostatic ENGRAM_HEBB_NODE_BUDGET still bounds per-node mass. Measured over a 60-call soak: hebb_max 0.0008 -> 0.0060, climbing at ~0.87 ETA/call against an all-time ceiling of 0.0008 before. hebb_mass 0.011 -> 0.019, no runaway. Projected consolidation of a genuinely recurring pair: ~1,730 calls, ~14h at autonomous cadence. links still 0 — that is expected and is what tomorrow's review must check. Also: Pass 3½ deduplicates this call's WM candidates, but the persisted WM population is a union of fresh promotions and carry-over residents, and Pass 3½ never sees the second set. Confirmed live: two byte-identical copies of one 3,193-char document both holding slots (0.289 / 0.271). Added global redundancy suppression in Pass 5 before the cap count. Post-fix census: 24 residents, 24 distinct contents, 0 wasted slots. New gauges: hebb_warm (eligible-but-not-co-resident population), dup_wm_global.