wavemind 2.3.2__tar.gz → 2.3.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. {wavemind-2.3.2 → wavemind-2.3.3}/PKG-INFO +32 -18
  2. {wavemind-2.3.2 → wavemind-2.3.3}/README.md +31 -17
  3. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/BENCHMARK_LEADERBOARD.md +1 -1
  4. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/BENCHMARK_REPORT.md +1 -1
  5. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/benchmark_matrix_results.json +10 -9
  6. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/benchmark_registry.py +2 -1
  7. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/scale_readiness_benchmark.py +18 -27
  8. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/scale_readiness_results.json +12 -11
  9. {wavemind-2.3.2 → wavemind-2.3.3}/docker-compose.yml +1 -1
  10. {wavemind-2.3.2 → wavemind-2.3.3}/docs/BENCHMARK_BRIEF.md +1 -1
  11. {wavemind-2.3.2 → wavemind-2.3.3}/docs/ROADMAP.md +9 -7
  12. {wavemind-2.3.2 → wavemind-2.3.3}/pyproject.toml +1 -1
  13. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_cli_smoke.py +4 -0
  14. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_jobs.py +54 -0
  15. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_object_store.py +19 -0
  16. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_scale_readiness_benchmark.py +1 -0
  17. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/__init__.py +5 -1
  18. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/cli.py +90 -1
  19. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/jobs.py +156 -0
  20. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/object_store.py +33 -0
  21. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind.egg-info/PKG-INFO +32 -18
  22. {wavemind-2.3.2 → wavemind-2.3.3}/CONTRIBUTING.md +0 -0
  23. {wavemind-2.3.2 → wavemind-2.3.3}/Dockerfile +0 -0
  24. {wavemind-2.3.2 → wavemind-2.3.3}/LICENSE +0 -0
  25. {wavemind-2.3.2 → wavemind-2.3.3}/MANIFEST.in +0 -0
  26. {wavemind-2.3.2 → wavemind-2.3.3}/SECURITY.md +0 -0
  27. {wavemind-2.3.2 → wavemind-2.3.3}/SUPPORT.md +0 -0
  28. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/agent_memory_benchmark.py +0 -0
  29. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/agent_memory_results.json +0 -0
  30. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/ann_index_curve_benchmark.py +0 -0
  31. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/ann_index_curve_results.json +0 -0
  32. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/dynamic_memory_benchmark.py +0 -0
  33. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/dynamic_memory_results.json +0 -0
  34. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/field_memory_dynamics_benchmark.py +0 -0
  35. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/field_memory_dynamics_results.json +0 -0
  36. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/locomo_evidence_results.json +0 -0
  37. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/locomo_memory_benchmark.py +0 -0
  38. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/locomo_sentence_evidence_results.json +0 -0
  39. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/long_memory_evidence_benchmark.py +0 -0
  40. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/long_memory_evidence_results.json +0 -0
  41. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/longmemeval_answer_benchmark.py +0 -0
  42. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/longmemeval_answer_extractive_20_results.json +0 -0
  43. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/longmemeval_answer_qwen25_0_5b_50_results.json +0 -0
  44. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/longmemeval_answer_qwen25_1_5b_50_results.json +0 -0
  45. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/longmemeval_evidence_50_results.json +0 -0
  46. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/longmemeval_evidence_results.json +0 -0
  47. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/longmemeval_memory_benchmark.py +0 -0
  48. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/memory_competitor_benchmark.py +0 -0
  49. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/memory_competitor_results.json +0 -0
  50. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/nomiracl_russian_benchmark.py +0 -0
  51. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/nomiracl_russian_results.json +0 -0
  52. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/open_retrieval_benchmark.py +0 -0
  53. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/open_retrieval_scifact_results.json +0 -0
  54. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/production_index_profile_results.json +0 -0
  55. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/production_load_benchmark.py +0 -0
  56. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/production_load_qdrant_100k_tuned_results.json +0 -0
  57. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/production_load_qdrant_1m_ef_sweep_results.json +0 -0
  58. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/production_load_qdrant_1m_results.json +0 -0
  59. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/production_load_qdrant_1m_tuned_results.json +0 -0
  60. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/production_load_results.json +0 -0
  61. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/render_benchmark_charts.py +0 -0
  62. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/render_benchmark_leaderboard.py +0 -0
  63. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/render_benchmark_report.py +0 -0
  64. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/ru_sentences_benchmark.py +0 -0
  65. {wavemind-2.3.2 → wavemind-2.3.3}/benchmarks/wavemind_capacity_results.json +0 -0
  66. {wavemind-2.3.2 → wavemind-2.3.3}/docs/CHROMA_MIGRATION.md +0 -0
  67. {wavemind-2.3.2 → wavemind-2.3.3}/docs/DEMO_SCRIPT.md +0 -0
  68. {wavemind-2.3.2 → wavemind-2.3.3}/docs/LAUNCH_KIT.md +0 -0
  69. {wavemind-2.3.2 → wavemind-2.3.3}/docs/OBSERVABILITY.md +0 -0
  70. {wavemind-2.3.2 → wavemind-2.3.3}/docs/PROJECT_BOARD.md +0 -0
  71. {wavemind-2.3.2 → wavemind-2.3.3}/docs/RELEASE.md +0 -0
  72. {wavemind-2.3.2 → wavemind-2.3.3}/docs/RU_LAUNCH_POSTS.md +0 -0
  73. {wavemind-2.3.2 → wavemind-2.3.3}/docs/USE_CASES.md +0 -0
  74. {wavemind-2.3.2 → wavemind-2.3.3}/docs/assets/benchmark-summary.svg +0 -0
  75. {wavemind-2.3.2 → wavemind-2.3.3}/docs/assets/wavemind-demo.gif +0 -0
  76. {wavemind-2.3.2 → wavemind-2.3.3}/docs/assets/wavemind-social-card.svg +0 -0
  77. {wavemind-2.3.2 → wavemind-2.3.3}/examples/agent_with_memory.py +0 -0
  78. {wavemind-2.3.2 → wavemind-2.3.3}/examples/chroma_migration.py +0 -0
  79. {wavemind-2.3.2 → wavemind-2.3.3}/examples/customer_support_memory.py +0 -0
  80. {wavemind-2.3.2 → wavemind-2.3.3}/examples/demo.py +0 -0
  81. {wavemind-2.3.2 → wavemind-2.3.3}/examples/dynamic_memory_demo.py +0 -0
  82. {wavemind-2.3.2 → wavemind-2.3.3}/examples/framework_integrations.py +0 -0
  83. {wavemind-2.3.2 → wavemind-2.3.3}/examples/langchain_memory.py +0 -0
  84. {wavemind-2.3.2 → wavemind-2.3.3}/examples/llamaindex_retriever.py +0 -0
  85. {wavemind-2.3.2 → wavemind-2.3.3}/examples/observability/README.md +0 -0
  86. {wavemind-2.3.2 → wavemind-2.3.3}/examples/observability/docker-compose.yml +0 -0
  87. {wavemind-2.3.2 → wavemind-2.3.3}/examples/observability/otel-collector.yaml +0 -0
  88. {wavemind-2.3.2 → wavemind-2.3.3}/examples/observability/prometheus-alerts.yml +0 -0
  89. {wavemind-2.3.2 → wavemind-2.3.3}/examples/observability/prometheus.yml +0 -0
  90. {wavemind-2.3.2 → wavemind-2.3.3}/examples/production-index-profile/README.md +0 -0
  91. {wavemind-2.3.2 → wavemind-2.3.3}/examples/production-index-profile/docker-compose.yml +0 -0
  92. {wavemind-2.3.2 → wavemind-2.3.3}/examples/research_notebook_memory.py +0 -0
  93. {wavemind-2.3.2 → wavemind-2.3.3}/examples/sharded_memory.py +0 -0
  94. {wavemind-2.3.2 → wavemind-2.3.3}/install.bat +0 -0
  95. {wavemind-2.3.2 → wavemind-2.3.3}/install.sh +0 -0
  96. {wavemind-2.3.2 → wavemind-2.3.3}/requirements-optional.txt +0 -0
  97. {wavemind-2.3.2 → wavemind-2.3.3}/requirements.txt +0 -0
  98. {wavemind-2.3.2 → wavemind-2.3.3}/setup.cfg +0 -0
  99. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_agent_memory_benchmark.py +0 -0
  100. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_ann_index_curve_benchmark.py +0 -0
  101. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_api.py +0 -0
  102. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_api_process_persistence.py +0 -0
  103. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_benchmark_brief.py +0 -0
  104. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_benchmark_charts.py +0 -0
  105. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_benchmark_leaderboard.py +0 -0
  106. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_benchmark_registry.py +0 -0
  107. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_benchmark_report.py +0 -0
  108. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_chroma_migration_example.py +0 -0
  109. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_cluster.py +0 -0
  110. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_core_persistence.py +0 -0
  111. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_dynamic_memory_benchmark.py +0 -0
  112. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_examples.py +0 -0
  113. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_field_graph.py +0 -0
  114. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_field_graph_integration.py +0 -0
  115. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_field_memory_dynamics_benchmark.py +0 -0
  116. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_framework_adapters.py +0 -0
  117. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_import_benchmark.py +0 -0
  118. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_indexes_encoders.py +0 -0
  119. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_langchain_integration.py +0 -0
  120. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_locomo_memory_benchmark.py +0 -0
  121. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_long_memory_evidence_benchmark.py +0 -0
  122. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_longmemeval_answer_benchmark.py +0 -0
  123. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_longmemeval_memory_benchmark.py +0 -0
  124. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_memory_competitor_benchmark.py +0 -0
  125. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_multimodal.py +0 -0
  126. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_nomiracl_russian_benchmark.py +0 -0
  127. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_observability.py +0 -0
  128. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_observability_docs.py +0 -0
  129. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_open_retrieval_benchmark.py +0 -0
  130. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_packaging_files.py +0 -0
  131. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_postgres_storage.py +0 -0
  132. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_production_index_profile.py +0 -0
  133. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_production_load_benchmark.py +0 -0
  134. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_replication.py +0 -0
  135. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_scale_plan.py +0 -0
  136. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_semantic_and_latency.py +0 -0
  137. {wavemind-2.3.2 → wavemind-2.3.3}/tests/test_sharding.py +0 -0
  138. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/__main__.py +0 -0
  139. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/api.py +0 -0
  140. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/benchmark.py +0 -0
  141. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/cluster.py +0 -0
  142. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/core.py +0 -0
  143. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/encoders.py +0 -0
  144. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/field_graph.py +0 -0
  145. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/importers.py +0 -0
  146. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/indexes.py +0 -0
  147. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/integrations/__init__.py +0 -0
  148. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/integrations/autogen.py +0 -0
  149. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/integrations/crewai.py +0 -0
  150. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/integrations/langchain.py +0 -0
  151. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/integrations/langgraph.py +0 -0
  152. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/integrations/llamaindex.py +0 -0
  153. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/multimodal.py +0 -0
  154. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/observability.py +0 -0
  155. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/replication.py +0 -0
  156. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/scale.py +0 -0
  157. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/sharding.py +0 -0
  158. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/storage.py +0 -0
  159. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind/studio.py +0 -0
  160. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind.egg-info/SOURCES.txt +0 -0
  161. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind.egg-info/dependency_links.txt +0 -0
  162. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind.egg-info/entry_points.txt +0 -0
  163. {wavemind-2.3.2 → wavemind-2.3.3}/wavemind.egg-info/requires.txt +0 -0
  164. {wavemind-2.3.2 → wavemind-2.3.3}/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.3.2
