wavemind 2.2.9__tar.gz → 2.3.1__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.9 → wavemind-2.3.1}/PKG-INFO +54 -23
  2. {wavemind-2.2.9 → wavemind-2.3.1}/README.md +50 -22
  3. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/BENCHMARK_LEADERBOARD.md +1 -1
  4. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/BENCHMARK_REPORT.md +1 -1
  5. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/benchmark_matrix_results.json +14 -11
  6. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/benchmark_registry.py +6 -3
  7. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/scale_readiness_benchmark.py +78 -2
  8. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/scale_readiness_results.json +14 -11
  9. {wavemind-2.2.9 → wavemind-2.3.1}/docker-compose.yml +1 -1
  10. {wavemind-2.2.9 → wavemind-2.3.1}/docs/BENCHMARK_BRIEF.md +1 -1
  11. {wavemind-2.2.9 → wavemind-2.3.1}/docs/ROADMAP.md +10 -5
  12. {wavemind-2.2.9 → wavemind-2.3.1}/pyproject.toml +5 -1
  13. {wavemind-2.2.9 → wavemind-2.3.1}/requirements-optional.txt +1 -0
  14. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_cli_smoke.py +16 -0
  15. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_jobs.py +95 -0
  16. wavemind-2.3.1/tests/test_object_store.py +143 -0
  17. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_packaging_files.py +3 -0
  18. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_scale_readiness_benchmark.py +3 -0
  19. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/__init__.py +13 -1
  20. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/cli.py +110 -1
  21. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/jobs.py +41 -0
  22. wavemind-2.3.1/wavemind/object_store.py +389 -0
  23. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind.egg-info/PKG-INFO +54 -23
  24. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind.egg-info/SOURCES.txt +2 -0
  25. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind.egg-info/requires.txt +4 -0
  26. {wavemind-2.2.9 → wavemind-2.3.1}/CONTRIBUTING.md +0 -0
  27. {wavemind-2.2.9 → wavemind-2.3.1}/Dockerfile +0 -0
  28. {wavemind-2.2.9 → wavemind-2.3.1}/LICENSE +0 -0
  29. {wavemind-2.2.9 → wavemind-2.3.1}/MANIFEST.in +0 -0
  30. {wavemind-2.2.9 → wavemind-2.3.1}/SECURITY.md +0 -0
  31. {wavemind-2.2.9 → wavemind-2.3.1}/SUPPORT.md +0 -0
  32. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/agent_memory_benchmark.py +0 -0
  33. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/agent_memory_results.json +0 -0
  34. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/ann_index_curve_benchmark.py +0 -0
  35. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/ann_index_curve_results.json +0 -0
  36. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/dynamic_memory_benchmark.py +0 -0
  37. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/dynamic_memory_results.json +0 -0
  38. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/field_memory_dynamics_benchmark.py +0 -0
  39. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/field_memory_dynamics_results.json +0 -0
  40. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/locomo_evidence_results.json +0 -0
  41. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/locomo_memory_benchmark.py +0 -0
  42. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/locomo_sentence_evidence_results.json +0 -0
  43. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/long_memory_evidence_benchmark.py +0 -0
  44. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/long_memory_evidence_results.json +0 -0
  45. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/longmemeval_answer_benchmark.py +0 -0
  46. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/longmemeval_answer_extractive_20_results.json +0 -0
  47. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/longmemeval_answer_qwen25_0_5b_50_results.json +0 -0
  48. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/longmemeval_answer_qwen25_1_5b_50_results.json +0 -0
  49. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/longmemeval_evidence_50_results.json +0 -0
  50. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/longmemeval_evidence_results.json +0 -0
  51. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/longmemeval_memory_benchmark.py +0 -0
  52. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/memory_competitor_benchmark.py +0 -0
  53. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/memory_competitor_results.json +0 -0
  54. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/nomiracl_russian_benchmark.py +0 -0
  55. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/nomiracl_russian_results.json +0 -0
  56. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/open_retrieval_benchmark.py +0 -0
  57. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/open_retrieval_scifact_results.json +0 -0
  58. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/production_index_profile_results.json +0 -0
  59. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/production_load_benchmark.py +0 -0
  60. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/production_load_qdrant_100k_tuned_results.json +0 -0
  61. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/production_load_qdrant_1m_ef_sweep_results.json +0 -0
  62. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/production_load_qdrant_1m_results.json +0 -0
  63. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/production_load_qdrant_1m_tuned_results.json +0 -0
  64. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/production_load_results.json +0 -0
  65. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/render_benchmark_charts.py +0 -0
  66. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/render_benchmark_leaderboard.py +0 -0
  67. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/render_benchmark_report.py +0 -0
  68. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/ru_sentences_benchmark.py +0 -0
  69. {wavemind-2.2.9 → wavemind-2.3.1}/benchmarks/wavemind_capacity_results.json +0 -0
  70. {wavemind-2.2.9 → wavemind-2.3.1}/docs/CHROMA_MIGRATION.md +0 -0
  71. {wavemind-2.2.9 → wavemind-2.3.1}/docs/DEMO_SCRIPT.md +0 -0
  72. {wavemind-2.2.9 → wavemind-2.3.1}/docs/LAUNCH_KIT.md +0 -0
  73. {wavemind-2.2.9 → wavemind-2.3.1}/docs/OBSERVABILITY.md +0 -0
  74. {wavemind-2.2.9 → wavemind-2.3.1}/docs/PROJECT_BOARD.md +0 -0
  75. {wavemind-2.2.9 → wavemind-2.3.1}/docs/RELEASE.md +0 -0
  76. {wavemind-2.2.9 → wavemind-2.3.1}/docs/RU_LAUNCH_POSTS.md +0 -0
  77. {wavemind-2.2.9 → wavemind-2.3.1}/docs/USE_CASES.md +0 -0
  78. {wavemind-2.2.9 → wavemind-2.3.1}/docs/assets/benchmark-summary.svg +0 -0
  79. {wavemind-2.2.9 → wavemind-2.3.1}/docs/assets/wavemind-demo.gif +0 -0
  80. {wavemind-2.2.9 → wavemind-2.3.1}/docs/assets/wavemind-social-card.svg +0 -0
  81. {wavemind-2.2.9 → wavemind-2.3.1}/examples/agent_with_memory.py +0 -0
  82. {wavemind-2.2.9 → wavemind-2.3.1}/examples/chroma_migration.py +0 -0
  83. {wavemind-2.2.9 → wavemind-2.3.1}/examples/customer_support_memory.py +0 -0
  84. {wavemind-2.2.9 → wavemind-2.3.1}/examples/demo.py +0 -0
  85. {wavemind-2.2.9 → wavemind-2.3.1}/examples/dynamic_memory_demo.py +0 -0
  86. {wavemind-2.2.9 → wavemind-2.3.1}/examples/framework_integrations.py +0 -0
  87. {wavemind-2.2.9 → wavemind-2.3.1}/examples/langchain_memory.py +0 -0
  88. {wavemind-2.2.9 → wavemind-2.3.1}/examples/llamaindex_retriever.py +0 -0
  89. {wavemind-2.2.9 → wavemind-2.3.1}/examples/observability/README.md +0 -0
  90. {wavemind-2.2.9 → wavemind-2.3.1}/examples/observability/docker-compose.yml +0 -0
  91. {wavemind-2.2.9 → wavemind-2.3.1}/examples/observability/otel-collector.yaml +0 -0
  92. {wavemind-2.2.9 → wavemind-2.3.1}/examples/observability/prometheus-alerts.yml +0 -0
  93. {wavemind-2.2.9 → wavemind-2.3.1}/examples/observability/prometheus.yml +0 -0
  94. {wavemind-2.2.9 → wavemind-2.3.1}/examples/production-index-profile/README.md +0 -0
  95. {wavemind-2.2.9 → wavemind-2.3.1}/examples/production-index-profile/docker-compose.yml +0 -0
  96. {wavemind-2.2.9 → wavemind-2.3.1}/examples/research_notebook_memory.py +0 -0
  97. {wavemind-2.2.9 → wavemind-2.3.1}/examples/sharded_memory.py +0 -0
  98. {wavemind-2.2.9 → wavemind-2.3.1}/install.bat +0 -0
  99. {wavemind-2.2.9 → wavemind-2.3.1}/install.sh +0 -0
  100. {wavemind-2.2.9 → wavemind-2.3.1}/requirements.txt +0 -0
  101. {wavemind-2.2.9 → wavemind-2.3.1}/setup.cfg +0 -0
  102. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_agent_memory_benchmark.py +0 -0
  103. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_ann_index_curve_benchmark.py +0 -0
  104. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_api.py +0 -0
  105. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_api_process_persistence.py +0 -0
  106. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_benchmark_brief.py +0 -0
  107. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_benchmark_charts.py +0 -0
  108. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_benchmark_leaderboard.py +0 -0
  109. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_benchmark_registry.py +0 -0
  110. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_benchmark_report.py +0 -0
  111. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_chroma_migration_example.py +0 -0
  112. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_cluster.py +0 -0
  113. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_core_persistence.py +0 -0
  114. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_dynamic_memory_benchmark.py +0 -0
  115. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_examples.py +0 -0
  116. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_field_graph.py +0 -0
  117. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_field_graph_integration.py +0 -0
  118. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_field_memory_dynamics_benchmark.py +0 -0
  119. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_framework_adapters.py +0 -0
  120. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_import_benchmark.py +0 -0
  121. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_indexes_encoders.py +0 -0
  122. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_langchain_integration.py +0 -0
  123. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_locomo_memory_benchmark.py +0 -0
  124. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_long_memory_evidence_benchmark.py +0 -0
  125. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_longmemeval_answer_benchmark.py +0 -0
  126. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_longmemeval_memory_benchmark.py +0 -0
  127. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_memory_competitor_benchmark.py +0 -0
  128. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_multimodal.py +0 -0
  129. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_nomiracl_russian_benchmark.py +0 -0
  130. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_observability.py +0 -0
  131. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_observability_docs.py +0 -0
  132. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_open_retrieval_benchmark.py +0 -0
  133. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_postgres_storage.py +0 -0
  134. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_production_index_profile.py +0 -0
  135. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_production_load_benchmark.py +0 -0
  136. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_replication.py +0 -0
  137. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_scale_plan.py +0 -0
  138. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_semantic_and_latency.py +0 -0
  139. {wavemind-2.2.9 → wavemind-2.3.1}/tests/test_sharding.py +0 -0
  140. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/__main__.py +0 -0
  141. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/api.py +0 -0
  142. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/benchmark.py +0 -0
  143. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/cluster.py +0 -0
  144. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/core.py +0 -0
  145. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/encoders.py +0 -0
  146. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/field_graph.py +0 -0
  147. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/importers.py +0 -0
  148. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/indexes.py +0 -0
  149. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/integrations/__init__.py +0 -0
  150. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/integrations/autogen.py +0 -0
  151. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/integrations/crewai.py +0 -0
  152. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/integrations/langchain.py +0 -0
  153. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/integrations/langgraph.py +0 -0
  154. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/integrations/llamaindex.py +0 -0
  155. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/multimodal.py +0 -0
  156. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/observability.py +0 -0
  157. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/replication.py +0 -0
  158. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/scale.py +0 -0
  159. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/sharding.py +0 -0
  160. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/storage.py +0 -0
  161. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind/studio.py +0 -0
  162. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind.egg-info/dependency_links.txt +0 -0
  163. {wavemind-2.2.9 → wavemind-2.3.1}/wavemind.egg-info/entry_points.txt +0 -0
  164. {wavemind-2.2.9 → wavemind-2.3.1}/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.9
