clsplusplus 7.3.1__tar.gz → 7.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/PKG-INFO +1 -1
  2. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/pyproject.toml +1 -1
  3. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/memory_phase.py +4 -0
  4. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/memory_service.py +28 -1
  5. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus.egg-info/PKG-INFO +1 -1
  6. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus.egg-info/SOURCES.txt +1 -0
  7. clsplusplus-7.3.2/tests/test_mem0_failure_modes.py +706 -0
  8. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/LICENSE +0 -0
  9. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/README.md +0 -0
  10. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/setup.cfg +0 -0
  11. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/__init__.py +0 -0
  12. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/abuse_guard.py +0 -0
  13. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/api.py +0 -0
  14. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/api_usage_analytics.py +0 -0
  15. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/auth.py +0 -0
  16. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/cli.py +0 -0
  17. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/client.py +0 -0
  18. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/config.py +0 -0
  19. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/cost_forecast.py +0 -0
  20. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/cost_model.py +0 -0
  21. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/debug_console.py +0 -0
  22. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/demo_llm.py +0 -0
  23. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/demo_llm_calls.py +0 -0
  24. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/demo_local.py +0 -0
  25. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/email_service.py +0 -0
  26. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/embeddings.py +0 -0
  27. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/funnel_routes.py +0 -0
  28. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/geo.py +0 -0
  29. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/health_metrics.py +0 -0
  30. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/homepage_autopromote.py +0 -0
  31. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/idempotency.py +0 -0
  32. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/integration_service.py +0 -0
  33. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/integrations/__init__.py +0 -0
  34. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/integrations/autogen.py +0 -0
  35. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/integrations/crewai.py +0 -0
  36. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/integrations/langgraph.py +0 -0
  37. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/integrations/llamaindex.py +0 -0
  38. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/jwt_utils.py +0 -0
  39. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/local_routes.py +0 -0
  40. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/main.py +0 -0
  41. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/mcp_http.py +0 -0
  42. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/mcp_server.py +0 -0
  43. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/memory_cycle.py +0 -0
  44. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/metering_v2/__init__.py +0 -0
  45. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/metering_v2/__main__.py +0 -0
  46. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/metering_v2/billing.py +0 -0
  47. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/metering_v2/healthcheck.py +0 -0
  48. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/metering_v2/notifier.py +0 -0
  49. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/metering_v2/pricing.py +0 -0
  50. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/metering_v2/reconciler.py +0 -0
  51. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/metering_v2/schema.py +0 -0
  52. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/metering_v2/writer.py +0 -0
  53. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/metrics.py +0 -0
  54. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/middleware.py +0 -0
  55. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/models.py +0 -0
  56. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/namespace_resolver.py +0 -0
  57. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/oauth_server.py +0 -0
  58. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/permissions.py +0 -0
  59. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/plasticity.py +0 -0
  60. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/pricing.py +0 -0
  61. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/pricing_models.py +0 -0
  62. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/pricing_store.py +0 -0
  63. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/prompt_log.py +0 -0
  64. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/rate_limit.py +0 -0
  65. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/razorpay_service.py +0 -0
  66. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/rbac_service.py +0 -0
  67. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/reconsolidation.py +0 -0
  68. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/resilience.py +0 -0
  69. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/sleep_cycle.py +0 -0
  70. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/__init__.py +0 -0
  71. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/base.py +0 -0
  72. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/chat_session_store.py +0 -0
  73. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/integration_store.py +0 -0
  74. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/l0_working_buffer.py +0 -0
  75. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/l1_indexing_store.py +0 -0
  76. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/l2_schema_graph.py +0 -0
  77. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/l3_deep_recess.py +0 -0
  78. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/l3_postgres.py +0 -0
  79. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/oauth_store.py +0 -0
  80. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/rbac_store.py +0 -0
  81. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/user_store.py +0 -0
  82. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/waitlist_store.py +0 -0
  83. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stores/web_events_store.py +0 -0
  84. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/stripe_service.py +0 -0
  85. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/subscription_watchdog.py +0 -0
  86. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/temporal.py +0 -0
  87. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/test_suite.py +0 -0
  88. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/tier_resolver.py +0 -0
  89. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/tiers.py +0 -0
  90. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/topical_resonance.py +0 -0
  91. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/tracer.py +0 -0
  92. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/usage.py +0 -0
  93. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/user_embeddings.py +0 -0
  94. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/user_pulse.py +0 -0
  95. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/user_service.py +0 -0
  96. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/waitlist_service.py +0 -0
  97. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/webhook_dispatcher.py +0 -0
  98. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/weblab.py +0 -0
  99. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/weblab_watcher.py +0 -0
  100. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/window_limits.py +0 -0
  101. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus/write_metrics.py +0 -0
  102. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus.egg-info/dependency_links.txt +0 -0
  103. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus.egg-info/entry_points.txt +0 -0
  104. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus.egg-info/requires.txt +0 -0
  105. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/src/clsplusplus.egg-info/top_level.txt +0 -0
  106. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_abuse_guard.py +0 -0
  107. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_admin.py +0 -0
  108. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_admin_seed.py +0 -0
  109. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_api.py +0 -0
  110. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_api_comprehensive.py +0 -0
  111. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_api_endpoints.py +0 -0
  112. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_api_usage_analytics.py +0 -0
  113. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_auth.py +0 -0
  114. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_auth_me_api_key.py +0 -0
  115. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_autogen_memory.py +0 -0
  116. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_billing_e2e.py +0 -0
  117. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_burst_hardening.py +0 -0
  118. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_client_sdk.py +0 -0
  119. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_config.py +0 -0
  120. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_cost_forecast.py +0 -0
  121. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_crewai_provider.py +0 -0
  122. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_cross_llm_memory.py +0 -0
  123. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_debug_console.py +0 -0
  124. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_demo_llm.py +0 -0
  125. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_embeddings.py +0 -0
  126. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_extension_cross_model_runtime.py +0 -0
  127. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_extension_integration.py +0 -0
  128. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_extension_ui.py +0 -0
  129. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_feedback_github.py +0 -0
  130. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_free_tier_lifecycle.py +0 -0
  131. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_full_api_coverage.py +0 -0
  132. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_funnel_metrics.py +0 -0
  133. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_geo_gating.py +0 -0
  134. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_health_metrics.py +0 -0
  135. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_idempotency.py +0 -0
  136. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_integration_service.py +0 -0
  137. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_integration_sync_cli_contract.py +0 -0
  138. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_langgraph_store.py +0 -0
  139. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_llamaindex_block.py +0 -0
  140. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_mcp_connect.py +0 -0
  141. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_mcp_oauth.py +0 -0
  142. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_memory_cycle.py +0 -0
  143. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_memory_phase.py +0 -0
  144. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_memory_service.py +0 -0
  145. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_memory_write_no_schema_garbage.py +0 -0
  146. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_metering_v2_healthcheck.py +0 -0
  147. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_metering_v2_notifier.py +0 -0
  148. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_metering_v2_pricing.py +0 -0
  149. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_metering_v2_reconciler.py +0 -0
  150. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_metering_v2_schema.py +0 -0
  151. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_metering_v2_writer.py +0 -0
  152. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_middleware.py +0 -0
  153. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_models.py +0 -0
  154. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_overage_billing.py +0 -0
  155. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_performance.py +0 -0
  156. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_plasticity.py +0 -0
  157. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_pricing.py +0 -0
  158. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_prototype_e2e.py +0 -0
  159. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_rate_limit.py +0 -0
  160. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_razorpay_billing.py +0 -0
  161. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_razorpay_subscription_webhooks.py +0 -0
  162. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_reconsolidation.py +0 -0
  163. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_regression.py +0 -0
  164. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_resilience.py +0 -0
  165. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_security.py +0 -0
  166. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_sleep_cycle.py +0 -0
  167. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_stores.py +0 -0
  168. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_subscription_watchdog.py +0 -0
  169. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_tier_resolver.py +0 -0
  170. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_tiers.py +0 -0
  171. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_usage.py +0 -0
  172. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_user_auth.py +0 -0
  173. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_user_embeddings.py +0 -0
  174. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_user_pulse.py +0 -0
  175. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_user_stories.py +0 -0
  176. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_waitlist.py +0 -0
  177. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_webhook_dispatcher.py +0 -0
  178. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_weblab.py +0 -0
  179. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_window_limits.py +0 -0
  180. {clsplusplus-7.3.1 → clsplusplus-7.3.2}/tests/test_write_metrics.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: clsplusplus
