wavemind 2.2.8__tar.gz → 2.3.0__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 (164) hide show
  1. {wavemind-2.2.8 → wavemind-2.3.0}/PKG-INFO +55 -29
  2. {wavemind-2.2.8 → wavemind-2.3.0}/README.md +51 -28
  3. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/BENCHMARK_LEADERBOARD.md +1 -1
  4. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/BENCHMARK_REPORT.md +1 -1
  5. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/benchmark_matrix_results.json +13 -11
  6. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/benchmark_registry.py +5 -3
  7. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/scale_readiness_benchmark.py +41 -5
  8. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/scale_readiness_results.json +13 -11
  9. {wavemind-2.2.8 → wavemind-2.3.0}/docker-compose.yml +1 -1
  10. {wavemind-2.2.8 → wavemind-2.3.0}/docs/BENCHMARK_BRIEF.md +1 -1
  11. {wavemind-2.2.8 → wavemind-2.3.0}/docs/ROADMAP.md +7 -4
  12. {wavemind-2.2.8 → wavemind-2.3.0}/pyproject.toml +5 -1
  13. {wavemind-2.2.8 → wavemind-2.3.0}/requirements-optional.txt +1 -0
  14. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_cli_smoke.py +16 -1
  15. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_jobs.py +153 -0
  16. wavemind-2.3.0/tests/test_object_store.py +88 -0
  17. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_packaging_files.py +3 -0
  18. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_scale_readiness_benchmark.py +2 -0
  19. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/__init__.py +13 -1
  20. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/cli.py +55 -6
  21. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/jobs.py +67 -1
  22. wavemind-2.3.0/wavemind/object_store.py +242 -0
  23. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/replication.py +162 -1
  24. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind.egg-info/PKG-INFO +55 -29
  25. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind.egg-info/SOURCES.txt +2 -0
  26. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind.egg-info/requires.txt +4 -0
  27. {wavemind-2.2.8 → wavemind-2.3.0}/CONTRIBUTING.md +0 -0
  28. {wavemind-2.2.8 → wavemind-2.3.0}/Dockerfile +0 -0
  29. {wavemind-2.2.8 → wavemind-2.3.0}/LICENSE +0 -0
  30. {wavemind-2.2.8 → wavemind-2.3.0}/MANIFEST.in +0 -0
  31. {wavemind-2.2.8 → wavemind-2.3.0}/SECURITY.md +0 -0
  32. {wavemind-2.2.8 → wavemind-2.3.0}/SUPPORT.md +0 -0
  33. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/agent_memory_benchmark.py +0 -0
  34. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/agent_memory_results.json +0 -0
  35. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/ann_index_curve_benchmark.py +0 -0
  36. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/ann_index_curve_results.json +0 -0
  37. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/dynamic_memory_benchmark.py +0 -0
  38. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/dynamic_memory_results.json +0 -0
  39. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/field_memory_dynamics_benchmark.py +0 -0
  40. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/field_memory_dynamics_results.json +0 -0
  41. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/locomo_evidence_results.json +0 -0
  42. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/locomo_memory_benchmark.py +0 -0
  43. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/locomo_sentence_evidence_results.json +0 -0
  44. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/long_memory_evidence_benchmark.py +0 -0
  45. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/long_memory_evidence_results.json +0 -0
  46. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/longmemeval_answer_benchmark.py +0 -0
  47. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/longmemeval_answer_extractive_20_results.json +0 -0
  48. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/longmemeval_answer_qwen25_0_5b_50_results.json +0 -0
  49. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/longmemeval_answer_qwen25_1_5b_50_results.json +0 -0
  50. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/longmemeval_evidence_50_results.json +0 -0
  51. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/longmemeval_evidence_results.json +0 -0
  52. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/longmemeval_memory_benchmark.py +0 -0
  53. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/memory_competitor_benchmark.py +0 -0
  54. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/memory_competitor_results.json +0 -0
  55. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/nomiracl_russian_benchmark.py +0 -0
  56. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/nomiracl_russian_results.json +0 -0
  57. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/open_retrieval_benchmark.py +0 -0
  58. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/open_retrieval_scifact_results.json +0 -0
  59. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/production_index_profile_results.json +0 -0
  60. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/production_load_benchmark.py +0 -0
  61. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/production_load_qdrant_100k_tuned_results.json +0 -0
  62. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/production_load_qdrant_1m_ef_sweep_results.json +0 -0
  63. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/production_load_qdrant_1m_results.json +0 -0
  64. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/production_load_qdrant_1m_tuned_results.json +0 -0
  65. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/production_load_results.json +0 -0
  66. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/render_benchmark_charts.py +0 -0
  67. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/render_benchmark_leaderboard.py +0 -0
  68. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/render_benchmark_report.py +0 -0
  69. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/ru_sentences_benchmark.py +0 -0
  70. {wavemind-2.2.8 → wavemind-2.3.0}/benchmarks/wavemind_capacity_results.json +0 -0
  71. {wavemind-2.2.8 → wavemind-2.3.0}/docs/CHROMA_MIGRATION.md +0 -0
  72. {wavemind-2.2.8 → wavemind-2.3.0}/docs/DEMO_SCRIPT.md +0 -0
  73. {wavemind-2.2.8 → wavemind-2.3.0}/docs/LAUNCH_KIT.md +0 -0
  74. {wavemind-2.2.8 → wavemind-2.3.0}/docs/OBSERVABILITY.md +0 -0
  75. {wavemind-2.2.8 → wavemind-2.3.0}/docs/PROJECT_BOARD.md +0 -0
  76. {wavemind-2.2.8 → wavemind-2.3.0}/docs/RELEASE.md +0 -0
  77. {wavemind-2.2.8 → wavemind-2.3.0}/docs/RU_LAUNCH_POSTS.md +0 -0
  78. {wavemind-2.2.8 → wavemind-2.3.0}/docs/USE_CASES.md +0 -0
  79. {wavemind-2.2.8 → wavemind-2.3.0}/docs/assets/benchmark-summary.svg +0 -0
  80. {wavemind-2.2.8 → wavemind-2.3.0}/docs/assets/wavemind-demo.gif +0 -0
  81. {wavemind-2.2.8 → wavemind-2.3.0}/docs/assets/wavemind-social-card.svg +0 -0
  82. {wavemind-2.2.8 → wavemind-2.3.0}/examples/agent_with_memory.py +0 -0
  83. {wavemind-2.2.8 → wavemind-2.3.0}/examples/chroma_migration.py +0 -0
  84. {wavemind-2.2.8 → wavemind-2.3.0}/examples/customer_support_memory.py +0 -0
  85. {wavemind-2.2.8 → wavemind-2.3.0}/examples/demo.py +0 -0
  86. {wavemind-2.2.8 → wavemind-2.3.0}/examples/dynamic_memory_demo.py +0 -0
  87. {wavemind-2.2.8 → wavemind-2.3.0}/examples/framework_integrations.py +0 -0
  88. {wavemind-2.2.8 → wavemind-2.3.0}/examples/langchain_memory.py +0 -0
  89. {wavemind-2.2.8 → wavemind-2.3.0}/examples/llamaindex_retriever.py +0 -0
  90. {wavemind-2.2.8 → wavemind-2.3.0}/examples/observability/README.md +0 -0
  91. {wavemind-2.2.8 → wavemind-2.3.0}/examples/observability/docker-compose.yml +0 -0
  92. {wavemind-2.2.8 → wavemind-2.3.0}/examples/observability/otel-collector.yaml +0 -0
  93. {wavemind-2.2.8 → wavemind-2.3.0}/examples/observability/prometheus-alerts.yml +0 -0
  94. {wavemind-2.2.8 → wavemind-2.3.0}/examples/observability/prometheus.yml +0 -0
  95. {wavemind-2.2.8 → wavemind-2.3.0}/examples/production-index-profile/README.md +0 -0
  96. {wavemind-2.2.8 → wavemind-2.3.0}/examples/production-index-profile/docker-compose.yml +0 -0
  97. {wavemind-2.2.8 → wavemind-2.3.0}/examples/research_notebook_memory.py +0 -0
  98. {wavemind-2.2.8 → wavemind-2.3.0}/examples/sharded_memory.py +0 -0
  99. {wavemind-2.2.8 → wavemind-2.3.0}/install.bat +0 -0
  100. {wavemind-2.2.8 → wavemind-2.3.0}/install.sh +0 -0
  101. {wavemind-2.2.8 → wavemind-2.3.0}/requirements.txt +0 -0
  102. {wavemind-2.2.8 → wavemind-2.3.0}/setup.cfg +0 -0
  103. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_agent_memory_benchmark.py +0 -0
  104. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_ann_index_curve_benchmark.py +0 -0
  105. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_api.py +0 -0
  106. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_api_process_persistence.py +0 -0
  107. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_benchmark_brief.py +0 -0
  108. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_benchmark_charts.py +0 -0
  109. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_benchmark_leaderboard.py +0 -0
  110. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_benchmark_registry.py +0 -0
  111. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_benchmark_report.py +0 -0
  112. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_chroma_migration_example.py +0 -0
  113. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_cluster.py +0 -0
  114. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_core_persistence.py +0 -0
  115. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_dynamic_memory_benchmark.py +0 -0
  116. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_examples.py +0 -0
  117. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_field_graph.py +0 -0
  118. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_field_graph_integration.py +0 -0
  119. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_field_memory_dynamics_benchmark.py +0 -0
  120. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_framework_adapters.py +0 -0
  121. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_import_benchmark.py +0 -0
  122. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_indexes_encoders.py +0 -0
  123. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_langchain_integration.py +0 -0
  124. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_locomo_memory_benchmark.py +0 -0
  125. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_long_memory_evidence_benchmark.py +0 -0
  126. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_longmemeval_answer_benchmark.py +0 -0
  127. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_longmemeval_memory_benchmark.py +0 -0
  128. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_memory_competitor_benchmark.py +0 -0
  129. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_multimodal.py +0 -0
  130. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_nomiracl_russian_benchmark.py +0 -0
  131. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_observability.py +0 -0
  132. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_observability_docs.py +0 -0
  133. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_open_retrieval_benchmark.py +0 -0
  134. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_postgres_storage.py +0 -0
  135. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_production_index_profile.py +0 -0
  136. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_production_load_benchmark.py +0 -0
  137. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_replication.py +0 -0
  138. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_scale_plan.py +0 -0
  139. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_semantic_and_latency.py +0 -0
  140. {wavemind-2.2.8 → wavemind-2.3.0}/tests/test_sharding.py +0 -0
  141. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/__main__.py +0 -0
  142. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/api.py +0 -0
  143. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/benchmark.py +0 -0
  144. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/cluster.py +0 -0
  145. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/core.py +0 -0
  146. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/encoders.py +0 -0
  147. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/field_graph.py +0 -0
  148. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/importers.py +0 -0
  149. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/indexes.py +0 -0
  150. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/integrations/__init__.py +0 -0
  151. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/integrations/autogen.py +0 -0
  152. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/integrations/crewai.py +0 -0
  153. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/integrations/langchain.py +0 -0
  154. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/integrations/langgraph.py +0 -0
  155. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/integrations/llamaindex.py +0 -0
  156. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/multimodal.py +0 -0
  157. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/observability.py +0 -0
  158. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/scale.py +0 -0
  159. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/sharding.py +0 -0
  160. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/storage.py +0 -0
  161. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind/studio.py +0 -0
  162. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind.egg-info/dependency_links.txt +0 -0
  163. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind.egg-info/entry_points.txt +0 -0
  164. {wavemind-2.2.8 → wavemind-2.3.0}/wavemind.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wavemind
