wavemind 2.2.8__tar.gz → 2.2.9__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.
- {wavemind-2.2.8 → wavemind-2.2.9}/PKG-INFO +38 -31
- {wavemind-2.2.8 → wavemind-2.2.9}/README.md +37 -30
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/BENCHMARK_LEADERBOARD.md +1 -1
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/BENCHMARK_REPORT.md +1 -1
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/benchmark_matrix_results.json +11 -10
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/benchmark_registry.py +3 -2
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/scale_readiness_benchmark.py +7 -4
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/scale_readiness_results.json +12 -11
- {wavemind-2.2.8 → wavemind-2.2.9}/docker-compose.yml +1 -1
- {wavemind-2.2.8 → wavemind-2.2.9}/docs/BENCHMARK_BRIEF.md +1 -1
- {wavemind-2.2.8 → wavemind-2.2.9}/docs/ROADMAP.md +7 -6
- {wavemind-2.2.8 → wavemind-2.2.9}/pyproject.toml +1 -1
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_cli_smoke.py +5 -1
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_jobs.py +94 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_scale_readiness_benchmark.py +1 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/__init__.py +3 -1
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/cli.py +19 -6
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/jobs.py +37 -1
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/replication.py +162 -1
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind.egg-info/PKG-INFO +38 -31
- {wavemind-2.2.8 → wavemind-2.2.9}/CONTRIBUTING.md +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/Dockerfile +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/LICENSE +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/MANIFEST.in +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/SECURITY.md +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/SUPPORT.md +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/agent_memory_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/agent_memory_results.json +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/ann_index_curve_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/ann_index_curve_results.json +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/dynamic_memory_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/dynamic_memory_results.json +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/field_memory_dynamics_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/field_memory_dynamics_results.json +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/locomo_evidence_results.json +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/locomo_memory_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/locomo_sentence_evidence_results.json +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/long_memory_evidence_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/long_memory_evidence_results.json +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/longmemeval_answer_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/longmemeval_answer_extractive_20_results.json +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/longmemeval_answer_qwen25_0_5b_50_results.json +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/longmemeval_answer_qwen25_1_5b_50_results.json +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/longmemeval_evidence_50_results.json +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/longmemeval_evidence_results.json +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/longmemeval_memory_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/memory_competitor_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/memory_competitor_results.json +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/nomiracl_russian_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/nomiracl_russian_results.json +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/open_retrieval_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/open_retrieval_scifact_results.json +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/production_index_profile_results.json +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/production_load_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/production_load_qdrant_100k_tuned_results.json +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/production_load_qdrant_1m_ef_sweep_results.json +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/production_load_qdrant_1m_results.json +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/production_load_qdrant_1m_tuned_results.json +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/production_load_results.json +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/render_benchmark_charts.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/render_benchmark_leaderboard.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/render_benchmark_report.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/ru_sentences_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/benchmarks/wavemind_capacity_results.json +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/docs/CHROMA_MIGRATION.md +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/docs/DEMO_SCRIPT.md +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/docs/LAUNCH_KIT.md +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/docs/OBSERVABILITY.md +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/docs/PROJECT_BOARD.md +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/docs/RELEASE.md +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/docs/RU_LAUNCH_POSTS.md +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/docs/USE_CASES.md +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/docs/assets/benchmark-summary.svg +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/docs/assets/wavemind-demo.gif +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/docs/assets/wavemind-social-card.svg +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/examples/agent_with_memory.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/examples/chroma_migration.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/examples/customer_support_memory.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/examples/demo.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/examples/dynamic_memory_demo.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/examples/framework_integrations.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/examples/langchain_memory.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/examples/llamaindex_retriever.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/examples/observability/README.md +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/examples/observability/docker-compose.yml +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/examples/observability/otel-collector.yaml +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/examples/observability/prometheus-alerts.yml +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/examples/observability/prometheus.yml +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/examples/production-index-profile/README.md +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/examples/production-index-profile/docker-compose.yml +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/examples/research_notebook_memory.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/examples/sharded_memory.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/install.bat +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/install.sh +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/requirements-optional.txt +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/requirements.txt +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/setup.cfg +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_agent_memory_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_ann_index_curve_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_api.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_api_process_persistence.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_benchmark_brief.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_benchmark_charts.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_benchmark_leaderboard.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_benchmark_registry.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_benchmark_report.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_chroma_migration_example.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_cluster.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_core_persistence.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_dynamic_memory_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_examples.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_field_graph.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_field_graph_integration.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_field_memory_dynamics_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_framework_adapters.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_import_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_indexes_encoders.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_langchain_integration.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_locomo_memory_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_long_memory_evidence_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_longmemeval_answer_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_longmemeval_memory_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_memory_competitor_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_multimodal.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_nomiracl_russian_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_observability.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_observability_docs.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_open_retrieval_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_packaging_files.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_postgres_storage.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_production_index_profile.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_production_load_benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_replication.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_scale_plan.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_semantic_and_latency.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/tests/test_sharding.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/__main__.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/api.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/benchmark.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/cluster.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/core.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/encoders.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/field_graph.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/importers.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/indexes.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/integrations/__init__.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/integrations/autogen.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/integrations/crewai.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/integrations/langchain.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/integrations/langgraph.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/integrations/llamaindex.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/multimodal.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/observability.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/scale.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/sharding.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/storage.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind/studio.py +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind.egg-info/SOURCES.txt +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind.egg-info/dependency_links.txt +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind.egg-info/entry_points.txt +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/wavemind.egg-info/requires.txt +0 -0
- {wavemind-2.2.8 → wavemind-2.2.9}/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.
|
|
3
|
+
Version: 2.2.9
|
|
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
|
|
@@ -543,16 +543,17 @@ Checked-in result:
|
|
|
543
543
|
|---|---:|
|
|
544
544
|
| Cluster planner | 4096 namespaces, 4 nodes, replication factor 2, node-loss availability `1.000`, zone-loss availability `1.000`, write quorum `2`. |
|
|
545
545
|
| 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.
|
|
547
|
-
| Active-active delta sync | 2 regions, bidirectional convergence `true`, stale import suppressed after delete `true`, tombstone convergence `true`, sync `
|
|
548
|
-
| Replicated snapshot job | 3 replica files, manifest checksum validation `true`, offsite mirror validation `true`, restore `
|
|
549
|
-
| Structured payloads | image/audio/table/event retrieval, precision@1 `1.000`, p99 `0.
|
|
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`. |
|
|
550
550
|
|
|
551
551
|
This profile validates routing, quorum-replicated runtime behavior, cache
|
|
552
552
|
behavior, active-active namespace delta sync, replicated snapshot/restore, and
|
|
553
|
-
structured payload handling
|
|
554
|
-
and 10M latency claims should
|
|
555
|
-
load tests on production-like
|
|
553
|
+
structured payload handling, including verified offsite and archive restore.
|
|
554
|
+
It is not a 10M-vector load test. Real 100k, 1M, and 10M latency claims should
|
|
555
|
+
come from service-backed FAISS/Qdrant/pgvector load tests on production-like
|
|
556
|
+
hardware.
|
|
556
557
|
|
|
557
558
|
Cluster placement planning:
|
|
558
559
|
|
|
@@ -579,14 +580,15 @@ Maintenance workers:
|
|
|
579
580
|
|
|
580
581
|
```sh
|
|
581
582
|
wavemind maintenance --namespace user:42 --consolidate-steps 10 --consolidate-concepts --json
|
|
582
|
-
wavemind replicated-snapshot --root ./state/replicas --node node-a --node node-b --node node-c --out ./backups/replicated --offsite ./offsite/replicated --keep-last 7 --json
|
|
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
|
|
583
584
|
```
|
|
584
585
|
|
|
585
586
|
The first command runs one deterministic memory pass: expired-memory purge,
|
|
586
587
|
optional field/concept consolidation, and index-health repair. The second
|
|
587
588
|
command creates a verified replicated snapshot, mirrors it to an offsite path,
|
|
588
|
-
|
|
589
|
-
|
|
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.
|
|
590
592
|
|
|
591
593
|
Hot-cache options:
|
|
592
594
|
|
|
@@ -689,12 +691,13 @@ memory.remember("Tenant A prefers short support replies.", namespace="tenant:a")
|
|
|
689
691
|
snapshot_job = ReplicatedSnapshotWorker(memory).run_once(
|
|
690
692
|
destination="./backups/replicated",
|
|
691
693
|
offsite_destination="./offsite/replicated",
|
|
694
|
+
archive_destination="./archives/replicated",
|
|
692
695
|
keep_last=7,
|
|
693
696
|
)
|
|
694
697
|
assert snapshot_job.ok
|
|
695
698
|
|
|
696
|
-
restored, report = ReplicatedWaveMind.
|
|
697
|
-
snapshot_job.
|
|
699
|
+
restored, report = ReplicatedWaveMind.restore_snapshot_archive(
|
|
700
|
+
snapshot_job.archive_path,
|
|
698
701
|
"./state/restored-replicas",
|
|
699
702
|
encoder=HashingTextEncoder(vector_dim=64),
|
|
700
703
|
)
|
|
@@ -703,8 +706,10 @@ restored, report = ReplicatedWaveMind.restore_snapshot(
|
|
|
703
706
|
The replicated snapshot job writes one SQLite backup per replica plus
|
|
704
707
|
`manifest.json` with SHA-256 checksums, replica metadata, quorum settings, and
|
|
705
708
|
node definitions. It can mirror the snapshot to a second path for offsite
|
|
706
|
-
backup
|
|
707
|
-
|
|
709
|
+
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.
|
|
708
713
|
|
|
709
714
|
Equivalent CLI:
|
|
710
715
|
|
|
@@ -714,11 +719,12 @@ wavemind replicated-snapshot \
|
|
|
714
719
|
--node node-a --node node-b --node node-c \
|
|
715
720
|
--out ./backups/replicated \
|
|
716
721
|
--offsite ./offsite/replicated \
|
|
722
|
+
--archive ./archives/replicated \
|
|
717
723
|
--keep-last 7 \
|
|
718
724
|
--json
|
|
719
725
|
|
|
720
726
|
wavemind replicated-restore \
|
|
721
|
-
--from ./
|
|
727
|
+
--from ./archives/replicated/wavemind-replicated-20260705-120000.tar.gz \
|
|
722
728
|
--to ./state/restored-replicas \
|
|
723
729
|
--overwrite \
|
|
724
730
|
--json
|
|
@@ -1097,7 +1103,7 @@ Current read:
|
|
|
1097
1103
|
| LongMemEval 50-query smoke | On the first 50 non-abstention LongMemEval-S questions, WaveMind reaches `evidence_recall@5 0.920`, `precision@1 0.760`, and `MRR@5 0.827`; Chroma/Qdrant static reach `0.600`, `0.260`, and `0.385`. | This is the fast regression profile for checking current changes before rerunning the full LongMemEval profile. WaveMind wins on quality; latency still needs work. |
|
|
1098
1104
|
| ANN/index curve | At 50000 generated 128-d vectors, NumPy exact keeps `recall@10 1.000` at `6.49 ms`; quantized int8 keeps `0.934` at `24.92 ms`; Annoy is faster at `4.92 ms` but drops to `0.730` recall; Qdrant local keeps `1.000` recall at `43.49 ms`. | Current local scale boundary is clear: quantized search needs kernel work, Annoy needs tuning/FAISS, and Qdrant should be tested in service mode for a fair production comparison. |
|
|
1099
1105
|
| Production load | At 100000 generated 128-d vectors, service-mode Qdrant reaches `recall@10 1.000`, avg `10.28 ms`, p99 `21.26 ms`. At 1M, tuned Qdrant reaches `recall@10 0.984`, avg `116.80 ms`, p99 `209.28 ms`; an EF sweep finds `recall@10 0.977`, avg `64.76 ms`, p99 `103.77 ms` at `hnsw_ef=2048` on 30 queries. | 100k is production-grade on the tested machine. 1M recall is now strong, but p99 still needs tuning before claiming a stable sub-100 ms SLO. |
|
|
1100
|
-
| Scale readiness | Deterministic 1M-memory simulation validates 4096 namespace placements over 4 nodes with replication factor 2, node-loss availability `1.000`, zone-loss availability `1.000`, hot-cache hit rate `0.920`, quorum-replicated runtime recall after node loss, missing-record repair, tombstone repair, active-active delta sync, checksummed replicated snapshot/restore, offsite
|
|
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. |
|
|
1101
1107
|
| Memory competitor adapters | WaveMind reaches `precision@1 0.80`, `precision@3 1.00`, stale suppression `1.00` on the small adapter profile. Mem0, Zep, and LangGraph are listed as skipped unless their real packages/services are configured. | This prevents fake competitor claims. The adapter harness is ready; real Mem0/Zep/LangGraph results still need configured installs. |
|
|
1102
1108
|
| LongMemEval local answer generation | With the same local Ollama `qwen2.5:1.5b`, WaveMind reaches `exact_match 0.240`, `contains_answer 0.380`, `token_f1 0.333`, and `evidence_recall@5 0.920`; Chroma and Qdrant static both reach `0.120`, `0.160`, `0.170`, and `0.600`. | This is the first checked-in end-to-end answer benchmark against Chroma/Qdrant. It is still a 50-question lightweight smoke run, not a full LongMemEval leaderboard score. |
|
|
1103
1109
|
|
|
@@ -1116,7 +1122,7 @@ Current read:
|
|
|
1116
1122
|
| Production index profile | Docker-backed 50000-vector profile for persisted FAISS, Qdrant service, and PostgreSQL/pgvector HNSW. | implemented | FAISS / Qdrant service / pgvector | Keep service-mode candidate generation above `0.95` recall@10 and below 10 ms average query latency at 50000 vectors. |
|
|
1117
1123
|
| Production load profile | 100k and 1M service-backed candidate-index checks with p95/p99 latency. | implemented | Qdrant service / pgvector HNSW / FAISS persisted | Keep 100k at recall@10 `1.000`; push 1M p99 below 100 ms with recall@10 >= 0.95. |
|
|
1118
1124
|
| Qdrant 1M HNSW ef sweep | One 1M Qdrant collection queried with multiple `hnsw_ef` values. | implemented | Qdrant service | Repeat with 100+ queries and collection-level HNSW build parameters before claiming a stable 1M SLO. |
|
|
1119
|
-
| Scale readiness profile | Cluster placement, node/zone-loss simulation, quorum report, replicated runtime, active-active delta sync, replicated snapshot/restore with offsite verification, hot-cache behavior, and structured/multimodal payload retrieval. | implemented | Mem0 / Zep / LangGraph persistent memory / GraphRAG target adapters | Keep quorum replication, namespace-delta sync, repair, offsite backup, and restore drills green while adding larger service-backed 10M load tests. |
|
|
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. |
|
|
1120
1126
|
| Memory competitor adapter profile | Dynamic-memory scenario wired for external memory frameworks. | implemented | Mem0 / Zep / LangGraph persistent memory | Report real competitor results only when their packages/services are explicitly configured. |
|
|
1121
1127
|
| [BEIR](https://github.com/beir-cellar/beir) | Standard zero-shot information retrieval quality. | planned | Chroma / Qdrant / FAISS | Stay within 0.02 `nDCG@10` on identical embeddings. |
|
|
1122
1128
|
| [MTEB Retrieval](https://github.com/embeddings-benchmark/mteb) | Separates encoder quality from retrieval-store quality. | planned | Chroma / Qdrant / FAISS | Prove WaveMind does not reduce same-embedding retrieval quality. |
|
|
@@ -1291,25 +1297,27 @@ The delta contains active records plus tombstones. Import is idempotent and
|
|
|
1291
1297
|
tombstone-aware, so a stale region export cannot resurrect a deleted memory.
|
|
1292
1298
|
|
|
1293
1299
|
For operational recovery, `ReplicatedSnapshotWorker` creates a checksummed
|
|
1294
|
-
replicated snapshot, verifies an optional offsite mirror,
|
|
1295
|
-
`
|
|
1300
|
+
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:
|
|
1296
1303
|
|
|
1297
1304
|
```python
|
|
1298
1305
|
job = ReplicatedSnapshotWorker(memory).run_once(
|
|
1299
1306
|
destination="./backups/replicated",
|
|
1300
1307
|
offsite_destination="./offsite/replicated",
|
|
1308
|
+
archive_destination="./archives/replicated",
|
|
1301
1309
|
keep_last=7,
|
|
1302
1310
|
)
|
|
1303
|
-
restored, report = ReplicatedWaveMind.
|
|
1304
|
-
job.
|
|
1311
|
+
restored, report = ReplicatedWaveMind.restore_snapshot_archive(
|
|
1312
|
+
job.archive_path,
|
|
1305
1313
|
"./state/restored-replicas",
|
|
1306
1314
|
)
|
|
1307
1315
|
```
|
|
1308
1316
|
|
|
1309
1317
|
The checked-in scale-readiness profile verifies manifest checksums, verifies the
|
|
1310
|
-
offsite mirror, restores three replica files from
|
|
1311
|
-
disables the restored primary and confirms the memory is
|
|
1312
|
-
remaining replicas.
|
|
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.
|
|
1313
1321
|
|
|
1314
1322
|
Checked-in official LoCoMo retrieval result:
|
|
1315
1323
|
|
|
@@ -1659,9 +1667,8 @@ If you already use Chroma for local memory, see the practical migration guide:
|
|
|
1659
1667
|
- The dynamic benchmark currently compares WaveMind against a static Chroma baseline. Chroma and Qdrant can implement similar behavior with extra application-layer metadata policy, deletes, filters, and reinforcement logic.
|
|
1660
1668
|
- `MemoryFieldGraph` is a discrete graph over stored memories, not a continuous mathematical field. Its current build path should be optimized with incremental edge updates before large production use.
|
|
1661
1669
|
- pgvector is a candidate-index backend. PostgreSQL source-of-truth storage is
|
|
1662
|
-
also available separately, but migrations, PITR docs,
|
|
1663
|
-
|
|
1664
|
-
coverage.
|
|
1670
|
+
also available separately, but migrations, PITR docs, and service benchmark
|
|
1671
|
+
profiles still need more real deployment coverage.
|
|
1665
1672
|
- The Qdrant backend is also a candidate-index backend. WaveMind rebuilds it
|
|
1666
1673
|
from SQLite on load/build, so large service-mode deployments still need a
|
|
1667
1674
|
measured rebuild strategy and index-health monitoring.
|
|
@@ -1700,9 +1707,9 @@ Near-term priorities:
|
|
|
1700
1707
|
- Faster dynamic re-ranking through smaller candidate windows, caching, and
|
|
1701
1708
|
background updates.
|
|
1702
1709
|
- Better production operations: OpenTelemetry and replicated offsite snapshot
|
|
1703
|
-
jobs are implemented; richer latency
|
|
1704
|
-
|
|
1705
|
-
are next.
|
|
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.
|
|
1706
1713
|
|
|
1707
1714
|
Longer-term direction:
|
|
1708
1715
|
|
|
@@ -490,16 +490,17 @@ Checked-in result:
|
|
|
490
490
|
|---|---:|
|
|
491
491
|
| Cluster planner | 4096 namespaces, 4 nodes, replication factor 2, node-loss availability `1.000`, zone-loss availability `1.000`, write quorum `2`. |
|
|
492
492
|
| Hot cache | 2000 lookups, hit rate `0.920`, p99 lookup `0.003 ms`. |
|
|
493
|
-
| Replicated runtime | 3 physical WaveMind stores, replication factor 3, write quorum 2, node-loss recall `true`, repair copied `1` missing record, tombstone repair deleted `1` stale record, p99 query-after-loss `1.
|
|
494
|
-
| Active-active delta sync | 2 regions, bidirectional convergence `true`, stale import suppressed after delete `true`, tombstone convergence `true`, sync `
|
|
495
|
-
| Replicated snapshot job | 3 replica files, manifest checksum validation `true`, offsite mirror validation `true`, restore `
|
|
496
|
-
| Structured payloads | image/audio/table/event retrieval, precision@1 `1.000`, p99 `0.
|
|
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`. |
|
|
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
|
|
501
|
-
and 10M latency claims should
|
|
502
|
-
load tests on production-like
|
|
500
|
+
structured payload handling, including verified offsite and archive restore.
|
|
501
|
+
It is not a 10M-vector load test. Real 100k, 1M, and 10M latency claims should
|
|
502
|
+
come from service-backed FAISS/Qdrant/pgvector load tests on production-like
|
|
503
|
+
hardware.
|
|
503
504
|
|
|
504
505
|
Cluster placement planning:
|
|
505
506
|
|
|
@@ -526,14 +527,15 @@ Maintenance workers:
|
|
|
526
527
|
|
|
527
528
|
```sh
|
|
528
529
|
wavemind maintenance --namespace user:42 --consolidate-steps 10 --consolidate-concepts --json
|
|
529
|
-
wavemind replicated-snapshot --root ./state/replicas --node node-a --node node-b --node node-c --out ./backups/replicated --offsite ./offsite/replicated --keep-last 7 --json
|
|
530
|
+
wavemind replicated-snapshot --root ./state/replicas --node node-a --node node-b --node node-c --out ./backups/replicated --offsite ./offsite/replicated --archive ./archives/replicated --keep-last 7 --json
|
|
530
531
|
```
|
|
531
532
|
|
|
532
533
|
The first command runs one deterministic memory pass: expired-memory purge,
|
|
533
534
|
optional field/concept consolidation, and index-health repair. The second
|
|
534
535
|
command creates a verified replicated snapshot, mirrors it to an offsite path,
|
|
535
|
-
|
|
536
|
-
|
|
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
539
|
|
|
538
540
|
Hot-cache options:
|
|
539
541
|
|
|
@@ -636,12 +638,13 @@ memory.remember("Tenant A prefers short support replies.", namespace="tenant:a")
|
|
|
636
638
|
snapshot_job = ReplicatedSnapshotWorker(memory).run_once(
|
|
637
639
|
destination="./backups/replicated",
|
|
638
640
|
offsite_destination="./offsite/replicated",
|
|
641
|
+
archive_destination="./archives/replicated",
|
|
639
642
|
keep_last=7,
|
|
640
643
|
)
|
|
641
644
|
assert snapshot_job.ok
|
|
642
645
|
|
|
643
|
-
restored, report = ReplicatedWaveMind.
|
|
644
|
-
snapshot_job.
|
|
646
|
+
restored, report = ReplicatedWaveMind.restore_snapshot_archive(
|
|
647
|
+
snapshot_job.archive_path,
|
|
645
648
|
"./state/restored-replicas",
|
|
646
649
|
encoder=HashingTextEncoder(vector_dim=64),
|
|
647
650
|
)
|
|
@@ -650,8 +653,10 @@ restored, report = ReplicatedWaveMind.restore_snapshot(
|
|
|
650
653
|
The replicated snapshot job writes one SQLite backup per replica plus
|
|
651
654
|
`manifest.json` with SHA-256 checksums, replica metadata, quorum settings, and
|
|
652
655
|
node definitions. It can mirror the snapshot to a second path for offsite
|
|
653
|
-
backup
|
|
654
|
-
|
|
656
|
+
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.
|
|
655
660
|
|
|
656
661
|
Equivalent CLI:
|
|
657
662
|
|
|
@@ -661,11 +666,12 @@ wavemind replicated-snapshot \
|
|
|
661
666
|
--node node-a --node node-b --node node-c \
|
|
662
667
|
--out ./backups/replicated \
|
|
663
668
|
--offsite ./offsite/replicated \
|
|
669
|
+
--archive ./archives/replicated \
|
|
664
670
|
--keep-last 7 \
|
|
665
671
|
--json
|
|
666
672
|
|
|
667
673
|
wavemind replicated-restore \
|
|
668
|
-
--from ./
|
|
674
|
+
--from ./archives/replicated/wavemind-replicated-20260705-120000.tar.gz \
|
|
669
675
|
--to ./state/restored-replicas \
|
|
670
676
|
--overwrite \
|
|
671
677
|
--json
|
|
@@ -1044,7 +1050,7 @@ Current read:
|
|
|
1044
1050
|
| LongMemEval 50-query smoke | On the first 50 non-abstention LongMemEval-S questions, WaveMind reaches `evidence_recall@5 0.920`, `precision@1 0.760`, and `MRR@5 0.827`; Chroma/Qdrant static reach `0.600`, `0.260`, and `0.385`. | This is the fast regression profile for checking current changes before rerunning the full LongMemEval profile. WaveMind wins on quality; latency still needs work. |
|
|
1045
1051
|
| ANN/index curve | At 50000 generated 128-d vectors, NumPy exact keeps `recall@10 1.000` at `6.49 ms`; quantized int8 keeps `0.934` at `24.92 ms`; Annoy is faster at `4.92 ms` but drops to `0.730` recall; Qdrant local keeps `1.000` recall at `43.49 ms`. | Current local scale boundary is clear: quantized search needs kernel work, Annoy needs tuning/FAISS, and Qdrant should be tested in service mode for a fair production comparison. |
|
|
1046
1052
|
| Production load | At 100000 generated 128-d vectors, service-mode Qdrant reaches `recall@10 1.000`, avg `10.28 ms`, p99 `21.26 ms`. At 1M, tuned Qdrant reaches `recall@10 0.984`, avg `116.80 ms`, p99 `209.28 ms`; an EF sweep finds `recall@10 0.977`, avg `64.76 ms`, p99 `103.77 ms` at `hnsw_ef=2048` on 30 queries. | 100k is production-grade on the tested machine. 1M recall is now strong, but p99 still needs tuning before claiming a stable sub-100 ms SLO. |
|
|
1047
|
-
| Scale readiness | Deterministic 1M-memory simulation validates 4096 namespace placements over 4 nodes with replication factor 2, node-loss availability `1.000`, zone-loss availability `1.000`, hot-cache hit rate `0.920`, quorum-replicated runtime recall after node loss, missing-record repair, tombstone repair, active-active delta sync, checksummed replicated snapshot/restore, offsite
|
|
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. |
|
|
1048
1054
|
| Memory competitor adapters | WaveMind reaches `precision@1 0.80`, `precision@3 1.00`, stale suppression `1.00` on the small adapter profile. Mem0, Zep, and LangGraph are listed as skipped unless their real packages/services are configured. | This prevents fake competitor claims. The adapter harness is ready; real Mem0/Zep/LangGraph results still need configured installs. |
|
|
1049
1055
|
| LongMemEval local answer generation | With the same local Ollama `qwen2.5:1.5b`, WaveMind reaches `exact_match 0.240`, `contains_answer 0.380`, `token_f1 0.333`, and `evidence_recall@5 0.920`; Chroma and Qdrant static both reach `0.120`, `0.160`, `0.170`, and `0.600`. | This is the first checked-in end-to-end answer benchmark against Chroma/Qdrant. It is still a 50-question lightweight smoke run, not a full LongMemEval leaderboard score. |
|
|
1050
1056
|
|
|
@@ -1063,7 +1069,7 @@ Current read:
|
|
|
1063
1069
|
| Production index profile | Docker-backed 50000-vector profile for persisted FAISS, Qdrant service, and PostgreSQL/pgvector HNSW. | implemented | FAISS / Qdrant service / pgvector | Keep service-mode candidate generation above `0.95` recall@10 and below 10 ms average query latency at 50000 vectors. |
|
|
1064
1070
|
| Production load profile | 100k and 1M service-backed candidate-index checks with p95/p99 latency. | implemented | Qdrant service / pgvector HNSW / FAISS persisted | Keep 100k at recall@10 `1.000`; push 1M p99 below 100 ms with recall@10 >= 0.95. |
|
|
1065
1071
|
| Qdrant 1M HNSW ef sweep | One 1M Qdrant collection queried with multiple `hnsw_ef` values. | implemented | Qdrant service | Repeat with 100+ queries and collection-level HNSW build parameters before claiming a stable 1M SLO. |
|
|
1066
|
-
| Scale readiness profile | Cluster placement, node/zone-loss simulation, quorum report, replicated runtime, active-active delta sync, replicated snapshot/restore with offsite verification, hot-cache behavior, and structured/multimodal payload retrieval. | implemented | Mem0 / Zep / LangGraph persistent memory / GraphRAG target adapters | Keep quorum replication, namespace-delta sync, repair, offsite backup, and restore drills green while adding larger service-backed 10M load tests. |
|
|
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. |
|
|
1067
1073
|
| Memory competitor adapter profile | Dynamic-memory scenario wired for external memory frameworks. | implemented | Mem0 / Zep / LangGraph persistent memory | Report real competitor results only when their packages/services are explicitly configured. |
|
|
1068
1074
|
| [BEIR](https://github.com/beir-cellar/beir) | Standard zero-shot information retrieval quality. | planned | Chroma / Qdrant / FAISS | Stay within 0.02 `nDCG@10` on identical embeddings. |
|
|
1069
1075
|
| [MTEB Retrieval](https://github.com/embeddings-benchmark/mteb) | Separates encoder quality from retrieval-store quality. | planned | Chroma / Qdrant / FAISS | Prove WaveMind does not reduce same-embedding retrieval quality. |
|
|
@@ -1238,25 +1244,27 @@ The delta contains active records plus tombstones. Import is idempotent and
|
|
|
1238
1244
|
tombstone-aware, so a stale region export cannot resurrect a deleted memory.
|
|
1239
1245
|
|
|
1240
1246
|
For operational recovery, `ReplicatedSnapshotWorker` creates a checksummed
|
|
1241
|
-
replicated snapshot, verifies an optional offsite mirror,
|
|
1242
|
-
`
|
|
1247
|
+
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:
|
|
1243
1250
|
|
|
1244
1251
|
```python
|
|
1245
1252
|
job = ReplicatedSnapshotWorker(memory).run_once(
|
|
1246
1253
|
destination="./backups/replicated",
|
|
1247
1254
|
offsite_destination="./offsite/replicated",
|
|
1255
|
+
archive_destination="./archives/replicated",
|
|
1248
1256
|
keep_last=7,
|
|
1249
1257
|
)
|
|
1250
|
-
restored, report = ReplicatedWaveMind.
|
|
1251
|
-
job.
|
|
1258
|
+
restored, report = ReplicatedWaveMind.restore_snapshot_archive(
|
|
1259
|
+
job.archive_path,
|
|
1252
1260
|
"./state/restored-replicas",
|
|
1253
1261
|
)
|
|
1254
1262
|
```
|
|
1255
1263
|
|
|
1256
1264
|
The checked-in scale-readiness profile verifies manifest checksums, verifies the
|
|
1257
|
-
offsite mirror, restores three replica files from
|
|
1258
|
-
disables the restored primary and confirms the memory is
|
|
1259
|
-
remaining replicas.
|
|
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.
|
|
1260
1268
|
|
|
1261
1269
|
Checked-in official LoCoMo retrieval result:
|
|
1262
1270
|
|
|
@@ -1606,9 +1614,8 @@ If you already use Chroma for local memory, see the practical migration guide:
|
|
|
1606
1614
|
- The dynamic benchmark currently compares WaveMind against a static Chroma baseline. Chroma and Qdrant can implement similar behavior with extra application-layer metadata policy, deletes, filters, and reinforcement logic.
|
|
1607
1615
|
- `MemoryFieldGraph` is a discrete graph over stored memories, not a continuous mathematical field. Its current build path should be optimized with incremental edge updates before large production use.
|
|
1608
1616
|
- pgvector is a candidate-index backend. PostgreSQL source-of-truth storage is
|
|
1609
|
-
also available separately, but migrations, PITR docs,
|
|
1610
|
-
|
|
1611
|
-
coverage.
|
|
1617
|
+
also available separately, but migrations, PITR docs, and service benchmark
|
|
1618
|
+
profiles still need more real deployment coverage.
|
|
1612
1619
|
- The Qdrant backend is also a candidate-index backend. WaveMind rebuilds it
|
|
1613
1620
|
from SQLite on load/build, so large service-mode deployments still need a
|
|
1614
1621
|
measured rebuild strategy and index-health monitoring.
|
|
@@ -1647,9 +1654,9 @@ Near-term priorities:
|
|
|
1647
1654
|
- Faster dynamic re-ranking through smaller candidate windows, caching, and
|
|
1648
1655
|
background updates.
|
|
1649
1656
|
- Better production operations: OpenTelemetry and replicated offsite snapshot
|
|
1650
|
-
jobs are implemented; richer latency
|
|
1651
|
-
|
|
1652
|
-
are next.
|
|
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.
|
|
1653
1660
|
|
|
1654
1661
|
Longer-term direction:
|
|
1655
1662
|
|
|
@@ -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.
|
|
24
|
+
| Scale readiness profile | production-scale | precision@1 | WaveMind structured payloads: 1 / 0.461 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
|
|
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. |
|
|
28
28
|
| Memory competitor adapter profile | agent-memory | implemented | WaveMind: precision@1 0.80, precision@3 1.00, stale suppression 1.00, avg latency 0.55, p95 latency 0.83<br>Mem0: skipped - Install Mem0 to run this adapter profile: pip install "mem0ai"<br>Zep: skipped - Install the Zep client package and set ZEP_API_KEY or ZEP_API_URL.<br>LangGraph persistent memory: skipped - Install LangGraph to run this adapter profile: pip install "langgraph" | Add documented setup commands for each competitor adapter and store checked-in results only when those real adapters run. |
|
|
29
29
|
| [LongMemEval answer generation](https://github.com/xiaowu0162/LongMemEval) | long-term-agent-memory | implemented | extractive smoke: queries 20, evidence recall@k 1.00, exact match 0.00, contains answer 0.05, token f1 0.02, avg retrieval ms 3.79, avg generation ms 0.77<br>WaveMind + qwen2.5:0.5b: queries 50, evidence recall@k 0.92, exact match 0.12, contains answer 0.18, token f1 0.18, avg retrieval ms 2.98, avg generation ms 1428.2<br>Chroma static + qwen2.5:0.5b: queries 50, evidence recall@k 0.60, exact match 0.10, contains answer 0.12, token f1 0.13, avg retrieval ms 4.10, avg generation ms 1234.7<br>Qdrant static + qwen2.5:0.5b: queries 50, evidence recall@k 0.60, exact match 0.10, contains answer 0.12, token f1 0.13, avg retrieval ms 63.8, avg generation ms 893.5<br>WaveMind + qwen2.5:1.5b: queries 50, evidence recall@k 0.92, exact match 0.24, contains answer 0.38, token f1 0.33, avg retrieval ms 2.00, avg generation ms 2153.0<br>Chroma static + qwen2.5:1.5b: queries 50, evidence recall@k 0.60, exact match 0.12, contains answer 0.16, token f1 0.17, avg retrieval ms 7.05, avg generation ms 2082.4<br>Qdrant static + qwen2.5:1.5b: queries 50, evidence recall@k 0.60, exact match 0.12, contains answer 0.16, token f1 0.17, avg retrieval ms 100.2, avg generation ms 758.1 | Run all 470 non-abstention questions with a stronger local/API model and add faithfulness/abstention scoring. |
|
|
30
30
|
|
|
@@ -741,7 +741,7 @@
|
|
|
741
741
|
"category": "production-scale",
|
|
742
742
|
"status": "implemented",
|
|
743
743
|
"source": "benchmarks/scale_readiness_benchmark.py",
|
|
744
|
-
"dataset": "Deterministic 1M-memory simulation for namespace placement, quorum runtime, active-active delta sync, replicated snapshot/restore, hot-cache, and structured-payload retrieval checks.",
|
|
744
|
+
"dataset": "Deterministic 1M-memory simulation for namespace placement, quorum runtime, active-active delta sync, replicated snapshot/offsite/archive restore, 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":
|
|
767
|
+
"placement_ms": 61.49380002170801
|
|
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.
|
|
774
|
+
"p99_lookup_ms": 0.002900022082030773
|
|
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.
|
|
784
|
+
"p99_query_after_loss_ms": 1.573899993672967
|
|
785
785
|
},
|
|
786
786
|
"WaveMind active-active delta sync": {
|
|
787
787
|
"regions": 2,
|
|
@@ -790,25 +790,26 @@
|
|
|
790
790
|
"converged_after_bidirectional_sync": true,
|
|
791
791
|
"suppressed_stale_import_after_delete": true,
|
|
792
792
|
"tombstone_converged": true,
|
|
793
|
-
"sync_ms":
|
|
793
|
+
"sync_ms": 104.4289999990724
|
|
794
794
|
},
|
|
795
795
|
"WaveMind replicated snapshot": {
|
|
796
796
|
"nodes": 3,
|
|
797
797
|
"manifest_healthy": true,
|
|
798
798
|
"offsite_verified": true,
|
|
799
|
+
"archive_verified": true,
|
|
799
800
|
"restored_files": 3,
|
|
800
801
|
"recalled_after_restore_node_loss": true,
|
|
801
|
-
"snapshot_ms":
|
|
802
|
-
"restore_ms":
|
|
802
|
+
"snapshot_ms": 109.23659999389201,
|
|
803
|
+
"restore_ms": 25.69669997319579
|
|
803
804
|
},
|
|
804
805
|
"WaveMind structured payloads": {
|
|
805
806
|
"queries": 4,
|
|
806
807
|
"precision_at_1": 1.0,
|
|
807
|
-
"avg_latency_ms": 0.
|
|
808
|
-
"p99_latency_ms": 0.
|
|
808
|
+
"avg_latency_ms": 0.4606249858625233,
|
|
809
|
+
"p99_latency_ms": 0.5845999694429338
|
|
809
810
|
}
|
|
810
811
|
},
|
|
811
|
-
"target": "Prove the production foundation before heavier 100k, 1M, and 10M vector load tests: deterministic placement, survivable replicas, active-active sync, offsite-verified restore drills, hot-cache behavior, and structured payload recall.",
|
|
812
|
+
"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.",
|
|
812
813
|
"next_step": "Move from local replicated runtime to service-backed replicated runs, object-store snapshot adapters, and larger 10M candidate-index load tests."
|
|
813
814
|
},
|
|
814
815
|
{
|
|
@@ -702,7 +702,7 @@ def _implemented_entries(root: Path) -> list[dict[str, Any]]:
|
|
|
702
702
|
"category": "production-scale",
|
|
703
703
|
"status": "implemented",
|
|
704
704
|
"source": "benchmarks/scale_readiness_benchmark.py",
|
|
705
|
-
"dataset": "Deterministic 1M-memory simulation for namespace placement, quorum runtime, active-active delta sync, replicated snapshot/restore, hot-cache, and structured-payload retrieval checks.",
|
|
705
|
+
"dataset": "Deterministic 1M-memory simulation for namespace placement, quorum runtime, active-active delta sync, replicated snapshot/offsite/archive restore, hot-cache, and structured-payload retrieval checks.",
|
|
706
706
|
"competitors": ["Mem0", "Zep", "LangGraph persistent memory", "GraphRAG"],
|
|
707
707
|
"metrics": [
|
|
708
708
|
"node_loss_min_availability",
|
|
@@ -766,6 +766,7 @@ def _implemented_entries(root: Path) -> list[dict[str, Any]]:
|
|
|
766
766
|
"nodes",
|
|
767
767
|
"manifest_healthy",
|
|
768
768
|
"offsite_verified",
|
|
769
|
+
"archive_verified",
|
|
769
770
|
"restored_files",
|
|
770
771
|
"recalled_after_restore_node_loss",
|
|
771
772
|
"snapshot_ms",
|
|
@@ -782,7 +783,7 @@ def _implemented_entries(root: Path) -> list[dict[str, Any]]:
|
|
|
782
783
|
),
|
|
783
784
|
),
|
|
784
785
|
},
|
|
785
|
-
"target": "Prove the production foundation before heavier 100k, 1M, and 10M vector load tests: deterministic placement, survivable replicas, active-active sync, offsite-verified restore drills, hot-cache behavior, and structured payload recall.",
|
|
786
|
+
"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.",
|
|
786
787
|
"next_step": "Move from local replicated runtime to service-backed replicated runs, object-store snapshot adapters, and larger 10M candidate-index load tests.",
|
|
787
788
|
},
|
|
788
789
|
{
|
|
@@ -339,14 +339,15 @@ def run_replicated_snapshot_profile() -> dict[str, object]:
|
|
|
339
339
|
snapshot_job = ReplicatedSnapshotWorker(memory).run_once(
|
|
340
340
|
destination=root / "snapshots",
|
|
341
341
|
offsite_destination=root / "offsite",
|
|
342
|
+
archive_destination=root / "archives",
|
|
342
343
|
keep_last=2,
|
|
343
344
|
)
|
|
344
345
|
snapshot_ms = (time.perf_counter() - snapshot_started) * 1000.0
|
|
345
346
|
health = ReplicatedWaveMind.verify_snapshot(snapshot_job.snapshot_path)
|
|
346
347
|
|
|
347
348
|
restore_started = time.perf_counter()
|
|
348
|
-
restored, restore = ReplicatedWaveMind.
|
|
349
|
-
snapshot_job.
|
|
349
|
+
restored, restore = ReplicatedWaveMind.restore_snapshot_archive(
|
|
350
|
+
snapshot_job.archive_path,
|
|
350
351
|
root / "restored",
|
|
351
352
|
width=16,
|
|
352
353
|
height=16,
|
|
@@ -364,6 +365,7 @@ def run_replicated_snapshot_profile() -> dict[str, object]:
|
|
|
364
365
|
"nodes": len(snapshot_job.nodes),
|
|
365
366
|
"manifest_healthy": health["healthy"],
|
|
366
367
|
"offsite_verified": snapshot_job.offsite_verified,
|
|
368
|
+
"archive_verified": snapshot_job.archive_verified,
|
|
367
369
|
"total_bytes": snapshot_job.total_bytes,
|
|
368
370
|
"snapshot_ms": snapshot_ms,
|
|
369
371
|
"restore_ms": restore_ms,
|
|
@@ -477,8 +479,8 @@ def run_benchmark(
|
|
|
477
479
|
"description": (
|
|
478
480
|
"Deterministic scale-readiness profile for cluster placement, "
|
|
479
481
|
"node/zone loss simulation, quorum-replicated runtime behavior, "
|
|
480
|
-
"active-active delta sync, replicated snapshot/
|
|
481
|
-
"behavior, and structured payload retrieval. This is not a "
|
|
482
|
+
"active-active delta sync, replicated snapshot/offsite/archive "
|
|
483
|
+
"restore, hot-cache behavior, and structured payload retrieval. This is not a "
|
|
482
484
|
"10M-vector database load test."
|
|
483
485
|
),
|
|
484
486
|
},
|
|
@@ -526,6 +528,7 @@ def main() -> int:
|
|
|
526
528
|
elif result["engine"] == "WaveMind replicated snapshot":
|
|
527
529
|
print(f"| replicated snapshot | manifest_healthy | {result['manifest_healthy']} |")
|
|
528
530
|
print(f"| replicated snapshot | offsite_verified | {result['offsite_verified']} |")
|
|
531
|
+
print(f"| replicated snapshot | archive_verified | {result['archive_verified']} |")
|
|
529
532
|
print(f"| replicated snapshot | recalled_after_restore_node_loss | {result['recalled_after_restore_node_loss']} |")
|
|
530
533
|
else:
|
|
531
534
|
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/restore, 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, 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":
|
|
17
|
+
"placement_ms": 61.49380002170801,
|
|
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.
|
|
36
|
-
"p99_lookup_ms": 0.
|
|
35
|
+
"avg_lookup_ms": 0.0013803999754600227,
|
|
36
|
+
"p99_lookup_ms": 0.002900022082030773
|
|
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.
|
|
51
|
-
"p99_query_after_loss_ms": 1.
|
|
50
|
+
"avg_query_after_loss_ms": 1.573899993672967,
|
|
51
|
+
"p99_query_after_loss_ms": 1.573899993672967
|
|
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":
|
|
59
|
+
"sync_ms": 104.4289999990724,
|
|
60
60
|
"suppressed_stale_import_after_delete": true,
|
|
61
61
|
"tombstone_deleted_records": 3,
|
|
62
62
|
"tombstone_converged": true
|
|
@@ -66,9 +66,10 @@
|
|
|
66
66
|
"nodes": 3,
|
|
67
67
|
"manifest_healthy": true,
|
|
68
68
|
"offsite_verified": true,
|
|
69
|
+
"archive_verified": true,
|
|
69
70
|
"total_bytes": 110592,
|
|
70
|
-
"snapshot_ms":
|
|
71
|
-
"restore_ms":
|
|
71
|
+
"snapshot_ms": 109.23659999389201,
|
|
72
|
+
"restore_ms": 25.69669997319579,
|
|
72
73
|
"restored_files": 3,
|
|
73
74
|
"recalled_after_restore_node_loss": true
|
|
74
75
|
},
|
|
@@ -82,8 +83,8 @@
|
|
|
82
83
|
],
|
|
83
84
|
"queries": 4,
|
|
84
85
|
"precision_at_1": 1.0,
|
|
85
|
-
"avg_latency_ms": 0.
|
|
86
|
-
"p99_latency_ms": 0.
|
|
86
|
+
"avg_latency_ms": 0.4606249858625233,
|
|
87
|
+
"p99_latency_ms": 0.5845999694429338
|
|
87
88
|
}
|
|
88
89
|
]
|
|
89
90
|
}
|
|
@@ -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
|
|
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`, 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
|