3
+ Version: 2.3.1
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,14 +546,15 @@ 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.57 ms`. |
547
- | Active-active delta sync | 2 regions, bidirectional convergence `true`, stale import suppressed after delete `true`, tombstone convergence `true`, sync `104.43 ms`. |
548
- | Replicated snapshot job | 3 replica files, manifest checksum validation `true`, offsite mirror validation `true`, portable archive validation `true`, archive restore `25.70 ms`, recall after restored-primary loss `true`. |
549
- | Structured payloads | image/audio/table/event retrieval, precision@1 `1.000`, p99 `0.58 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.47 ms`. |
550
+ | Active-active delta sync | 2 regions, bidirectional convergence `true`, stale import suppressed after delete `true`, tombstone convergence `true`, sync `135.90 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`, latest remote archive metadata validation `true`, object-store retention pruned `2`, archive restore `32.92 ms`. |
552
+ | Structured payloads | image/audio/table/event retrieval, precision@1 `1.000`, p99 `0.77 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, including verified offsite and archive restore.
556
+ structured payload handling, including verified offsite, archive, object-store
557
+ latest lookup, object-store retention, and archive restore.
554
558
  It is not a 10M-vector load test. Real 100k, 1M, and 10M latency claims should
555
559
  come from service-backed FAISS/Qdrant/pgvector load tests on production-like
