wavemind 2.2.9__tar.gz → 2.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {wavemind-2.2.9 → wavemind-2.3.0}/PKG-INFO +41 -22
- {wavemind-2.2.9 → wavemind-2.3.0}/README.md +37 -21
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/BENCHMARK_LEADERBOARD.md +1 -1
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/BENCHMARK_REPORT.md +1 -1
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/benchmark_matrix_results.json +12 -11
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/benchmark_registry.py +4 -3
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/scale_readiness_benchmark.py +35 -2
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/scale_readiness_results.json +12 -11
- {wavemind-2.2.9 → wavemind-2.3.0}/docker-compose.yml +1 -1
- {wavemind-2.2.9 → wavemind-2.3.0}/docs/BENCHMARK_BRIEF.md +1 -1
- {wavemind-2.2.9 → wavemind-2.3.0}/docs/ROADMAP.md +7 -5
- {wavemind-2.2.9 → wavemind-2.3.0}/pyproject.toml +5 -1
- {wavemind-2.2.9 → wavemind-2.3.0}/requirements-optional.txt +1 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_cli_smoke.py +11 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_jobs.py +59 -0
- wavemind-2.3.0/tests/test_object_store.py +88 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_packaging_files.py +3 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_scale_readiness_benchmark.py +1 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/__init__.py +11 -1
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/cli.py +37 -1
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/jobs.py +30 -0
- wavemind-2.3.0/wavemind/object_store.py +242 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind.egg-info/PKG-INFO +41 -22
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind.egg-info/SOURCES.txt +2 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind.egg-info/requires.txt +4 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/CONTRIBUTING.md +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/Dockerfile +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/LICENSE +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/MANIFEST.in +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/SECURITY.md +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/SUPPORT.md +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/agent_memory_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/agent_memory_results.json +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/ann_index_curve_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/ann_index_curve_results.json +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/dynamic_memory_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/dynamic_memory_results.json +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/field_memory_dynamics_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/field_memory_dynamics_results.json +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/locomo_evidence_results.json +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/locomo_memory_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/locomo_sentence_evidence_results.json +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/long_memory_evidence_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/long_memory_evidence_results.json +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/longmemeval_answer_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/longmemeval_answer_extractive_20_results.json +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/longmemeval_answer_qwen25_0_5b_50_results.json +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/longmemeval_answer_qwen25_1_5b_50_results.json +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/longmemeval_evidence_50_results.json +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/longmemeval_evidence_results.json +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/longmemeval_memory_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/memory_competitor_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/memory_competitor_results.json +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/nomiracl_russian_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/nomiracl_russian_results.json +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/open_retrieval_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/open_retrieval_scifact_results.json +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/production_index_profile_results.json +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/production_load_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/production_load_qdrant_100k_tuned_results.json +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/production_load_qdrant_1m_ef_sweep_results.json +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/production_load_qdrant_1m_results.json +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/production_load_qdrant_1m_tuned_results.json +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/production_load_results.json +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/render_benchmark_charts.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/render_benchmark_leaderboard.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/render_benchmark_report.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/ru_sentences_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/benchmarks/wavemind_capacity_results.json +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/docs/CHROMA_MIGRATION.md +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/docs/DEMO_SCRIPT.md +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/docs/LAUNCH_KIT.md +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/docs/OBSERVABILITY.md +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/docs/PROJECT_BOARD.md +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/docs/RELEASE.md +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/docs/RU_LAUNCH_POSTS.md +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/docs/USE_CASES.md +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/docs/assets/benchmark-summary.svg +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/docs/assets/wavemind-demo.gif +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/docs/assets/wavemind-social-card.svg +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/examples/agent_with_memory.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/examples/chroma_migration.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/examples/customer_support_memory.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/examples/demo.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/examples/dynamic_memory_demo.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/examples/framework_integrations.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/examples/langchain_memory.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/examples/llamaindex_retriever.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/examples/observability/README.md +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/examples/observability/docker-compose.yml +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/examples/observability/otel-collector.yaml +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/examples/observability/prometheus-alerts.yml +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/examples/observability/prometheus.yml +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/examples/production-index-profile/README.md +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/examples/production-index-profile/docker-compose.yml +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/examples/research_notebook_memory.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/examples/sharded_memory.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/install.bat +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/install.sh +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/requirements.txt +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/setup.cfg +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_agent_memory_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_ann_index_curve_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_api.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_api_process_persistence.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_benchmark_brief.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_benchmark_charts.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_benchmark_leaderboard.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_benchmark_registry.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_benchmark_report.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_chroma_migration_example.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_cluster.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_core_persistence.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_dynamic_memory_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_examples.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_field_graph.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_field_graph_integration.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_field_memory_dynamics_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_framework_adapters.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_import_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_indexes_encoders.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_langchain_integration.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_locomo_memory_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_long_memory_evidence_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_longmemeval_answer_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_longmemeval_memory_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_memory_competitor_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_multimodal.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_nomiracl_russian_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_observability.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_observability_docs.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_open_retrieval_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_postgres_storage.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_production_index_profile.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_production_load_benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_replication.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_scale_plan.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_semantic_and_latency.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/tests/test_sharding.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/__main__.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/api.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/benchmark.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/cluster.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/core.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/encoders.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/field_graph.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/importers.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/indexes.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/integrations/__init__.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/integrations/autogen.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/integrations/crewai.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/integrations/langchain.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/integrations/langgraph.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/integrations/llamaindex.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/multimodal.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/observability.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/replication.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/scale.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/sharding.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/storage.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind/studio.py +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind.egg-info/dependency_links.txt +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind.egg-info/entry_points.txt +0 -0
- {wavemind-2.2.9 → wavemind-2.3.0}/wavemind.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: wavemind
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.0
|
|
4
4
|
Summary: Local-first dynamic memory field with vector search and wave-field re-ranking
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
Project-URL: Homepage, https://github.com/CaspianG/wavemind
|
|
@@ -25,6 +25,8 @@ Provides-Extra: postgres
|
|
|
25
25
|
Requires-Dist: psycopg[binary]>=3.1; extra == "postgres"
|
|
26
26
|
Provides-Extra: redis
|
|
27
27
|
Requires-Dist: redis>=5.0; extra == "redis"
|
|
28
|
+
Provides-Extra: s3
|
|
29
|
+
Requires-Dist: boto3>=1.34; extra == "s3"
|
|
28
30
|
Provides-Extra: otel
|
|
29
31
|
Requires-Dist: opentelemetry-api>=1.25; extra == "otel"
|
|
30
32
|
Requires-Dist: opentelemetry-sdk>=1.25; extra == "otel"
|
|
@@ -41,6 +43,7 @@ Requires-Dist: faiss-cpu>=1.8; platform_system != "Windows" and extra == "produc
|
|
|
41
43
|
Requires-Dist: qdrant-client>=1.9; extra == "production"
|
|
42
44
|
Requires-Dist: psycopg[binary]>=3.1; extra == "production"
|
|
43
45
|
Requires-Dist: redis>=5.0; extra == "production"
|
|
46
|
+
Requires-Dist: boto3>=1.34; extra == "production"
|
|
44
47
|
Requires-Dist: opentelemetry-api>=1.25; extra == "production"
|
|
45
48
|
Requires-Dist: opentelemetry-sdk>=1.25; extra == "production"
|
|
46
49
|
Requires-Dist: opentelemetry-exporter-otlp>=1.25; extra == "production"
|
|
@@ -543,10 +546,10 @@ Checked-in result:
|
|
|
543
546
|
|---|---:|
|
|
544
547
|
| Cluster planner | 4096 namespaces, 4 nodes, replication factor 2, node-loss availability `1.000`, zone-loss availability `1.000`, write quorum `2`. |
|
|
545
548
|
| Hot cache | 2000 lookups, hit rate `0.920`, p99 lookup `0.003 ms`. |
|
|
546
|
-
| Replicated runtime | 3 physical WaveMind stores, replication factor 3, write quorum 2, node-loss recall `true`, repair copied `1` missing record, tombstone repair deleted `1` stale record, p99 query-after-loss `1.
|
|
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`, portable archive validation `true`, archive restore `
|
|
549
|
-
| Structured payloads | image/audio/table/event retrieval, precision@1 `1.000`, p99 `0.
|
|
549
|
+
| Replicated runtime | 3 physical WaveMind stores, replication factor 3, write quorum 2, node-loss recall `true`, repair copied `1` missing record, tombstone repair deleted `1` stale record, p99 query-after-loss `1.31 ms`. |
|
|
550
|
+
| Active-active delta sync | 2 regions, bidirectional convergence `true`, stale import suppressed after delete `true`, tombstone convergence `true`, sync `159.69 ms`. |
|
|
551
|
+
| Replicated snapshot job | 3 replica files, manifest checksum validation `true`, offsite mirror validation `true`, portable archive validation `true`, S3-compatible upload validation `true`, archive restore `24.85 ms`. |
|
|
552
|
+
| Structured payloads | image/audio/table/event retrieval, precision@1 `1.000`, p99 `0.62 ms`. |
|
|
550
553
|
|
|
551
554
|
This profile validates routing, quorum-replicated runtime behavior, cache
|
|
552
555
|
behavior, active-active namespace delta sync, replicated snapshot/restore, and
|
|
@@ -580,15 +583,16 @@ Maintenance workers:
|
|
|
580
583
|
|
|
581
584
|
```sh
|
|
582
585
|
wavemind maintenance --namespace user:42 --consolidate-steps 10 --consolidate-concepts --json
|
|
583
|
-
wavemind replicated-snapshot --root ./state/replicas --node node-a --node node-b --node node-c --out ./backups/replicated --offsite ./offsite/replicated --archive ./archives/replicated --keep-last 7 --json
|
|
586
|
+
wavemind replicated-snapshot --root ./state/replicas --node node-a --node node-b --node node-c --out ./backups/replicated --offsite ./offsite/replicated --archive ./archives/replicated --s3 s3://my-bucket/wavemind/prod --keep-last 7 --json
|
|
584
587
|
```
|
|
585
588
|
|
|
586
589
|
The first command runs one deterministic memory pass: expired-memory purge,
|
|
587
590
|
optional field/concept consolidation, and index-health repair. The second
|
|
588
591
|
command creates a verified replicated snapshot, mirrors it to an offsite path,
|
|
589
|
-
writes a portable `.tar.gz` archive, verifies that archive,
|
|
590
|
-
retention. Production deployments can
|
|
591
|
-
Kubernetes CronJobs, Celery, RQ, or
|
|
592
|
+
writes a portable `.tar.gz` archive, verifies that archive, can upload it to an
|
|
593
|
+
S3-compatible object store, and applies retention. Production deployments can
|
|
594
|
+
call these commands from cron, systemd, Kubernetes CronJobs, Celery, RQ, or
|
|
595
|
+
Temporal.
|
|
592
596
|
|
|
593
597
|
Hot-cache options:
|
|
594
598
|
|
|
@@ -692,6 +696,7 @@ snapshot_job = ReplicatedSnapshotWorker(memory).run_once(
|
|
|
692
696
|
destination="./backups/replicated",
|
|
693
697
|
offsite_destination="./offsite/replicated",
|
|
694
698
|
archive_destination="./archives/replicated",
|
|
699
|
+
object_store_destination="s3://my-bucket/wavemind/prod",
|
|
695
700
|
keep_last=7,
|
|
696
701
|
)
|
|
697
702
|
assert snapshot_job.ok
|
|
@@ -707,9 +712,9 @@ The replicated snapshot job writes one SQLite backup per replica plus
|
|
|
707
712
|
`manifest.json` with SHA-256 checksums, replica metadata, quorum settings, and
|
|
708
713
|
node definitions. It can mirror the snapshot to a second path for offsite
|
|
709
714
|
backup, write a portable `.tar.gz` archive for object-store/offsite systems,
|
|
710
|
-
verify that archive,
|
|
711
|
-
|
|
712
|
-
is passed.
|
|
715
|
+
verify that archive, upload it to any S3-compatible object store through
|
|
716
|
+
`boto3`, and apply `keep_last` retention locally, offsite, and for archives.
|
|
717
|
+
Restore refuses to overwrite a non-empty root unless `overwrite=True` is passed.
|
|
713
718
|
|
|
714
719
|
Equivalent CLI:
|
|
715
720
|
|
|
@@ -720,6 +725,7 @@ wavemind replicated-snapshot \
|
|
|
720
725
|
--out ./backups/replicated \
|
|
721
726
|
--offsite ./offsite/replicated \
|
|
722
727
|
--archive ./archives/replicated \
|
|
728
|
+
--s3 s3://my-bucket/wavemind/prod \
|
|
723
729
|
--keep-last 7 \
|
|
724
730
|
--json
|
|
725
731
|
|
|
@@ -728,8 +734,18 @@ wavemind replicated-restore \
|
|
|
728
734
|
--to ./state/restored-replicas \
|
|
729
735
|
--overwrite \
|
|
730
736
|
--json
|
|
737
|
+
|
|
738
|
+
wavemind replicated-restore \
|
|
739
|
+
--from s3://my-bucket/wavemind/prod/wavemind-replicated-20260705-120000.tar.gz \
|
|
740
|
+
--to ./state/restored-replicas \
|
|
741
|
+
--overwrite \
|
|
742
|
+
--json
|
|
731
743
|
```
|
|
732
744
|
|
|
745
|
+
Install S3/R2/MinIO support with `pip install "wavemind[s3]"`. For
|
|
746
|
+
S3-compatible endpoints such as Cloudflare R2 or MinIO, pass
|
|
747
|
+
`--s3-endpoint-url` and optionally `--s3-region`.
|
|
748
|
+
|
|
733
749
|
## HTTP API
|
|
734
750
|
|
|
735
751
|
Run the local FastAPI server:
|
|
@@ -1103,7 +1119,7 @@ Current read:
|
|
|
1103
1119
|
| LongMemEval 50-query smoke | On the first 50 non-abstention LongMemEval-S questions, WaveMind reaches `evidence_recall@5 0.920`, `precision@1 0.760`, and `MRR@5 0.827`; Chroma/Qdrant static reach `0.600`, `0.260`, and `0.385`. | This is the fast regression profile for checking current changes before rerunning the full LongMemEval profile. WaveMind wins on quality; latency still needs work. |
|
|
1104
1120
|
| ANN/index curve | At 50000 generated 128-d vectors, NumPy exact keeps `recall@10 1.000` at `6.49 ms`; quantized int8 keeps `0.934` at `24.92 ms`; Annoy is faster at `4.92 ms` but drops to `0.730` recall; Qdrant local keeps `1.000` recall at `43.49 ms`. | Current local scale boundary is clear: quantized search needs kernel work, Annoy needs tuning/FAISS, and Qdrant should be tested in service mode for a fair production comparison. |
|
|
1105
1121
|
| Production load | At 100000 generated 128-d vectors, service-mode Qdrant reaches `recall@10 1.000`, avg `10.28 ms`, p99 `21.26 ms`. At 1M, tuned Qdrant reaches `recall@10 0.984`, avg `116.80 ms`, p99 `209.28 ms`; an EF sweep finds `recall@10 0.977`, avg `64.76 ms`, p99 `103.77 ms` at `hnsw_ef=2048` on 30 queries. | 100k is production-grade on the tested machine. 1M recall is now strong, but p99 still needs tuning before claiming a stable sub-100 ms SLO. |
|
|
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. |
|
|
1122
|
+
| Scale readiness | Deterministic 1M-memory simulation validates 4096 namespace placements over 4 nodes with replication factor 2, node-loss availability `1.000`, zone-loss availability `1.000`, hot-cache hit rate `0.920`, quorum-replicated runtime recall after node loss, missing-record repair, tombstone repair, active-active delta sync, checksummed replicated snapshot/restore, offsite mirror verification, portable archive verification, S3-compatible upload verification, and structured payload precision@1 `1.000`. | This proves routing, cache, payload, replicated-runtime, namespace-delta, offsite/archive/object-store backup, and restore-drill foundations. It is not a 10M-vector latency claim; real 10M latency still needs service-backed load tests on larger hardware. |
|
|
1107
1123
|
| Memory competitor adapters | WaveMind reaches `precision@1 0.80`, `precision@3 1.00`, stale suppression `1.00` on the small adapter profile. Mem0, Zep, and LangGraph are listed as skipped unless their real packages/services are configured. | This prevents fake competitor claims. The adapter harness is ready; real Mem0/Zep/LangGraph results still need configured installs. |
|
|
1108
1124
|
| LongMemEval local answer generation | With the same local Ollama `qwen2.5:1.5b`, WaveMind reaches `exact_match 0.240`, `contains_answer 0.380`, `token_f1 0.333`, and `evidence_recall@5 0.920`; Chroma and Qdrant static both reach `0.120`, `0.160`, `0.170`, and `0.600`. | This is the first checked-in end-to-end answer benchmark against Chroma/Qdrant. It is still a 50-question lightweight smoke run, not a full LongMemEval leaderboard score. |
|
|
1109
1125
|
|
|
@@ -1122,7 +1138,7 @@ Current read:
|
|
|
1122
1138
|
| Production index profile | Docker-backed 50000-vector profile for persisted FAISS, Qdrant service, and PostgreSQL/pgvector HNSW. | implemented | FAISS / Qdrant service / pgvector | Keep service-mode candidate generation above `0.95` recall@10 and below 10 ms average query latency at 50000 vectors. |
|
|
1123
1139
|
| Production load profile | 100k and 1M service-backed candidate-index checks with p95/p99 latency. | implemented | Qdrant service / pgvector HNSW / FAISS persisted | Keep 100k at recall@10 `1.000`; push 1M p99 below 100 ms with recall@10 >= 0.95. |
|
|
1124
1140
|
| Qdrant 1M HNSW ef sweep | One 1M Qdrant collection queried with multiple `hnsw_ef` values. | implemented | Qdrant service | Repeat with 100+ queries and collection-level HNSW build parameters before claiming a stable 1M SLO. |
|
|
1125
|
-
| Scale readiness profile | Cluster placement, node/zone-loss simulation, quorum report, replicated runtime, active-active delta sync, replicated snapshot/restore with offsite and
|
|
1141
|
+
| Scale readiness profile | Cluster placement, node/zone-loss simulation, quorum report, replicated runtime, active-active delta sync, replicated snapshot/restore with offsite, archive, and object-store verification, hot-cache behavior, and structured/multimodal payload retrieval. | implemented | Mem0 / Zep / LangGraph persistent memory / GraphRAG target adapters | Keep quorum replication, namespace-delta sync, repair, offsite/archive/object-store backup, and restore drills green while adding larger service-backed 10M load tests. |
|
|
1126
1142
|
| Memory competitor adapter profile | Dynamic-memory scenario wired for external memory frameworks. | implemented | Mem0 / Zep / LangGraph persistent memory | Report real competitor results only when their packages/services are explicitly configured. |
|
|
1127
1143
|
| [BEIR](https://github.com/beir-cellar/beir) | Standard zero-shot information retrieval quality. | planned | Chroma / Qdrant / FAISS | Stay within 0.02 `nDCG@10` on identical embeddings. |
|
|
1128
1144
|
| [MTEB Retrieval](https://github.com/embeddings-benchmark/mteb) | Separates encoder quality from retrieval-store quality. | planned | Chroma / Qdrant / FAISS | Prove WaveMind does not reduce same-embedding retrieval quality. |
|
|
@@ -1298,14 +1314,15 @@ tombstone-aware, so a stale region export cannot resurrect a deleted memory.
|
|
|
1298
1314
|
|
|
1299
1315
|
For operational recovery, `ReplicatedSnapshotWorker` creates a checksummed
|
|
1300
1316
|
replicated snapshot, verifies an optional offsite mirror, writes a verified
|
|
1301
|
-
`.tar.gz` archive,
|
|
1302
|
-
replica root:
|
|
1317
|
+
`.tar.gz` archive, can upload that archive to S3-compatible storage, and
|
|
1318
|
+
`restore_snapshot_archive()` restores it into a fresh replica root:
|
|
1303
1319
|
|
|
1304
1320
|
```python
|
|
1305
1321
|
job = ReplicatedSnapshotWorker(memory).run_once(
|
|
1306
1322
|
destination="./backups/replicated",
|
|
1307
1323
|
offsite_destination="./offsite/replicated",
|
|
1308
1324
|
archive_destination="./archives/replicated",
|
|
1325
|
+
object_store_destination="s3://my-bucket/wavemind/prod",
|
|
1309
1326
|
keep_last=7,
|
|
1310
1327
|
)
|
|
1311
1328
|
restored, report = ReplicatedWaveMind.restore_snapshot_archive(
|
|
@@ -1315,9 +1332,10 @@ restored, report = ReplicatedWaveMind.restore_snapshot_archive(
|
|
|
1315
1332
|
```
|
|
1316
1333
|
|
|
1317
1334
|
The checked-in scale-readiness profile verifies manifest checksums, verifies the
|
|
1318
|
-
offsite mirror, verifies the portable archive,
|
|
1319
|
-
|
|
1320
|
-
still recalled from the
|
|
1335
|
+
offsite mirror, verifies the portable archive, verifies S3-compatible object
|
|
1336
|
+
upload metadata, restores three replica files from that archive, then disables
|
|
1337
|
+
the restored primary and confirms the memory is still recalled from the
|
|
1338
|
+
remaining replicas.
|
|
1321
1339
|
|
|
1322
1340
|
Checked-in official LoCoMo retrieval result:
|
|
1323
1341
|
|
|
@@ -1707,9 +1725,10 @@ Near-term priorities:
|
|
|
1707
1725
|
- Faster dynamic re-ranking through smaller candidate windows, caching, and
|
|
1708
1726
|
background updates.
|
|
1709
1727
|
- Better production operations: OpenTelemetry and replicated offsite snapshot
|
|
1710
|
-
jobs with verified portable archives
|
|
1711
|
-
histograms, index-health metrics, alerting
|
|
1712
|
-
|
|
1728
|
+
jobs with verified portable archives and S3-compatible upload are
|
|
1729
|
+
implemented; richer latency histograms, index-health metrics, alerting
|
|
1730
|
+
examples, object-store retention/download drills, and Postgres PITR runbooks
|
|
1731
|
+
are next.
|
|
1713
1732
|
|
|
1714
1733
|
Longer-term direction:
|
|
1715
1734
|
|
|
@@ -490,10 +490,10 @@ 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`, portable archive validation `true`, archive 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.31 ms`. |
|
|
494
|
+
| Active-active delta sync | 2 regions, bidirectional convergence `true`, stale import suppressed after delete `true`, tombstone convergence `true`, sync `159.69 ms`. |
|
|
495
|
+
| Replicated snapshot job | 3 replica files, manifest checksum validation `true`, offsite mirror validation `true`, portable archive validation `true`, S3-compatible upload validation `true`, archive restore `24.85 ms`. |
|
|
496
|
+
| Structured payloads | image/audio/table/event retrieval, precision@1 `1.000`, p99 `0.62 ms`. |
|
|
497
497
|
|
|
498
498
|
This profile validates routing, quorum-replicated runtime behavior, cache
|
|
499
499
|
behavior, active-active namespace delta sync, replicated snapshot/restore, and
|
|
@@ -527,15 +527,16 @@ Maintenance workers:
|
|
|
527
527
|
|
|
528
528
|
```sh
|
|
529
529
|
wavemind maintenance --namespace user:42 --consolidate-steps 10 --consolidate-concepts --json
|
|
530
|
-
wavemind replicated-snapshot --root ./state/replicas --node node-a --node node-b --node node-c --out ./backups/replicated --offsite ./offsite/replicated --archive ./archives/replicated --keep-last 7 --json
|
|
530
|
+
wavemind replicated-snapshot --root ./state/replicas --node node-a --node node-b --node node-c --out ./backups/replicated --offsite ./offsite/replicated --archive ./archives/replicated --s3 s3://my-bucket/wavemind/prod --keep-last 7 --json
|
|
531
531
|
```
|
|
532
532
|
|
|
533
533
|
The first command runs one deterministic memory pass: expired-memory purge,
|
|
534
534
|
optional field/concept consolidation, and index-health repair. The second
|
|
535
535
|
command creates a verified replicated snapshot, mirrors it to an offsite path,
|
|
536
|
-
writes a portable `.tar.gz` archive, verifies that archive,
|
|
537
|
-
retention. Production deployments can
|
|
538
|
-
Kubernetes CronJobs, Celery, RQ, or
|
|
536
|
+
writes a portable `.tar.gz` archive, verifies that archive, can upload it to an
|
|
537
|
+
S3-compatible object store, and applies retention. Production deployments can
|
|
538
|
+
call these commands from cron, systemd, Kubernetes CronJobs, Celery, RQ, or
|
|
539
|
+
Temporal.
|
|
539
540
|
|
|
540
541
|
Hot-cache options:
|
|
541
542
|
|
|
@@ -639,6 +640,7 @@ snapshot_job = ReplicatedSnapshotWorker(memory).run_once(
|
|
|
639
640
|
destination="./backups/replicated",
|
|
640
641
|
offsite_destination="./offsite/replicated",
|
|
641
642
|
archive_destination="./archives/replicated",
|
|
643
|
+
object_store_destination="s3://my-bucket/wavemind/prod",
|
|
642
644
|
keep_last=7,
|
|
643
645
|
)
|
|
644
646
|
assert snapshot_job.ok
|
|
@@ -654,9 +656,9 @@ The replicated snapshot job writes one SQLite backup per replica plus
|
|
|
654
656
|
`manifest.json` with SHA-256 checksums, replica metadata, quorum settings, and
|
|
655
657
|
node definitions. It can mirror the snapshot to a second path for offsite
|
|
656
658
|
backup, write a portable `.tar.gz` archive for object-store/offsite systems,
|
|
657
|
-
verify that archive,
|
|
658
|
-
|
|
659
|
-
is passed.
|
|
659
|
+
verify that archive, upload it to any S3-compatible object store through
|
|
660
|
+
`boto3`, and apply `keep_last` retention locally, offsite, and for archives.
|
|
661
|
+
Restore refuses to overwrite a non-empty root unless `overwrite=True` is passed.
|
|
660
662
|
|
|
661
663
|
Equivalent CLI:
|
|
662
664
|
|
|
@@ -667,6 +669,7 @@ wavemind replicated-snapshot \
|
|
|
667
669
|
--out ./backups/replicated \
|
|
668
670
|
--offsite ./offsite/replicated \
|
|
669
671
|
--archive ./archives/replicated \
|
|
672
|
+
--s3 s3://my-bucket/wavemind/prod \
|
|
670
673
|
--keep-last 7 \
|
|
671
674
|
--json
|
|
672
675
|
|
|
@@ -675,8 +678,18 @@ wavemind replicated-restore \
|
|
|
675
678
|
--to ./state/restored-replicas \
|
|
676
679
|
--overwrite \
|
|
677
680
|
--json
|
|
681
|
+
|
|
682
|
+
wavemind replicated-restore \
|
|
683
|
+
--from s3://my-bucket/wavemind/prod/wavemind-replicated-20260705-120000.tar.gz \
|
|
684
|
+
--to ./state/restored-replicas \
|
|
685
|
+
--overwrite \
|
|
686
|
+
--json
|
|
678
687
|
```
|
|
679
688
|
|
|
689
|
+
Install S3/R2/MinIO support with `pip install "wavemind[s3]"`. For
|
|
690
|
+
S3-compatible endpoints such as Cloudflare R2 or MinIO, pass
|
|
691
|
+
`--s3-endpoint-url` and optionally `--s3-region`.
|
|
692
|
+
|
|
680
693
|
## HTTP API
|
|
681
694
|
|
|
682
695
|
Run the local FastAPI server:
|
|
@@ -1050,7 +1063,7 @@ Current read:
|
|
|
1050
1063
|
| LongMemEval 50-query smoke | On the first 50 non-abstention LongMemEval-S questions, WaveMind reaches `evidence_recall@5 0.920`, `precision@1 0.760`, and `MRR@5 0.827`; Chroma/Qdrant static reach `0.600`, `0.260`, and `0.385`. | This is the fast regression profile for checking current changes before rerunning the full LongMemEval profile. WaveMind wins on quality; latency still needs work. |
|
|
1051
1064
|
| ANN/index curve | At 50000 generated 128-d vectors, NumPy exact keeps `recall@10 1.000` at `6.49 ms`; quantized int8 keeps `0.934` at `24.92 ms`; Annoy is faster at `4.92 ms` but drops to `0.730` recall; Qdrant local keeps `1.000` recall at `43.49 ms`. | Current local scale boundary is clear: quantized search needs kernel work, Annoy needs tuning/FAISS, and Qdrant should be tested in service mode for a fair production comparison. |
|
|
1052
1065
|
| Production load | At 100000 generated 128-d vectors, service-mode Qdrant reaches `recall@10 1.000`, avg `10.28 ms`, p99 `21.26 ms`. At 1M, tuned Qdrant reaches `recall@10 0.984`, avg `116.80 ms`, p99 `209.28 ms`; an EF sweep finds `recall@10 0.977`, avg `64.76 ms`, p99 `103.77 ms` at `hnsw_ef=2048` on 30 queries. | 100k is production-grade on the tested machine. 1M recall is now strong, but p99 still needs tuning before claiming a stable sub-100 ms SLO. |
|
|
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. |
|
|
1066
|
+
| Scale readiness | Deterministic 1M-memory simulation validates 4096 namespace placements over 4 nodes with replication factor 2, node-loss availability `1.000`, zone-loss availability `1.000`, hot-cache hit rate `0.920`, quorum-replicated runtime recall after node loss, missing-record repair, tombstone repair, active-active delta sync, checksummed replicated snapshot/restore, offsite mirror verification, portable archive verification, S3-compatible upload verification, and structured payload precision@1 `1.000`. | This proves routing, cache, payload, replicated-runtime, namespace-delta, offsite/archive/object-store backup, and restore-drill foundations. It is not a 10M-vector latency claim; real 10M latency still needs service-backed load tests on larger hardware. |
|
|
1054
1067
|
| Memory competitor adapters | WaveMind reaches `precision@1 0.80`, `precision@3 1.00`, stale suppression `1.00` on the small adapter profile. Mem0, Zep, and LangGraph are listed as skipped unless their real packages/services are configured. | This prevents fake competitor claims. The adapter harness is ready; real Mem0/Zep/LangGraph results still need configured installs. |
|
|
1055
1068
|
| LongMemEval local answer generation | With the same local Ollama `qwen2.5:1.5b`, WaveMind reaches `exact_match 0.240`, `contains_answer 0.380`, `token_f1 0.333`, and `evidence_recall@5 0.920`; Chroma and Qdrant static both reach `0.120`, `0.160`, `0.170`, and `0.600`. | This is the first checked-in end-to-end answer benchmark against Chroma/Qdrant. It is still a 50-question lightweight smoke run, not a full LongMemEval leaderboard score. |
|
|
1056
1069
|
|
|
@@ -1069,7 +1082,7 @@ Current read:
|
|
|
1069
1082
|
| Production index profile | Docker-backed 50000-vector profile for persisted FAISS, Qdrant service, and PostgreSQL/pgvector HNSW. | implemented | FAISS / Qdrant service / pgvector | Keep service-mode candidate generation above `0.95` recall@10 and below 10 ms average query latency at 50000 vectors. |
|
|
1070
1083
|
| Production load profile | 100k and 1M service-backed candidate-index checks with p95/p99 latency. | implemented | Qdrant service / pgvector HNSW / FAISS persisted | Keep 100k at recall@10 `1.000`; push 1M p99 below 100 ms with recall@10 >= 0.95. |
|
|
1071
1084
|
| Qdrant 1M HNSW ef sweep | One 1M Qdrant collection queried with multiple `hnsw_ef` values. | implemented | Qdrant service | Repeat with 100+ queries and collection-level HNSW build parameters before claiming a stable 1M SLO. |
|
|
1072
|
-
| Scale readiness profile | Cluster placement, node/zone-loss simulation, quorum report, replicated runtime, active-active delta sync, replicated snapshot/restore with offsite and
|
|
1085
|
+
| Scale readiness profile | Cluster placement, node/zone-loss simulation, quorum report, replicated runtime, active-active delta sync, replicated snapshot/restore with offsite, archive, and object-store verification, hot-cache behavior, and structured/multimodal payload retrieval. | implemented | Mem0 / Zep / LangGraph persistent memory / GraphRAG target adapters | Keep quorum replication, namespace-delta sync, repair, offsite/archive/object-store backup, and restore drills green while adding larger service-backed 10M load tests. |
|
|
1073
1086
|
| Memory competitor adapter profile | Dynamic-memory scenario wired for external memory frameworks. | implemented | Mem0 / Zep / LangGraph persistent memory | Report real competitor results only when their packages/services are explicitly configured. |
|
|
1074
1087
|
| [BEIR](https://github.com/beir-cellar/beir) | Standard zero-shot information retrieval quality. | planned | Chroma / Qdrant / FAISS | Stay within 0.02 `nDCG@10` on identical embeddings. |
|
|
1075
1088
|
| [MTEB Retrieval](https://github.com/embeddings-benchmark/mteb) | Separates encoder quality from retrieval-store quality. | planned | Chroma / Qdrant / FAISS | Prove WaveMind does not reduce same-embedding retrieval quality. |
|
|
@@ -1245,14 +1258,15 @@ tombstone-aware, so a stale region export cannot resurrect a deleted memory.
|
|
|
1245
1258
|
|
|
1246
1259
|
For operational recovery, `ReplicatedSnapshotWorker` creates a checksummed
|
|
1247
1260
|
replicated snapshot, verifies an optional offsite mirror, writes a verified
|
|
1248
|
-
`.tar.gz` archive,
|
|
1249
|
-
replica root:
|
|
1261
|
+
`.tar.gz` archive, can upload that archive to S3-compatible storage, and
|
|
1262
|
+
`restore_snapshot_archive()` restores it into a fresh replica root:
|
|
1250
1263
|
|
|
1251
1264
|
```python
|
|
1252
1265
|
job = ReplicatedSnapshotWorker(memory).run_once(
|
|
1253
1266
|
destination="./backups/replicated",
|
|
1254
1267
|
offsite_destination="./offsite/replicated",
|
|
1255
1268
|
archive_destination="./archives/replicated",
|
|
1269
|
+
object_store_destination="s3://my-bucket/wavemind/prod",
|
|
1256
1270
|
keep_last=7,
|
|
1257
1271
|
)
|
|
1258
1272
|
restored, report = ReplicatedWaveMind.restore_snapshot_archive(
|
|
@@ -1262,9 +1276,10 @@ restored, report = ReplicatedWaveMind.restore_snapshot_archive(
|
|
|
1262
1276
|
```
|
|
1263
1277
|
|
|
1264
1278
|
The checked-in scale-readiness profile verifies manifest checksums, verifies the
|
|
1265
|
-
offsite mirror, verifies the portable archive,
|
|
1266
|
-
|
|
1267
|
-
still recalled from the
|
|
1279
|
+
offsite mirror, verifies the portable archive, verifies S3-compatible object
|
|
1280
|
+
upload metadata, restores three replica files from that archive, then disables
|
|
1281
|
+
the restored primary and confirms the memory is still recalled from the
|
|
1282
|
+
remaining replicas.
|
|
1268
1283
|
|
|
1269
1284
|
Checked-in official LoCoMo retrieval result:
|
|
1270
1285
|
|
|
@@ -1654,9 +1669,10 @@ Near-term priorities:
|
|
|
1654
1669
|
- Faster dynamic re-ranking through smaller candidate windows, caching, and
|
|
1655
1670
|
background updates.
|
|
1656
1671
|
- Better production operations: OpenTelemetry and replicated offsite snapshot
|
|
1657
|
-
jobs with verified portable archives
|
|
1658
|
-
histograms, index-health metrics, alerting
|
|
1659
|
-
|
|
1672
|
+
jobs with verified portable archives and S3-compatible upload are
|
|
1673
|
+
implemented; richer latency histograms, index-health metrics, alerting
|
|
1674
|
+
examples, object-store retention/download drills, and Postgres PITR runbooks
|
|
1675
|
+
are next.
|
|
1660
1676
|
|
|
1661
1677
|
Longer-term direction:
|
|
1662
1678
|
|
|
@@ -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.41 ms | - | WaveMind-only check |
|
|
25
25
|
| Memory competitor adapter profile | agent-memory | precision@1 | WaveMind: 0.8 / 0.554 ms | - | WaveMind-only check |
|
|
26
26
|
| [LongMemEval answer generation](https://github.com/xiaowu0162/LongMemEval) | long-term-agent-memory | token F1 | WaveMind + qwen2.5:1.5b: 0.333 / - | Chroma static + qwen2.5:1.5b: 0.17 / - | WaveMind leads on quality |
|
|
27
27
|
|
|
@@ -24,7 +24,7 @@ Planned rows are not claimed wins. They are the public proof path WaveMind must
|
|
|
24
24
|
| Production load profile 100k | production-scale | implemented | Qdrant service: Recall@k 1.00, avg latency 10.3, p95 latency 19.0, p99 latency ms 21.3, build ms 27439.3<br>WaveMind pgvector: Recall@k 0.74, avg latency 17.8, p95 latency 23.5, build ms 455703.7<br>WaveMind faiss-persisted: skipped - Set WAVEMIND_FAISS_PATH to use the persisted FAISS backend | Tune pgvector HNSW build/search parameters and add persisted FAISS from the Linux benchmark container. |
|
|
25
25
|
| Production load profile 1M | production-scale | implemented | Qdrant service: Recall@k 0.98, avg latency 116.8, p95 latency 153.8, p99 latency ms 209.3, build ms 450674.6 | Tune Qdrant indexing/search params further, then add FAISS IVF/HNSW and pgvector 1M profiles on a larger disk. |
|
|
26
26
|
| Qdrant 1M HNSW ef sweep | production-scale | implemented | hnsw_ef=512: Recall@k 0.75, avg latency 47.2, p95 latency 68.5, p99 latency ms 68.5, max latency ms 68.5<br>hnsw_ef=768: Recall@k 0.85, avg latency 44.0, p95 latency 69.1, p99 latency ms 69.8, max latency ms 69.8<br>hnsw_ef=1024: Recall@k 0.88, avg latency 62.9, p95 latency 81.1, p99 latency ms 85.5, max latency ms 85.5<br>hnsw_ef=1536: Recall@k 0.94, avg latency 65.6, p95 latency 111.2, p99 latency ms 119.7, max latency ms 119.7<br>hnsw_ef=2048: Recall@k 0.98, avg latency 64.8, p95 latency 91.2, p99 latency ms 103.8, max latency ms 103.8 | Repeat with 100+ queries and collection-level HNSW build parameters before claiming a stable production SLO. |
|
|
27
|
-
| Scale readiness profile | production-scale | implemented | WaveMind cluster planner: simulated memories 1000000, namespaces 4096, nodes 4, replication factor 2, node loss min availability 1.00, zone loss min availability 1.00, read quorum 1, write quorum 2, placement ms
|
|
27
|
+
| Scale readiness profile | production-scale | implemented | WaveMind cluster planner: simulated memories 1000000, namespaces 4096, nodes 4, replication factor 2, node loss min availability 1.00, zone loss min availability 1.00, read quorum 1, write quorum 2, placement ms 62.6<br>WaveMind hot cache: queries 2000, capacity 512, hit rate 0.92, evictions 0, p99 lookup ms 0.00<br>WaveMind replicated runtime: nodes 3, replication factor 3, write quorum 2, read quorum 1, recalled after node loss True, repair copied records 1, tombstone repair deleted records 1, p99 query after loss ms 1.31<br>WaveMind active-active delta sync: regions 2, replication factor per region 3, records imported 6, converged after bidirectional sync True, suppressed stale import after delete True, tombstone converged True, sync ms 159.7<br>WaveMind replicated snapshot: nodes 3, manifest healthy True, offsite verified True, archive verified True, object store verified True, restored files 3, recalled after restore node loss True, snapshot ms 186.2, restore ms 24.9<br>WaveMind structured payloads: queries 4, precision@1 1.00, avg latency 0.41, p99 latency ms 0.62 | Move from local replicated runtime to service-backed replicated runs, object-store retention/download drills, and larger 10M candidate-index load tests. |
|
|
28
28
|
| Memory competitor adapter profile | agent-memory | implemented | WaveMind: precision@1 0.80, precision@3 1.00, stale suppression 1.00, avg latency 0.55, p95 latency 0.83<br>Mem0: skipped - Install Mem0 to run this adapter profile: pip install "mem0ai"<br>Zep: skipped - Install the Zep client package and set ZEP_API_KEY or ZEP_API_URL.<br>LangGraph persistent memory: skipped - Install LangGraph to run this adapter profile: pip install "langgraph" | Add documented setup commands for each competitor adapter and store checked-in results only when those real adapters run. |
|
|
29
29
|
| [LongMemEval answer generation](https://github.com/xiaowu0162/LongMemEval) | long-term-agent-memory | implemented | extractive smoke: queries 20, evidence recall@k 1.00, exact match 0.00, contains answer 0.05, token f1 0.02, avg retrieval ms 3.79, avg generation ms 0.77<br>WaveMind + qwen2.5:0.5b: queries 50, evidence recall@k 0.92, exact match 0.12, contains answer 0.18, token f1 0.18, avg retrieval ms 2.98, avg generation ms 1428.2<br>Chroma static + qwen2.5:0.5b: queries 50, evidence recall@k 0.60, exact match 0.10, contains answer 0.12, token f1 0.13, avg retrieval ms 4.10, avg generation ms 1234.7<br>Qdrant static + qwen2.5:0.5b: queries 50, evidence recall@k 0.60, exact match 0.10, contains answer 0.12, token f1 0.13, avg retrieval ms 63.8, avg generation ms 893.5<br>WaveMind + qwen2.5:1.5b: queries 50, evidence recall@k 0.92, exact match 0.24, contains answer 0.38, token f1 0.33, avg retrieval ms 2.00, avg generation ms 2153.0<br>Chroma static + qwen2.5:1.5b: queries 50, evidence recall@k 0.60, exact match 0.12, contains answer 0.16, token f1 0.17, avg retrieval ms 7.05, avg generation ms 2082.4<br>Qdrant static + qwen2.5:1.5b: queries 50, evidence recall@k 0.60, exact match 0.12, contains answer 0.16, token f1 0.17, avg retrieval ms 100.2, avg generation ms 758.1 | Run all 470 non-abstention questions with a stronger local/API model and add faithfulness/abstention scoring. |
|
|
30
30
|
|
|
@@ -741,7 +741,7 @@
|
|
|
741
741
|
"category": "production-scale",
|
|
742
742
|
"status": "implemented",
|
|
743
743
|
"source": "benchmarks/scale_readiness_benchmark.py",
|
|
744
|
-
"dataset": "Deterministic 1M-memory simulation for namespace placement, quorum runtime, active-active delta sync, replicated snapshot/offsite/archive restore, hot-cache, and structured-payload retrieval checks.",
|
|
744
|
+
"dataset": "Deterministic 1M-memory simulation for namespace placement, quorum runtime, active-active delta sync, replicated snapshot/offsite/archive restore, S3-compatible object-store upload verification, hot-cache, and structured-payload retrieval checks.",
|
|
745
745
|
"competitors": [
|
|
746
746
|
"Mem0",
|
|
747
747
|
"Zep",
|
|
@@ -764,14 +764,14 @@
|
|
|
764
764
|
"zone_loss_min_availability": 1.0,
|
|
765
765
|
"read_quorum": 1,
|
|
766
766
|
"write_quorum": 2,
|
|
767
|
-
"placement_ms":
|
|
767
|
+
"placement_ms": 62.552399991545826
|
|
768
768
|
},
|
|
769
769
|
"WaveMind hot cache": {
|
|
770
770
|
"queries": 2000,
|
|
771
771
|
"capacity": 512,
|
|
772
772
|
"hit_rate": 0.92,
|
|
773
773
|
"evictions": 0,
|
|
774
|
-
"p99_lookup_ms": 0.
|
|
774
|
+
"p99_lookup_ms": 0.0026999623514711857
|
|
775
775
|
},
|
|
776
776
|
"WaveMind replicated runtime": {
|
|
777
777
|
"nodes": 3,
|
|
@@ -781,7 +781,7 @@
|
|
|
781
781
|
"recalled_after_node_loss": true,
|
|
782
782
|
"repair_copied_records": 1,
|
|
783
783
|
"tombstone_repair_deleted_records": 1,
|
|
784
|
-
"p99_query_after_loss_ms": 1.
|
|
784
|
+
"p99_query_after_loss_ms": 1.3142999960109591
|
|
785
785
|
},
|
|
786
786
|
"WaveMind active-active delta sync": {
|
|
787
787
|
"regions": 2,
|
|
@@ -790,27 +790,28 @@
|
|
|
790
790
|
"converged_after_bidirectional_sync": true,
|
|
791
791
|
"suppressed_stale_import_after_delete": true,
|
|
792
792
|
"tombstone_converged": true,
|
|
793
|
-
"sync_ms":
|
|
793
|
+
"sync_ms": 159.69160001259297
|
|
794
794
|
},
|
|
795
795
|
"WaveMind replicated snapshot": {
|
|
796
796
|
"nodes": 3,
|
|
797
797
|
"manifest_healthy": true,
|
|
798
798
|
"offsite_verified": true,
|
|
799
799
|
"archive_verified": true,
|
|
800
|
+
"object_store_verified": true,
|
|
800
801
|
"restored_files": 3,
|
|
801
802
|
"recalled_after_restore_node_loss": true,
|
|
802
|
-
"snapshot_ms":
|
|
803
|
-
"restore_ms":
|
|
803
|
+
"snapshot_ms": 186.24169996473938,
|
|
804
|
+
"restore_ms": 24.853000009898096
|
|
804
805
|
},
|
|
805
806
|
"WaveMind structured payloads": {
|
|
806
807
|
"queries": 4,
|
|
807
808
|
"precision_at_1": 1.0,
|
|
808
|
-
"avg_latency_ms": 0.
|
|
809
|
-
"p99_latency_ms": 0.
|
|
809
|
+
"avg_latency_ms": 0.4099500220036134,
|
|
810
|
+
"p99_latency_ms": 0.6203000084497035
|
|
810
811
|
}
|
|
811
812
|
},
|
|
812
|
-
"target": "Prove the production foundation before heavier 100k, 1M, and 10M vector load tests: deterministic placement, survivable replicas, active-active sync, offsite/archive-verified restore drills, hot-cache behavior, and structured payload recall.",
|
|
813
|
-
"next_step": "Move from local replicated runtime to service-backed replicated runs, object-store
|
|
813
|
+
"target": "Prove the production foundation before heavier 100k, 1M, and 10M vector load tests: deterministic placement, survivable replicas, active-active sync, offsite/archive/object-store-verified restore drills, hot-cache behavior, and structured payload recall.",
|
|
814
|
+
"next_step": "Move from local replicated runtime to service-backed replicated runs, object-store retention/download drills, and larger 10M candidate-index load tests."
|
|
814
815
|
},
|
|
815
816
|
{
|
|
816
817
|
"id": "memory_competitor_adapter_profile",
|
|
@@ -702,7 +702,7 @@ def _implemented_entries(root: Path) -> list[dict[str, Any]]:
|
|
|
702
702
|
"category": "production-scale",
|
|
703
703
|
"status": "implemented",
|
|
704
704
|
"source": "benchmarks/scale_readiness_benchmark.py",
|
|
705
|
-
"dataset": "Deterministic 1M-memory simulation for namespace placement, quorum runtime, active-active delta sync, replicated snapshot/offsite/archive restore, hot-cache, and structured-payload retrieval checks.",
|
|
705
|
+
"dataset": "Deterministic 1M-memory simulation for namespace placement, quorum runtime, active-active delta sync, replicated snapshot/offsite/archive restore, S3-compatible object-store upload verification, hot-cache, and structured-payload retrieval checks.",
|
|
706
706
|
"competitors": ["Mem0", "Zep", "LangGraph persistent memory", "GraphRAG"],
|
|
707
707
|
"metrics": [
|
|
708
708
|
"node_loss_min_availability",
|
|
@@ -767,6 +767,7 @@ def _implemented_entries(root: Path) -> list[dict[str, Any]]:
|
|
|
767
767
|
"manifest_healthy",
|
|
768
768
|
"offsite_verified",
|
|
769
769
|
"archive_verified",
|
|
770
|
+
"object_store_verified",
|
|
770
771
|
"restored_files",
|
|
771
772
|
"recalled_after_restore_node_loss",
|
|
772
773
|
"snapshot_ms",
|
|
@@ -783,8 +784,8 @@ def _implemented_entries(root: Path) -> list[dict[str, Any]]:
|
|
|
783
784
|
),
|
|
784
785
|
),
|
|
785
786
|
},
|
|
786
|
-
"target": "Prove the production foundation before heavier 100k, 1M, and 10M vector load tests: deterministic placement, survivable replicas, active-active sync, offsite/archive-verified restore drills, hot-cache behavior, and structured payload recall.",
|
|
787
|
-
"next_step": "Move from local replicated runtime to service-backed replicated runs, object-store
|
|
787
|
+
"target": "Prove the production foundation before heavier 100k, 1M, and 10M vector load tests: deterministic placement, survivable replicas, active-active sync, offsite/archive/object-store-verified restore drills, hot-cache behavior, and structured payload recall.",
|
|
788
|
+
"next_step": "Move from local replicated runtime to service-backed replicated runs, object-store retention/download drills, and larger 10M candidate-index load tests.",
|
|
788
789
|
},
|
|
789
790
|
{
|
|
790
791
|
"id": "memory_competitor_adapter_profile",
|
|
@@ -20,6 +20,7 @@ from wavemind import (
|
|
|
20
20
|
QueryResult,
|
|
21
21
|
ReplicatedWaveMind,
|
|
22
22
|
ReplicatedSnapshotWorker,
|
|
23
|
+
S3SnapshotStore,
|
|
23
24
|
WaveMind,
|
|
24
25
|
audio_payload,
|
|
25
26
|
build_cluster_plan,
|
|
@@ -31,6 +32,26 @@ from wavemind import (
|
|
|
31
32
|
)
|
|
32
33
|
|
|
33
34
|
|
|
35
|
+
class InMemoryS3Client:
|
|
36
|
+
def __init__(self):
|
|
37
|
+
self.objects: dict[tuple[str, str], dict[str, object]] = {}
|
|
38
|
+
|
|
39
|
+
def upload_file(self, filename: str, bucket: str, key: str, ExtraArgs=None):
|
|
40
|
+
self.objects[(bucket, key)] = {
|
|
41
|
+
"Body": Path(filename).read_bytes(),
|
|
42
|
+
"Metadata": dict((ExtraArgs or {}).get("Metadata") or {}),
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
def head_object(self, Bucket: str, Key: str) -> dict[str, object]:
|
|
46
|
+
payload = self.objects[(Bucket, Key)]
|
|
47
|
+
body = payload["Body"]
|
|
48
|
+
return {
|
|
49
|
+
"ContentLength": len(body),
|
|
50
|
+
"Metadata": dict(payload["Metadata"]),
|
|
51
|
+
"ETag": '"benchmark-etag"',
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
|
|
34
55
|
def percentile(values: list[float], pct: float) -> float:
|
|
35
56
|
if not values:
|
|
36
57
|
return 0.0
|
|
@@ -336,10 +357,16 @@ def run_replicated_snapshot_profile() -> dict[str, object]:
|
|
|
336
357
|
namespace=namespace,
|
|
337
358
|
)
|
|
338
359
|
snapshot_started = time.perf_counter()
|
|
360
|
+
object_store = S3SnapshotStore.from_uri(
|
|
361
|
+
"s3://wavemind-benchmark/replicated",
|
|
362
|
+
client=InMemoryS3Client(),
|
|
363
|
+
)
|
|
339
364
|
snapshot_job = ReplicatedSnapshotWorker(memory).run_once(
|
|
340
365
|
destination=root / "snapshots",
|
|
341
366
|
offsite_destination=root / "offsite",
|
|
342
367
|
archive_destination=root / "archives",
|
|
368
|
+
object_store_destination="s3://wavemind-benchmark/replicated",
|
|
369
|
+
object_store=object_store,
|
|
343
370
|
keep_last=2,
|
|
344
371
|
)
|
|
345
372
|
snapshot_ms = (time.perf_counter() - snapshot_started) * 1000.0
|
|
@@ -366,6 +393,10 @@ def run_replicated_snapshot_profile() -> dict[str, object]:
|
|
|
366
393
|
"manifest_healthy": health["healthy"],
|
|
367
394
|
"offsite_verified": snapshot_job.offsite_verified,
|
|
368
395
|
"archive_verified": snapshot_job.archive_verified,
|
|
396
|
+
"object_store_verified": bool(
|
|
397
|
+
snapshot_job.object_store_upload
|
|
398
|
+
and snapshot_job.object_store_upload.verified
|
|
399
|
+
),
|
|
369
400
|
"total_bytes": snapshot_job.total_bytes,
|
|
370
401
|
"snapshot_ms": snapshot_ms,
|
|
371
402
|
"restore_ms": restore_ms,
|
|
@@ -480,8 +511,9 @@ def run_benchmark(
|
|
|
480
511
|
"Deterministic scale-readiness profile for cluster placement, "
|
|
481
512
|
"node/zone loss simulation, quorum-replicated runtime behavior, "
|
|
482
513
|
"active-active delta sync, replicated snapshot/offsite/archive "
|
|
483
|
-
"restore,
|
|
484
|
-
"10M-vector
|
|
514
|
+
"restore, S3-compatible object-store upload verification, hot-cache "
|
|
515
|
+
"behavior, and structured payload retrieval. This is not a 10M-vector "
|
|
516
|
+
"database load test."
|
|
485
517
|
),
|
|
486
518
|
},
|
|
487
519
|
"results": results,
|
|
@@ -529,6 +561,7 @@ def main() -> int:
|
|
|
529
561
|
print(f"| replicated snapshot | manifest_healthy | {result['manifest_healthy']} |")
|
|
530
562
|
print(f"| replicated snapshot | offsite_verified | {result['offsite_verified']} |")
|
|
531
563
|
print(f"| replicated snapshot | archive_verified | {result['archive_verified']} |")
|
|
564
|
+
print(f"| replicated snapshot | object_store_verified | {result['object_store_verified']} |")
|
|
532
565
|
print(f"| replicated snapshot | recalled_after_restore_node_loss | {result['recalled_after_restore_node_loss']} |")
|
|
533
566
|
else:
|
|
534
567
|
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, 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 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":
|
|
17
|
+
"placement_ms": 62.552399991545826,
|
|
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.0013917501782998443,
|
|
36
|
+
"p99_lookup_ms": 0.0026999623514711857
|
|
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.3142999960109591,
|
|
51
|
+
"p99_query_after_loss_ms": 1.3142999960109591
|
|
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": 159.69160001259297,
|
|
60
60
|
"suppressed_stale_import_after_delete": true,
|
|
61
61
|
"tombstone_deleted_records": 3,
|
|
62
62
|
"tombstone_converged": true
|
|
@@ -67,9 +67,10 @@
|
|
|
67
67
|
"manifest_healthy": true,
|
|
68
68
|
"offsite_verified": true,
|
|
69
69
|
"archive_verified": true,
|
|
70
|
+
"object_store_verified": true,
|
|
70
71
|
"total_bytes": 110592,
|
|
71
|
-
"snapshot_ms":
|
|
72
|
-
"restore_ms":
|
|
72
|
+
"snapshot_ms": 186.24169996473938,
|
|
73
|
+
"restore_ms": 24.853000009898096,
|
|
73
74
|
"restored_files": 3,
|
|
74
75
|
"recalled_after_restore_node_loss": true
|
|
75
76
|
},
|
|
@@ -83,8 +84,8 @@
|
|
|
83
84
|
],
|
|
84
85
|
"queries": 4,
|
|
85
86
|
"precision_at_1": 1.0,
|
|
86
|
-
"avg_latency_ms": 0.
|
|
87
|
-
"p99_latency_ms": 0.
|
|
87
|
+
"avg_latency_ms": 0.4099500220036134,
|
|
88
|
+
"p99_latency_ms": 0.6203000084497035
|
|
88
89
|
}
|
|
89
90
|
]
|
|
90
91
|
}
|