3
+ Version: 2.3.3
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
@@ -546,16 +546,18 @@ Checked-in result:
546
546
  |---|---:|
547
547
  | Cluster planner | 4096 namespaces, 4 nodes, replication factor 2, node-loss availability `1.000`, zone-loss availability `1.000`, write quorum `2`. |
548
548
  | Hot cache | 2000 lookups, hit rate `0.920`, p99 lookup `0.003 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.96 ms`. |
550
- | Active-active delta sync | 2 regions, bidirectional convergence `true`, stale import suppressed after delete `true`, tombstone convergence `true`, sync `114.71 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`, remote archive download validation `true`, object-store retention pruned `2`, archive restore `47.91 ms`. |
552
- | Structured payloads | image/audio/table/event retrieval, precision@1 `1.000`, p99 `0.80 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.78 ms`. |
550
+ | Active-active delta sync | 2 regions, bidirectional convergence `true`, stale import suppressed after delete `true`, tombstone convergence `true`, sync `113.81 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`, remote archive download validation `true`, object-store DR drill `true`, object-store retention pruned `2`, archive restore `72.30 ms`. |
552
+ | Structured payloads | image/audio/table/event retrieval, precision@1 `1.000`, p99 `0.79 ms`. |
553
553
 
554
554
  This profile validates routing, quorum-replicated runtime behavior, cache