3
- Version: 2.2.8
3
+ Version: 2.3.0
4
4
  Summary: Local-first dynamic memory field with vector search and wave-field re-ranking
5
5
  License-Expression: MIT
6
6
  Project-URL: Homepage, https://github.com/CaspianG/wavemind
@@ -25,6 +25,8 @@ Provides-Extra: postgres
25
25
  Requires-Dist: psycopg[binary]>=3.1; extra == "postgres"
26
26
  Provides-Extra: redis
27
27
  Requires-Dist: redis>=5.0; extra == "redis"
28
+ Provides-Extra: s3
29
+ Requires-Dist: boto3>=1.34; extra == "s3"
28
30
  Provides-Extra: otel
29
31
  Requires-Dist: opentelemetry-api>=1.25; extra == "otel"
30
32
  Requires-Dist: opentelemetry-sdk>=1.25; extra == "otel"
@@ -41,6 +43,7 @@ Requires-Dist: faiss-cpu>=1.8; platform_system != "Windows" and extra == "produc
41
43
  Requires-Dist: qdrant-client>=1.9; extra == "production"
42
44
  Requires-Dist: psycopg[binary]>=3.1; extra == "production"
43
45
  Requires-Dist: redis>=5.0; extra == "production"
46
+ Requires-Dist: boto3>=1.34; extra == "production"
44
47
  Requires-Dist: opentelemetry-api>=1.25; extra == "production"
45
48
  Requires-Dist: opentelemetry-sdk>=1.25; extra == "production"
46
49
  Requires-Dist: opentelemetry-exporter-otlp>=1.25; extra == "production"
@@ -543,16 +546,17 @@ Checked-in result:
543
546
  |---|---:|
544
547
  | Cluster planner | 4096 namespaces, 4 nodes, replication factor 2, node-loss availability `1.000`, zone-loss availability `1.000`, write quorum `2`. |
545
548
  | Hot cache | 2000 lookups, hit rate `0.920`, p99 lookup `0.003 ms`. |
546
- | Replicated runtime | 3 physical WaveMind stores, replication factor 3, write quorum 2, node-loss recall `true`, repair copied `1` missing record, tombstone repair deleted `1` stale record, p99 query-after-loss `1.35 ms`. |
547
- | Active-active delta sync | 2 regions, bidirectional convergence `true`, stale import suppressed after delete `true`, tombstone convergence `true`, sync `103.42 ms`. |
548
- | Replicated snapshot job | 3 replica files, manifest checksum validation `true`, offsite mirror validation `true`, restore `7.10 ms`, recall after restored-primary loss `true`. |
549
- | Structured payloads | image/audio/table/event retrieval, precision@1 `1.000`, p99 `0.59 ms`. |
549
+ | Replicated runtime | 3 physical WaveMind stores, replication factor 3, write quorum 2, node-loss recall `true`, repair copied `1` missing record, tombstone repair deleted `1` stale record, p99 query-after-loss `1.31 ms`. |
550
+ | Active-active delta sync | 2 regions, bidirectional convergence `true`, stale import suppressed after delete `true`, tombstone convergence `true`, sync `159.69 ms`. |
551
+ | Replicated snapshot job | 3 replica files, manifest checksum validation `true`, offsite mirror validation `true`, portable archive validation `true`, S3-compatible upload validation `true`, archive restore `24.85 ms`. |
552
+ | Structured payloads | image/audio/table/event retrieval, precision@1 `1.000`, p99 `0.62 ms`. |
550
553
 
551
554
  This profile validates routing, quorum-replicated runtime behavior, cache
552
555
  behavior, active-active namespace delta sync, replicated snapshot/restore, and