3
- Version: 7.3.1
3
+ Version: 7.3.2
4
4
  Summary: Brain-inspired, model-agnostic persistent memory for LLMs. Learn, recall, forget — like a brain. Works with OpenAI, Claude, Gemini, Llama.
5
5
  Author-email: AlphaForge AI Labs <contact@alphaforge.ai>
6
6
  Maintainer-email: Rajamohan Jabbala <contact@alphaforge.ai>
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "clsplusplus"
7
- version = "7.3.1"
7
+ version = "7.3.2"
8
8
  description = "Brain-inspired, model-agnostic persistent memory for LLMs. Learn, recall, forget — like a brain. Works with OpenAI, Claude, Gemini, Llama."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -496,6 +496,10 @@ class PhaseMemoryItem:
496
496
  # True = a newer fact on the same (subject, relation) dimension exists.
497
497
  # Superseded items are hidden from default reads but never deleted.
498
498
  superseded: bool = False
499
+ # Belief-revision provenance: lineage holds the ids of prior facts this item
500
+ # supersedes (oldest first); version increments on each adjudicated overwrite.
501
+ lineage: list = field(default_factory=list)
502
+ version: int = 1
499
503
 
500
504
  # --- Crystallization (Liquid → Solid phase transition) ---
501
505
  schema_meta: Optional[SchemaMeta] = None # Non-None = solid/glass phase