556
560
  hardware.
@@ -580,15 +584,16 @@ Maintenance workers:
580
584
 
581
585
  ```sh
582
586
  wavemind maintenance --namespace user:42 --consolidate-steps 10 --consolidate-concepts --json
583
- wavemind replicated-snapshot --root ./state/replicas --node node-a --node node-b --node node-c --out ./backups/replicated --offsite ./offsite/replicated --archive ./archives/replicated --keep-last 7 --json
587
+ 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 --s3-keep-last 30 --json
584
588
  ```
585
589
 
586
590
  The first command runs one deterministic memory pass: expired-memory purge,
587
591
  optional field/concept consolidation, and index-health repair. The second
588
592
  command creates a verified replicated snapshot, mirrors it to an offsite path,
589
- writes a portable `.tar.gz` archive, verifies that archive, and applies
590
- retention. Production deployments can call these commands from cron, systemd,
591
- Kubernetes CronJobs, Celery, RQ, or Temporal.
593
+ writes a portable `.tar.gz` archive, verifies that archive, can upload it to an
594
+ S3-compatible object store, verify newest-archive metadata, and apply local and
595
+ object-store retention. Production deployments can call these commands from
596
+ cron, systemd, Kubernetes CronJobs, Celery, RQ, or Temporal.
592
597
 
