v3.8.0 — the dashboard answers, and what it reports stops lying
Every dashboard endpoint that recomputed a multi-second analysis on each request now serves
it from a shared cached report, and three defects that made stored state quietly disagree
with reality are fixed.
Added
smem prune-orphan-states — reports, and on --apply removes, neuron_state rows
whose neuron is gone. Orphans are not inert: the decay pass iterates every state row, so
each one is decay computed for a neuron that no longer exists.
Deliberately an explicit command rather than a consolidation stage. It deletes on the
strength of a neuron/state comparison, and the two sides spell the same neuron differently
— record ids fold - to _ while the state keeps the dashed uuid. Normalising only one
side marks every live state as an orphan and empties the table, so this runs only when a
human asks, and it defaults to reporting.
Per-pass decay telemetry ([decay_telemetry], off by default). One aggregate row per
decay pass — never a row per edge, since the pass touches every synapse and per-edge rows
are the write pattern that grew the change log without bound. Records the weight
distribution either side of the pass, why each skipped synapse was skipped, and the knobs
the pass ran with, because a distribution is uninterpretable without them. Closes #183.
smem_transplant(min_salience=…) — the engine validated and applied this threshold all
along, but no MCP caller could set it, so every transplant ran unfiltered. Closes #175.
Fixed
- Four dashboard endpoints each recomputed the same diagnostics analysis.
/health,
/brains,/config-statusand/storage/statuscalled the engine directly, so one
analysis ran once per endpoint per page load instead of once per brain per window.
Sharing one cached report also removes the possibility of two endpoints disagreeing about
the same brain. - The diagnostics cache had a TTL too short to amortise its own cost. A report costing
tens of seconds cannot pay off inside a 60 s window: anyone opening the dashboard less
often than that missed every single time. /evolutionrecomputed per request and fetched the synapse metadata blob for a metric
no caller reads, scanned maturations twice, and re-fetched stats its caller already had.add_neuronswallowed a failedneuron_stateinsert and still reported success. A
neuron without a state row looks permanently un-accessed: it never receives the activation
boost and is a standing candidate for dead-neuron pruning, for a reason nothing logged.
Closes #174.smem_editleftmetadata["_structure"]describing the previous content, which recall
reads back — so an edited memory kept reporting fields the new text no longer had. Now
recomputed, and removed rather than overwritten when the new content has no structure.
Closes #176.activate_from_multiplefanned out without bound, so concurrent traversals grew with
caller input rather than with anything the system controls. Closes #181.
Upgrading
Nothing to do. The telemetry table is additive and its config section is off by default;
smem prune-orphan-states is opt-in and reports before it deletes.
Full changelog: v3.7.0...v3.8.0