@@ -112,6 +112,8 @@ class MemoryService:
112
112
  object=(phase_item.fact.value[:256] if phase_item.fact.value else None) or (req.object if req else None),
113
113
  event_at=getattr(phase_item, "event_at", None),
114
114
  superseded=getattr(phase_item, "superseded", False),
115
+ lineage=list(getattr(phase_item, "lineage", []) or []),
116
+ version=getattr(phase_item, "version", 1),
115
117
  )
116
118
 
117
119
  # =========================================================================
@@ -1245,6 +1247,7 @@ class MemoryService:
1245
1247
  new_item = MemoryItem(text=new_text, namespace=namespace)
1246
1248
  new_item = self.embedding_service.embed_item(new_item)
1247
1249
 
1250
+ revised = None # the gate-updated item carrying lineage/version, if any
1248
1251
  if existing and existing.embedding:
1249
1252
  updated, archived, should_engrave = self.reconsolidation.prepare_for_reconsolidation(
1250
1253
  new_item, existing, evidence,
@@ -1252,6 +1255,7 @@ class MemoryService:
1252
1255
  if not should_engrave:
1253
1256
  # Quorum not met — return existing unchanged
1254
1257
  return existing
1258
+ revised = updated # lineage = old.lineage + [old.id], version = old.version + 1
1255
1259
 
1256
1260
  # Quorum met (or no existing) — store via PhaseMemoryEngine
1257
1261
  req = WriteRequest(
@@ -1260,7 +1264,30 @@ class MemoryService:
1260
1264
  source="adjudicate",
1261
1265
  authority=1.0, # High authority for adjudicated facts
1262
1266
  )
1263
- return await self.write(req)
1267
+ result = await self.write(req)
1268
+
1269
+ # Persist belief-revision provenance: carry the gate's lineage/version onto
1270
+ # the engraved fact and archive (never delete) the superseded one. Without
1271
+ # this the overwrite would land as a fresh v1 with no history — the gap a
1272
+ # naive "latest wins" store (e.g. Mem0 #4536) leaves behind.
1273
+ if revised is not None:
1274
+ new_phase = self.engine._item_by_id.get(result.id)
1275
+ if new_phase is not None:
1276
+ new_phase.lineage = list(revised.lineage)
1277
+ new_phase.version = revised.version
1278
+ result.lineage = list(revised.lineage)
1279
+ result.version = revised.version
1280
+ if existing is not None:
1281
+ old_phase = self.engine._item_by_id.get(existing.id)
1282
+ if old_phase is not None:
1283
+ old_phase.superseded = True
1284
+ # Best-effort durable archive of the superseded fact in L1.
1285
+ try:
1286
+ await self.l1.update_superseded(existing.id, namespace)
1287
+ except Exception as _arch_err: # pragma: no cover - archive is best-effort
1288
+ logger.debug("Adjudicate archive (L1) non-fatal: %s", _arch_err)
1289
+
1290
+ return result
1264
1291
 
1265
1292
  # =========================================================================
1266
1293
  # Multi-hop read (Issue #36)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: clsplusplus
3
- Version: 7.3.1
3
+ Version: 7.3.2
4
4
  Summary: Brain-inspired, model-agnostic persistent memory for LLMs. Learn, recall, forget — like a brain. Works with OpenAI, Claude, Gemini, Llama.
5
5
  Author-email: AlphaForge AI Labs <contact@alphaforge.ai>
6
6
  Maintainer-email: Rajamohan Jabbala <contact@alphaforge.ai>
@@ -136,6 +136,7 @@ tests/test_langgraph_store.py
136
136
  tests/test_llamaindex_block.py
137
137
  tests/test_mcp_connect.py
138
138
  tests/test_mcp_oauth.py
139
+ tests/test_mem0_failure_modes.py
139
140
  tests/test_memory_cycle.py
140
141
  tests/test_memory_phase.py
141
142
  tests/test_memory_service.py