555
555
  behavior, active-active namespace delta sync, replicated snapshot/restore, and
556
556
  structured payload handling, including verified offsite, archive, object-store
557
- latest lookup, object-store download, object-store retention, and archive
558
- restore.
557
+ latest lookup, object-store download, object-store retention, and a disaster
558
+ recovery drill that restores the latest object-store archive, disables the
559
+ restored primary replica, and confirms recall still works from the remaining
560
+ replicas.
559
561
  It is not a 10M-vector load test. Real 100k, 1M, and 10M latency claims should
560
562
  come from service-backed FAISS/Qdrant/pgvector load tests on production-like
561
563
  hardware.
@@ -586,15 +588,17 @@ Maintenance workers:
586
588
  ```sh
587
589
  wavemind maintenance --namespace user:42 --consolidate-steps 10 --consolidate-concepts --json
588
590
  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
591
+ wavemind replicated-drill --from s3://my-bucket/wavemind/prod --to ./state/drill-restore --query "short support replies" --expect-text "Tenant A prefers short support replies." --json
589
592
  ```
590
593
 
591
594
  The first command runs one deterministic memory pass: expired-memory purge,
592
595
  optional field/concept consolidation, and index-health repair. The second
593
596
  command creates a verified replicated snapshot, mirrors it to an offsite path,
594
597
  writes a portable `.tar.gz` archive, verifies that archive, can upload it to an
595
- S3-compatible object store, verify newest-archive metadata, and apply local and
596
- object-store retention. Production deployments can call these commands from
597
- cron, systemd, Kubernetes CronJobs, Celery, RQ, or Temporal.
598
+ S3-compatible object store, verify newest-archive metadata, run an object-store
599
+ disaster-recovery drill, and apply local and object-store retention. Production
600
+ deployments can call these commands from cron, systemd, Kubernetes CronJobs,
601
+ Celery, RQ, or Temporal.
598
602
 
599
603
  Hot-cache options:
600
604
 
@@ -717,8 +721,9 @@ node definitions. It can mirror the snapshot to a second path for offsite
717
721
  backup, write a portable `.tar.gz` archive for object-store/offsite systems,
718
722
  verify that archive, upload it to any S3-compatible object store through
719
723
  `boto3`, list the newest remote archive, restore from the newest remote archive,
720
- and apply `keep_last` retention locally, offsite, for archives, and explicitly
721
- for object-store archives through `object_store_keep_last`.
724
+ run a disaster-recovery drill from the newest or exact remote archive, and apply
725
+ `keep_last` retention locally, offsite, for archives, and explicitly for
726
+ object-store archives through `object_store_keep_last`.
722
727
  Restore refuses to overwrite a non-empty root unless `overwrite=True` is passed.
723
728
 
724
729
  Equivalent CLI:
@@ -752,6 +757,13 @@ wavemind replicated-restore \
752
757
  --to ./state/restored-replicas \
753
758
  --overwrite \
754
759
  --json
