v3.10.14
ruvnet/ruflov3.10.14May 30, 2026by ruvnet
AI Summary
Wires up the self-learning subsystem that was reporting success but persisting nothing (issue #2245). Three CLI-side wirings are fixed plus honest multi-path output and adversarial hardening.
Key Highlights
- hooks_task-completed {trainPatterns: true} now invokes real SONA + EWC++ trajectory pipeline
- signalsProcessed counter now wired into bridgeStoreEntry for actual counting
- hooks_pretrain writes per-pattern rows into neural store via storeNeuralPatterns
- Honest multi-path messaging declares learning path and store(s) written to
- Content sanitization on task-completed content (strip control chars, 4KB cap)
New Features
- Real SONA + EWC++ trajectory pipeline integration
- signalsProcessed counter tracking
- Neural store pattern writing via storeNeuralPatterns
- Multi-path learning output with path declaration
- Content sanitization for adversarial hardening
Full Release Notes
Wires up the self-learning subsystem the reporter found was reporting success but persisting nothing queryable ([#2245](https://github.com/ruvnet/ruflo/issues/2245)). Three CLI-side wirings + honest multi-path output + a proof harness.
**What's fixed**
- `hooks_task-completed {trainPatterns: true}` now invokes the real SONA + EWC++ trajectory pipeline (was a stub returning `patternsLearned: 0`). Returns `learningPath: 'trajectory-pipeline' | 'recorded-only'` so callers know what happened.
- `signalsProcessed` was a dead counter — initialized 3×, read 1×, incremented 0× anywhere. Now wired into `bridgeStoreEntry` so every memory-bridge write counts. `loadPersistedStats` also restores `patternsLearned` + `signalsProcessed` so a process restart no longer zeroes the learning history.
- `hooks_pretrain` now writes per-pattern rows into the neural store (via new `storeNeuralPatterns`), so `neural_patterns list` reflects them. Response surfaces both `patternsBundled` + `patternsIndexed` + `sources.stores`.
**Honest multi-path messaging** (per the goal-condition)
Every learning-adjacent surface declares the path it took and the store(s) it wrote to. The `task-completed` description lists the three paths explicitly: (a) `trainPatterns:true` for one-step learning, (b) `hooks_intelligence_trajectory-*` for multi-step, (c) `memory_store` for storage without learning.
**Adversarial hardening** (#2241 ASI06)
Basic content sanitization on `task-completed` content before it feeds SONA (strip ASCII control chars, cap to 4 KB).
**Proof**
- `__tests__/self-learning-2245.test.ts` — 9 tests across EASY / MEDIUM / COMPLEX categories. CI gate.
- `scripts/benchmark-self-learning.mjs` — 5 sections (A–E), writes a committed run JSON. Latest run: signalsProcessed +10, trained=10/10 at ~18 ms/call, pretrain stored=10/listed=10, multi-step persisted=5/sonaUpdate=5. **All passed.**
- Reproduction guide: [`v3/docs/learning/self-learning-2245-proof.md`](https://github.com/ruvnet/ruflo/blob/main/v3/docs/learning/self-learning-2245-proof.md)
- ADR: [`v3/docs/adr/ADR-074-self-learning-wiring-2245.md`](https://github.com/ruvnet/ruflo/blob/main/v3/docs/adr/ADR-074-self-learning-wiring-2245.md)
**Install:** `npx ruflo@3.10.14`
**Tracked for round 2 (not in this release)**
Unify the 4 stat aggregators (globalStats / memory_bridge / hooks_metrics / neural_patterns); wire `post-edit` / `post-command` to feed the trajectory pipeline; Structured Distillation (#2241) of trajectory content for 11× compression + better MRR.