atmem 2.3.2__tar.gz → 2.3.3__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 (525) hide show
  1. {atmem-2.3.2/atmem.egg-info → atmem-2.3.3}/PKG-INFO +20 -14
  2. {atmem-2.3.2 → atmem-2.3.3}/README.md +17 -13
  3. atmem-2.3.3/atmem/benchmark/data/mem0-head-to-head-2.3.3b1-v1.json +48 -0
  4. {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/external.py +2 -0
  5. {atmem-2.3.2 → atmem-2.3.3}/atmem/contracts/models.py +13 -0
  6. {atmem-2.3.2 → atmem-2.3.3}/atmem/control/assets/app.css +25 -0
  7. {atmem-2.3.2 → atmem-2.3.3}/atmem/control/atbot_companion.py +8 -39
  8. atmem-2.3.3/atmem/control/query_expansion.py +27 -0
  9. {atmem-2.3.2 → atmem-2.3.3}/atmem/mcp/server.py +1 -1
  10. {atmem-2.3.2 → atmem-2.3.3}/atmem/memory.py +17 -3
  11. {atmem-2.3.2 → atmem-2.3.3}/atmem/openclaw_install.py +1 -1
  12. atmem-2.3.3/atmem/retrieve/fusion.py +18 -0
  13. atmem-2.3.3/atmem/retrieve/graph.py +135 -0
  14. atmem-2.3.3/atmem/retrieve/hybrid.py +159 -0
  15. {atmem-2.3.2 → atmem-2.3.3}/atmem/retrieve/rank.py +59 -1
  16. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/recall-request.json +2 -1
  17. {atmem-2.3.2 → atmem-2.3.3}/atmem/semantic/index.py +201 -41
  18. {atmem-2.3.2 → atmem-2.3.3}/atmem/semantic/providers.py +61 -0
  19. {atmem-2.3.2 → atmem-2.3.3}/atmem/store/sqlite.py +34 -0
  20. {atmem-2.3.2 → atmem-2.3.3/atmem.egg-info}/PKG-INFO +20 -14
  21. {atmem-2.3.2 → atmem-2.3.3}/atmem.egg-info/SOURCES.txt +24 -0
  22. {atmem-2.3.2 → atmem-2.3.3}/atmem.egg-info/requires.txt +3 -0
  23. {atmem-2.3.2 → atmem-2.3.3}/docs/benchmarks.md +60 -2
  24. {atmem-2.3.2 → atmem-2.3.3}/docs/current-status.md +16 -4
  25. atmem-2.3.3/docs/implementation-evidence/031/baseline.md +50 -0
  26. atmem-2.3.3/docs/implementation-evidence/031/consistency-audit.md +32 -0
  27. atmem-2.3.3/docs/implementation-evidence/031/core-hybrid-benchmark.md +87 -0
  28. atmem-2.3.3/docs/implementation-evidence/031/core-hybrid-calibration.json +479 -0
  29. atmem-2.3.3/docs/implementation-evidence/031/core-hybrid-review.md +85 -0
  30. atmem-2.3.3/docs/implementation-evidence/031/graph-calibration-four-profile.json +1126 -0
  31. atmem-2.3.3/docs/implementation-evidence/031/graph-calibration.json +908 -0
  32. atmem-2.3.3/docs/implementation-evidence/031/graph-nomination.md +174 -0
  33. atmem-2.3.3/docs/implementation-evidence/031/matched-v2.md +67 -0
  34. atmem-2.3.3/docs/implementation-evidence/031/numpy-benchmark.md +65 -0
  35. atmem-2.3.3/docs/implementation-evidence/031/numpy-review.md +64 -0
  36. atmem-2.3.3/docs/implementation-evidence/031/profiling.md +84 -0
  37. atmem-2.3.3/docs/implementation-evidence/031/release-2.3.3.md +62 -0
  38. {atmem-2.3.2 → atmem-2.3.3}/docs/release-roadmap.md +21 -5
  39. atmem-2.3.3/docs/releases/v2.3.3.md +120 -0
  40. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/README.md +2 -2
  41. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/openclaw.plugin.json +1 -1
  42. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/package-lock.json +2 -2
  43. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/package.json +1 -1
  44. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/src/rpc-client.ts +1 -1
  45. {atmem-2.3.2 → atmem-2.3.3}/pyproject.toml +4 -1
  46. {atmem-2.3.2 → atmem-2.3.3}/tests/test_atbot_companion.py +22 -0
  47. {atmem-2.3.2 → atmem-2.3.3}/tests/test_benchmark_external.py +66 -0
  48. {atmem-2.3.2 → atmem-2.3.3}/tests/test_control_plane.py +1 -1
  49. {atmem-2.3.2 → atmem-2.3.3}/tests/test_dashboard.py +9 -0
  50. {atmem-2.3.2 → atmem-2.3.3}/tests/test_documentation.py +2 -2
  51. atmem-2.3.3/tests/test_release_metadata.py +57 -0
  52. atmem-2.3.3/tests/test_retrieval_candidate_union.py +226 -0
  53. atmem-2.3.3/tests/test_retrieval_graph_fusion.py +206 -0
  54. {atmem-2.3.2 → atmem-2.3.3}/tests/test_retrieval_quality.py +44 -0
  55. atmem-2.3.3/tests/test_semantic_matrix_cache.py +124 -0
  56. {atmem-2.3.2 → atmem-2.3.3}/tests/test_semantic_rebuild.py +56 -0
  57. {atmem-2.3.2 → atmem-2.3.3}/tests/test_semantic_search.py +89 -0
  58. atmem-2.3.3/tools/benchmark_core_hybrid.py +93 -0
  59. atmem-2.3.3/tools/benchmark_numpy_cache.py +79 -0
  60. {atmem-2.3.2 → atmem-2.3.3}/tools/run_longmemeval_retrieval.py +226 -43
  61. {atmem-2.3.2 → atmem-2.3.3}/tools/smoke_installed_package.py +1 -1
  62. {atmem-2.3.2 → atmem-2.3.3}/tools/smoke_upgrade_from_2_1.py +4 -4
  63. atmem-2.3.2/tests/test_release_metadata.py +0 -30
  64. {atmem-2.3.2 → atmem-2.3.3}/LICENSE +0 -0
  65. {atmem-2.3.2 → atmem-2.3.3}/MANIFEST.in +0 -0
  66. {atmem-2.3.2 → atmem-2.3.3}/atmem/__init__.py +0 -0
  67. {atmem-2.3.2 → atmem-2.3.3}/atmem/adapters/__init__.py +0 -0
  68. {atmem-2.3.2 → atmem-2.3.3}/atmem/adapters/base.py +0 -0
  69. {atmem-2.3.2 → atmem-2.3.3}/atmem/adapters/callbacks.py +0 -0
  70. {atmem-2.3.2 → atmem-2.3.3}/atmem/adapters/crewai.py +0 -0
  71. {atmem-2.3.2 → atmem-2.3.3}/atmem/adapters/evidence_profiles.py +0 -0
  72. {atmem-2.3.2 → atmem-2.3.3}/atmem/adapters/google_adk.py +0 -0
  73. {atmem-2.3.2 → atmem-2.3.3}/atmem/adapters/langgraph.py +0 -0
  74. {atmem-2.3.2 → atmem-2.3.3}/atmem/adapters/microsoft_agent.py +0 -0
  75. {atmem-2.3.2 → atmem-2.3.3}/atmem/adapters/openai_agents.py +0 -0
  76. {atmem-2.3.2 → atmem-2.3.3}/atmem/adapters/pydantic_ai.py +0 -0
  77. {atmem-2.3.2 → atmem-2.3.3}/atmem/adapters/smolagents.py +0 -0
  78. {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/__init__.py +0 -0
  79. {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/contracts.py +0 -0
  80. {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/data/deterministic-v1.json +0 -0
  81. {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/data/mem0-oss-v1.json +0 -0
  82. {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/data/retrieval-calibration-v1.json +0 -0
  83. {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/data/retrieval-heldout-v1.json +0 -0
  84. {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/data/task-state-v1.json +0 -0
  85. {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/data/thresholds-v1.json +0 -0
  86. {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/profiles.py +0 -0
  87. {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/retrieval.py +0 -0
  88. {atmem-2.3.2 → atmem-2.3.3}/atmem/benchmark/runner.py +0 -0
  89. {atmem-2.3.2 → atmem-2.3.3}/atmem/cli.py +0 -0
  90. {atmem-2.3.2 → atmem-2.3.3}/atmem/client.py +0 -0
  91. {atmem-2.3.2 → atmem-2.3.3}/atmem/contracts/__init__.py +0 -0
  92. {atmem-2.3.2 → atmem-2.3.3}/atmem/contracts/execution.py +0 -0
  93. {atmem-2.3.2 → atmem-2.3.3}/atmem/contracts/task_state.py +0 -0
  94. {atmem-2.3.2 → atmem-2.3.3}/atmem/contracts/versions.py +0 -0
  95. {atmem-2.3.2 → atmem-2.3.3}/atmem/control/__init__.py +0 -0
  96. {atmem-2.3.2 → atmem-2.3.3}/atmem/control/assets/app.html +0 -0
  97. {atmem-2.3.2 → atmem-2.3.3}/atmem/control/assets/app.js +0 -0
  98. {atmem-2.3.2 → atmem-2.3.3}/atmem/control/assets/atmem.jpg +0 -0
  99. {atmem-2.3.2 → atmem-2.3.3}/atmem/control/atbot_service.py +0 -0
  100. {atmem-2.3.2 → atmem-2.3.3}/atmem/control/blackbox.py +0 -0
  101. {atmem-2.3.2 → atmem-2.3.3}/atmem/control/compat.py +0 -0
  102. {atmem-2.3.2 → atmem-2.3.3}/atmem/control/evidence.py +0 -0
  103. {atmem-2.3.2 → atmem-2.3.3}/atmem/control/explain.py +0 -0
  104. {atmem-2.3.2 → atmem-2.3.3}/atmem/control/hosts.py +0 -0
  105. {atmem-2.3.2 → atmem-2.3.3}/atmem/control/manager.py +0 -0
  106. {atmem-2.3.2 → atmem-2.3.3}/atmem/control/models.py +0 -0
  107. {atmem-2.3.2 → atmem-2.3.3}/atmem/control/openclaw_native.py +0 -0
  108. {atmem-2.3.2 → atmem-2.3.3}/atmem/control/openclaw_topology.py +0 -0
  109. {atmem-2.3.2 → atmem-2.3.3}/atmem/control/server.py +0 -0
  110. {atmem-2.3.2 → atmem-2.3.3}/atmem/control/state.py +0 -0
  111. {atmem-2.3.2 → atmem-2.3.3}/atmem/control/store.py +0 -0
  112. {atmem-2.3.2 → atmem-2.3.3}/atmem/control/topology.py +0 -0
  113. {atmem-2.3.2 → atmem-2.3.3}/atmem/control/ui.py +0 -0
  114. {atmem-2.3.2 → atmem-2.3.3}/atmem/control/verify.py +0 -0
  115. {atmem-2.3.2 → atmem-2.3.3}/atmem/control/web.py +0 -0
  116. {atmem-2.3.2 → atmem-2.3.3}/atmem/core/__init__.py +0 -0
  117. {atmem-2.3.2 → atmem-2.3.3}/atmem/core/canonical.py +0 -0
  118. {atmem-2.3.2 → atmem-2.3.3}/atmem/core/fact_keys.py +0 -0
  119. {atmem-2.3.2 → atmem-2.3.3}/atmem/core/keys.py +0 -0
  120. {atmem-2.3.2 → atmem-2.3.3}/atmem/core/policy.py +0 -0
  121. {atmem-2.3.2 → atmem-2.3.3}/atmem/core/storage.py +0 -0
  122. {atmem-2.3.2 → atmem-2.3.3}/atmem/core/time.py +0 -0
  123. {atmem-2.3.2 → atmem-2.3.3}/atmem/dashboard_daemon.py +0 -0
  124. {atmem-2.3.2 → atmem-2.3.3}/atmem/delegated/__init__.py +0 -0
  125. {atmem-2.3.2 → atmem-2.3.3}/atmem/delegated/canonical.py +0 -0
  126. {atmem-2.3.2 → atmem-2.3.3}/atmem/delegated/client.py +0 -0
  127. {atmem-2.3.2 → atmem-2.3.3}/atmem/delegated/config.py +0 -0
  128. {atmem-2.3.2 → atmem-2.3.3}/atmem/delegated/contracts.py +0 -0
  129. {atmem-2.3.2 → atmem-2.3.3}/atmem/delegated/service.py +0 -0
  130. {atmem-2.3.2 → atmem-2.3.3}/atmem/delegated/transport.py +0 -0
  131. {atmem-2.3.2 → atmem-2.3.3}/atmem/delegated/validation.py +0 -0
  132. {atmem-2.3.2 → atmem-2.3.3}/atmem/evidence/__init__.py +0 -0
  133. {atmem-2.3.2 → atmem-2.3.3}/atmem/evidence/accounts.py +0 -0
  134. {atmem-2.3.2 → atmem-2.3.3}/atmem/evidence/crypto.py +0 -0
  135. {atmem-2.3.2 → atmem-2.3.3}/atmem/evidence/models.py +0 -0
  136. {atmem-2.3.2 → atmem-2.3.3}/atmem/evidence/service.py +0 -0
  137. {atmem-2.3.2 → atmem-2.3.3}/atmem/evidence/store.py +0 -0
  138. {atmem-2.3.2 → atmem-2.3.3}/atmem/execution/__init__.py +0 -0
  139. {atmem-2.3.2 → atmem-2.3.3}/atmem/execution/coverage.py +0 -0
  140. {atmem-2.3.2 → atmem-2.3.3}/atmem/execution/events.py +0 -0
  141. {atmem-2.3.2 → atmem-2.3.3}/atmem/execution/projection.py +0 -0
  142. {atmem-2.3.2 → atmem-2.3.3}/atmem/execution/retention.py +0 -0
  143. {atmem-2.3.2 → atmem-2.3.3}/atmem/execution/status.py +0 -0
  144. {atmem-2.3.2 → atmem-2.3.3}/atmem/extract/__init__.py +0 -0
  145. {atmem-2.3.2 → atmem-2.3.3}/atmem/extract/classify.py +0 -0
  146. {atmem-2.3.2 → atmem-2.3.3}/atmem/extract/context.py +0 -0
  147. {atmem-2.3.2 → atmem-2.3.3}/atmem/extract/models.py +0 -0
  148. {atmem-2.3.2 → atmem-2.3.3}/atmem/extract/review.py +0 -0
  149. {atmem-2.3.2 → atmem-2.3.3}/atmem/extract/rules.py +0 -0
  150. {atmem-2.3.2 → atmem-2.3.3}/atmem/extract/validation.py +0 -0
  151. {atmem-2.3.2 → atmem-2.3.3}/atmem/graph/__init__.py +0 -0
  152. {atmem-2.3.2 → atmem-2.3.3}/atmem/graph/identity.py +0 -0
  153. {atmem-2.3.2 → atmem-2.3.3}/atmem/graph/maintenance.py +0 -0
  154. {atmem-2.3.2 → atmem-2.3.3}/atmem/graph/models.py +0 -0
  155. {atmem-2.3.2 → atmem-2.3.3}/atmem/graph/store.py +0 -0
  156. {atmem-2.3.2 → atmem-2.3.3}/atmem/graph/traverse.py +0 -0
  157. {atmem-2.3.2 → atmem-2.3.3}/atmem/home/__init__.py +0 -0
  158. {atmem-2.3.2 → atmem-2.3.3}/atmem/home/artifacts.py +0 -0
  159. {atmem-2.3.2 → atmem-2.3.3}/atmem/home/layout.py +0 -0
  160. {atmem-2.3.2 → atmem-2.3.3}/atmem/home/service.py +0 -0
  161. {atmem-2.3.2 → atmem-2.3.3}/atmem/identity/__init__.py +0 -0
  162. {atmem-2.3.2 → atmem-2.3.3}/atmem/identity/models.py +0 -0
  163. {atmem-2.3.2 → atmem-2.3.3}/atmem/identity/service.py +0 -0
  164. {atmem-2.3.2 → atmem-2.3.3}/atmem/identity/store.py +0 -0
  165. {atmem-2.3.2 → atmem-2.3.3}/atmem/incidents/__init__.py +0 -0
  166. {atmem-2.3.2 → atmem-2.3.3}/atmem/incidents/detect.py +0 -0
  167. {atmem-2.3.2 → atmem-2.3.3}/atmem/interchange/__init__.py +0 -0
  168. {atmem-2.3.2 → atmem-2.3.3}/atmem/interchange/export.py +0 -0
  169. {atmem-2.3.2 → atmem-2.3.3}/atmem/interchange/importer.py +0 -0
  170. {atmem-2.3.2 → atmem-2.3.3}/atmem/interchange/mem0.py +0 -0
  171. {atmem-2.3.2 → atmem-2.3.3}/atmem/interchange/models.py +0 -0
  172. {atmem-2.3.2 → atmem-2.3.3}/atmem/interchange/plan.py +0 -0
  173. {atmem-2.3.2 → atmem-2.3.3}/atmem/invariants/__init__.py +0 -0
  174. {atmem-2.3.2 → atmem-2.3.3}/atmem/invariants/attestation.py +0 -0
  175. {atmem-2.3.2 → atmem-2.3.3}/atmem/invariants/models.py +0 -0
  176. {atmem-2.3.2 → atmem-2.3.3}/atmem/invariants/registry.py +0 -0
  177. {atmem-2.3.2 → atmem-2.3.3}/atmem/invariants/report.py +0 -0
  178. {atmem-2.3.2 → atmem-2.3.3}/atmem/invariants/verdict.py +0 -0
  179. {atmem-2.3.2 → atmem-2.3.3}/atmem/investigate.py +0 -0
  180. {atmem-2.3.2 → atmem-2.3.3}/atmem/lifecycle/__init__.py +0 -0
  181. {atmem-2.3.2 → atmem-2.3.3}/atmem/lifecycle/invalidation.py +0 -0
  182. {atmem-2.3.2 → atmem-2.3.3}/atmem/lifecycle/maintenance.py +0 -0
  183. {atmem-2.3.2 → atmem-2.3.3}/atmem/lifecycle/models.py +0 -0
  184. {atmem-2.3.2 → atmem-2.3.3}/atmem/lifecycle/policy.py +0 -0
  185. {atmem-2.3.2 → atmem-2.3.3}/atmem/lifecycle/service.py +0 -0
  186. {atmem-2.3.2 → atmem-2.3.3}/atmem/maintenance.py +0 -0
  187. {atmem-2.3.2 → atmem-2.3.3}/atmem/mcp/__init__.py +0 -0
  188. {atmem-2.3.2 → atmem-2.3.3}/atmem/media/__init__.py +0 -0
  189. {atmem-2.3.2 → atmem-2.3.3}/atmem/media/access.py +0 -0
  190. {atmem-2.3.2 → atmem-2.3.3}/atmem/media/index.py +0 -0
  191. {atmem-2.3.2 → atmem-2.3.3}/atmem/media/invalidation.py +0 -0
  192. {atmem-2.3.2 → atmem-2.3.3}/atmem/media/models.py +0 -0
  193. {atmem-2.3.2 → atmem-2.3.3}/atmem/media/processors.py +0 -0
  194. {atmem-2.3.2 → atmem-2.3.3}/atmem/media/service.py +0 -0
  195. {atmem-2.3.2 → atmem-2.3.3}/atmem/onboarding.py +0 -0
  196. {atmem-2.3.2 → atmem-2.3.3}/atmem/onboarding_verify.py +0 -0
  197. {atmem-2.3.2 → atmem-2.3.3}/atmem/provider_adapters/__init__.py +0 -0
  198. {atmem-2.3.2 → atmem-2.3.3}/atmem/provider_adapters/langgraph.py +0 -0
  199. {atmem-2.3.2 → atmem-2.3.3}/atmem/provider_adapters/lifecycle.py +0 -0
  200. {atmem-2.3.2 → atmem-2.3.3}/atmem/provider_adapters/loading.py +0 -0
  201. {atmem-2.3.2 → atmem-2.3.3}/atmem/provider_adapters/mem0.py +0 -0
  202. {atmem-2.3.2 → atmem-2.3.3}/atmem/provider_adapters/models.py +0 -0
  203. {atmem-2.3.2 → atmem-2.3.3}/atmem/provider_adapters/pydantic_ai.py +0 -0
  204. {atmem-2.3.2 → atmem-2.3.3}/atmem/provider_adapters/runtime.py +0 -0
  205. {atmem-2.3.2 → atmem-2.3.3}/atmem/provider_adapters/server.py +0 -0
  206. {atmem-2.3.2 → atmem-2.3.3}/atmem/provider_adapters/signing.py +0 -0
  207. {atmem-2.3.2 → atmem-2.3.3}/atmem/provider_adapters/worker.py +0 -0
  208. {atmem-2.3.2 → atmem-2.3.3}/atmem/retrieve/__init__.py +0 -0
  209. {atmem-2.3.2 → atmem-2.3.3}/atmem/retrieve/cache.py +0 -0
  210. {atmem-2.3.2 → atmem-2.3.3}/atmem/retrieve/calibration-v1.json +0 -0
  211. {atmem-2.3.2 → atmem-2.3.3}/atmem/retrieve/calibration.py +0 -0
  212. {atmem-2.3.2 → atmem-2.3.3}/atmem/retrieve/graph_signal.py +0 -0
  213. {atmem-2.3.2 → atmem-2.3.3}/atmem/retrieve/models.py +0 -0
  214. {atmem-2.3.2 → atmem-2.3.3}/atmem/retrieve/signals.py +0 -0
  215. {atmem-2.3.2 → atmem-2.3.3}/atmem/retrieve/support.py +0 -0
  216. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/__init__.py +0 -0
  217. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/admin-audit.json +0 -0
  218. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/benchmark-cases.schema.json +0 -0
  219. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/benchmark-report.schema.json +0 -0
  220. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/capabilities.json +0 -0
  221. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/context-package.json +0 -0
  222. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/graph-path.json +0 -0
  223. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/host-task-lifecycle-request.json +0 -0
  224. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/host-task-observation-request.json +0 -0
  225. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/host-task-proposal-request.json +0 -0
  226. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/invariant-registry.json +0 -0
  227. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/media-observation.json +0 -0
  228. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/memory-archive.json +0 -0
  229. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/memory-lifecycle.json +0 -0
  230. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/memory-proposal.json +0 -0
  231. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/onboarding-state.json +0 -0
  232. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/retrieval-decision.json +0 -0
  233. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/scope.json +0 -0
  234. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/semantic-health.json +0 -0
  235. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/service-job.json +0 -0
  236. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/service-key.json +0 -0
  237. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/service-principal.json +0 -0
  238. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/source-capture.json +0 -0
  239. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/task-context-package.json +0 -0
  240. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/task-profile.json +0 -0
  241. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/task-session-binding.json +0 -0
  242. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/task-start-request.json +0 -0
  243. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/task-state-proposal.json +0 -0
  244. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/task-state.json +0 -0
  245. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/task-transition-decision.json +0 -0
  246. {atmem-2.3.2 → atmem-2.3.3}/atmem/schemas/v1/unified-health.json +0 -0
  247. {atmem-2.3.2 → atmem-2.3.3}/atmem/semantic/__init__.py +0 -0
  248. {atmem-2.3.2 → atmem-2.3.3}/atmem/semantic/health.py +0 -0
  249. {atmem-2.3.2 → atmem-2.3.3}/atmem/semantic/models.json +0 -0
  250. {atmem-2.3.2 → atmem-2.3.3}/atmem/semantic/pgvector.py +0 -0
  251. {atmem-2.3.2 → atmem-2.3.3}/atmem/semantic/qdrant.py +0 -0
  252. {atmem-2.3.2 → atmem-2.3.3}/atmem/server/__init__.py +0 -0
  253. {atmem-2.3.2 → atmem-2.3.3}/atmem/server/admin_audit.py +0 -0
  254. {atmem-2.3.2 → atmem-2.3.3}/atmem/server/auth.py +0 -0
  255. {atmem-2.3.2 → atmem-2.3.3}/atmem/server/cache_policy.py +0 -0
  256. {atmem-2.3.2 → atmem-2.3.3}/atmem/server/config.py +0 -0
  257. {atmem-2.3.2 → atmem-2.3.3}/atmem/server/jobs.py +0 -0
  258. {atmem-2.3.2 → atmem-2.3.3}/atmem/server/observability.py +0 -0
  259. {atmem-2.3.2 → atmem-2.3.3}/atmem/server/recovery.py +0 -0
  260. {atmem-2.3.2 → atmem-2.3.3}/atmem/server/repositories.py +0 -0
  261. {atmem-2.3.2 → atmem-2.3.3}/atmem/service/__init__.py +0 -0
  262. {atmem-2.3.2 → atmem-2.3.3}/atmem/service/application.py +0 -0
  263. {atmem-2.3.2 → atmem-2.3.3}/atmem/service/executions.py +0 -0
  264. {atmem-2.3.2 → atmem-2.3.3}/atmem/store/__init__.py +0 -0
  265. {atmem-2.3.2 → atmem-2.3.3}/atmem/store/health.py +0 -0
  266. {atmem-2.3.2 → atmem-2.3.3}/atmem/store/postgres.py +0 -0
  267. {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/__init__.py +0 -0
  268. {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/binding.py +0 -0
  269. {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/context.py +0 -0
  270. {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/enablement.py +0 -0
  271. {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/enforcement.py +0 -0
  272. {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/governance.py +0 -0
  273. {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/guards.py +0 -0
  274. {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/host_boundary.py +0 -0
  275. {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/models.py +0 -0
  276. {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/observability.py +0 -0
  277. {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/policy.py +0 -0
  278. {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/profiles.py +0 -0
  279. {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/provenance.py +0 -0
  280. {atmem-2.3.2 → atmem-2.3.3}/atmem/task_state/service.py +0 -0
  281. {atmem-2.3.2 → atmem-2.3.3}/atmem/telemetry/__init__.py +0 -0
  282. {atmem-2.3.2 → atmem-2.3.3}/atmem/telemetry/retrieval.py +0 -0
  283. {atmem-2.3.2 → atmem-2.3.3}/atmem.egg-info/dependency_links.txt +0 -0
  284. {atmem-2.3.2 → atmem-2.3.3}/atmem.egg-info/entry_points.txt +0 -0
  285. {atmem-2.3.2 → atmem-2.3.3}/atmem.egg-info/top_level.txt +0 -0
  286. {atmem-2.3.2 → atmem-2.3.3}/docs/agent-blackbox.md +0 -0
  287. {atmem-2.3.2 → atmem-2.3.3}/docs/atbot-release.md +0 -0
  288. {atmem-2.3.2 → atmem-2.3.3}/docs/audit-log-spec.md +0 -0
  289. {atmem-2.3.2 → atmem-2.3.3}/docs/audit-search.md +0 -0
  290. {atmem-2.3.2 → atmem-2.3.3}/docs/auditing-guide.md +0 -0
  291. {atmem-2.3.2 → atmem-2.3.3}/docs/capabilities.json +0 -0
  292. {atmem-2.3.2 → atmem-2.3.3}/docs/context-provider-adapters.md +0 -0
  293. {atmem-2.3.2 → atmem-2.3.3}/docs/contracts/delegated-context-provider-v1/inject.next-turn-same-nonce.valid.json +0 -0
  294. {atmem-2.3.2 → atmem-2.3.3}/docs/contracts/delegated-context-provider-v1/inject.valid.json +0 -0
  295. {atmem-2.3.2 → atmem-2.3.3}/docs/contracts/delegated-context-provider-v1/test-vectors.json +0 -0
  296. {atmem-2.3.2 → atmem-2.3.3}/docs/contracts/delegated-context-provider-v1/trust.json +0 -0
  297. {atmem-2.3.2 → atmem-2.3.3}/docs/contracts/delegated-context-provider-v1/withhold.valid.json +0 -0
  298. {atmem-2.3.2 → atmem-2.3.3}/docs/contracts/delegated-context-provider-v1.md +0 -0
  299. {atmem-2.3.2 → atmem-2.3.3}/docs/contracts/delegated-context-provider-v1.schema.json +0 -0
  300. {atmem-2.3.2 → atmem-2.3.3}/docs/contracts/delegated-context-request-v1.schema.json +0 -0
  301. {atmem-2.3.2 → atmem-2.3.3}/docs/contracts/delegated-request-auth-v1.json +0 -0
  302. {atmem-2.3.2 → atmem-2.3.3}/docs/contracts/delegated-request-auth-v1.md +0 -0
  303. {atmem-2.3.2 → atmem-2.3.3}/docs/control-plane.md +0 -0
  304. {atmem-2.3.2 → atmem-2.3.3}/docs/dashboard-design-language.md +0 -0
  305. {atmem-2.3.2 → atmem-2.3.3}/docs/data-storage-and-backup.md +0 -0
  306. {atmem-2.3.2 → atmem-2.3.3}/docs/delegated-context-provider.md +0 -0
  307. {atmem-2.3.2 → atmem-2.3.3}/docs/entity-relationship-memory.md +0 -0
  308. {atmem-2.3.2 → atmem-2.3.3}/docs/examples/benchmark-deterministic-v1.json +0 -0
  309. {atmem-2.3.2 → atmem-2.3.3}/docs/examples/longmemeval-s-retrieval-12-v1.json +0 -0
  310. {atmem-2.3.2 → atmem-2.3.3}/docs/examples/longmemeval-s-support-ranking-2026-09-02.json +0 -0
  311. {atmem-2.3.2 → atmem-2.3.3}/docs/examples/onboarding/http.md +0 -0
  312. {atmem-2.3.2 → atmem-2.3.3}/docs/examples/onboarding/langgraph.md +0 -0
  313. {atmem-2.3.2 → atmem-2.3.3}/docs/examples/onboarding/openclaw.md +0 -0
  314. {atmem-2.3.2 → atmem-2.3.3}/docs/examples/onboarding/pydantic-ai.md +0 -0
  315. {atmem-2.3.2 → atmem-2.3.3}/docs/framework-adapters.md +0 -0
  316. {atmem-2.3.2 → atmem-2.3.3}/docs/generic-adapter.md +0 -0
  317. {atmem-2.3.2 → atmem-2.3.3}/docs/governed-task-state.md +0 -0
  318. {atmem-2.3.2 → atmem-2.3.3}/docs/http-api.md +0 -0
  319. {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/003/20260909T043658Z-740c5c89d63c-host-compatibility.md +0 -0
  320. {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/003/20260909T052000Z-740c5c89d63c-mem0-latest-hosts.json +0 -0
  321. {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/003/20260909T052000Z-740c5c89d63c-mem0-latest-hosts.md +0 -0
  322. {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/003/20260909T055300Z-04a063ce1e7b-publication.md +0 -0
  323. {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/003/20260910-storizon-published-2.2.6.md +0 -0
  324. {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/020/20260909-progress-card-observations.md +0 -0
  325. {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/020/20260909-selective-context-and-precise-time.md +0 -0
  326. {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/020/20260912-m0-investigation-preview.md +0 -0
  327. {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/020/20260912-release-candidate-correctness-hardening.md +0 -0
  328. {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/021/20260912-m0-findings-ui.md +0 -0
  329. {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/022/20260909-dashboard-usability.md +0 -0
  330. {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/028/20260913-encrypted-evidence-access.md +0 -0
  331. {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/029/2026-09-13-local-user-management.md +0 -0
  332. {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/030/2026-09-13-portable-home.md +0 -0
  333. {atmem-2.3.2 → atmem-2.3.3}/docs/implementation-evidence/README.md +0 -0
  334. {atmem-2.3.2 → atmem-2.3.3}/docs/integration-guide.md +0 -0
  335. {atmem-2.3.2 → atmem-2.3.3}/docs/invariants.md +0 -0
  336. {atmem-2.3.2 → atmem-2.3.3}/docs/memory-extraction.md +0 -0
  337. {atmem-2.3.2 → atmem-2.3.3}/docs/memory-interchange.md +0 -0
  338. {atmem-2.3.2 → atmem-2.3.3}/docs/multimodal-observations.md +0 -0
  339. {atmem-2.3.2 → atmem-2.3.3}/docs/onboarding.md +0 -0
  340. {atmem-2.3.2 → atmem-2.3.3}/docs/openclaw-setup.md +0 -0
  341. {atmem-2.3.2 → atmem-2.3.3}/docs/production-service.md +0 -0
  342. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v1.0.0.md +0 -0
  343. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.0.0.md +0 -0
  344. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.0.1.md +0 -0
  345. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.1.0.md +0 -0
  346. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.0.md +0 -0
  347. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.1.md +0 -0
  348. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.2.md +0 -0
  349. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.3.md +0 -0
  350. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.4.md +0 -0
  351. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.5.md +0 -0
  352. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.6.md +0 -0
  353. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.6b1.md +0 -0
  354. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.6b10.md +0 -0
  355. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.6b11.md +0 -0
  356. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.6b2.md +0 -0
  357. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.6b3.md +0 -0
  358. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.6b4.md +0 -0
  359. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.6b5.md +0 -0
  360. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.6b8.md +0 -0
  361. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.2.6b9.md +0 -0
  362. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.3.0.md +0 -0
  363. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.3.0b1.md +0 -0
  364. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.3.1.md +0 -0
  365. {atmem-2.3.2 → atmem-2.3.3}/docs/releases/v2.3.2.md +0 -0
  366. {atmem-2.3.2 → atmem-2.3.3}/docs/retrieval-quality.md +0 -0
  367. {atmem-2.3.2 → atmem-2.3.3}/docs/saas-integration.md +0 -0
  368. {atmem-2.3.2 → atmem-2.3.3}/docs/security/production-threat-model.md +0 -0
  369. {atmem-2.3.2 → atmem-2.3.3}/docs/semantic-search.md +0 -0
  370. {atmem-2.3.2 → atmem-2.3.3}/docs/spec-kit.md +0 -0
  371. {atmem-2.3.2 → atmem-2.3.3}/docs/storage-performance.md +0 -0
  372. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/index.ts +0 -0
  373. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/src/delegated-identity.ts +0 -0
  374. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/src/execution-spool.ts +0 -0
  375. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/src/setup.ts +0 -0
  376. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/src/task-tools.ts +0 -0
  377. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/src/tool-errors.ts +0 -0
  378. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/src/tool-observations.ts +0 -0
  379. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/src/tool-result-comparison.ts +0 -0
  380. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/src/types.ts +0 -0
  381. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/blackbox-diagnostics.mjs +0 -0
  382. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/dashboard-live.mjs +0 -0
  383. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/delegated-context-contract.mjs +0 -0
  384. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/delegated-identity.mjs +0 -0
  385. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/delegated-journey.mjs +0 -0
  386. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/execution-spool.mjs +0 -0
  387. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/fixtures/hook-context/2026.7.1-2.json +0 -0
  388. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/fixtures/hook-context/2026.8.1.json +0 -0
  389. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/fixtures/hook-context/2026.9.2.json +0 -0
  390. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/fixtures/hook-context/2026.9.3.json +0 -0
  391. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/fixtures/hook-context/2026.9.4.json +0 -0
  392. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/hook-context-compat.mjs +0 -0
  393. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/hooks.mjs +0 -0
  394. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/lib/hook-context-shape.mjs +0 -0
  395. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/lib/record-hook-context.mjs +0 -0
  396. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/manifest.mjs +0 -0
  397. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/setup.mjs +0 -0
  398. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/smoke.mjs +0 -0
  399. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/task-journey.mjs +0 -0
  400. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/task-tools.mjs +0 -0
  401. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/tool-observations.mjs +0 -0
  402. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/test/tool-result-comparison.mjs +0 -0
  403. {atmem-2.3.2 → atmem-2.3.3}/integrations/openclaw/tsconfig.json +0 -0
  404. {atmem-2.3.2 → atmem-2.3.3}/setup.cfg +0 -0
  405. {atmem-2.3.2 → atmem-2.3.3}/tests/test_api_contracts.py +0 -0
  406. {atmem-2.3.2 → atmem-2.3.3}/tests/test_api_idempotency.py +0 -0
  407. {atmem-2.3.2 → atmem-2.3.3}/tests/test_api_upgrade.py +0 -0
  408. {atmem-2.3.2 → atmem-2.3.3}/tests/test_atbot_service.py +0 -0
  409. {atmem-2.3.2 → atmem-2.3.3}/tests/test_auditability.py +0 -0
  410. {atmem-2.3.2 → atmem-2.3.3}/tests/test_benchmark_cli.py +0 -0
  411. {atmem-2.3.2 → atmem-2.3.3}/tests/test_benchmark_contracts.py +0 -0
  412. {atmem-2.3.2 → atmem-2.3.3}/tests/test_benchmark_runner.py +0 -0
  413. {atmem-2.3.2 → atmem-2.3.3}/tests/test_blackbox.py +0 -0
  414. {atmem-2.3.2 → atmem-2.3.3}/tests/test_cli.py +0 -0
  415. {atmem-2.3.2 → atmem-2.3.3}/tests/test_cli_guidance.py +0 -0
  416. {atmem-2.3.2 → atmem-2.3.3}/tests/test_contracts_v1.py +0 -0
  417. {atmem-2.3.2 → atmem-2.3.3}/tests/test_control_evidence.py +0 -0
  418. {atmem-2.3.2 → atmem-2.3.3}/tests/test_control_verify.py +0 -0
  419. {atmem-2.3.2 → atmem-2.3.3}/tests/test_dashboard_daemon.py +0 -0
  420. {atmem-2.3.2 → atmem-2.3.3}/tests/test_delegated_context.py +0 -0
  421. {atmem-2.3.2 → atmem-2.3.3}/tests/test_delegated_control.py +0 -0
  422. {atmem-2.3.2 → atmem-2.3.3}/tests/test_delegated_transport.py +0 -0
  423. {atmem-2.3.2 → atmem-2.3.3}/tests/test_encryption.py +0 -0
  424. {atmem-2.3.2 → atmem-2.3.3}/tests/test_evidence_protection.py +0 -0
  425. {atmem-2.3.2 → atmem-2.3.3}/tests/test_execution_capture.py +0 -0
  426. {atmem-2.3.2 → atmem-2.3.3}/tests/test_execution_identity.py +0 -0
  427. {atmem-2.3.2 → atmem-2.3.3}/tests/test_extract.py +0 -0
  428. {atmem-2.3.2 → atmem-2.3.3}/tests/test_extract_contracts.py +0 -0
  429. {atmem-2.3.2 → atmem-2.3.3}/tests/test_extract_proposals.py +0 -0
  430. {atmem-2.3.2 → atmem-2.3.3}/tests/test_extract_upgrade.py +0 -0
  431. {atmem-2.3.2 → atmem-2.3.3}/tests/test_feature_surfaces.py +0 -0
  432. {atmem-2.3.2 → atmem-2.3.3}/tests/test_forget_verification.py +0 -0
  433. {atmem-2.3.2 → atmem-2.3.3}/tests/test_framework_adapter_conformance.py +0 -0
  434. {atmem-2.3.2 → atmem-2.3.3}/tests/test_framework_adapter_packaging.py +0 -0
  435. {atmem-2.3.2 → atmem-2.3.3}/tests/test_framework_adapters.py +0 -0
  436. {atmem-2.3.2 → atmem-2.3.3}/tests/test_framework_delegated_adapters.py +0 -0
  437. {atmem-2.3.2 → atmem-2.3.3}/tests/test_generic_control.py +0 -0
  438. {atmem-2.3.2 → atmem-2.3.3}/tests/test_graph.py +0 -0
  439. {atmem-2.3.2 → atmem-2.3.3}/tests/test_graph_aliases.py +0 -0
  440. {atmem-2.3.2 → atmem-2.3.3}/tests/test_graph_lifecycle.py +0 -0
  441. {atmem-2.3.2 → atmem-2.3.3}/tests/test_graph_quality.py +0 -0
  442. {atmem-2.3.2 → atmem-2.3.3}/tests/test_home.py +0 -0
  443. {atmem-2.3.2 → atmem-2.3.3}/tests/test_host_adapter.py +0 -0
  444. {atmem-2.3.2 → atmem-2.3.3}/tests/test_http_api.py +0 -0
  445. {atmem-2.3.2 → atmem-2.3.3}/tests/test_incident_resolution.py +0 -0
  446. {atmem-2.3.2 → atmem-2.3.3}/tests/test_interchange.py +0 -0
  447. {atmem-2.3.2 → atmem-2.3.3}/tests/test_langgraph_provider.py +0 -0
  448. {atmem-2.3.2 → atmem-2.3.3}/tests/test_layers.py +0 -0
  449. {atmem-2.3.2 → atmem-2.3.3}/tests/test_lifecycle.py +0 -0
  450. {atmem-2.3.2 → atmem-2.3.3}/tests/test_lifecycle_migration.py +0 -0
  451. {atmem-2.3.2 → atmem-2.3.3}/tests/test_local_identity.py +0 -0
  452. {atmem-2.3.2 → atmem-2.3.3}/tests/test_maintenance.py +0 -0
  453. {atmem-2.3.2 → atmem-2.3.3}/tests/test_mcp.py +0 -0
  454. {atmem-2.3.2 → atmem-2.3.3}/tests/test_media_governance.py +0 -0
  455. {atmem-2.3.2 → atmem-2.3.3}/tests/test_media_observations.py +0 -0
  456. {atmem-2.3.2 → atmem-2.3.3}/tests/test_media_packaging.py +0 -0
  457. {atmem-2.3.2 → atmem-2.3.3}/tests/test_mem0_provider.py +0 -0
  458. {atmem-2.3.2 → atmem-2.3.3}/tests/test_memory.py +0 -0
  459. {atmem-2.3.2 → atmem-2.3.3}/tests/test_onboarding.py +0 -0
  460. {atmem-2.3.2 → atmem-2.3.3}/tests/test_onboarding_recovery.py +0 -0
  461. {atmem-2.3.2 → atmem-2.3.3}/tests/test_openclaw_compat.py +0 -0
  462. {atmem-2.3.2 → atmem-2.3.3}/tests/test_openclaw_control.py +0 -0
  463. {atmem-2.3.2 → atmem-2.3.3}/tests/test_openclaw_install.py +0 -0
  464. {atmem-2.3.2 → atmem-2.3.3}/tests/test_openclaw_topology.py +0 -0
  465. {atmem-2.3.2 → atmem-2.3.3}/tests/test_policy.py +0 -0
  466. {atmem-2.3.2 → atmem-2.3.3}/tests/test_provider_cli.py +0 -0
  467. {atmem-2.3.2 → atmem-2.3.3}/tests/test_provider_integration.py +0 -0
  468. {atmem-2.3.2 → atmem-2.3.3}/tests/test_provider_packaging.py +0 -0
  469. {atmem-2.3.2 → atmem-2.3.3}/tests/test_provider_performance.py +0 -0
  470. {atmem-2.3.2 → atmem-2.3.3}/tests/test_provider_runtime.py +0 -0
  471. {atmem-2.3.2 → atmem-2.3.3}/tests/test_provider_server.py +0 -0
  472. {atmem-2.3.2 → atmem-2.3.3}/tests/test_pydantic_provider.py +0 -0
  473. {atmem-2.3.2 → atmem-2.3.3}/tests/test_recall_evidence.py +0 -0
  474. {atmem-2.3.2 → atmem-2.3.3}/tests/test_restore_receipt.py +0 -0
  475. {atmem-2.3.2 → atmem-2.3.3}/tests/test_retrieval_adapter_conformance.py +0 -0
  476. {atmem-2.3.2 → atmem-2.3.3}/tests/test_retrieval_benchmark.py +0 -0
  477. {atmem-2.3.2 → atmem-2.3.3}/tests/test_retrieval_cache.py +0 -0
  478. {atmem-2.3.2 → atmem-2.3.3}/tests/test_retrieval_signals_and_cache.py +0 -0
  479. {atmem-2.3.2 → atmem-2.3.3}/tests/test_retrieve.py +0 -0
  480. {atmem-2.3.2 → atmem-2.3.3}/tests/test_sdk_packaging.py +0 -0
  481. {atmem-2.3.2 → atmem-2.3.3}/tests/test_semantic_health.py +0 -0
  482. {atmem-2.3.2 → atmem-2.3.3}/tests/test_semantic_parity.py +0 -0
  483. {atmem-2.3.2 → atmem-2.3.3}/tests/test_semantic_policy_invalidation.py +0 -0
  484. {atmem-2.3.2 → atmem-2.3.3}/tests/test_semantic_profiles.py +0 -0
  485. {atmem-2.3.2 → atmem-2.3.3}/tests/test_semantic_schema.py +0 -0
  486. {atmem-2.3.2 → atmem-2.3.3}/tests/test_semantic_setup.py +0 -0
  487. {atmem-2.3.2 → atmem-2.3.3}/tests/test_spec_task_inventory.py +0 -0
  488. {atmem-2.3.2 → atmem-2.3.3}/tests/test_storage_packaging.py +0 -0
  489. {atmem-2.3.2 → atmem-2.3.3}/tests/test_store_transactions.py +0 -0
  490. {atmem-2.3.2 → atmem-2.3.3}/tests/test_supporting_evidence.py +0 -0
  491. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_adapters.py +0 -0
  492. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_atbot.py +0 -0
  493. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_benchmark.py +0 -0
  494. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_binding.py +0 -0
  495. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_cli.py +0 -0
  496. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_clock.py +0 -0
  497. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_context.py +0 -0
  498. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_contracts.py +0 -0
  499. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_dashboard.py +0 -0
  500. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_deletion.py +0 -0
  501. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_expiry.py +0 -0
  502. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_governance.py +0 -0
  503. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_guards.py +0 -0
  504. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_host_boundary.py +0 -0
  505. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_host_contracts.py +0 -0
  506. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_observability.py +0 -0
  507. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_performance.py +0 -0
  508. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_policy.py +0 -0
  509. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_prerequisites.py +0 -0
  510. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_schemas.py +0 -0
  511. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_service.py +0 -0
  512. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_session_binding.py +0 -0
  513. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_store.py +0 -0
  514. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_tamper.py +0 -0
  515. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_upgrade.py +0 -0
  516. {atmem-2.3.2 → atmem-2.3.3}/tests/test_task_state_walking_skeleton.py +0 -0
  517. {atmem-2.3.2 → atmem-2.3.3}/tools/benchmark_storage.py +0 -0
  518. {atmem-2.3.2 → atmem-2.3.3}/tools/check_invariants.py +0 -0
  519. {atmem-2.3.2 → atmem-2.3.3}/tools/check_spec_tasks.py +0 -0
  520. {atmem-2.3.2 → atmem-2.3.3}/tools/release_metadata.py +0 -0
  521. {atmem-2.3.2 → atmem-2.3.3}/tools/run_mem0_openclaw_live.py +0 -0
  522. {atmem-2.3.2 → atmem-2.3.3}/tools/smoke_delegated_package.py +0 -0
  523. {atmem-2.3.2 → atmem-2.3.3}/tools/smoke_delegated_transport.py +0 -0
  524. {atmem-2.3.2 → atmem-2.3.3}/tools/smoke_mem0_roleplay.py +0 -0
  525. {atmem-2.3.2 → atmem-2.3.3}/tools/verify_audit.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atmem
3
- Version: 2.3.2
3
+ Version: 2.3.3
4
4
  Summary: Host-neutral Agent Black Box and reversible memory control plane.
5
5
  Author-email: Javad Taghia <taghia.javad@gmail.com>
6
6
  Maintainer-email: Aetna / AtMem <aetna000@gmail.com>
@@ -31,6 +31,8 @@ Requires-Dist: pytest>=8.0.0; extra == "dev"
31
31
  Requires-Dist: tomli>=2.0; python_version < "3.11" and extra == "dev"
32
32
  Provides-Extra: semantic
33
33
  Requires-Dist: sentence-transformers<6.0.0,>=5.0.0; extra == "semantic"
34
+ Provides-Extra: semantic-accelerated
35
+ Requires-Dist: numpy<3,>=1.26; extra == "semantic-accelerated"
34
36
  Provides-Extra: mem0
35
37
  Requires-Dist: mem0ai<3,>=2.0.20; extra == "mem0"
36
38
  Provides-Extra: langgraph-provider
@@ -75,12 +77,12 @@ Dynamic: license-file
75
77
 
76
78
  # AtMem
77
79
 
78
- [![Version 2.3.2](https://img.shields.io/badge/version-2.3.2-blue)](./docs/releases/v2.3.2.md)
80
+ [![Version 2.3.3](https://img.shields.io/badge/version-2.3.3-blue)](./docs/releases/v2.3.3.md)
79
81
  [![CI](https://github.com/aetna000/atmem/actions/workflows/ci.yml/badge.svg)](https://github.com/aetna000/atmem/actions/workflows/ci.yml)
80
82
 
81
83
  **AtMem is a host-neutral Agent Black Box and reversible memory control plane.**
82
84
 
83
- > **Release status:** AtMem 2.3.2 is the stable encrypted Agent Black Box release.
85
+ > **Release status:** AtMem 2.3.3 is the stable encrypted Agent Black Box release.
84
86
  > It records exact host-observed text and supported multimodal boundaries by default,
85
87
  > while keeping every claim limited to what the connected agent actually supplied.
86
88
 
@@ -97,7 +99,7 @@ authorizes, stores, scopes, injects, corrects, and deletes memory.
97
99
  ### 1. Install AtMem and choose memory intelligence
98
100
 
99
101
  ```bash
100
- python -m pip install --upgrade atmem==2.3.2
102
+ python -m pip install --upgrade atmem==2.3.3
101
103
  atmem atbot setup
102
104
  atmem atbot doctor
103
105
  atmem init
@@ -130,7 +132,7 @@ package yourself.
130
132
  Already using AtMem 2.1 with OpenClaw? Upgrade in place:
131
133
 
132
134
  ```bash
133
- python -m pip install --upgrade atmem==2.3.2
135
+ python -m pip install --upgrade atmem==2.3.3
134
136
  atmem openclaw upgrade
135
137
  atmem control verify
136
138
  ```
@@ -153,7 +155,7 @@ selected by `python`, rather than an unrelated `pip` executable on `PATH`.
153
155
  #### Pydantic AI — native capability
154
156
 
155
157
  ```bash
156
- python -m pip install 'atmem[pydantic-ai]==2.3.2'
158
+ python -m pip install 'atmem[pydantic-ai]==2.3.3'
157
159
  atmem control shadow --host generic --memory-db ~/.atmem/memories.db
158
160
  ```
159
161
 
@@ -178,7 +180,7 @@ agent = Agent("openai:gpt-5-mini", capabilities=[memory])
178
180
  #### LangChain/LangGraph — native middleware
179
181
 
180
182
  ```bash
181
- python -m pip install 'atmem[langgraph]==2.3.2'
183
+ python -m pip install 'atmem[langgraph]==2.3.3'
182
184
  atmem control shadow --host generic --memory-db ~/.atmem/memories.db
183
185
  ```
184
186
 
@@ -242,7 +244,7 @@ open tasks. AtBot may propose a change, but AtMem revalidates and commits it.
242
244
 
243
245
  See the [Governed Task State guide](docs/governed-task-state.md) for lifecycle,
244
246
  correction, provenance, expiry, benchmark, and automation examples, and read
245
- the [2.3.2 release notes](docs/releases/v2.3.2.md) before upgrading.
247
+ the [2.3.3 release notes](docs/releases/v2.3.3.md) before upgrading.
246
248
 
247
249
  ### Prove memory quality locally
248
250
 
@@ -250,12 +252,16 @@ the [2.3.2 release notes](docs/releases/v2.3.2.md) before upgrading.
250
252
  atmem benchmark run --output benchmark.json
251
253
  ```
252
254
 
253
- This offline release gate runs 16 isolated extraction, contradiction, recall,
255
+ This offline release gate runs 24 isolated extraction, contradiction, recall,
254
256
  withholding, injection, privacy, poisoning and fallback cases. Safety must be
255
257
  perfect; other quality metrics cannot fall below checked-in baselines. Optional
256
258
  local/hosted profiles, LongMemEval import and fair Mem0 OSS comparison are also
257
259
  available without adding Mem0 or model SDKs to the base install. See the
258
260
  [memory benchmark guide](docs/benchmarks.md) for commands and honest limits.
261
+ The [2.3.3 release](docs/releases/v2.3.3.md) improves local retrieval work and
262
+ archive layout while retaining existing retrieval defaults. Developer opt-in
263
+ fusion, scoped graph nomination and matrix reuse are available for evaluation;
264
+ broader performance targets remain research, not release claims.
259
265
 
260
266
  ### 3. Review, then activate
261
267
 
@@ -340,7 +346,7 @@ and restores it exactly.
340
346
  ## Installation details
341
347
 
342
348
  ```bash
343
- python -m pip install atmem==2.3.2
349
+ python -m pip install atmem==2.3.3
344
350
  atmem --version
345
351
  ```
346
352
 
@@ -350,7 +356,7 @@ embedding model, while the semantic extra adds local sentence-transformer
350
356
  choices:
351
357
 
352
358
  ```bash
353
- python -m pip install 'atmem[semantic]==2.3.2'
359
+ python -m pip install 'atmem[semantic]==2.3.3'
354
360
  ```
355
361
 
356
362
  For repository development, install both workspace packages:
@@ -538,7 +544,7 @@ atmem control restore
538
544
  Existing 2.1 installations upgrade without starting a new migration:
539
545
 
540
546
  ```bash
541
- python -m pip install --upgrade atmem==2.3.2
547
+ python -m pip install --upgrade atmem==2.3.3
542
548
  atmem openclaw upgrade
543
549
  atmem control verify
544
550
  ```
@@ -766,8 +772,8 @@ npm test
766
772
  npm run smoke
767
773
  ```
768
774
 
769
- Current repository metadata is version **2.3.2**, with the matched OpenClaw
770
- bridge **2.3.2**. Release validation requires exact Python/bridge alignment;
775
+ Current repository metadata is version **2.3.3**, with the matched OpenClaw
776
+ bridge **2.3.3**. Release validation requires exact Python/bridge alignment;
771
777
  AtBot retains its independent stable compatible version **0.1.0**.
772
778
 
773
779
  ## License
@@ -1,11 +1,11 @@
1
1
  # AtMem
2
2
 
3
- [![Version 2.3.2](https://img.shields.io/badge/version-2.3.2-blue)](./docs/releases/v2.3.2.md)
3
+ [![Version 2.3.3](https://img.shields.io/badge/version-2.3.3-blue)](./docs/releases/v2.3.3.md)
4
4
  [![CI](https://github.com/aetna000/atmem/actions/workflows/ci.yml/badge.svg)](https://github.com/aetna000/atmem/actions/workflows/ci.yml)
5
5
 
6
6
  **AtMem is a host-neutral Agent Black Box and reversible memory control plane.**
7
7
 
8
- > **Release status:** AtMem 2.3.2 is the stable encrypted Agent Black Box release.
8
+ > **Release status:** AtMem 2.3.3 is the stable encrypted Agent Black Box release.
9
9
  > It records exact host-observed text and supported multimodal boundaries by default,
10
10
  > while keeping every claim limited to what the connected agent actually supplied.
11
11
 
@@ -22,7 +22,7 @@ authorizes, stores, scopes, injects, corrects, and deletes memory.
22
22
  ### 1. Install AtMem and choose memory intelligence
23
23
 
24
24
  ```bash
25
- python -m pip install --upgrade atmem==2.3.2
25
+ python -m pip install --upgrade atmem==2.3.3
26
26
  atmem atbot setup
27
27
  atmem atbot doctor
28
28
  atmem init
@@ -55,7 +55,7 @@ package yourself.
55
55
  Already using AtMem 2.1 with OpenClaw? Upgrade in place:
56
56
 
57
57
  ```bash
58
- python -m pip install --upgrade atmem==2.3.2
58
+ python -m pip install --upgrade atmem==2.3.3
59
59
  atmem openclaw upgrade
60
60
  atmem control verify
61
61
  ```
@@ -78,7 +78,7 @@ selected by `python`, rather than an unrelated `pip` executable on `PATH`.
78
78
  #### Pydantic AI — native capability
79
79
 
80
80
  ```bash
81
- python -m pip install 'atmem[pydantic-ai]==2.3.2'
81
+ python -m pip install 'atmem[pydantic-ai]==2.3.3'
82
82
  atmem control shadow --host generic --memory-db ~/.atmem/memories.db
83
83
  ```
84
84
 
@@ -103,7 +103,7 @@ agent = Agent("openai:gpt-5-mini", capabilities=[memory])
103
103
  #### LangChain/LangGraph — native middleware
104
104
 
105
105
  ```bash
106
- python -m pip install 'atmem[langgraph]==2.3.2'
106
+ python -m pip install 'atmem[langgraph]==2.3.3'
107
107
  atmem control shadow --host generic --memory-db ~/.atmem/memories.db
108
108
  ```
109
109
 
@@ -167,7 +167,7 @@ open tasks. AtBot may propose a change, but AtMem revalidates and commits it.
167
167
 
168
168
  See the [Governed Task State guide](docs/governed-task-state.md) for lifecycle,
169
169
  correction, provenance, expiry, benchmark, and automation examples, and read
170
- the [2.3.2 release notes](docs/releases/v2.3.2.md) before upgrading.
170
+ the [2.3.3 release notes](docs/releases/v2.3.3.md) before upgrading.
171
171
 
172
172
  ### Prove memory quality locally
173
173
 
@@ -175,12 +175,16 @@ the [2.3.2 release notes](docs/releases/v2.3.2.md) before upgrading.
175
175
  atmem benchmark run --output benchmark.json
176
176
  ```
177
177
 
178
- This offline release gate runs 16 isolated extraction, contradiction, recall,
178
+ This offline release gate runs 24 isolated extraction, contradiction, recall,
179
179
  withholding, injection, privacy, poisoning and fallback cases. Safety must be
180
180
  perfect; other quality metrics cannot fall below checked-in baselines. Optional
181
181
  local/hosted profiles, LongMemEval import and fair Mem0 OSS comparison are also
182
182
  available without adding Mem0 or model SDKs to the base install. See the
183
183
  [memory benchmark guide](docs/benchmarks.md) for commands and honest limits.
184
+ The [2.3.3 release](docs/releases/v2.3.3.md) improves local retrieval work and
185
+ archive layout while retaining existing retrieval defaults. Developer opt-in
186
+ fusion, scoped graph nomination and matrix reuse are available for evaluation;
187
+ broader performance targets remain research, not release claims.
184
188
 
185
189
  ### 3. Review, then activate
186
190
 
@@ -265,7 +269,7 @@ and restores it exactly.
265
269
  ## Installation details
266
270
 
267
271
  ```bash
268
- python -m pip install atmem==2.3.2
272
+ python -m pip install atmem==2.3.3
269
273
  atmem --version
270
274
  ```
271
275
 
@@ -275,7 +279,7 @@ embedding model, while the semantic extra adds local sentence-transformer
275
279
  choices:
276
280
 
277
281
  ```bash
278
- python -m pip install 'atmem[semantic]==2.3.2'
282
+ python -m pip install 'atmem[semantic]==2.3.3'
279
283
  ```
280
284
 
281
285
  For repository development, install both workspace packages:
@@ -463,7 +467,7 @@ atmem control restore
463
467
  Existing 2.1 installations upgrade without starting a new migration:
464
468
 
465
469
  ```bash
466
- python -m pip install --upgrade atmem==2.3.2
470
+ python -m pip install --upgrade atmem==2.3.3
467
471
  atmem openclaw upgrade
468
472
  atmem control verify
469
473
  ```
@@ -691,8 +695,8 @@ npm test
691
695
  npm run smoke
692
696
  ```
693
697
 
694
- Current repository metadata is version **2.3.2**, with the matched OpenClaw
695
- bridge **2.3.2**. Release validation requires exact Python/bridge alignment;
698
+ Current repository metadata is version **2.3.3**, with the matched OpenClaw
699
+ bridge **2.3.3**. Release validation requires exact Python/bridge alignment;
696
700
  AtBot retains its independent stable compatible version **0.1.0**.
697
701
 
698
702
  ## License
@@ -0,0 +1,48 @@
1
+ {
2
+ "format": "atmem-mem0-head-to-head-manifest-v1",
3
+ "frozen_at": "2026-09-16",
4
+ "dataset": {
5
+ "name": "LongMemEval-S cleaned",
6
+ "upstream_commit": "98d7416c24c778c2fee6e6f3006e7a073259d48f",
7
+ "source_sha256": "d6f21ea9d60a0d56f34a05b609c79c88a451d2ae03597821ea3d5a9678c3a442"
8
+ },
9
+ "selection": {
10
+ "rule": "sha256-question-id-stratified-v1",
11
+ "calibration_case_ids": [
12
+ "07741c45", "b6019101", "720133ac", "gpt4_7fce9456",
13
+ "c4f10528", "1d4da289", "54026fce", "06878be2",
14
+ "58bf7951", "c8c3f81d", "gpt4_d31cdae3", "gpt4_4edbafa2"
15
+ ],
16
+ "heldout_case_ids": [
17
+ "6071bd76", "a2f3aa27", "09ba9854", "00ca467f",
18
+ "70b3e69b", "ceb54acb", "195a1a1b", "6b7dfb22",
19
+ "ad7109d1", "36580ce8", "bcbe585f", "gpt4_6ed717ea"
20
+ ],
21
+ "heldout_selection_sha256": "sha256:4bd9ee57ced759f74e09283da571dd0b1283c1560aa26afabde50a2dd8e050a5"
22
+ },
23
+ "raw_retrieval": {
24
+ "ingestion": "raw-infer-disabled",
25
+ "chunk_chars": 1600,
26
+ "embedding_provider": "ollama",
27
+ "embedding_model": "nomic-embed-text:latest",
28
+ "embedding_model_id": "0a109f422b47",
29
+ "retrieved_chunk_limit": 100,
30
+ "session_cutoff": 5,
31
+ "quality_metrics": ["session_recall_any_at_5", "session_recall_all_at_5", "session_mrr_at_5"],
32
+ "latency_boundary": "query embedding through returned search candidates; excludes admission/indexing"
33
+ },
34
+ "native_preparation": {
35
+ "quality_metrics": ["useful_context_precision", "answerable_recall", "no_answer_correctness", "incorrect_injection_rate"],
36
+ "latency_boundary": "native control_prepare entry through authorized prepared context return",
37
+ "final_delivery_is_separately_confirmed": true
38
+ },
39
+ "competition": {
40
+ "mem0_oss_version": "2.0.20",
41
+ "mem0_nlp_and_bm25_status": "explicitly report base and hybrid-enabled profiles separately",
42
+ "speed_ratio_target": 2.0,
43
+ "speed_ratio_stretch": 10.0,
44
+ "speed_metric": "matched warm p95 on the same declared boundary",
45
+ "quality_condition": "no lower held-out answer/source quality and zero authority violations",
46
+ "claim_policy": "no cross-profile ratio or beta publication if a required comparable 2x gate fails"
47
+ }
48
+ }
@@ -25,6 +25,8 @@ _METRIC_DIRECTIONS = {
25
25
  "fallback_completion": "higher",
26
26
  "latency_p50_ms": "lower",
27
27
  "latency_p95_ms": "lower",
28
+ "warm_latency_p50_ms": "lower",
29
+ "warm_latency_p95_ms": "lower",
28
30
  "token_usage": "lower",
29
31
  "model_cost_usd": "lower",
30
32
  }
@@ -212,9 +212,22 @@ class RecallRequest(Contract):
212
212
  reranker_model: str = "none"
213
213
  egress_class: Literal["local", "remote", "none"] = "local"
214
214
  min_score: float = 0.0
215
+ retrieval_strategy: Literal['legacy', 'core-rrf-v1'] = 'legacy'
216
+
217
+ def to_dict(self) -> dict[str, Any]:
218
+ value = Contract.to_dict(self)
219
+ if self.retrieval_strategy == 'legacy':
220
+ value.pop('retrieval_strategy')
221
+ return value
215
222
 
216
223
  def __post_init__(self) -> None:
217
224
  _required_id("request_id", self.request_id)
225
+ if self.retrieval_strategy not in {'legacy', 'core-rrf-v1'}:
226
+ raise ValueError('unknown retrieval strategy')
227
+ if self.retrieval_strategy == 'core-rrf-v1' and not 1 <= int(self.candidate_limit) <= 2000:
228
+ raise ValueError('candidate_limit must be between 1 and 2000')
229
+ if self.retrieval_strategy == 'core-rrf-v1' and not {'lexical', 'semantic', 'graph'}.intersection(self.signals):
230
+ raise ValueError('core-rrf-v1 requires lexical, semantic or graph signals')
218
231
  if not str(self.query).strip():
219
232
  raise ValueError("query is required")
220
233
  if not 1 <= int(self.limit) <= 100:
@@ -473,6 +473,31 @@ body:has(.memorychat.collapsed){padding-bottom:70px}
473
473
  @media(max-width:760px){.activityrow .activitytime{display:flex}.activityclock{font-size:11px}}
474
474
  @media(max-width:780px){.insightmetrics{grid-template-columns:1fr 1fr}.healthcharthead{display:block}.chartlegend{margin-top:8px}}
475
475
 
476
+ /* The archive can be narrow on a wide screen when evidence is open. Size its
477
+ contents against the pane, not the viewport or the drawer's former parent. */
478
+ #blackboxArchiveCard{container-type:inline-size;min-width:0;align-self:start}
479
+ .flightfilters>.field{min-width:0}
480
+ .flightfilters input,.flightfilters select{min-width:0;max-width:100%;width:100%}
481
+ .flightidentity>.mono{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
482
+ .flightstat{min-width:0;overflow-wrap:anywhere}
483
+ @container (max-width:850px){
484
+ .flightfilters{grid-template-columns:repeat(2,minmax(0,1fr))}
485
+ .flightfilters>.field:first-child{grid-column:1/-1}
486
+ .flightfilters>button{align-self:end;white-space:normal}
487
+ .blackboxhead{flex-direction:column;gap:8px}
488
+ .flight,.blackboxworkspace.detail-open .flight{grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;align-items:start;padding:12px}
489
+ .flight>.flightidentity{grid-column:1/-1}
490
+ .flight>.flightstat,.blackboxworkspace.detail-open .flight>.flightstat{display:block}
491
+ .flight>.secondary,.blackboxworkspace.detail-open .flight>.secondary{grid-column:1/-1;grid-row:auto;justify-self:start;max-width:100%;white-space:normal}
492
+ .flighttimestamp{white-space:normal}
493
+ }
494
+ @container (max-width:380px){
495
+ .flightfilters{grid-template-columns:minmax(0,1fr)}
496
+ .flight,.blackboxworkspace.detail-open .flight{grid-template-columns:minmax(0,1fr)}
497
+ .flightstat{display:flex;gap:8px;justify-content:space-between}
498
+ .flightstat small{flex-shrink:0}
499
+ }
500
+
476
501
  .activitylegend{margin:12px 0 18px;padding:12px 14px;border:1px solid var(--line);border-radius:10px;color:var(--muted);font-size:12px;line-height:1.5}
477
502
  .activitylegend .legendlabel{font-weight:600;color:var(--ink)}
478
503
  .activitylegend ul{display:flex;flex-wrap:wrap;gap:6px 16px;list-style:none;margin:7px 0;padding:0}
@@ -87,52 +87,21 @@ class AtBotCompanionClient:
87
87
  return _fallback(query, candidates, {**health, "reason": str(exc)})
88
88
 
89
89
  def expand_query(self, query: str) -> dict[str, Any]:
90
- """Send query text only; candidate content is prohibited on this call."""
90
+ """Expand locally; AtBot v1 uses these same deterministic rules."""
91
91
  clean = " ".join(query.split())
92
92
  from atmem.control.atbot_service import AtBotServiceManager
93
+ from atmem.control.query_expansion import expand_query_v1
93
94
 
94
- health = (
95
- {"available": False, "reason": "safe fallback was selected"}
96
- if AtBotServiceManager().fallback_selected()
97
- else self.health()
98
- )
99
- fallback = {
95
+ fallback_selected = AtBotServiceManager().fallback_selected()
96
+ return {
100
97
  "format": "atbot-query-expansion-v1",
101
98
  "query": clean,
102
- "expanded_queries": [clean],
99
+ "expanded_queries": [clean] if fallback_selected and clean else expand_query_v1(clean),
103
100
  "content_received": False,
104
- "companion": {"available": False, "fallback": True},
101
+ "provider": "atbot-policy",
102
+ "model": "query-concepts-v1",
103
+ "companion": {"available": False, "fallback": True, "local_rules": not fallback_selected},
105
104
  }
106
- if not health.get("available"):
107
- return fallback
108
- request = Request(
109
- f"{self.endpoint}/api/companion/expand-query",
110
- data=json.dumps({"query": clean}).encode("utf-8"),
111
- headers={
112
- "Content-Type": "application/json",
113
- "X-AtBot-CSRF": str(health["csrf_token"]),
114
- },
115
- method="POST",
116
- )
117
- try:
118
- with urlopen(request, timeout=min(self.timeout, 10.0)) as response:
119
- value = json.loads(response.read())
120
- queries: list[str] = []
121
- for raw in value.get("expanded_queries") or []:
122
- item = " ".join(str(raw).split())[:200]
123
- if item and item.casefold() not in {row.casefold() for row in queries}:
124
- queries.append(item)
125
- if len(queries) >= 6:
126
- break
127
- if not queries or value.get("content_received") is not False:
128
- raise ValueError("invalid content-free expansion result")
129
- return {
130
- **value,
131
- "expanded_queries": queries,
132
- "companion": {"available": True, "fallback": False},
133
- }
134
- except (OSError, ValueError, HTTPError, URLError, json.JSONDecodeError):
135
- return fallback
136
105
 
137
106
  def propose(self, message: str) -> dict[str, Any]:
138
107
  """Request interpretation only; AtMem remains responsible for admission."""
@@ -0,0 +1,27 @@
1
+ """Local, content-free query expansion matching AtBot's v1 rules."""
2
+
3
+ from __future__ import annotations
4
+
5
+
6
+ def expand_query_v1(query: str) -> list[str]:
7
+ clean = " ".join(query.split())
8
+ if not clean:
9
+ return []
10
+ lowered = clean.casefold()
11
+ expansions = [clean]
12
+ concept_rules = (
13
+ (("fav food", "favorite food", "favourite food"), ("favorite food", "food preference", "preferred meal", "likes to eat")),
14
+ (("fav car", "favorite car", "favourite car"), ("favorite car", "car preference", "preferred vehicle")),
15
+ (("fav book", "favorite book", "favourite book"), ("favorite book", "book preference", "preferred reading")),
16
+ )
17
+ for triggers, values in concept_rules:
18
+ if any(trigger in lowered for trigger in triggers):
19
+ expansions.extend(values)
20
+ normalized: list[str] = []
21
+ for value in expansions:
22
+ item = " ".join(str(value).split())[:200]
23
+ if item and item.casefold() not in {row.casefold() for row in normalized}:
24
+ normalized.append(item)
25
+ if len(normalized) >= 6:
26
+ break
27
+ return normalized
@@ -27,7 +27,7 @@ try:
27
27
 
28
28
  SERVER_VERSION = _pkg_version("atmem")
29
29
  except Exception: # not installed (e.g. run from a checkout)
30
- SERVER_VERSION = "2.3.2"
30
+ SERVER_VERSION = "2.3.3"
31
31
 
32
32
  _SUBJECT_PROPERTY = {
33
33
  "subject_id": {
@@ -734,6 +734,13 @@ class Memory:
734
734
 
735
735
  if not isinstance(request, RecallRequest):
736
736
  raise TypeError("request must be RecallRequest")
737
+ if request.retrieval_strategy == 'core-rrf-v1':
738
+ from dataclasses import replace
739
+ from atmem.retrieve.hybrid import collect
740
+ rows, metadata = collect(self, request)
741
+ # Channel quotas are independent; bound the ranked publication prefix.
742
+ publication = replace(request, candidate_limit=max(request.candidate_limit, request.limit))
743
+ return self.create_candidate_set_v1(publication, rows, retrieval_metadata=metadata)
737
744
  scope = request.scope
738
745
  recalled = self.recall(
739
746
  scope.subject_id,
@@ -884,7 +891,7 @@ class Memory:
884
891
 
885
892
  @_atomic
886
893
  def create_candidate_set_v1(
887
- self, request: Any, candidates: list[dict[str, Any]]
894
+ self, request: Any, candidates: list[dict[str, Any]], *, retrieval_metadata: dict[str, Any] | None = None
888
895
  ) -> Any:
889
896
  """Persist one revalidated union of already-governed retrieval signals.
890
897
 
@@ -969,7 +976,7 @@ class Memory:
969
976
  aggregation_signal_digest,
970
977
  )
971
978
 
972
- aggregated = aggregate_supporting_evidence(
979
+ aggregated = eligible_rows if retrieval_metadata is not None else aggregate_supporting_evidence(
973
980
  eligible_rows,
974
981
  subject_id=scope.subject_id,
975
982
  workspace_id=scope.workspace_id,
@@ -1024,7 +1031,14 @@ class Memory:
1024
1031
  for query in row.get("matched_queries") or ()
1025
1032
  }
1026
1033
  ),
1027
- "support_aggregation_version": SUPPORT_AGGREGATION_VERSION,
1034
+ "support_aggregation_version": None if retrieval_metadata is not None else SUPPORT_AGGREGATION_VERSION,
1035
+ **({'retrieval_fusion': {**retrieval_metadata, 'candidate_ranks': {
1036
+ row.record_id: row.signals.get('fusion', {}).get('channel_ranks', {})
1037
+ for row in durable
1038
+ }, 'graph_support_record_ids': {
1039
+ row.record_id: [step['record_id'] for step in row.signals.get('fusion', {}).get('graph_path', ())]
1040
+ for row in durable if row.signals.get('fusion', {}).get('graph_path')
1041
+ }}} if retrieval_metadata is not None else {}),
1028
1042
  "aggregation_signal_digest": aggregation_digest,
1029
1043
  "grouped_candidate_count": len(grouped_candidates),
1030
1044
  "supported_group_count": len(
@@ -17,7 +17,7 @@ from atmem.control.manager import DEFAULT_STATE_PATH, DEFAULT_CONTROL_ROOT
17
17
 
18
18
  OPENCLAW_PLUGIN_ID = "memory-atmem"
19
19
  OPENCLAW_PLUGIN_PACKAGE = "openclaw-memory-atmem"
20
- OPENCLAW_PLUGIN_VERSION = "2.3.2"
20
+ OPENCLAW_PLUGIN_VERSION = "2.3.3"
21
21
  _CONFIG_KEY = "plugins.entries.memory-atmem"
22
22
 
23
23
 
@@ -0,0 +1,18 @@
1
+ """Deterministic rank fusion; scores are nomination priors, not confidence."""
2
+ from collections import defaultdict
3
+
4
+ FUSION_VERSION = 'core-rrf-v1'
5
+ RANK_CONSTANT = 60
6
+
7
+
8
+ def fuse_rankings(channels):
9
+ active = {name: list(dict.fromkeys(ids)) for name, ids in channels.items() if ids}
10
+ ranks = defaultdict(dict)
11
+ for name, ids in active.items():
12
+ for rank, record_id in enumerate(ids, 1):
13
+ ranks[record_id][name] = rank
14
+ denominator = len(active) / (RANK_CONSTANT + 1) if active else 1
15
+ result = [dict(record_id=record_id, channel_ranks=positions,
16
+ score=sum(1 / (RANK_CONSTANT + rank) for rank in positions.values()) / denominator)
17
+ for record_id, positions in ranks.items()]
18
+ return sorted(result, key=lambda row: (-row['score'], row['record_id']))