760
+
761
+ wavemind replicated-drill \
762
+ --from s3://my-bucket/wavemind/prod \
763
+ --to ./state/drill-restore \
764
+ --query "short support replies" \
765
+ --expect-text "Tenant A prefers short support replies." \
766
+ --json
755
767
  ```
756
768
 
757
769
  Install S3/R2/MinIO support with `pip install "wavemind[s3]"`. For
@@ -1131,7 +1143,7 @@ Current read:
1131
1143
  | 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. |
1132
1144
  | 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. |
1133
1145
  | 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. |
1134
- | 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/download/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. |
1146
+ | 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/download/retention verification, object-store DR drill `true`, 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. |
1135
1147
  | 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. |
1136
1148
  | 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. |
1137
1149
 
@@ -1150,7 +1162,7 @@ Current read:
1150
1162
  | 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. |
1151
1163
  | 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. |
1152
1164
  | 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. |
1153
- | 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/download/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. |
1165
+ | 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/download/retention/DR-drill 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. |
1154
1166
  | 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. |
1155
1167
  | [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. |
1156
1168
  | [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. |
@@ -1327,7 +1339,8 @@ tombstone-aware, so a stale region export cannot resurrect a deleted memory.
1327
1339
  For operational recovery, `ReplicatedSnapshotWorker` creates a checksummed
1328
1340
  replicated snapshot, verifies an optional offsite mirror, writes a verified
1329
1341
  `.tar.gz` archive, can upload that archive to S3-compatible storage, and
1330
- `restore_snapshot_archive()` restores it into a fresh replica root:
1342
+ `ReplicatedObjectStoreDrillWorker` can run a recovery drill from the newest or
1343
+ exact remote archive:
1331
1344
 
1332
1345
  ```python
