Skip to content

feat(sona): complete state persistence — loadState() restores patterns (#274)#285

Merged
ruvnet merged 1 commit intomainfrom
fix/sona-load-state-274
Mar 23, 2026
Merged

feat(sona): complete state persistence — loadState() restores patterns (#274)#285
ruvnet merged 1 commit intomainfrom
fix/sona-load-state-274

Conversation

@ruvnet
Copy link
Copy Markdown
Owner

@ruvnet ruvnet commented Mar 23, 2026

Summary

Completes #274 by implementing the load path for SONA state persistence.

What was missing

PR #284 added saveState() but no loadState(). SONA could serialize its learned patterns but couldn't restore them after a restart.

What this PR adds

Layer Method Purpose
Rust (reasoning_bank) insert_pattern() Direct pattern insertion for state restore
Rust (coordinator) load_state(json) Deserialize JSON and restore patterns
Rust (coordinator) serialize_state() Now includes full pattern data (centroids, quality)
NAPI loadState(stateJson) Node.js binding
TypeScript loadState(stateJson) Wrapper returning count of restored patterns

Full save/load cycle

// Save before shutdown
const state = engine.saveState();
fs.writeFileSync('sona-state.json', state);

// Restore after restart
const json = fs.readFileSync('sona-state.json', 'utf8');
const restored = engine.loadState(json);
console.log(`Restored ${restored} patterns`);

What's still needed (follow-up)

  • Brain server: auto-persist SONA state to Firestore after each training cycle
  • Brain server: auto-load SONA state on Cloud Run cold start

Files Changed

File Change
crates/sona/src/reasoning_bank.rs Added insert_pattern()
crates/sona/src/loops/coordinator.rs Full serialize_state() + load_state()
crates/sona/src/napi.rs Added loadState() NAPI binding
npm/packages/ruvector/src/core/sona-wrapper.ts Added loadState() wrapper

Closes #274

🤖 Generated with claude-flow

#274)

Completes #274 by adding the load path for SONA state persistence:

- ReasoningBank.insert_pattern(): directly insert a pattern (for restore)
- LoopCoordinator.load_state(json): deserialize and restore patterns
- NAPI loadState(stateJson): binding for Node.js
- TypeScript loadState(stateJson): wrapper with return count

Full save/load cycle now works:
  const state = engine.saveState();    // serialize patterns to JSON
  // ... restart ...
  const restored = engine.loadState(state);  // restore N patterns

serialize_state() now includes full pattern data (centroids, quality,
cluster sizes) not just counts.

Co-Authored-By: claude-flow <ruv@ruv.net>
ruvnet added a commit that referenced this pull request Mar 23, 2026
- After each training cycle, if patterns exist, persist SONA stats
  to Firestore collection 'sona_state' (doc 'latest')
- On startup, check Firestore for persisted state and log
- Full pattern restore (load_state) will activate once sona >= 0.1.8
  merges (PR #285)

This ensures SONA learning survives Cloud Run deploys by writing
to durable storage after every train cycle (every 5 minutes).

Co-Authored-By: claude-flow <ruv@ruv.net>
@ruvnet ruvnet merged commit c023e94 into main Mar 23, 2026
16 of 17 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(sona): Save/load learned state to disk for persistence across restarts

1 participant