553
- structured payload handling. It is not a 10M-vector load test. Real 100k, 1M,
554
- and 10M latency claims should come from service-backed FAISS/Qdrant/pgvector
555
- load tests on production-like hardware.
556
+ structured payload handling, including verified offsite and archive restore.
557
+ It is not a 10M-vector load test. Real 100k, 1M, and 10M latency claims should
558
+ come from service-backed FAISS/Qdrant/pgvector load tests on production-like
559
+ hardware.
556
560
 
557
561
  Cluster placement planning:
558
562
 
@@ -579,14 +583,16 @@ Maintenance workers:
579
583
 
580
584
  ```sh
581
585
  wavemind maintenance --namespace user:42 --consolidate-steps 10 --consolidate-concepts --json
582
- wavemind replicated-snapshot --root ./state/replicas --node node-a --node node-b --node node-c --out ./backups/replicated --offsite ./offsite/replicated --keep-last 7 --json
586
+ wavemind replicated-snapshot --root ./state/replicas --node node-a --node node-b --node node-c --out ./backups/replicated --offsite ./offsite/replicated --archive ./archives/replicated --s3 s3://my-bucket/wavemind/prod --keep-last 7 --json
583
587
  ```
584
588
 
585
589
  The first command runs one deterministic memory pass: expired-memory purge,
586
590
  optional field/concept consolidation, and index-health repair. The second
587
591
  command creates a verified replicated snapshot, mirrors it to an offsite path,
588
- and applies retention. Production deployments can call these commands from
589
- cron, systemd, Kubernetes CronJobs, Celery, RQ, or Temporal.
592
+ writes a portable `.tar.gz` archive, verifies that archive, can upload it to an
593
+ S3-compatible object store, and applies retention. Production deployments can
594
+ call these commands from cron, systemd, Kubernetes CronJobs, Celery, RQ, or
595
+ Temporal.
590
596
 
591
597
  Hot-cache options:
592
598
 
@@ -689,12 +695,14 @@ memory.remember("Tenant A prefers short support replies.", namespace="tenant:a")
689
695
  snapshot_job = ReplicatedSnapshotWorker(memory).run_once(
690
696
  destination="./backups/replicated",
691
697
  offsite_destination="./offsite/replicated",
698
+ archive_destination="./archives/replicated",
699
+ object_store_destination="s3://my-bucket/wavemind/prod",
692
700
  keep_last=7,
693
701
  )
694
702
  assert snapshot_job.ok
695
703
 