1333
1346
  job = ReplicatedSnapshotWorker(memory).run_once(
@@ -1345,8 +1358,9 @@ restored, report = ReplicatedWaveMind.restore_snapshot_archive(
1345
1358
 
1346
1359
  The checked-in scale-readiness profile verifies manifest checksums, verifies the
1347
1360
  offsite mirror, verifies the portable archive, verifies S3-compatible object
1348
- upload metadata, restores three replica files from that archive, then disables
1349
- the restored primary and confirms the memory is still recalled from the
1361
+ upload metadata, downloads the latest remote archive, verifies its SHA-256
1362
+ against object metadata, restores three replica files from that archive, then
1363
+ disables the restored primary and confirms the memory is still recalled from the
1350
1364
  remaining replicas.
1351
1365
 
1352
1366
  Checked-in official LoCoMo retrieval result:
@@ -1738,7 +1752,7 @@ Near-term priorities:
1738
1752
  background updates.
1739
1753
  - Better production operations: OpenTelemetry and replicated offsite snapshot
1740
1754
  jobs with verified portable archives, S3-compatible upload, latest-archive
1741
- lookup, restore from latest, and object-store retention are
1755
+ lookup, restore from latest, object-store DR drill, and object-store retention are
1742
1756
  implemented; richer latency histograms, index-health metrics, alerting
1743
1757
  examples, real cloud disaster-recovery drills, and Postgres PITR runbooks are
1744
1758
  next.
@@ -490,16 +490,18 @@ 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.96 ms`. |
494
- | Active-active delta sync | 2 regions, bidirectional convergence `true`, stale import suppressed after delete `true`, tombstone convergence `true`, sync `114.71 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`, remote archive download validation `true`, object-store retention pruned `2`, archive restore `47.91 ms`. |
496
- | Structured payloads | image/audio/table/event retrieval, precision@1 `1.000`, p99 `0.80 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.78 ms`. |
494
+ | Active-active delta sync | 2 regions, bidirectional convergence `true`, stale import suppressed after delete `true`, tombstone convergence `true`, sync `113.81 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`, remote archive download validation `true`, object-store DR drill `true`, object-store retention pruned `2`, archive restore `72.30 ms`. |
496
+ | Structured payloads | image/audio/table/event retrieval, precision@1 `1.000`, p99 `0.79 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
500
  structured payload handling, including verified offsite, archive, object-store
501
- latest lookup, object-store download, object-store retention, and archive
502
- restore.
501
+ latest lookup, object-store download, object-store retention, and a disaster
502
+ recovery drill that restores the latest object-store archive, disables the
503
+ restored primary replica, and confirms recall still works from the remaining
504
+ replicas.
503
505
  It is not a 10M-vector load test. Real 100k, 1M, and 10M latency claims should
504
506
  come from service-backed FAISS/Qdrant/pgvector load tests on production-like
505
507
  hardware.
@@ -530,15 +532,17 @@ Maintenance workers:
530
532
  ```sh
531
533
  wavemind maintenance --namespace user:42 --consolidate-steps 10 --consolidate-concepts --json
532
534
  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
535
+ wavemind replicated-drill --from s3://my-bucket/wavemind/prod --to ./state/drill-restore --query "short support replies" --expect-text "Tenant A prefers short support replies." --json
533
536
  ```
534
537
 
535
538
  The first command runs one deterministic memory pass: expired-memory purge,
536
539
  optional field/concept consolidation, and index-health repair. The second
537
540
  command creates a verified replicated snapshot, mirrors it to an offsite path,
538
541
  writes a portable `.tar.gz` archive, verifies that archive, can upload it to an
539
- S3-compatible object store, verify newest-archive metadata, and apply local and
540
- object-store retention. Production deployments can call these commands from
541
- cron, systemd, Kubernetes CronJobs, Celery, RQ, or Temporal.
542
+ S3-compatible object store, verify newest-archive metadata, run an object-store
543
+ disaster-recovery drill, and apply local and object-store retention. Production
544
+ deployments can call these commands from cron, systemd, Kubernetes CronJobs,
545
+ Celery, RQ, or Temporal.
542
546
 
543
547
  Hot-cache options:
544
548
 
@@ -661,8 +665,9 @@ node definitions. It can mirror the snapshot to a second path for offsite
661
665
  backup, write a portable `.tar.gz` archive for object-store/offsite systems,
662
666
  verify that archive, upload it to any S3-compatible object store through
663
667
  `boto3`, list the newest remote archive, restore from the newest remote archive,
664
- and apply `keep_last` retention locally, offsite, for archives, and explicitly
665
- for object-store archives through `object_store_keep_last`.
668
+ run a disaster-recovery drill from the newest or exact remote archive, and apply
669
+ `keep_last` retention locally, offsite, for archives, and explicitly for
670
+ object-store archives through `object_store_keep_last`.
666
671
  Restore refuses to overwrite a non-empty root unless `overwrite=True` is passed.
667
672
 
668
673
  Equivalent CLI:
@@ -696,6 +701,13 @@ wavemind replicated-restore \
696
701
  --to ./state/restored-replicas \
697
702
  --overwrite \
698
703
  --json
704
+
705
+ wavemind replicated-drill \
706
+ --from s3://my-bucket/wavemind/prod \
707
+ --to ./state/drill-restore \
708
+ --query "short support replies" \
709
+ --expect-text "Tenant A prefers short support replies." \
710
+ --json
699
711
  ```
700
712
 
701
713
  Install S3/R2/MinIO support with `pip install "wavemind[s3]"`. For
@@ -1075,7 +1087,7 @@ Current read:
1075
1087
  | 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. |
1076
1088
  | 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. |
1077
1089
  | 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. |
1078
- | 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/download/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. |
1090
+ | 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/download/retention verification, object-store DR drill `true`, 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. |
1079
1091
  | 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. |
1080
1092
  | 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. |
1081
1093
 
@@ -1094,7 +1106,7 @@ Current read:
1094
1106
  | 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. |
1095
1107
  | 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. |
1096
1108
  | 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. |
1097
- | 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/download/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. |
1109
+ | 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/download/retention/DR-drill 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. |
1098
1110
  | 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. |
1099
1111
  | [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. |
1100
1112
  | [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. |
@@ -1271,7 +1283,8 @@ tombstone-aware, so a stale region export cannot resurrect a deleted memory.
1271
1283
  For operational recovery, `ReplicatedSnapshotWorker` creates a checksummed
1272
1284
  replicated snapshot, verifies an optional offsite mirror, writes a verified
1273
1285
  `.tar.gz` archive, can upload that archive to S3-compatible storage, and
1274
- `restore_snapshot_archive()` restores it into a fresh replica root:
1286
+ `ReplicatedObjectStoreDrillWorker` can run a recovery drill from the newest or
1287
+ exact remote archive:
1275
1288
 
1276
1289
  ```python
1277
1290
  job = ReplicatedSnapshotWorker(memory).run_once(
@@ -1289,8 +1302,9 @@ restored, report = ReplicatedWaveMind.restore_snapshot_archive(
1289
1302
 
1290
1303
  The checked-in scale-readiness profile verifies manifest checksums, verifies the
1291
1304
  offsite mirror, verifies the portable archive, verifies S3-compatible object
1292
- upload metadata, restores three replica files from that archive, then disables
1293
- the restored primary and confirms the memory is still recalled from the
1305
+ upload metadata, downloads the latest remote archive, verifies its SHA-256
1306
+ against object metadata, restores three replica files from that archive, then
1307
+ disables the restored primary and confirms the memory is still recalled from the
1294
1308
  remaining replicas.
1295
1309
 
1296
1310
  Checked-in official LoCoMo retrieval result:
@@ -1682,7 +1696,7 @@ Near-term priorities:
1682
1696
  background updates.
1683
1697
  - Better production operations: OpenTelemetry and replicated offsite snapshot
1684
1698
  jobs with verified portable archives, S3-compatible upload, latest-archive
1685
- lookup, restore from latest, and object-store retention are
1699
+ lookup, restore from latest, object-store DR drill, and object-store retention are
1686
1700
  implemented; richer latency histograms, index-health metrics, alerting
1687
1701
  examples, real cloud disaster-recovery drills, and Postgres PITR runbooks are
1688
1702
  next.
@@ -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.588 ms | - | WaveMind-only check |
24
+ | Scale readiness profile | production-scale | precision@1 | WaveMind structured payloads: 1 / 0.511 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 78.8<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.96<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 114.7<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, object store download verified True, restored files 3, recalled after restore node loss True, snapshot ms 176.1, restore ms 47.9<br>WaveMind structured payloads: queries 4, precision@1 1.00, avg latency 0.59, p99 latency ms 0.80 | Move from local replicated runtime to service-backed replicated runs, real cloud object-store disaster-recovery drills, 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 81.0<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.78<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 113.8<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, object store download verified True, object store drill ok True, restored files 3, recalled after restore node loss True, snapshot ms 133.9, restore ms 72.3<br>WaveMind structured payloads: queries 4, precision@1 1.00, avg latency 0.51, p99 latency ms 0.79 | 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
 
@@ -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": 78.79679999314249
767
+ "placement_ms": 81.04710001498461
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.003800028935074806
774
+ "p99_lookup_ms": 0.003400025889277458
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.9631999894045293
784
+ "p99_query_after_loss_ms": 1.7821999499574304
785
785
  },
786
786
  "WaveMind active-active delta sync": {
787
787
  "regions": 2,
@@ -790,7 +790,7 @@
790
790
  "converged_after_bidirectional_sync": true,
791
791
  "suppressed_stale_import_after_delete": true,
792
792
  "tombstone_converged": true,
793
- "sync_ms": 114.70850004116073
793
+ "sync_ms": 113.8127000303939
794
794
  },
795
795
  "WaveMind replicated snapshot": {
796
796
  "nodes": 3,
@@ -801,19 +801,20 @@
801
801
  "object_store_latest_verified": true,
802
802
  "object_store_pruned": 2,
803
803
  "object_store_download_verified": true,
804
+ "object_store_drill_ok": true,
804
805
  "restored_files": 3,
805
806
  "recalled_after_restore_node_loss": true,
806
- "snapshot_ms": 176.10959999728948,
807
- "restore_ms": 47.905499988701195
807
+ "snapshot_ms": 133.94379999954253,
808
+ "restore_ms": 72.30180001351982
808
809
  },
809
810
  "WaveMind structured payloads": {
810
811
  "queries": 4,
811
812
  "precision_at_1": 1.0,
812
- "avg_latency_ms": 0.5878500087419525,
813
- "p99_latency_ms": 0.8010999881662428
813
+ "avg_latency_ms": 0.5105750169605017,
814
+ "p99_latency_ms": 0.785200041718781
814
815
  }
815
816
  },
816
- "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/download/retention restore drills, hot-cache behavior, and structured payload recall.",
817
+ "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/download/retention/DR-drill checks, hot-cache behavior, and structured payload recall.",
817
818
  "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."
818
819
  },
819
820
  {
@@ -771,6 +771,7 @@ def _implemented_entries(root: Path) -> list[dict[str, Any]]:
771
771
  "object_store_latest_verified",
772
772
  "object_store_pruned",
773
773
  "object_store_download_verified",
774
+ "object_store_drill_ok",
774
775
  "restored_files",
775
776
  "recalled_after_restore_node_loss",
776
777
  "snapshot_ms",
@@ -787,7 +788,7 @@ def _implemented_entries(root: Path) -> list[dict[str, Any]]:
787
788
  ),
788
789
  ),