593
598
  Hot-cache options:
594
599
 
@@ -692,7 +697,9 @@ snapshot_job = ReplicatedSnapshotWorker(memory).run_once(
692
697
  destination="./backups/replicated",
693
698
  offsite_destination="./offsite/replicated",
694
699
  archive_destination="./archives/replicated",
700
+ object_store_destination="s3://my-bucket/wavemind/prod",
695
701
  keep_last=7,
702
+ object_store_keep_last=30,
696
703
  )
697
704
  assert snapshot_job.ok
698
705
 
@@ -707,9 +714,11 @@ The replicated snapshot job writes one SQLite backup per replica plus
707
714
  `manifest.json` with SHA-256 checksums, replica metadata, quorum settings, and
708
715
  node definitions. It can mirror the snapshot to a second path for offsite
709
716
  backup, write a portable `.tar.gz` archive for object-store/offsite systems,
710
- verify that archive, and apply `keep_last` retention locally, offsite, and for
711
- archives. Restore refuses to overwrite a non-empty root unless `overwrite=True`
712
- is passed.
717
+ verify that archive, upload it to any S3-compatible object store through
718
+ `boto3`, list the newest remote archive, restore from the newest remote archive,
719
+ and apply `keep_last` retention locally, offsite, for archives, and explicitly
720
+ for object-store archives through `object_store_keep_last`.
721
+ Restore refuses to overwrite a non-empty root unless `overwrite=True` is passed.
713
722
 
714
723
  Equivalent CLI:
715
724
 
@@ -720,7 +729,14 @@ wavemind replicated-snapshot \
720
729
  --out ./backups/replicated \
721
730
  --offsite ./offsite/replicated \
722
731
  --archive ./archives/replicated \
732
+ --s3 s3://my-bucket/wavemind/prod \
723
733
  --keep-last 7 \
734
+ --s3-keep-last 30 \
735
+ --json
736
+
737
+ wavemind replicated-s3-archives \
738
+ --s3 s3://my-bucket/wavemind/prod \
739
+ --latest \
724
740
  --json
725
741
 
726
742
  wavemind replicated-restore \
@@ -728,8 +744,19 @@ wavemind replicated-restore \
728
744
  --to ./state/restored-replicas \
729
745
  --overwrite \
730
746
  --json
