Key changes from review:
- Use separate _sessionContext field instead of mutating _systemPromptBase
- Parameterize compaction prompt via buildCompactionPrompt() instead of duplicating
- Fix flaky TTL=0 test to use hardcoded past expiry date
- Route memory extraction to {userNamespace}/facts when namespace is set
- Document future considerations (config refactor, concurrent writes, token counting)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Two-tier memory model (working memory + long-term store) with a unified
user namespace across all channels. Addresses four gaps: cross-session
forgetting, compaction context loss, no proactive recall, and channel
fragmentation.
Key design decisions:
- user/working namespace written on every compaction (TTL-based expiry)
- user/profile + user/patterns as shared identity across channels
- Session-start injection before first turn (one-time, idempotent)
- Opt-in via memory.user_namespace config; default is unchanged behavior
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The scorecard claimed 128/128 (100%) which was never accurate — the
2026-02-06 gap analysis listed 16 MISSING features that remain
deferred. Updated to ~114/130 (~88%) with explicit list of deferred
items: channel adapters (Matrix/Zalo/LINE/Feishu/Mattermost), providers
(MiniMax/Moonshot/Vercel AI/OAuth), native companion apps, ClawHub,
Bonjour/mDNS, skill safety scanner, and elevated mode.
Also added missing progress entries for Phase 3 (companion/canvas/voice
deepening), Phase 4 (rollout/operator readiness), and the post-phase
test fixes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- platformClients.integration: iOS/Android push tests lacked
setStatus() call before listNodes(), so platform filter excluded
nodes. Added publishHeartbeat() to set platform on connection state.
- server.test: agent.send now emits run_state events before done (Phase
1). Added sendAndWaitForDone() helper and updated test to find done
event rather than assuming index 0.
- handlers.test: updated agent.send/cancel assertions to use find()
and pass send arg to agent.cancel, consistent with run_state events.
- httpBody: req.destroy() closed socket before 413 response could be
sent. Removed socket destruction from body reader; 413 responses now
send Connection: close so Node closes the connection cleanly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>