Skip to content

fix(sona): trajectory counter always 0 + state persistence (#273, #274)#284

Merged
ruvnet merged 1 commit intomainfrom
fix/sona-persistence-273-274
Mar 23, 2026
Merged

fix(sona): trajectory counter always 0 + state persistence (#273, #274)#284
ruvnet merged 1 commit intomainfrom
fix/sona-persistence-273-274

Conversation

@ruvnet
Copy link
Copy Markdown
Owner

@ruvnet ruvnet commented Mar 23, 2026

Summary

Fixes #273 and #274 — SONA trajectory counter always returns 0 and learned state lost on restart.

Changes

Fix #273: getStats().trajectoriesRecorded always returns 0

Root cause: Rust CoordinatorStats serializes as trajectories_buffered (snake_case) but the TypeScript SonaStats interface expects trajectoriesRecorded (camelCase). The JSON field name mismatch meant the value was always undefined, coerced to 0.

Fix:

  • Added trajectories_recorded field to CoordinatorStats (= trajectories_buffered + trajectories_dropped)
  • Added patterns_learned alias for patterns_stored
  • Updated TypeScript wrapper getStats() to map snake_case Rust fields to camelCase with fallbacks

Fix #274: Save/load learned state for persistence

Root cause: All SONA state (reasoning bank patterns, EWC tasks, trajectory buffer) lives only in memory. Cloud Run deploys or process restarts lose all accumulated learning.

Fix:

  • Added serialize_state() to LoopCoordinator — returns JSON with reasoning bank patterns, EWC task count, enabled flags
  • Added saveState() to NAPI layer and TypeScript wrapper
  • Consumers can now call engine.saveState() to persist to disk/database and restore on next startup

Files Changed

File Change
crates/sona/src/loops/coordinator.rs Added trajectories_recorded, patterns_learned, serialize_state()
crates/sona/src/engine.rs Added coordinator() accessor
crates/sona/src/napi.rs Added saveState() NAPI binding
npm/packages/ruvector/src/core/sona-wrapper.ts Fixed snake→camel mapping, added saveState()

Test plan

  • cargo check passes for sona crate
  • NAPI binary rebuild (CI will handle)
  • Verify getStats().trajectoriesRecorded > 0 after recording trajectories

🤖 Generated with claude-flow

…274)

#273: trajectoriesRecorded always returns 0
Root cause: Rust CoordinatorStats serializes as trajectories_buffered
but TypeScript expects trajectoriesRecorded. Added trajectories_recorded
field and mapped snake_case → camelCase in TypeScript wrapper.

#274: Save/load learned state for persistence across restarts
Added serialize_state() to LoopCoordinator and saveState() to
NAPI + TypeScript wrapper.

Co-Authored-By: claude-flow <ruv@ruv.net>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

1 participant