747
+
748
+ wavemind replicated-restore \
749
+ --from s3://my-bucket/wavemind/prod \
750
+ --latest \
751
+ --to ./state/restored-replicas \
752
+ --overwrite \
753
+ --json
731
754
  ```
732
755
 
756
+ Install S3/R2/MinIO support with `pip install "wavemind[s3]"`. For
757
+ S3-compatible endpoints such as Cloudflare R2 or MinIO, pass
758
+ `--s3-endpoint-url` and optionally `--s3-region`.
759
+
733
760
  ## HTTP API
734
761
 
735
762
  Run the local FastAPI server:
@@ -1103,7 +1130,7 @@ Current read:
1103
1130
  | 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. |
1104
1131
  | 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. |
1105
1132
  | 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. |
1106
- | 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, and structured payload precision@1 `1.000`. | This proves routing, cache, payload, replicated-runtime, namespace-delta, offsite/archive 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. |
1133
+ | 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/latest-metadata/retention verification, and structured payload precision@1 `1.000`. | This proves routing, cache, payload, replicated-runtime, namespace-delta, offsite/archive/object-store backup lifecycle, and restore-drill foundations. It is not a 10M-vector latency claim; real 10M latency still needs service-backed load tests on larger hardware. |
1107
1134
  | 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. |
1108
1135
  | 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. |
1109
1136
 
@@ -1122,7 +1149,7 @@ Current read:
1122
1149
  | 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. |
1123
1150
  | 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. |
1124
1151
  | 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. |
1125
- | Scale readiness profile | Cluster placement, node/zone-loss simulation, quorum report, replicated runtime, active-active delta sync, replicated snapshot/restore with offsite and archive 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 backup, and restore drills green while adding larger service-backed 10M load tests. |
1152
+ | Scale readiness profile | Cluster placement, node/zone-loss simulation, quorum report, replicated runtime, active-active delta sync, replicated snapshot/restore with offsite, archive, object-store latest-metadata/retention 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 lifecycle, and restore drills green while adding larger service-backed 10M load tests. |
1126
1153
  | 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. |
1127
1154
  | [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. |
1128
1155
  | [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. |
@@ -1298,14 +1325,15 @@ tombstone-aware, so a stale region export cannot resurrect a deleted memory.
1298
1325
 
1299
1326
  For operational recovery, `ReplicatedSnapshotWorker` creates a checksummed
1300
1327
  replicated snapshot, verifies an optional offsite mirror, writes a verified
1301
- `.tar.gz` archive, and `restore_snapshot_archive()` restores it into a fresh
1302
- replica root:
1328
+ `.tar.gz` archive, can upload that archive to S3-compatible storage, and
1329
+ `restore_snapshot_archive()` restores it into a fresh replica root:
1303
1330
 
1304
1331
  ```python
1305
1332
  job = ReplicatedSnapshotWorker(memory).run_once(
1306
1333
  destination="./backups/replicated",
1307
1334
  offsite_destination="./offsite/replicated",
1308
1335
  archive_destination="./archives/replicated",
1336
+ object_store_destination="s3://my-bucket/wavemind/prod",
1309
1337
  keep_last=7,
1310
1338
  )