789
790
  },
790
- "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/download/retention restore drills, hot-cache behavior, and structured payload recall.",
791
+ "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/download/retention/DR-drill checks, hot-cache behavior, and structured payload recall.",
791
792
  "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.",
792
793
  },
793
794
  {
@@ -19,6 +19,7 @@ from wavemind import (
19
19
  HashingTextEncoder,
20
20
  HotMemoryCache,
21
21
  QueryResult,
22
+ ReplicatedObjectStoreDrillWorker,
22
23
  ReplicatedWaveMind,
23
24
  ReplicatedSnapshotWorker,
24
25
  S3SnapshotStore,
@@ -384,7 +385,6 @@ def run_replicated_snapshot_profile() -> dict[str, object]:
384
385
  layers=1,
385
386
  encoder=HashingTextEncoder(vector_dim=64),
386
387
  )
387
- restored = None
388
388
  try:
389
389
  namespace = "tenant:snapshot"
390
390
  memory.remember(
@@ -412,34 +412,21 @@ def run_replicated_snapshot_profile() -> dict[str, object]:
412
412
  snapshot_ms = (time.perf_counter() - snapshot_started) * 1000.0
413
413
  health = ReplicatedWaveMind.verify_snapshot(snapshot_job.snapshot_path)
414
414
  latest_object_archive = object_store.latest_archive()
415
- object_store_download_verified = False
416
- downloaded_archive = None
417
- if latest_object_archive is not None:
418
- downloaded_archive = object_store.download_archive(
419
- latest_object_archive.uri,
420
- root / "object-store-downloads",
421
- )
422
- object_store_download_verified = bool(
423
- ReplicatedWaveMind.verify_snapshot_archive(downloaded_archive)[
424
- "healthy"
425
- ]
426
- )
427
415
 
428
416
  restore_started = time.perf_counter()
429
- restored, restore = ReplicatedWaveMind.restore_snapshot_archive(
430
- downloaded_archive or snapshot_job.archive_path,
431
- root / "restored",
417
+ drill = ReplicatedObjectStoreDrillWorker(object_store).run_once(
418
+ source="s3://wavemind-benchmark/replicated",
419
+ destination=root / "restored",
420
+ download_destination=root / "object-store-downloads",
421
+ namespace=namespace,
422
+ query="snapshot restore node loss",
423
+ expected_text="replicated snapshot restore survives node loss",
432
424
  width=16,
433
425
  height=16,
434
426
  layers=1,
435
427
  encoder=HashingTextEncoder(vector_dim=64),
436
428
  )
437
429
  restore_ms = (time.perf_counter() - restore_started) * 1000.0
438
- placement = restored.placement(namespace)
439
- restored.set_node_available(placement.primary, False)
440
- recalled_after_restore_loss = bool(
441
- restored.query("snapshot restore node loss", namespace=namespace, top_k=1)
442
- )
443
430
  return {
444
431
  "engine": "WaveMind replicated snapshot",
445
432
  "nodes": len(snapshot_job.nodes),
@@ -454,17 +441,20 @@ def run_replicated_snapshot_profile() -> dict[str, object]:
454
441
  latest_object_archive and latest_object_archive.verified
455
442
  ),
456
443
  "object_store_pruned": len(snapshot_job.pruned_object_store),
457
- "object_store_download_verified": object_store_download_verified,
444
+ "object_store_download_verified": (
445
+ drill.download_matches_object and drill.archive_verified
446
+ ),
447
+ "object_store_drill_ok": drill.ok,
458
448
  "total_bytes": snapshot_job.total_bytes,
459
449
  "snapshot_ms": snapshot_ms,
460
450
  "restore_ms": restore_ms,
461
- "restored_files": len(restore.restored_files),
462
- "recalled_after_restore_node_loss": recalled_after_restore_loss,
451
+ "restored_files": drill.restored_files,
452
+ "recalled_after_restore_node_loss": bool(
453
+ drill.recalled_after_primary_loss
454
+ ),
463
455
  }
464
456
  finally:
465
457
  memory.close()
466
- if restored is not None:
467
- restored.close()
468
458
 
469
459
 
470
460
  def run_multimodal_profile() -> dict[str, object]:
@@ -570,7 +560,7 @@ def run_benchmark(
570
560
  "node/zone loss simulation, quorum-replicated runtime behavior, "
571
561
  "active-active delta sync, replicated snapshot/offsite/archive "
572
562
  "restore, S3-compatible object-store upload/latest-metadata/"
573
- "download/retention verification, hot-cache behavior, and structured payload retrieval. "
563
+ "download/retention/DR-drill verification, hot-cache behavior, and structured payload retrieval. "
574
564
  "This is not a 10M-vector database load test."
575
565
  ),
576
566
  },
@@ -623,6 +613,7 @@ def main() -> int:
623
613
  print(f"| replicated snapshot | object_store_latest_verified | {result['object_store_latest_verified']} |")
624
614
  print(f"| replicated snapshot | object_store_pruned | {result['object_store_pruned']} |")
625
615
  print(f"| replicated snapshot | object_store_download_verified | {result['object_store_download_verified']} |")
616
+ print(f"| replicated snapshot | object_store_drill_ok | {result['object_store_drill_ok']} |")
626
617
  print(f"| replicated snapshot | recalled_after_restore_node_loss | {result['recalled_after_restore_node_loss']} |")
627
618
  else:
628
619
  print(f"| structured payloads | precision@1 | {result['precision_at_1']:.3f} |")
@@ -5,7 +5,7 @@
5
5
  "namespace_count": 4096,
6
6
  "node_count": 4,
7
7
  "replication_factor": 2,
8
- "description": "Deterministic scale-readiness profile for cluster placement, node/zone loss simulation, quorum-replicated runtime behavior, active-active delta sync, replicated snapshot/offsite/archive restore, S3-compatible object-store upload/latest-metadata/download/retention verification, hot-cache behavior, and structured payload retrieval. This is not a 10M-vector database load test."
8
+ "description": "Deterministic scale-readiness profile for cluster placement, node/zone loss simulation, quorum-replicated runtime behavior, active-active delta sync, replicated snapshot/offsite/archive restore, S3-compatible object-store upload/latest-metadata/download/retention/DR-drill verification, hot-cache behavior, and structured payload retrieval. This is not a 10M-vector database load test."
9
9
  },