696
- restored, report = ReplicatedWaveMind.restore_snapshot(
697
- snapshot_job.offsite_path,
704
+ restored, report = ReplicatedWaveMind.restore_snapshot_archive(
705
+ snapshot_job.archive_path,
698
706
  "./state/restored-replicas",
699
707
  encoder=HashingTextEncoder(vector_dim=64),
700
708
  )
@@ -703,8 +711,10 @@ restored, report = ReplicatedWaveMind.restore_snapshot(
703
711
  The replicated snapshot job writes one SQLite backup per replica plus
704
712
  `manifest.json` with SHA-256 checksums, replica metadata, quorum settings, and
705
713
  node definitions. It can mirror the snapshot to a second path for offsite
706
- backup and applies `keep_last` retention locally and offsite. Restore refuses to
707
- overwrite a non-empty root unless `overwrite=True` is passed.
714
+ backup, write a portable `.tar.gz` archive for object-store/offsite systems,
715
+ verify that archive, upload it to any S3-compatible object store through
716
+ `boto3`, and apply `keep_last` retention locally, offsite, and for archives.
717
+ Restore refuses to overwrite a non-empty root unless `overwrite=True` is passed.
708
718
 
709
719
  Equivalent CLI:
710
720
 
@@ -714,16 +724,28 @@ wavemind replicated-snapshot \
714
724
  --node node-a --node node-b --node node-c \
715
725
  --out ./backups/replicated \
716
726
  --offsite ./offsite/replicated \
727
+ --archive ./archives/replicated \
728
+ --s3 s3://my-bucket/wavemind/prod \
717
729
  --keep-last 7 \
718
730
  --json
719
731
 
720
732
  wavemind replicated-restore \
721
- --from ./offsite/replicated/wavemind-replicated-20260705-120000 \
733
+ --from ./archives/replicated/wavemind-replicated-20260705-120000.tar.gz \
734
+ --to ./state/restored-replicas \
735
+ --overwrite \
736
+ --json
737
+
738
+ wavemind replicated-restore \
739
+ --from s3://my-bucket/wavemind/prod/wavemind-replicated-20260705-120000.tar.gz \
722
740
  --to ./state/restored-replicas \
723
741
  --overwrite \
724
742
  --json
725
743
  ```
726
744
 
745
+ Install S3/R2/MinIO support with `pip install "wavemind[s3]"`. For
746
+ S3-compatible endpoints such as Cloudflare R2 or MinIO, pass
747
+ `--s3-endpoint-url` and optionally `--s3-region`.
748
+
727
749
  ## HTTP API
728
750
 
729
751
  Run the local FastAPI server:
@@ -1097,7 +1119,7 @@ Current read:
1097
1119
  | LongMemEval 50-query smoke | On the first 50 non-abstention LongMemEval-S questions, WaveMind reaches `evidence_recall@5 0.920`, `precision@1 0.760`, and `MRR@5 0.827`; Chroma/Qdrant static reach `0.600`, `0.260`, and `0.385`. | This is the fast regression profile for checking current changes before rerunning the full LongMemEval profile. WaveMind wins on quality; latency still needs work. |
1098
1120
  | ANN/index curve | At 50000 generated 128-d vectors, NumPy exact keeps `recall@10 1.000` at `6.49 ms`; quantized int8 keeps `0.934` at `24.92 ms`; Annoy is faster at `4.92 ms` but drops to `0.730` recall; Qdrant local keeps `1.000` recall at `43.49 ms`. | Current local scale boundary is clear: quantized search needs kernel work, Annoy needs tuning/FAISS, and Qdrant should be tested in service mode for a fair production comparison. |
1099
1121
  | Production load | At 100000 generated 128-d vectors, service-mode Qdrant reaches `recall@10 1.000`, avg `10.28 ms`, p99 `21.26 ms`. At 1M, tuned Qdrant reaches `recall@10 0.984`, avg `116.80 ms`, p99 `209.28 ms`; an EF sweep finds `recall@10 0.977`, avg `64.76 ms`, p99 `103.77 ms` at `hnsw_ef=2048` on 30 queries. | 100k is production-grade on the tested machine. 1M recall is now strong, but p99 still needs tuning before claiming a stable sub-100 ms SLO. |
1100
- | Scale readiness | Deterministic 1M-memory simulation validates 4096 namespace placements over 4 nodes with replication factor 2, node-loss availability `1.000`, zone-loss availability `1.000`, hot-cache hit rate `0.920`, quorum-replicated runtime recall after node loss, missing-record repair, tombstone repair, active-active delta sync, checksummed replicated snapshot/restore, offsite snapshot verification, and structured payload precision@1 `1.000`. | This proves routing, cache, payload, replicated-runtime, namespace-delta, offsite backup, and restore-drill foundations. It is not a 10M-vector latency claim; real 10M latency still needs service-backed load tests on larger hardware. |
1122
+ | Scale readiness | Deterministic 1M-memory simulation validates 4096 namespace placements over 4 nodes with replication factor 2, node-loss availability `1.000`, zone-loss availability `1.000`, hot-cache hit rate `0.920`, quorum-replicated runtime recall after node loss, missing-record repair, tombstone repair, active-active delta sync, checksummed replicated snapshot/restore, offsite mirror verification, portable archive verification, S3-compatible upload verification, and structured payload precision@1 `1.000`. | This proves routing, cache, payload, replicated-runtime, namespace-delta, offsite/archive/object-store backup, and restore-drill foundations. It is not a 10M-vector latency claim; real 10M latency still needs service-backed load tests on larger hardware. |
1101
1123
  | Memory competitor adapters | WaveMind reaches `precision@1 0.80`, `precision@3 1.00`, stale suppression `1.00` on the small adapter profile. Mem0, Zep, and LangGraph are listed as skipped unless their real packages/services are configured. | This prevents fake competitor claims. The adapter harness is ready; real Mem0/Zep/LangGraph results still need configured installs. |
1102
1124
  | LongMemEval local answer generation | With the same local Ollama `qwen2.5:1.5b`, WaveMind reaches `exact_match 0.240`, `contains_answer 0.380`, `token_f1 0.333`, and `evidence_recall@5 0.920`; Chroma and Qdrant static both reach `0.120`, `0.160`, `0.170`, and `0.600`. | This is the first checked-in end-to-end answer benchmark against Chroma/Qdrant. It is still a 50-question lightweight smoke run, not a full LongMemEval leaderboard score. |
1103
1125
 
@@ -1116,7 +1138,7 @@ Current read:
1116
1138
  | Production index profile | Docker-backed 50000-vector profile for persisted FAISS, Qdrant service, and PostgreSQL/pgvector HNSW. | implemented | FAISS / Qdrant service / pgvector | Keep service-mode candidate generation above `0.95` recall@10 and below 10 ms average query latency at 50000 vectors. |
1117
1139
  | Production load profile | 100k and 1M service-backed candidate-index checks with p95/p99 latency. | implemented | Qdrant service / pgvector HNSW / FAISS persisted | Keep 100k at recall@10 `1.000`; push 1M p99 below 100 ms with recall@10 >= 0.95. |
1118
1140
  | Qdrant 1M HNSW ef sweep | One 1M Qdrant collection queried with multiple `hnsw_ef` values. | implemented | Qdrant service | Repeat with 100+ queries and collection-level HNSW build parameters before claiming a stable 1M SLO. |
1119
- | Scale readiness profile | Cluster placement, node/zone-loss simulation, quorum report, replicated runtime, active-active delta sync, replicated snapshot/restore with offsite verification, hot-cache behavior, and structured/multimodal payload retrieval. | implemented | Mem0 / Zep / LangGraph persistent memory / GraphRAG target adapters | Keep quorum replication, namespace-delta sync, repair, offsite backup, and restore drills green while adding larger service-backed 10M load tests. |
1141
+ | Scale readiness profile | Cluster placement, node/zone-loss simulation, quorum report, replicated runtime, active-active delta sync, replicated snapshot/restore with offsite, archive, and object-store verification, hot-cache behavior, and structured/multimodal payload retrieval. | implemented | Mem0 / Zep / LangGraph persistent memory / GraphRAG target adapters | Keep quorum replication, namespace-delta sync, repair, offsite/archive/object-store backup, and restore drills green while adding larger service-backed 10M load tests. |
1120
1142
  | Memory competitor adapter profile | Dynamic-memory scenario wired for external memory frameworks. | implemented | Mem0 / Zep / LangGraph persistent memory | Report real competitor results only when their packages/services are explicitly configured. |
1121
1143
  | [BEIR](https://github.com/beir-cellar/beir) | Standard zero-shot information retrieval quality. | planned | Chroma / Qdrant / FAISS | Stay within 0.02 `nDCG@10` on identical embeddings. |
1122
1144
  | [MTEB Retrieval](https://github.com/embeddings-benchmark/mteb) | Separates encoder quality from retrieval-store quality. | planned | Chroma / Qdrant / FAISS | Prove WaveMind does not reduce same-embedding retrieval quality. |
@@ -1291,24 +1313,28 @@ The delta contains active records plus tombstones. Import is idempotent and
1291
1313
  tombstone-aware, so a stale region export cannot resurrect a deleted memory.
1292
1314
 
1293
1315
  For operational recovery, `ReplicatedSnapshotWorker` creates a checksummed
1294
- replicated snapshot, verifies an optional offsite mirror, and
1295
- `restore_snapshot()` restores it into a fresh replica root:
1316
+ replicated snapshot, verifies an optional offsite mirror, writes a verified
1317
+ `.tar.gz` archive, can upload that archive to S3-compatible storage, and
1318
+ `restore_snapshot_archive()` restores it into a fresh replica root:
1296
1319
 
1297
1320
  ```python
1298
1321
  job = ReplicatedSnapshotWorker(memory).run_once(
1299
1322
  destination="./backups/replicated",
1300
1323
  offsite_destination="./offsite/replicated",
1324
+ archive_destination="./archives/replicated",
1325
+ object_store_destination="s3://my-bucket/wavemind/prod",
1301
1326
  keep_last=7,
1302
1327
  )
1303
- restored, report = ReplicatedWaveMind.restore_snapshot(
1304
- job.offsite_path,
1328
+ restored, report = ReplicatedWaveMind.restore_snapshot_archive(
1329
+ job.archive_path,
1305
1330
  "./state/restored-replicas",
1306
1331
  )
1307
1332
  ```
1308
1333
 
1309
1334
  The checked-in scale-readiness profile verifies manifest checksums, verifies the
1310
- offsite mirror, restores three replica files from that offsite mirror, then
1311
- disables the restored primary and confirms the memory is still recalled from the
1335
+ offsite mirror, verifies the portable archive, verifies S3-compatible object
1336
+ upload metadata, restores three replica files from that archive, then disables
1337
+ the restored primary and confirms the memory is still recalled from the
1312
1338
  remaining replicas.
1313
1339
 
1314
1340
  Checked-in official LoCoMo retrieval result:
@@ -1659,9 +1685,8 @@ If you already use Chroma for local memory, see the practical migration guide:
1659
1685
  - The dynamic benchmark currently compares WaveMind against a static Chroma baseline. Chroma and Qdrant can implement similar behavior with extra application-layer metadata policy, deletes, filters, and reinforcement logic.
1660
1686
  - `MemoryFieldGraph` is a discrete graph over stored memories, not a continuous mathematical field. Its current build path should be optimized with incremental edge updates before large production use.
1661
1687
  - pgvector is a candidate-index backend. PostgreSQL source-of-truth storage is
1662
- also available separately, but migrations, PITR docs, scheduled backup
1663
- runbooks, and service benchmark profiles still need more real deployment
1664
- coverage.
1688
+ also available separately, but migrations, PITR docs, and service benchmark
1689
+ profiles still need more real deployment coverage.
1665
1690
  - The Qdrant backend is also a candidate-index backend. WaveMind rebuilds it
1666
1691
  from SQLite on load/build, so large service-mode deployments still need a
1667
1692
  measured rebuild strategy and index-health monitoring.
@@ -1700,8 +1725,9 @@ Near-term priorities:
1700
1725
  - Faster dynamic re-ranking through smaller candidate windows, caching, and
1701
1726
  background updates.
1702
1727
  - Better production operations: OpenTelemetry and replicated offsite snapshot
1703
- jobs are implemented; richer latency histograms, index-health metrics,
1704
- alerting examples, object-store upload adapters, and Postgres PITR runbooks
1728
+ jobs with verified portable archives and S3-compatible upload are
1729
+ implemented; richer latency histograms, index-health metrics, alerting
1730
+ examples, object-store retention/download drills, and Postgres PITR runbooks
1705
1731
  are next.
1706
1732
 
1707
1733
  Longer-term direction:
@@ -490,16 +490,17 @@ Checked-in result:
490
490
  |---|---:|
491
491
  | Cluster planner | 4096 namespaces, 4 nodes, replication factor 2, node-loss availability `1.000`, zone-loss availability `1.000`, write quorum `2`. |
492
492
  | Hot cache | 2000 lookups, hit rate `0.920`, p99 lookup `0.003 ms`. |
493
- | Replicated runtime | 3 physical WaveMind stores, replication factor 3, write quorum 2, node-loss recall `true`, repair copied `1` missing record, tombstone repair deleted `1` stale record, p99 query-after-loss `1.35 ms`. |
494
- | Active-active delta sync | 2 regions, bidirectional convergence `true`, stale import suppressed after delete `true`, tombstone convergence `true`, sync `103.42 ms`. |
495
- | Replicated snapshot job | 3 replica files, manifest checksum validation `true`, offsite mirror validation `true`, restore `7.10 ms`, recall after restored-primary loss `true`. |
496
- | Structured payloads | image/audio/table/event retrieval, precision@1 `1.000`, p99 `0.59 ms`. |
493
+ | Replicated runtime | 3 physical WaveMind stores, replication factor 3, write quorum 2, node-loss recall `true`, repair copied `1` missing record, tombstone repair deleted `1` stale record, p99 query-after-loss `1.31 ms`. |
494
+ | Active-active delta sync | 2 regions, bidirectional convergence `true`, stale import suppressed after delete `true`, tombstone convergence `true`, sync `159.69 ms`. |
495
+ | Replicated snapshot job | 3 replica files, manifest checksum validation `true`, offsite mirror validation `true`, portable archive validation `true`, S3-compatible upload validation `true`, archive restore `24.85 ms`. |
496
+ | Structured payloads | image/audio/table/event retrieval, precision@1 `1.000`, p99 `0.62 ms`. |
497
497
 
498
498
  This profile validates routing, quorum-replicated runtime behavior, cache
499
499
  behavior, active-active namespace delta sync, replicated snapshot/restore, and
500
- structured payload handling. It is not a 10M-vector load test. Real 100k, 1M,
501
- and 10M latency claims should come from service-backed FAISS/Qdrant/pgvector
502
- load tests on production-like hardware.
500
+ structured payload handling, including verified offsite and archive restore.
501
+ It is not a 10M-vector load test. Real 100k, 1M, and 10M latency claims should
502
+ come from service-backed FAISS/Qdrant/pgvector load tests on production-like
503
+ hardware.
503
504
 
504
505
  Cluster placement planning:
505
506
 
@@ -526,14 +527,16 @@ Maintenance workers:
526
527
 
527
528
  ```sh
528
529
  wavemind maintenance --namespace user:42 --consolidate-steps 10 --consolidate-concepts --json
529
- wavemind replicated-snapshot --root ./state/replicas --node node-a --node node-b --node node-c --out ./backups/replicated --offsite ./offsite/replicated --keep-last 7 --json
530
+ wavemind replicated-snapshot --root ./state/replicas --node node-a --node node-b --node node-c --out ./backups/replicated --offsite ./offsite/replicated --archive ./archives/replicated --s3 s3://my-bucket/wavemind/prod --keep-last 7 --json
530
531
  ```
531
532
 
532
533
  The first command runs one deterministic memory pass: expired-memory purge,
533
534
  optional field/concept consolidation, and index-health repair. The second
534
535
  command creates a verified replicated snapshot, mirrors it to an offsite path,
535
- and applies retention. Production deployments can call these commands from
536
- cron, systemd, Kubernetes CronJobs, Celery, RQ, or Temporal.
536
+ writes a portable `.tar.gz` archive, verifies that archive, can upload it to an
537
+ S3-compatible object store, and applies retention. Production deployments can
538
+ call these commands from cron, systemd, Kubernetes CronJobs, Celery, RQ, or
539
+ Temporal.
537
540
 
538
541
  Hot-cache options:
539
542
 
@@ -636,12 +639,14 @@ memory.remember("Tenant A prefers short support replies.", namespace="tenant:a")
636
639
  snapshot_job = ReplicatedSnapshotWorker(memory).run_once(
637
640
  destination="./backups/replicated",
638
641
  offsite_destination="./offsite/replicated",
642
+ archive_destination="./archives/replicated",
643
+ object_store_destination="s3://my-bucket/wavemind/prod",
639
644
  keep_last=7,
640
645
  )
641
646
  assert snapshot_job.ok
642
647
 
643
- restored, report = ReplicatedWaveMind.restore_snapshot(
644
- snapshot_job.offsite_path,
648
+ restored, report = ReplicatedWaveMind.restore_snapshot_archive(
649
+ snapshot_job.archive_path,
645
650
  "./state/restored-replicas",
646
651
  encoder=HashingTextEncoder(vector_dim=64),
647
652
  )
@@ -650,8 +655,10 @@ restored, report = ReplicatedWaveMind.restore_snapshot(
650
655
  The replicated snapshot job writes one SQLite backup per replica plus
651
656
  `manifest.json` with SHA-256 checksums, replica metadata, quorum settings, and
652
657
  node definitions. It can mirror the snapshot to a second path for offsite
653
- backup and applies `keep_last` retention locally and offsite. Restore refuses to
654
- overwrite a non-empty root unless `overwrite=True` is passed.
658
+ backup, write a portable `.tar.gz` archive for object-store/offsite systems,
659
+ verify that archive, upload it to any S3-compatible object store through
660
+ `boto3`, and apply `keep_last` retention locally, offsite, and for archives.
661
+ Restore refuses to overwrite a non-empty root unless `overwrite=True` is passed.
655
662
 
656
663
  Equivalent CLI:
657
664
 
@@ -661,16 +668,28 @@ wavemind replicated-snapshot \
661
668
  --node node-a --node node-b --node node-c \
662
669
  --out ./backups/replicated \
663
670
  --offsite ./offsite/replicated \
671
+ --archive ./archives/replicated \
672
+ --s3 s3://my-bucket/wavemind/prod \
664
673
  --keep-last 7 \
665
674
  --json
666
675
 
667
676
  wavemind replicated-restore \
668
- --from ./offsite/replicated/wavemind-replicated-20260705-120000 \
677
+ --from ./archives/replicated/wavemind-replicated-20260705-120000.tar.gz \
678
+ --to ./state/restored-replicas \
679
+ --overwrite \
680
+ --json
681
+
682
+ wavemind replicated-restore \
683
+ --from s3://my-bucket/wavemind/prod/wavemind-replicated-20260705-120000.tar.gz \
669
684
  --to ./state/restored-replicas \
670
685
  --overwrite \
671
686
  --json
672
687
  ```
673
688
 
689
+ Install S3/R2/MinIO support with `pip install "wavemind[s3]"`. For
690
+ S3-compatible endpoints such as Cloudflare R2 or MinIO, pass
691
+ `--s3-endpoint-url` and optionally `--s3-region`.
692
+
674
693
  ## HTTP API
675
694
 
676
695
  Run the local FastAPI server:
@@ -1044,7 +1063,7 @@ Current read:
1044
1063
  | LongMemEval 50-query smoke | On the first 50 non-abstention LongMemEval-S questions, WaveMind reaches `evidence_recall@5 0.920`, `precision@1 0.760`, and `MRR@5 0.827`; Chroma/Qdrant static reach `0.600`, `0.260`, and `0.385`. | This is the fast regression profile for checking current changes before rerunning the full LongMemEval profile. WaveMind wins on quality; latency still needs work. |
1045
1064
  | ANN/index curve | At 50000 generated 128-d vectors, NumPy exact keeps `recall@10 1.000` at `6.49 ms`; quantized int8 keeps `0.934` at `24.92 ms`; Annoy is faster at `4.92 ms` but drops to `0.730` recall; Qdrant local keeps `1.000` recall at `43.49 ms`. | Current local scale boundary is clear: quantized search needs kernel work, Annoy needs tuning/FAISS, and Qdrant should be tested in service mode for a fair production comparison. |
1046
1065
  | Production load | At 100000 generated 128-d vectors, service-mode Qdrant reaches `recall@10 1.000`, avg `10.28 ms`, p99 `21.26 ms`. At 1M, tuned Qdrant reaches `recall@10 0.984`, avg `116.80 ms`, p99 `209.28 ms`; an EF sweep finds `recall@10 0.977`, avg `64.76 ms`, p99 `103.77 ms` at `hnsw_ef=2048` on 30 queries. | 100k is production-grade on the tested machine. 1M recall is now strong, but p99 still needs tuning before claiming a stable sub-100 ms SLO. |
1047
- | Scale readiness | Deterministic 1M-memory simulation validates 4096 namespace placements over 4 nodes with replication factor 2, node-loss availability `1.000`, zone-loss availability `1.000`, hot-cache hit rate `0.920`, quorum-replicated runtime recall after node loss, missing-record repair, tombstone repair, active-active delta sync, checksummed replicated snapshot/restore, offsite snapshot verification, and structured payload precision@1 `1.000`. | This proves routing, cache, payload, replicated-runtime, namespace-delta, offsite backup, and restore-drill foundations. It is not a 10M-vector latency claim; real 10M latency still needs service-backed load tests on larger hardware. |
1066
+ | Scale readiness | Deterministic 1M-memory simulation validates 4096 namespace placements over 4 nodes with replication factor 2, node-loss availability `1.000`, zone-loss availability `1.000`, hot-cache hit rate `0.920`, quorum-replicated runtime recall after node loss, missing-record repair, tombstone repair, active-active delta sync, checksummed replicated snapshot/restore, offsite mirror verification, portable archive verification, S3-compatible upload verification, and structured payload precision@1 `1.000`. | This proves routing, cache, payload, replicated-runtime, namespace-delta, offsite/archive/object-store backup, and restore-drill foundations. It is not a 10M-vector latency claim; real 10M latency still needs service-backed load tests on larger hardware. |
1048
1067
  | Memory competitor adapters | WaveMind reaches `precision@1 0.80`, `precision@3 1.00`, stale suppression `1.00` on the small adapter profile. Mem0, Zep, and LangGraph are listed as skipped unless their real packages/services are configured. | This prevents fake competitor claims. The adapter harness is ready; real Mem0/Zep/LangGraph results still need configured installs. |
1049
1068
  | LongMemEval local answer generation | With the same local Ollama `qwen2.5:1.5b`, WaveMind reaches `exact_match 0.240`, `contains_answer 0.380`, `token_f1 0.333`, and `evidence_recall@5 0.920`; Chroma and Qdrant static both reach `0.120`, `0.160`, `0.170`, and `0.600`. | This is the first checked-in end-to-end answer benchmark against Chroma/Qdrant. It is still a 50-question lightweight smoke run, not a full LongMemEval leaderboard score. |
1050
1069
 
@@ -1063,7 +1082,7 @@ Current read:
1063
1082
  | Production index profile | Docker-backed 50000-vector profile for persisted FAISS, Qdrant service, and PostgreSQL/pgvector HNSW. | implemented | FAISS / Qdrant service / pgvector | Keep service-mode candidate generation above `0.95` recall@10 and below 10 ms average query latency at 50000 vectors. |
1064
1083
  | Production load profile | 100k and 1M service-backed candidate-index checks with p95/p99 latency. | implemented | Qdrant service / pgvector HNSW / FAISS persisted | Keep 100k at recall@10 `1.000`; push 1M p99 below 100 ms with recall@10 >= 0.95. |
1065
1084
  | Qdrant 1M HNSW ef sweep | One 1M Qdrant collection queried with multiple `hnsw_ef` values. | implemented | Qdrant service | Repeat with 100+ queries and collection-level HNSW build parameters before claiming a stable 1M SLO. |
1066
- | Scale readiness profile | Cluster placement, node/zone-loss simulation, quorum report, replicated runtime, active-active delta sync, replicated snapshot/restore with offsite verification, hot-cache behavior, and structured/multimodal payload retrieval. | implemented | Mem0 / Zep / LangGraph persistent memory / GraphRAG target adapters | Keep quorum replication, namespace-delta sync, repair, offsite backup, and restore drills green while adding larger service-backed 10M load tests. |
1085
+ | Scale readiness profile | Cluster placement, node/zone-loss simulation, quorum report, replicated runtime, active-active delta sync, replicated snapshot/restore with offsite, archive, and object-store verification, hot-cache behavior, and structured/multimodal payload retrieval. | implemented | Mem0 / Zep / LangGraph persistent memory / GraphRAG target adapters | Keep quorum replication, namespace-delta sync, repair, offsite/archive/object-store backup, and restore drills green while adding larger service-backed 10M load tests. |
1067
1086
  | Memory competitor adapter profile | Dynamic-memory scenario wired for external memory frameworks. | implemented | Mem0 / Zep / LangGraph persistent memory | Report real competitor results only when their packages/services are explicitly configured. |
1068
1087
  | [BEIR](https://github.com/beir-cellar/beir) | Standard zero-shot information retrieval quality. | planned | Chroma / Qdrant / FAISS | Stay within 0.02 `nDCG@10` on identical embeddings. |
1069
1088
  | [MTEB Retrieval](https://github.com/embeddings-benchmark/mteb) | Separates encoder quality from retrieval-store quality. | planned | Chroma / Qdrant / FAISS | Prove WaveMind does not reduce same-embedding retrieval quality. |
@@ -1238,24 +1257,28 @@ The delta contains active records plus tombstones. Import is idempotent and
1238
1257
  tombstone-aware, so a stale region export cannot resurrect a deleted memory.
1239
1258
 
1240
1259
  For operational recovery, `ReplicatedSnapshotWorker` creates a checksummed
1241
- replicated snapshot, verifies an optional offsite mirror, and
1242
- `restore_snapshot()` restores it into a fresh replica root:
1260
+ replicated snapshot, verifies an optional offsite mirror, writes a verified
1261
+ `.tar.gz` archive, can upload that archive to S3-compatible storage, and
1262
+ `restore_snapshot_archive()` restores it into a fresh replica root:
1243
1263
 
1244
1264
  ```python
1245
1265
  job = ReplicatedSnapshotWorker(memory).run_once(
1246
1266
  destination="./backups/replicated",
1247
1267
  offsite_destination="./offsite/replicated",
1268
+ archive_destination="./archives/replicated",
1269
+ object_store_destination="s3://my-bucket/wavemind/prod",
1248
1270
  keep_last=7,
1249
1271
  )
1250
- restored, report = ReplicatedWaveMind.restore_snapshot(
1251
- job.offsite_path,
1272
+ restored, report = ReplicatedWaveMind.restore_snapshot_archive(
1273
+ job.archive_path,
1252
1274
  "./state/restored-replicas",
1253
1275
  )
1254
1276
  ```
1255
1277
 
1256
1278
  The checked-in scale-readiness profile verifies manifest checksums, verifies the
1257
- offsite mirror, restores three replica files from that offsite mirror, then
1258
- disables the restored primary and confirms the memory is still recalled from the
1279
+ offsite mirror, verifies the portable archive, verifies S3-compatible object
1280
+ upload metadata, restores three replica files from that archive, then disables
1281
+ the restored primary and confirms the memory is still recalled from the
1259
1282
  remaining replicas.
1260
1283
 
1261
1284
  Checked-in official LoCoMo retrieval result:
@@ -1606,9 +1629,8 @@ If you already use Chroma for local memory, see the practical migration guide:
1606
1629
  - The dynamic benchmark currently compares WaveMind against a static Chroma baseline. Chroma and Qdrant can implement similar behavior with extra application-layer metadata policy, deletes, filters, and reinforcement logic.
1607
1630
  - `MemoryFieldGraph` is a discrete graph over stored memories, not a continuous mathematical field. Its current build path should be optimized with incremental edge updates before large production use.
1608
1631
  - pgvector is a candidate-index backend. PostgreSQL source-of-truth storage is
1609
- also available separately, but migrations, PITR docs, scheduled backup
1610
- runbooks, and service benchmark profiles still need more real deployment
1611
- coverage.
1632
+ also available separately, but migrations, PITR docs, and service benchmark
1633
+ profiles still need more real deployment coverage.
1612
1634
  - The Qdrant backend is also a candidate-index backend. WaveMind rebuilds it
1613
1635
  from SQLite on load/build, so large service-mode deployments still need a
1614
1636
  measured rebuild strategy and index-health monitoring.
@@ -1647,8 +1669,9 @@ Near-term priorities:
1647
1669
  - Faster dynamic re-ranking through smaller candidate windows, caching, and
1648
1670
  background updates.
1649
1671
  - Better production operations: OpenTelemetry and replicated offsite snapshot
1650
- jobs are implemented; richer latency histograms, index-health metrics,
1651
- alerting examples, object-store upload adapters, and Postgres PITR runbooks
1672
+ jobs with verified portable archives and S3-compatible upload are
1673
+ implemented; richer latency histograms, index-health metrics, alerting
1674
+ examples, object-store retention/download drills, and Postgres PITR runbooks
1652
1675
  are next.
1653
1676
 
1654
1677
  Longer-term direction:
@@ -21,7 +21,7 @@ This is a compact reader-facing view of checked-in benchmark results. It is not
21
21
  | Production load profile 100k | production-scale | Recall@k | WaveMind pgvector: 0.736 / 17.8 ms | Qdrant service: 1 / 10.3 ms | Baseline leads on quality |
22
22
  | Production load profile 1M | production-scale | Recall@k | - | Qdrant service: 0.984 / 116.8 ms | No WaveMind result |
23
23
  | Qdrant 1M HNSW ef sweep | production-scale | Recall@k | - | hnsw_ef=2048: 0.977 / 64.8 ms | No WaveMind result |
24
- | Scale readiness profile | production-scale | precision@1 | WaveMind structured payloads: 1 / 0.401 ms | - | WaveMind-only check |
24
+ | Scale readiness profile | production-scale | precision@1 | WaveMind structured payloads: 1 / 0.41 ms | - | WaveMind-only check |
25
25
  | Memory competitor adapter profile | agent-memory | precision@1 | WaveMind: 0.8 / 0.554 ms | - | WaveMind-only check |
26
26
  | [LongMemEval answer generation](https://github.com/xiaowu0162/LongMemEval) | long-term-agent-memory | token F1 | WaveMind + qwen2.5:1.5b: 0.333 / - | Chroma static + qwen2.5:1.5b: 0.17 / - | WaveMind leads on quality |
27
27
 
@@ -24,7 +24,7 @@ Planned rows are not claimed wins. They are the public proof path WaveMind must
24
24
  | Production load profile 100k | production-scale | implemented | Qdrant service: Recall@k 1.00, avg latency 10.3, p95 latency 19.0, p99 latency ms 21.3, build ms 27439.3<br>WaveMind pgvector: Recall@k 0.74, avg latency 17.8, p95 latency 23.5, build ms 455703.7<br>WaveMind faiss-persisted: skipped - Set WAVEMIND_FAISS_PATH to use the persisted FAISS backend | Tune pgvector HNSW build/search parameters and add persisted FAISS from the Linux benchmark container. |
25
25
  | Production load profile 1M | production-scale | implemented | Qdrant service: Recall@k 0.98, avg latency 116.8, p95 latency 153.8, p99 latency ms 209.3, build ms 450674.6 | Tune Qdrant indexing/search params further, then add FAISS IVF/HNSW and pgvector 1M profiles on a larger disk. |
26
26
  | Qdrant 1M HNSW ef sweep | production-scale | implemented | hnsw_ef=512: Recall@k 0.75, avg latency 47.2, p95 latency 68.5, p99 latency ms 68.5, max latency ms 68.5<br>hnsw_ef=768: Recall@k 0.85, avg latency 44.0, p95 latency 69.1, p99 latency ms 69.8, max latency ms 69.8<br>hnsw_ef=1024: Recall@k 0.88, avg latency 62.9, p95 latency 81.1, p99 latency ms 85.5, max latency ms 85.5<br>hnsw_ef=1536: Recall@k 0.94, avg latency 65.6, p95 latency 111.2, p99 latency ms 119.7, max latency ms 119.7<br>hnsw_ef=2048: Recall@k 0.98, avg latency 64.8, p95 latency 91.2, p99 latency ms 103.8, max latency ms 103.8 | Repeat with 100+ queries and collection-level HNSW build parameters before claiming a stable production SLO. |
27
- | Scale readiness profile | production-scale | implemented | WaveMind cluster planner: simulated memories 1000000, namespaces 4096, nodes 4, replication factor 2, node loss min availability 1.00, zone loss min availability 1.00, read quorum 1, write quorum 2, placement ms 77.2<br>WaveMind hot cache: queries 2000, capacity 512, hit rate 0.92, evictions 0, p99 lookup ms 0.00<br>WaveMind replicated runtime: nodes 3, replication factor 3, write quorum 2, read quorum 1, recalled after node loss True, repair copied records 1, tombstone repair deleted records 1, p99 query after loss ms 1.35<br>WaveMind active-active delta sync: regions 2, replication factor per region 3, records imported 6, converged after bidirectional sync True, suppressed stale import after delete True, tombstone converged True, sync ms 103.4<br>WaveMind replicated snapshot: nodes 3, manifest healthy True, offsite verified True, restored files 3, recalled after restore node loss True, snapshot ms 69.7, restore ms 7.10<br>WaveMind structured payloads: queries 4, precision@1 1.00, avg latency 0.40, p99 latency ms 0.59 | Move from local replicated runtime to service-backed replicated runs, object-store snapshot adapters, and larger 10M candidate-index load tests. |
27
+ | Scale readiness profile | production-scale | implemented | WaveMind cluster planner: simulated memories 1000000, namespaces 4096, nodes 4, replication factor 2, node loss min availability 1.00, zone loss min availability 1.00, read quorum 1, write quorum 2, placement ms 62.6<br>WaveMind hot cache: queries 2000, capacity 512, hit rate 0.92, evictions 0, p99 lookup ms 0.00<br>WaveMind replicated runtime: nodes 3, replication factor 3, write quorum 2, read quorum 1, recalled after node loss True, repair copied records 1, tombstone repair deleted records 1, p99 query after loss ms 1.31<br>WaveMind active-active delta sync: regions 2, replication factor per region 3, records imported 6, converged after bidirectional sync True, suppressed stale import after delete True, tombstone converged True, sync ms 159.7<br>WaveMind replicated snapshot: nodes 3, manifest healthy True, offsite verified True, archive verified True, object store verified True, restored files 3, recalled after restore node loss True, snapshot ms 186.2, restore ms 24.9<br>WaveMind structured payloads: queries 4, precision@1 1.00, avg latency 0.41, p99 latency ms 0.62 | Move from local replicated runtime to service-backed replicated runs, object-store retention/download drills, and larger 10M candidate-index load tests. |
28
28
  | Memory competitor adapter profile | agent-memory | implemented | WaveMind: precision@1 0.80, precision@3 1.00, stale suppression 1.00, avg latency 0.55, p95 latency 0.83<br>Mem0: skipped - Install Mem0 to run this adapter profile: pip install "mem0ai"<br>Zep: skipped - Install the Zep client package and set ZEP_API_KEY or ZEP_API_URL.<br>LangGraph persistent memory: skipped - Install LangGraph to run this adapter profile: pip install "langgraph" | Add documented setup commands for each competitor adapter and store checked-in results only when those real adapters run. |
29
29
  | [LongMemEval answer generation](https://github.com/xiaowu0162/LongMemEval) | long-term-agent-memory | implemented | extractive smoke: queries 20, evidence recall@k 1.00, exact match 0.00, contains answer 0.05, token f1 0.02, avg retrieval ms 3.79, avg generation ms 0.77<br>WaveMind + qwen2.5:0.5b: queries 50, evidence recall@k 0.92, exact match 0.12, contains answer 0.18, token f1 0.18, avg retrieval ms 2.98, avg generation ms 1428.2<br>Chroma static + qwen2.5:0.5b: queries 50, evidence recall@k 0.60, exact match 0.10, contains answer 0.12, token f1 0.13, avg retrieval ms 4.10, avg generation ms 1234.7<br>Qdrant static + qwen2.5:0.5b: queries 50, evidence recall@k 0.60, exact match 0.10, contains answer 0.12, token f1 0.13, avg retrieval ms 63.8, avg generation ms 893.5<br>WaveMind + qwen2.5:1.5b: queries 50, evidence recall@k 0.92, exact match 0.24, contains answer 0.38, token f1 0.33, avg retrieval ms 2.00, avg generation ms 2153.0<br>Chroma static + qwen2.5:1.5b: queries 50, evidence recall@k 0.60, exact match 0.12, contains answer 0.16, token f1 0.17, avg retrieval ms 7.05, avg generation ms 2082.4<br>Qdrant static + qwen2.5:1.5b: queries 50, evidence recall@k 0.60, exact match 0.12, contains answer 0.16, token f1 0.17, avg retrieval ms 100.2, avg generation ms 758.1 | Run all 470 non-abstention questions with a stronger local/API model and add faithfulness/abstention scoring. |
30
30
 
@@ -741,7 +741,7 @@
741
741
  "category": "production-scale",
742
742
  "status": "implemented",
743
743
  "source": "benchmarks/scale_readiness_benchmark.py",
744
- "dataset": "Deterministic 1M-memory simulation for namespace placement, quorum runtime, active-active delta sync, replicated snapshot/restore, hot-cache, and structured-payload retrieval checks.",
744
+ "dataset": "Deterministic 1M-memory simulation for namespace placement, quorum runtime, active-active delta sync, replicated snapshot/offsite/archive restore, S3-compatible object-store upload verification, hot-cache, and structured-payload retrieval checks.",
745
745
  "competitors": [
746
746
  "Mem0",
747
747
  "Zep",
@@ -764,14 +764,14 @@
764
764
  "zone_loss_min_availability": 1.0,
765
765
  "read_quorum": 1,
766
766
  "write_quorum": 2,
767
- "placement_ms": 77.1686999942176
767
+ "placement_ms": 62.552399991545826
768
768
  },
769
769
  "WaveMind hot cache": {
770
770
  "queries": 2000,
771
771
  "capacity": 512,
772
772
  "hit_rate": 0.92,
773
773
  "evictions": 0,
774
- "p99_lookup_ms": 0.0030999653972685337
774
+ "p99_lookup_ms": 0.0026999623514711857
775
775
  },
776
776
  "WaveMind replicated runtime": {
777
777
  "nodes": 3,
@@ -781,7 +781,7 @@
781
781
  "recalled_after_node_loss": true,
782
782
  "repair_copied_records": 1,
783
783
  "tombstone_repair_deleted_records": 1,
784
- "p99_query_after_loss_ms": 1.35420000879094
784
+ "p99_query_after_loss_ms": 1.3142999960109591
785
785
  },
786
786
  "WaveMind active-active delta sync": {
787
787
  "regions": 2,
@@ -790,26 +790,28 @@
790
790
  "converged_after_bidirectional_sync": true,
791
791
  "suppressed_stale_import_after_delete": true,
792
792
  "tombstone_converged": true,
793
- "sync_ms": 103.42070000478998
793
+ "sync_ms": 159.69160001259297
794
794
  },
795
795
  "WaveMind replicated snapshot": {
796
796
  "nodes": 3,
797
797
  "manifest_healthy": true,
798
798
  "offsite_verified": true,
799
+ "archive_verified": true,
800
+ "object_store_verified": true,
799
801
  "restored_files": 3,
800
802
  "recalled_after_restore_node_loss": true,
801
- "snapshot_ms": 69.7173000080511,
802
- "restore_ms": 7.101800001692027
803
+ "snapshot_ms": 186.24169996473938,
804
+ "restore_ms": 24.853000009898096
803
805
  },
804
806
  "WaveMind structured payloads": {
805
807
  "queries": 4,
806
808
  "precision_at_1": 1.0,
807
- "avg_latency_ms": 0.40072499541565776,
808
- "p99_latency_ms": 0.5899000097997487
809
+ "avg_latency_ms": 0.4099500220036134,
810
+ "p99_latency_ms": 0.6203000084497035
809
811
  }
810
812
  },
811
- "target": "Prove the production foundation before heavier 100k, 1M, and 10M vector load tests: deterministic placement, survivable replicas, active-active sync, offsite-verified restore drills, hot-cache behavior, and structured payload recall.",
812
- "next_step": "Move from local replicated runtime to service-backed replicated runs, object-store snapshot adapters, and larger 10M candidate-index load tests."
813
+ "target": "Prove the production foundation before heavier 100k, 1M, and 10M vector load tests: deterministic placement, survivable replicas, active-active sync, offsite/archive/object-store-verified restore drills, hot-cache behavior, and structured payload recall.",
814
+ "next_step": "Move from local replicated runtime to service-backed replicated runs, object-store retention/download drills, and larger 10M candidate-index load tests."
813
815
  },
814
816
  {
815
817
  "id": "memory_competitor_adapter_profile",
@@ -702,7 +702,7 @@ def _implemented_entries(root: Path) -> list[dict[str, Any]]:
702
702
  "category": "production-scale",
703
703
  "status": "implemented",
704
704
  "source": "benchmarks/scale_readiness_benchmark.py",
705
- "dataset": "Deterministic 1M-memory simulation for namespace placement, quorum runtime, active-active delta sync, replicated snapshot/restore, hot-cache, and structured-payload retrieval checks.",
705
+ "dataset": "Deterministic 1M-memory simulation for namespace placement, quorum runtime, active-active delta sync, replicated snapshot/offsite/archive restore, S3-compatible object-store upload verification, hot-cache, and structured-payload retrieval checks.",
706
706
  "competitors": ["Mem0", "Zep", "LangGraph persistent memory", "GraphRAG"],
707
707
  "metrics": [
708
708
  "node_loss_min_availability",
@@ -766,6 +766,8 @@ def _implemented_entries(root: Path) -> list[dict[str, Any]]:
766
766
  "nodes",
767
767
  "manifest_healthy",
768
768
  "offsite_verified",
769
+ "archive_verified",
770
+ "object_store_verified",
769
771
  "restored_files",
770
772
  "recalled_after_restore_node_loss",
771
773
  "snapshot_ms",
@@ -782,8 +784,8 @@ def _implemented_entries(root: Path) -> list[dict[str, Any]]:
782
784
  ),
783
785
  ),
784
786
  },
785
- "target": "Prove the production foundation before heavier 100k, 1M, and 10M vector load tests: deterministic placement, survivable replicas, active-active sync, offsite-verified restore drills, hot-cache behavior, and structured payload recall.",
786
- "next_step": "Move from local replicated runtime to service-backed replicated runs, object-store snapshot adapters, and larger 10M candidate-index load tests.",
787
+ "target": "Prove the production foundation before heavier 100k, 1M, and 10M vector load tests: deterministic placement, survivable replicas, active-active sync, offsite/archive/object-store-verified restore drills, hot-cache behavior, and structured payload recall.",
788
+ "next_step": "Move from local replicated runtime to service-backed replicated runs, object-store retention/download drills, and larger 10M candidate-index load tests.",
787
789
  },
788
790
  {
789
791
  "id": "memory_competitor_adapter_profile",