1311
1339
  restored, report = ReplicatedWaveMind.restore_snapshot_archive(
@@ -1315,9 +1343,10 @@ restored, report = ReplicatedWaveMind.restore_snapshot_archive(
1315
1343
  ```
1316
1344
 
1317
1345
  The checked-in scale-readiness profile verifies manifest checksums, verifies the
1318
- offsite mirror, verifies the portable archive, restores three replica files from
1319
- that archive, then disables the restored primary and confirms the memory is
1320
- still recalled from the remaining replicas.
1346
+ offsite mirror, verifies the portable archive, verifies S3-compatible object
1347
+ upload metadata, restores three replica files from that archive, then disables
1348
+ the restored primary and confirms the memory is still recalled from the
1349
+ remaining replicas.
1321
1350
 
1322
1351
  Checked-in official LoCoMo retrieval result:
1323
1352
 
@@ -1707,9 +1736,11 @@ Near-term priorities:
1707
1736
  - Faster dynamic re-ranking through smaller candidate windows, caching, and
1708
1737
  background updates.
1709
1738
  - Better production operations: OpenTelemetry and replicated offsite snapshot
1710
- jobs with verified portable archives are implemented; richer latency
1711
- histograms, index-health metrics, alerting examples, direct object-store
1712
- upload adapters, and Postgres PITR runbooks are next.
1739
+ jobs with verified portable archives, S3-compatible upload, latest-archive
1740
+ lookup, restore from latest, and object-store retention are
1741
+ implemented; richer latency histograms, index-health metrics, alerting
1742
+ examples, real cloud disaster-recovery drills, and Postgres PITR runbooks are
1743
+ next.
1713
1744
 
1714
1745
  Longer-term direction:
1715
1746
 
@@ -490,14 +490,15 @@ 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.57 ms`. |
494
- | Active-active delta sync | 2 regions, bidirectional convergence `true`, stale import suppressed after delete `true`, tombstone convergence `true`, sync `104.43 ms`. |
495
- | Replicated snapshot job | 3 replica files, manifest checksum validation `true`, offsite mirror validation `true`, portable archive validation `true`, archive restore `25.70 ms`, recall after restored-primary loss `true`. |
496
- | Structured payloads | image/audio/table/event retrieval, precision@1 `1.000`, p99 `0.58 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.47 ms`. |
494
+ | Active-active delta sync | 2 regions, bidirectional convergence `true`, stale import suppressed after delete `true`, tombstone convergence `true`, sync `135.90 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`, latest remote archive metadata validation `true`, object-store retention pruned `2`, archive restore `32.92 ms`. |
496
+ | Structured payloads | image/audio/table/event retrieval, precision@1 `1.000`, p99 `0.77 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, including verified offsite and archive restore.
500
+ structured payload handling, including verified offsite, archive, object-store
501
+ latest lookup, object-store retention, and archive restore.
501
502
  It is not a 10M-vector load test. Real 100k, 1M, and 10M latency claims should
502
503
  come from service-backed FAISS/Qdrant/pgvector load tests on production-like
503
504
  hardware.
@@ -527,15 +528,16 @@ Maintenance workers:
527
528
 
528
529
  ```sh
529
530
  wavemind maintenance --namespace user:42 --consolidate-steps 10 --consolidate-concepts --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 --keep-last 7 --json
531
+ 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 --s3-keep-last 30 --json
531
532
  ```
532
533
 
533
534
  The first command runs one deterministic memory pass: expired-memory purge,
534
535
  optional field/concept consolidation, and index-health repair. The second
535
536
  command creates a verified replicated snapshot, mirrors it to an offsite path,
536
- writes a portable `.tar.gz` archive, verifies that archive, and applies
537
- retention. Production deployments can call these commands from cron, systemd,
538
- Kubernetes CronJobs, Celery, RQ, or Temporal.
537
+ writes a portable `.tar.gz` archive, verifies that archive, can upload it to an
538
+ S3-compatible object store, verify newest-archive metadata, and apply local and
539
+ object-store retention. Production deployments can call these commands from
540
+ cron, systemd, Kubernetes CronJobs, Celery, RQ, or Temporal.
539
541
 
540
542
  Hot-cache options:
541
543
 
@@ -639,7 +641,9 @@ snapshot_job = ReplicatedSnapshotWorker(memory).run_once(
639
641
  destination="./backups/replicated",
640
642
  offsite_destination="./offsite/replicated",
641
643
  archive_destination="./archives/replicated",
644
+ object_store_destination="s3://my-bucket/wavemind/prod",
642
645
  keep_last=7,
646
+ object_store_keep_last=30,
643
647
  )
644
648
  assert snapshot_job.ok
645
649
 
@@ -654,9 +658,11 @@ The replicated snapshot job writes one SQLite backup per replica plus
654
658
  `manifest.json` with SHA-256 checksums, replica metadata, quorum settings, and
655
659
  node definitions. It can mirror the snapshot to a second path for offsite
656
660
  backup, write a portable `.tar.gz` archive for object-store/offsite systems,
657
- verify that archive, and apply `keep_last` retention locally, offsite, and for
658
- archives. Restore refuses to overwrite a non-empty root unless `overwrite=True`
659
- is passed.
661
+ verify that archive, upload it to any S3-compatible object store through
662
+ `boto3`, list the newest remote archive, restore from the newest remote archive,
663
+ and apply `keep_last` retention locally, offsite, for archives, and explicitly
664
+ for object-store archives through `object_store_keep_last`.
665
+ Restore refuses to overwrite a non-empty root unless `overwrite=True` is passed.
660
666
 
661
667
  Equivalent CLI:
662
668
 
@@ -667,7 +673,14 @@ wavemind replicated-snapshot \
667
673
  --out ./backups/replicated \
668
674
  --offsite ./offsite/replicated \
669
675
  --archive ./archives/replicated \
676
+ --s3 s3://my-bucket/wavemind/prod \
670
677
  --keep-last 7 \
678
+ --s3-keep-last 30 \
679
+ --json
680
+
681
+ wavemind replicated-s3-archives \
682
+ --s3 s3://my-bucket/wavemind/prod \
683
+ --latest \
671
684
  --json
672
685
 
673
686
  wavemind replicated-restore \
@@ -675,8 +688,19 @@ wavemind replicated-restore \
675
688
  --to ./state/restored-replicas \
676
689
  --overwrite \
677
690
  --json
691
+
692
+ wavemind replicated-restore \
693
+ --from s3://my-bucket/wavemind/prod \
694
+ --latest \
695
+ --to ./state/restored-replicas \
696
+ --overwrite \
697
+ --json
678
698
  ```
679
699
 
700
+ Install S3/R2/MinIO support with `pip install "wavemind[s3]"`. For
701
+ S3-compatible endpoints such as Cloudflare R2 or MinIO, pass
702
+ `--s3-endpoint-url` and optionally `--s3-region`.
703
+
680
704
  ## HTTP API
681
705
 
682
706
  Run the local FastAPI server:
@@ -1050,7 +1074,7 @@ Current read:
1050
1074
  | 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. |
1051
1075
  | 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. |
1052
1076
  | 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. |
1053
- | 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, and structured payload precision@1 `1.000`. | This proves routing, cache, payload, replicated-runtime, namespace-delta, offsite/archive 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. |
1077
+ | 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/latest-metadata/retention verification, and structured payload precision@1 `1.000`. | This proves routing, cache, payload, replicated-runtime, namespace-delta, offsite/archive/object-store backup lifecycle, and restore-drill foundations. It is not a 10M-vector latency claim; real 10M latency still needs service-backed load tests on larger hardware. |
1054
1078
  | 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. |
1055
1079
  | 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. |
1056
1080
 
@@ -1069,7 +1093,7 @@ Current read:
1069
1093
  | 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. |
1070
1094
  | 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. |
1071
1095
  | 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. |
1072
- | Scale readiness profile | Cluster placement, node/zone-loss simulation, quorum report, replicated runtime, active-active delta sync, replicated snapshot/restore with offsite and archive 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 backup, and restore drills green while adding larger service-backed 10M load tests. |
1096
+ | Scale readiness profile | Cluster placement, node/zone-loss simulation, quorum report, replicated runtime, active-active delta sync, replicated snapshot/restore with offsite, archive, object-store latest-metadata/retention 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 lifecycle, and restore drills green while adding larger service-backed 10M load tests. |
1073
1097
  | 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. |
1074
1098
  | [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. |
1075
1099
  | [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. |
@@ -1245,14 +1269,15 @@ tombstone-aware, so a stale region export cannot resurrect a deleted memory.
1245
1269
 
1246
1270
  For operational recovery, `ReplicatedSnapshotWorker` creates a checksummed
1247
1271
  replicated snapshot, verifies an optional offsite mirror, writes a verified
1248
- `.tar.gz` archive, and `restore_snapshot_archive()` restores it into a fresh
1249
- replica root:
1272
+ `.tar.gz` archive, can upload that archive to S3-compatible storage, and
1273
+ `restore_snapshot_archive()` restores it into a fresh replica root:
1250
1274
 
1251
1275
  ```python
1252
1276
  job = ReplicatedSnapshotWorker(memory).run_once(
1253
1277
  destination="./backups/replicated",
1254
1278
  offsite_destination="./offsite/replicated",
1255
1279
  archive_destination="./archives/replicated",
1280
+ object_store_destination="s3://my-bucket/wavemind/prod",
1256
1281
  keep_last=7,
1257
1282
  )
1258
1283
  restored, report = ReplicatedWaveMind.restore_snapshot_archive(
@@ -1262,9 +1287,10 @@ restored, report = ReplicatedWaveMind.restore_snapshot_archive(
1262
1287
  ```
1263
1288
 
1264
1289
  The checked-in scale-readiness profile verifies manifest checksums, verifies the
1265
- offsite mirror, verifies the portable archive, restores three replica files from
1266
- that archive, then disables the restored primary and confirms the memory is
1267
- still recalled from the remaining replicas.
1290
+ offsite mirror, verifies the portable archive, verifies S3-compatible object
1291
+ upload metadata, restores three replica files from that archive, then disables
1292
+ the restored primary and confirms the memory is still recalled from the
1293
+ remaining replicas.
1268
1294
 
1269
1295
  Checked-in official LoCoMo retrieval result:
1270
1296
 
@@ -1654,9 +1680,11 @@ Near-term priorities:
1654
1680
  - Faster dynamic re-ranking through smaller candidate windows, caching, and
1655
1681
  background updates.
1656
1682
  - Better production operations: OpenTelemetry and replicated offsite snapshot
1657
- jobs with verified portable archives are implemented; richer latency
1658
- histograms, index-health metrics, alerting examples, direct object-store
1659
- upload adapters, and Postgres PITR runbooks are next.
1683
+ jobs with verified portable archives, S3-compatible upload, latest-archive
1684
+ lookup, restore from latest, and object-store retention are
1685
+ implemented; richer latency histograms, index-health metrics, alerting
1686
+ examples, real cloud disaster-recovery drills, and Postgres PITR runbooks are
1687
+ next.
1660
1688
 
1661
1689
  Longer-term direction:
1662
1690
 
@@ -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.461 ms | - | WaveMind-only check |
24
+ | Scale readiness profile | production-scale | precision@1 | WaveMind structured payloads: 1 / 0.592 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 61.5<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.57<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 104.4<br>WaveMind replicated snapshot: nodes 3, manifest healthy True, offsite verified True, archive verified True, restored files 3, recalled after restore node loss True, snapshot ms 109.2, restore ms 25.7<br>WaveMind structured payloads: queries 4, precision@1 1.00, avg latency 0.46, p99 latency ms 0.58 | 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 72.2<br>WaveMind hot cache: queries 2000, capacity 512, hit rate 0.92, evictions 0, p99 lookup ms 0.01<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.47<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 135.9<br>WaveMind replicated snapshot: nodes 3, manifest healthy True, offsite verified True, archive verified True, object store verified True, object store latest verified True, object store pruned 2, restored files 3, recalled after restore node loss True, snapshot ms 186.0, restore ms 32.9<br>WaveMind structured payloads: queries 4, precision@1 1.00, avg latency 0.59, p99 latency ms 0.77 | Move from local replicated runtime to service-backed replicated runs, real cloud object-store disaster-recovery 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/offsite/archive 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": 61.49380002170801
767
+ "placement_ms": 72.24250002764165
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.002900022082030773
774
+ "p99_lookup_ms": 0.005199981387704611
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.573899993672967
784
+ "p99_query_after_loss_ms": 1.469200011342764
785
785
  },
786
786
  "WaveMind active-active delta sync": {
787
787
  "regions": 2,
@@ -790,27 +790,30 @@
790
790
  "converged_after_bidirectional_sync": true,
791
791
  "suppressed_stale_import_after_delete": true,
792
792
  "tombstone_converged": true,
793
- "sync_ms": 104.4289999990724
793
+ "sync_ms": 135.9029000159353
794
794
  },
795
795
  "WaveMind replicated snapshot": {
796
796
  "nodes": 3,
797
797
  "manifest_healthy": true,
798
798
  "offsite_verified": true,
799
799
  "archive_verified": true,
800
+ "object_store_verified": true,
801
+ "object_store_latest_verified": true,
802
+ "object_store_pruned": 2,
800
803
  "restored_files": 3,
801
804
  "recalled_after_restore_node_loss": true,
802
- "snapshot_ms": 109.23659999389201,
803
- "restore_ms": 25.69669997319579
805
+ "snapshot_ms": 185.95519999507815,
806
+ "restore_ms": 32.917500007897615
804
807
  },
805
808
  "WaveMind structured payloads": {
806
809
  "queries": 4,
807
810
  "precision_at_1": 1.0,
808
- "avg_latency_ms": 0.4606249858625233,
809
- "p99_latency_ms": 0.5845999694429338
811
+ "avg_latency_ms": 0.5916499794693664,
812
+ "p99_latency_ms": 0.7669999613426626
810
813
  }
811
814
  },
812
- "target": "Prove the production foundation before heavier 100k, 1M, and 10M vector load tests: deterministic placement, survivable replicas, active-active sync, offsite/archive-verified restore drills, hot-cache behavior, and structured payload recall.",
813
- "next_step": "Move from local replicated runtime to service-backed replicated runs, object-store snapshot adapters, and larger 10M candidate-index load tests."
815
+ "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 upload/latest-metadata/retention restore drills, hot-cache behavior, and structured payload recall.",
816
+ "next_step": "Move from local replicated runtime to service-backed replicated runs, real cloud object-store disaster-recovery drills, and larger 10M candidate-index load tests."
814
817
  },
815
818
  {
816
819
  "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/offsite/archive 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",
@@ -767,6 +767,9 @@ def _implemented_entries(root: Path) -> list[dict[str, Any]]:
767
767
  "manifest_healthy",
768
768
  "offsite_verified",
769
769
  "archive_verified",
770
+ "object_store_verified",
771
+ "object_store_latest_verified",
772
+ "object_store_pruned",
770
773
  "restored_files",
771
774
  "recalled_after_restore_node_loss",
772
775
  "snapshot_ms",
@@ -783,8 +786,8 @@ def _implemented_entries(root: Path) -> list[dict[str, Any]]:
783
786
  ),
784
787
  ),
785
788
  },
786
- "target": "Prove the production foundation before heavier 100k, 1M, and 10M vector load tests: deterministic placement, survivable replicas, active-active sync, offsite/archive-verified restore drills, hot-cache behavior, and structured payload recall.",
787
- "next_step": "Move from local replicated runtime to service-backed replicated runs, object-store snapshot adapters, and larger 10M candidate-index load tests.",
789
+ "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 upload/latest-metadata/retention restore drills, hot-cache behavior, and structured payload recall.",
790
+ "next_step": "Move from local replicated runtime to service-backed replicated runs, real cloud object-store disaster-recovery drills, and larger 10M candidate-index load tests.",
788
791
  },
789
792
  {
790
793
  "id": "memory_competitor_adapter_profile",