10
10
  "results": [
11
11
  {
@@ -14,7 +14,7 @@
14
14
  "namespaces": 4096,
15
15
  "nodes": 4,
16
16
  "replication_factor": 2,
17
- "placement_ms": 78.79679999314249,
17
+ "placement_ms": 81.04710001498461,
18
18
  "max_replica_load": 2413,
19
19
  "min_replica_load": 1728,
20
20
  "replica_load_stdev": 316.54462560593254,
@@ -32,8 +32,8 @@
32
32
  "capacity": 512,
33
33
  "hit_rate": 0.92,
34
34
  "evictions": 0,
35
- "avg_lookup_ms": 0.0016424998175352812,
36
- "p99_lookup_ms": 0.003800028935074806
35
+ "avg_lookup_ms": 0.001552849862491712,
36
+ "p99_lookup_ms": 0.003400025889277458
37
37
  },
38
38
  {
39
39
  "engine": "WaveMind replicated runtime",
@@ -47,8 +47,8 @@
47
47
  "tombstone_suppressed_before_repair": true,
48
48
  "tombstone_suppressed_after_repair": true,
49
49
  "tombstone_repair_deleted_records": 1,
50
- "avg_query_after_loss_ms": 1.9631999894045293,
51
- "p99_query_after_loss_ms": 1.9631999894045293
50
+ "avg_query_after_loss_ms": 1.7821999499574304,
51
+ "p99_query_after_loss_ms": 1.7821999499574304
52
52
  },
53
53
  {
54
54
  "engine": "WaveMind active-active delta sync",
@@ -56,7 +56,7 @@
56
56
  "replication_factor_per_region": 3,
57
57
  "records_imported": 6,
58
58
  "converged_after_bidirectional_sync": true,
59
- "sync_ms": 114.70850004116073,
59
+ "sync_ms": 113.8127000303939,
60
60
  "suppressed_stale_import_after_delete": true,
61
61
  "tombstone_deleted_records": 3,
62
62
  "tombstone_converged": true
@@ -71,9 +71,10 @@
71
71
  "object_store_latest_verified": true,
72
72
  "object_store_pruned": 2,
73
73
  "object_store_download_verified": true,
74
+ "object_store_drill_ok": true,
74
75
  "total_bytes": 110592,
75
- "snapshot_ms": 176.10959999728948,
76
- "restore_ms": 47.905499988701195,
76
+ "snapshot_ms": 133.94379999954253,
77
+ "restore_ms": 72.30180001351982,
77
78
  "restored_files": 3,
78
79
  "recalled_after_restore_node_loss": true
79
80
  },
@@ -87,8 +88,8 @@
87
88
  ],
88
89
  "queries": 4,
89
90
  "precision_at_1": 1.0,
90
- "avg_latency_ms": 0.5878500087419525,
91
- "p99_latency_ms": 0.8010999881662428
91
+ "avg_latency_ms": 0.5105750169605017,
92
+ "p99_latency_ms": 0.785200041718781
92
93
  }
93
94
  ]
94
95
  }
@@ -4,7 +4,7 @@ services:
4
4
  context: .
5
5
  args:
6
6
  INSTALL_OPTIONAL: "false"
7
- image: wavemind:2.3.2
7
+ image: wavemind:2.3.3
8
8
  restart: unless-stopped
9
9
  environment:
10
10
  WAVEMIND_DB: /data/wavemind.sqlite3
@@ -31,7 +31,7 @@ purpose-built vector databases.
31
31
  | NoMIRACL Russian retrieval | WaveMind reaches `nDCG@10 0.434`; Chroma reaches `0.435`; Qdrant reaches `0.433`. Chroma is faster. | `benchmarks/nomiracl_russian_results.json` | `python benchmarks/nomiracl_russian_benchmark.py --engines wavemind chroma qdrant --output benchmarks/nomiracl_russian_results.json` |
32
32
  | Production index profile | At 50000 vectors, persisted FAISS and Qdrant service both reach `recall@10 1.000`; pgvector with `ef_search=400` reaches `0.811`. | `benchmarks/production_index_profile_results.json` | `docker compose -f examples/production-index-profile/docker-compose.yml run --rm benchmark` |
33
33
  | Production load profile | At 100000 vectors, Qdrant service reaches `recall@10 1.000`, avg `10.28 ms`, p99 `21.26 ms`. At 1M vectors, tuned Qdrant reaches `0.984`, avg `116.80 ms`, p99 `209.28 ms`; the best EF-sweep point reaches `0.977`, avg `64.76 ms`, p99 `103.77 ms`. | `benchmarks/production_load_qdrant_100k_tuned_results.json`, `benchmarks/production_load_qdrant_1m_tuned_results.json`, `benchmarks/production_load_qdrant_1m_ef_sweep_results.json` | `python benchmarks/production_load_benchmark.py --sizes 100000 --engines qdrant-service` |
34
- | Scale readiness profile | Deterministic 1M-memory simulation: namespace placement survives node loss and zone loss at `1.000`, hot-cache hit rate is `0.920`, replicated runtime survives node loss, active-active delta sync converges, replicated snapshot restore survives primary loss, offsite mirror verification is `true`, portable archive verification is `true`, S3-compatible upload verification is `true`, latest remote archive metadata verification is `true`, remote archive download verification is `true`, object-store retention prunes `2` stale archives, structured payload precision@1 is `1.000`. | `benchmarks/scale_readiness_results.json` | `python benchmarks/scale_readiness_benchmark.py --simulated-memories 1000000 --output benchmarks/scale_readiness_results.json` |
34
+ | Scale readiness profile | Deterministic 1M-memory simulation: namespace placement survives node loss and zone loss at `1.000`, hot-cache hit rate is `0.920`, replicated runtime survives node loss, active-active delta sync converges, replicated snapshot restore survives primary loss, offsite mirror verification is `true`, portable archive verification is `true`, S3-compatible upload verification is `true`, latest remote archive metadata verification is `true`, remote archive download verification is `true`, object-store DR drill is `true`, object-store retention prunes `2` stale archives, structured payload precision@1 is `1.000`. | `benchmarks/scale_readiness_results.json` | `python benchmarks/scale_readiness_benchmark.py --simulated-memories 1000000 --output benchmarks/scale_readiness_results.json` |
35
35
  | Memory competitor adapter profile | WaveMind reaches `precision@1 0.80`, `precision@3 1.00`, stale suppression `1.00`; Mem0, Zep, and LangGraph are skipped until real packages/services are configured. | `benchmarks/memory_competitor_results.json` | `python benchmarks/memory_competitor_benchmark.py --engines wavemind mem0 zep langgraph` |
36
36
 
37
37
  The generated matrix view is in `benchmarks/BENCHMARK_REPORT.md`; the compact
@@ -53,8 +53,9 @@ policy matters more than raw vector-database scale:
53
53
  namespace placement, quorum-replicated runtime behavior, active-active
54
54
  namespace delta sync, checksummed replicated snapshot/restore with offsite
55
55
  and portable-archive verification, S3-compatible object-store upload,
56
- latest-archive metadata, remote download, and retention verification,
57
- hot-cache behavior, and structured-payload retrieval.
56
+ latest-archive metadata, remote download, retention verification, and a
57
+ deterministic object-store disaster-recovery drill, hot-cache behavior, and
58
+ structured-payload retrieval.
58
59
  - Dynamic policy already covers hot memory, stale suppression, corrections,
59
60
  TTL, and namespace isolation.
60
61
  - Field self-consolidation is available through `WaveMind.consolidate_concepts()`,
@@ -68,8 +69,9 @@ policy matters more than raw vector-database scale:
68
69
  - SQLite backup, timestamped retention, restore, admin-only HTTP backup,
69
70
  replicated snapshot/restore, offsite-mirrored snapshot jobs, and verified
70
71
  `.tar.gz` snapshot archives with S3-compatible upload, latest-archive lookup,
71
- restore-from-latest support, remote download verification, and object-store
72
- retention are available as the first durability layer.
72
+ restore-from-latest support, remote download verification, object-store
73
+ disaster-recovery drills, and object-store retention are available as the
74
+ first durability layer.
73
75
  - Public retrieval evidence exists for LoCoMo, LongMemEval, and BEIR/SciFact,
74
76
  but full answer-quality evaluation is still the next proof step.
75
77
 
@@ -249,9 +251,9 @@ Enterprise requirements:
249
251
  - backup, restore, and point-in-time recovery. SQLite backup/restore and
250
252
  replicated snapshot/restore, offsite-mirrored snapshot jobs, and portable
251
253
  snapshot archives with S3-compatible upload, latest-archive lookup, remote
252
- download verification, and retention are implemented; point-in-time recovery,
253
- real cloud disaster-recovery drills, and network-service consensus remain
254
- future work;
254
+ download verification, object-store disaster-recovery drills, and retention
255
+ are implemented; point-in-time recovery, real multi-region cloud
256
+ disaster-recovery drills, and network-service consensus remain future work;
255
257
  - data residency controls;
256
258
  - SSO/OAuth integration;
257
259
  - SLOs for latency, throughput, and durability;