memorymaster 3.21.0__tar.gz → 3.23.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.
- {memorymaster-3.21.0/memorymaster.egg-info → memorymaster-3.23.0}/PKG-INFO +5 -2
- {memorymaster-3.21.0 → memorymaster-3.23.0}/README.md +4 -1
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/__init__.py +1 -1
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/cli.py +15 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/cli_handlers_basic.py +22 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/cli_handlers_curation.py +67 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/config.py +6 -0
- memorymaster-3.23.0/memorymaster/contradiction_probe.py +455 -0
- memorymaster-3.23.0/memorymaster/migrations/0003_contradiction_verdicts.py +42 -0
- memorymaster-3.23.0/memorymaster/migrations/0004_query_cache.py +114 -0
- memorymaster-3.23.0/memorymaster/query_cache.py +129 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/retrieval.py +91 -30
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/service.py +59 -1
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/steward.py +75 -8
- memorymaster-3.23.0/memorymaster/verbatim_cleanup.py +175 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0/memorymaster.egg-info}/PKG-INFO +5 -2
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster.egg-info/SOURCES.txt +11 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/pyproject.toml +1 -1
- memorymaster-3.23.0/tests/test_contradiction_probe.py +153 -0
- memorymaster-3.23.0/tests/test_floor_gate.py +90 -0
- memorymaster-3.23.0/tests/test_qrels_regression.py +88 -0
- memorymaster-3.23.0/tests/test_query_cache.py +127 -0
- memorymaster-3.23.0/tests/test_steward_contradiction_phase.py +181 -0
- memorymaster-3.23.0/tests/test_verbatim_cleanup.py +152 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_wiki_freshness.py +4 -1
- {memorymaster-3.21.0 → memorymaster-3.23.0}/LICENSE +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/artifacts/bm25-per-field-eval-harness.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/benchmarks/longmemeval_runner.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/benchmarks/longmemeval_vector_runner.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/benchmarks/perf_smoke.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/__main__.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/_storage_lifecycle.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/_storage_read.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/_storage_schema.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/_storage_shared.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/_storage_sources.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/_storage_write_claims.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/access_control.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/action_exporters.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/action_extractor.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/atlas_claim_extractor.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/atlas_contract.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/auto_extractor.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/auto_resolver.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/candidate_dedupe.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/claim_edges.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/claim_verifier.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/cli_helpers.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/closets.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/config_templates/claude-md-append.md +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/config_templates/codex-agents-md-append.md +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/config_templates/hooks/memorymaster-auto-ingest.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/config_templates/hooks/memorymaster-classify.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/config_templates/hooks/memorymaster-dream-sync.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/config_templates/hooks/memorymaster-precompact.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/config_templates/hooks/memorymaster-recall.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/config_templates/hooks/memorymaster-session-start.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/config_templates/hooks/memorymaster-steward-cycle.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/config_templates/hooks/memorymaster-validate-wiki.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/conflict_resolver.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/connectors/__init__.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/connectors/whatsapp.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/context_hook.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/context_optimizer.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/daily_notes.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/dashboard.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/dashboard_auth.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/db_merge.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/delta_sync.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/dream_bridge.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/embeddings.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/entity_extractor.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/entity_graph.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/entity_registry.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/federated_graphify.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/feedback.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/graph_store.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/hook_log.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/jobs/__init__.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/jobs/calibration.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/jobs/compact_summaries.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/jobs/compactor.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/jobs/daydream_ingest.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/jobs/decay.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/jobs/dedup.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/jobs/deterministic.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/jobs/entity_graph_export.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/jobs/extractor.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/jobs/staleness.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/jobs/validator.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/key_rotator.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/lifecycle.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/llm_budget.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/llm_provider.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/llm_rerank.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/llm_steward.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/mcp_path_policy.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/mcp_server.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/mcp_usage.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/media_processing.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/media_providers.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/metrics_exporter.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/migrations/0001_initial.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/migrations/0002_miner_state.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/migrations/__init__.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/migrations/runner.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/models.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/observability.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/operator.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/operator_queue.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/plugins.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/policy.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/postgres_store.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/qdrant_backend.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/qdrant_recall_fallback.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/qmd_bridge.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/query_classifier.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/query_expansion.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/recall_fusion.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/recall_tokenizer.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/retry.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/review.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/rl_trainer.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/rule_miner.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/rules.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/scheduler.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/schema.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/schema.sql +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/schema_postgres.sql +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/scope_utils.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/security.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/session_tracker.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/setup_hooks.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/skill_evolver.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/snapshot.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/steward_classifier.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/steward_features.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/storage.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/store_factory.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/transcript_miner.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/turn_schema.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/vault_bases.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/vault_curator.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/vault_exporter.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/vault_linter.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/vault_log.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/vault_query_capture.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/vault_synthesis.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/verbatim_recall.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/verbatim_store.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/webhook.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/wiki_engine.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/wiki_freshness.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/wiki_similarity.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/wiki_suggest.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster/wiki_validate.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster.egg-info/dependency_links.txt +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster.egg-info/entry_points.txt +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster.egg-info/requires.txt +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/memorymaster.egg-info/top_level.txt +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/agg_recall_latency.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/alert_operator_metrics.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/audit_dedupe_precision.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/autoresearch_daemon.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/backfill_entity_extraction.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/backfill_graph_store.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/backfill_stop_hook_citations.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/backtest_steward_classifier.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/build_steward_training_set.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/check_hook_template_drift.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/claude_to_turns.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/codex_live_to_turns.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/compaction_edge_cases.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/compaction_trace_report.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/compaction_trace_validate.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/confusion_matrix_eval.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/conversation_importer.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/conversation_to_turns.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/e2e_operator.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/email_live_to_turns.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/eval_bm25_sweep.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/eval_classify_f1.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/eval_memorymaster.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/eval_recall_precision_at_5.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/eval_recall_quality.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/eval_steward_pareto.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/eval_verbatim_recall.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/expand_recall_eval.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/generate_drill_signoff.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/git_to_turns.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/github_live_to_turns.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/gitnexus_to_claims.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/grid_recall_weights.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/index_claims_to_qdrant.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/ingest_planning_docs.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/jira_live_to_turns.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/label_prompts_with_judge.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/llm_benchmark.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/measure_dedupe_thresholds.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/merge_scope_variants.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/messages_to_turns.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/operator_metrics.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/precompute_candidates.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/recurring_incident_drill.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/release_readiness.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/run_codex_autologger.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/run_incident_drill.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/scheduled_ingest.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/setup-hooks.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/slack_live_to_turns.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/sync_hook_templates.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/tickets_to_turns.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/train_steward_classifier.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/scripts/webhook_to_turns.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/setup.cfg +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/bench_longmemeval.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/conftest.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/integration/test_extract_llm_ollama_live.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_access_control.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_action_exporters.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_action_extractor.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_atlas_claim_extractor.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_atlas_contract.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_atlas_source_schema.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_auto_extractor.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_auto_ingest_hook_citations.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_auto_ingest_hook_schema.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_auto_resolver.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_auto_validate.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_backend_parity.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_bm25_per_field.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_calibration.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_calibration_priors_applied.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_candidate_dedupe.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_claim_edges.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_claim_links.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_claim_type_ranking.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_classify_hook_f1.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_classify_hook_latency.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_claude_to_turns.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_cli_dry_run.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_cli_json_flag.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_cli_ready.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_cli_review_queue.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_cli_subcommands.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_closets.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_closets_recall_integration.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_compact_summaries.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_compact_summaries_sensitivity.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_compaction_trace.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_compactor_artifact_order.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_config.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_conflict_resolver.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_confusion_matrix_eval.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_connection_retry.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_connectors.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_context_hook.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_context_optimizer.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_context_optimizer_provider.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_conversation_to_turns.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_dashboard.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_dashboard_auth.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_dashboard_coverage.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_dashboard_latency.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_dashboard_lineage.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_dashboard_review_queue.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_daydream_ingest.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_db_merge_confidence_conflict.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_db_merge_coverage_v2.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_decay_coverage.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_decay_respects_pinned.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_dedup.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_dedup_cli.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_dedup_conflict_disambiguation.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_delta_sync.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_deterministic_predicates.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_dream_bridge_coverage_v2.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_dream_bridge_sensitivity.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_embeddings_coverage.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_entity_extractor.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_entity_extractor_llm.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_entity_graph.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_entity_graph_export.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_entity_new_kinds.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_entity_regex_v3.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_entity_registry.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_eval_harness.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_events_schema.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_extract_llm_ollama.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_federated_graphify_mcp.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_federated_query_safety.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_feedback.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_fts5_search.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_graph_distance.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_graph_store.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_handler_regressions.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_hook_env_isolation.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_human_id.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_incident_drill_runner.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_integration_workflows.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_key_rotator.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_lifecycle.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_lifecycle_supersede_invariant.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_llm_budget.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_llm_fallback.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_llm_provider_claude_cli.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_llm_provider_key_rotation.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_llm_steward_coverage.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_llm_steward_key_rotation.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_mcp_filter_bypass.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_mcp_helpers.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_mcp_path_policy.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_mcp_rate_limit.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_mcp_server_validation.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_mcp_usage.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_media_processing.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_meta_decisions.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_metrics_exporter.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_migrations.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_observability.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_obsidian_mind_patterns.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_operator.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_operator_queue.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_perf_smoke_config.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_plugins.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_policy_coverage.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_policy_mode_env.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_postgres_parity.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_qdrant_backend.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_qmd_bridge.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_query_classifier.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_query_expansion.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_recall_entity_fanout.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_recall_fusion.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_recall_latency.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_recall_precision_at_5.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_recall_tokenizer.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_recall_vector_fallback.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_reliability_hardening.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_resolvers_concurrent_supersede.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_retrieval_profile.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_retrieval_profiles.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_retrieval_rrf_tiebreaker.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_retrieval_weights.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_review.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_rl_trainer.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_rrf_auto_gate.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_rule_claims.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_rule_miner.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_scheduler.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_schema.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_scope_boost.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_scope_utils.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_security_access.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_security_patterns.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_sensitivity_filter_adversarial.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_sensitivity_filter_adversarial_v2.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_sensitivity_filter_t07.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_service_coverage.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_session_tracker.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_snapshot.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_snapshot_roundtrip.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_sqlite_core.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_staleness.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_stealth_mode.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_steward.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_steward_classifier.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_steward_daydream_hook.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_steward_features.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_steward_features_v3.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_steward_resolution_parity.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_storage_parity.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_store_factory.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_tenant_isolation.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_turn_schema.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_two_pass_recall.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_v311_fixes.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_v313_e2e.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_v313_run_cycle_dedupe.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_v390_e2e.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_v391_strict_warnings.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_vault_exporter.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_vault_linter_orphan.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_vector_search.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_verbatim_dedup.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_verbatim_recall.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_verbatim_store.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_verbatim_store_qdrant.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_webhook.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_webhook_hmac.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_whatsapp_importer.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_wiki_autopromote.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_wiki_binding.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_wiki_engine_idempotency.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_wiki_explored_and_contradictions.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_wiki_similarity_multiscope.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_wiki_suggest.py +0 -0
- {memorymaster-3.21.0 → memorymaster-3.23.0}/tests/test_wiki_validate_cli.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: memorymaster
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.23.0
|
|
4
4
|
Summary: Production-grade memory reliability system for AI coding agents. Lifecycle-managed claims with citations, conflict detection, steward governance, and MCP integration.
|
|
5
5
|
Author: wolverin0
|
|
6
6
|
License: MIT
|
|
@@ -52,7 +52,7 @@ Lifecycle-managed claims with citations, conflict detection, steward governance,
|
|
|
52
52
|
|
|
53
53
|
[](LICENSE)
|
|
54
54
|
[](https://www.python.org/downloads/)
|
|
55
|
-
[]()
|
|
56
56
|
[]()
|
|
57
57
|
[]()
|
|
58
58
|
[](https://pypi.org/project/memorymaster/)
|
|
@@ -90,6 +90,9 @@ recent PR status, and sensitivity-filter invariants.
|
|
|
90
90
|
- **Rule-shaped claims** (new in v3.21.0): prescriptive `when <trigger>, do <action> because <rationale>` claims (`ingest_rule` / `query_rules`) — the shape an agent needs to actually change behaviour next time, not just recall a fact
|
|
91
91
|
- **Correction mining** (new in v3.21.0): `mine-rules` scans the verbatim transcript archive for user corrections and distills them into rule claims; the Stop hook also mines each session's latest correction automatically
|
|
92
92
|
- **Versioned schema migrations** (new in v3.20.0): `migrate` applies SQLite/Postgres migrations with sha256 drift detection; incremental `export-delta` ships small claim deltas for cheap cross-machine sync
|
|
93
|
+
- **Retrieval quality** (new in v3.22.0): floor-ratio boost gate (`MEMORYMASTER_BOOST_FLOOR_RATIO`) stops fresh-but-wrong claims outranking the true match; `query --explain` shows per-stage score attribution; an opt-in correctness-safe query cache (`MEMORYMASTER_QUERY_CACHE`) with a generation gate
|
|
94
|
+
- **Semantic contradiction probe** (new in v3.22.0, wired as a steward phase in v3.23.0): `detect-contradictions` finds claims that genuinely contradict each other (beyond the deterministic same-subject conflict check) via an LLM judge with a Wilson-CI rate and verdict cache; in v3.23 the same probe runs inside `run-steward` and emits paste-ready `conflicted` proposals
|
|
95
|
+
- **Verbatim archive cleanup** (new in v3.23.0): `verbatim-cleanup` dedups the raw-transcript table and optionally purges pre-#128 junk rows, with a dry-run default and FTS5 mirror sync
|
|
93
96
|
- **Steward governance**: multi-probe validators (filesystem, format, citation, semantic, tool) with proposal review
|
|
94
97
|
- **Conflict resolution**: 5-tier auto (confidence > freshness > citations > LLM > manual)
|
|
95
98
|
- **Auto-redaction** at ingest: JWT, GitHub tokens, Bearer, AWS keys, SSH keys, custom patterns
|
|
@@ -6,7 +6,7 @@ Lifecycle-managed claims with citations, conflict detection, steward governance,
|
|
|
6
6
|
|
|
7
7
|
[](LICENSE)
|
|
8
8
|
[](https://www.python.org/downloads/)
|
|
9
|
-
[]()
|
|
10
10
|
[]()
|
|
11
11
|
[]()
|
|
12
12
|
[](https://pypi.org/project/memorymaster/)
|
|
@@ -44,6 +44,9 @@ recent PR status, and sensitivity-filter invariants.
|
|
|
44
44
|
- **Rule-shaped claims** (new in v3.21.0): prescriptive `when <trigger>, do <action> because <rationale>` claims (`ingest_rule` / `query_rules`) — the shape an agent needs to actually change behaviour next time, not just recall a fact
|
|
45
45
|
- **Correction mining** (new in v3.21.0): `mine-rules` scans the verbatim transcript archive for user corrections and distills them into rule claims; the Stop hook also mines each session's latest correction automatically
|
|
46
46
|
- **Versioned schema migrations** (new in v3.20.0): `migrate` applies SQLite/Postgres migrations with sha256 drift detection; incremental `export-delta` ships small claim deltas for cheap cross-machine sync
|
|
47
|
+
- **Retrieval quality** (new in v3.22.0): floor-ratio boost gate (`MEMORYMASTER_BOOST_FLOOR_RATIO`) stops fresh-but-wrong claims outranking the true match; `query --explain` shows per-stage score attribution; an opt-in correctness-safe query cache (`MEMORYMASTER_QUERY_CACHE`) with a generation gate
|
|
48
|
+
- **Semantic contradiction probe** (new in v3.22.0, wired as a steward phase in v3.23.0): `detect-contradictions` finds claims that genuinely contradict each other (beyond the deterministic same-subject conflict check) via an LLM judge with a Wilson-CI rate and verdict cache; in v3.23 the same probe runs inside `run-steward` and emits paste-ready `conflicted` proposals
|
|
49
|
+
- **Verbatim archive cleanup** (new in v3.23.0): `verbatim-cleanup` dedups the raw-transcript table and optionally purges pre-#128 junk rows, with a dry-run default and FTS5 mirror sync
|
|
47
50
|
- **Steward governance**: multi-probe validators (filesystem, format, citation, semantic, tool) with proposal review
|
|
48
51
|
- **Conflict resolution**: 5-tier auto (confidence > freshness > citations > LLM > manual)
|
|
49
52
|
- **Auto-redaction** at ingest: JWT, GitHub tokens, Bearer, AWS keys, SSH keys, custom patterns
|
|
@@ -185,6 +185,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
185
185
|
query.add_argument("--scope-allowlist", default="", help="Comma-separated scopes to include (e.g. project,team_x)")
|
|
186
186
|
query.add_argument("--as-of", default="", help="Temporal query: show claims valid at this ISO timestamp")
|
|
187
187
|
query.add_argument("--auto-classify", action="store_true", help="Auto-classify query type and use optimal retrieval mode")
|
|
188
|
+
query.add_argument("--explain", action="store_true", help="Show per-stage score attribution (relevance vs. boosts, floor-gate status) for each result")
|
|
188
189
|
|
|
189
190
|
context = sub.add_parser("context", help="Pack relevant claims into a token-budgeted context block for AI agents")
|
|
190
191
|
context.add_argument("text", help="Query text describing what context is needed")
|
|
@@ -331,6 +332,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
331
332
|
steward.add_argument("--probe-failure-threshold", type=int, default=3, help="Open circuit breaker for a probe type after this many timeout/error failures")
|
|
332
333
|
steward.add_argument("--disable-semantic-probe", action="store_true", help="Disable semantic retrieval probe in steward planner")
|
|
333
334
|
steward.add_argument("--disable-tool-probe", action="store_true", help="Disable tool/storage probe in steward planner")
|
|
335
|
+
steward.add_argument("--disable-contradiction-probe", action="store_true", help="Disable semantic contradiction probe in steward planner (v3.23)")
|
|
334
336
|
steward.add_argument("--allow-sensitive", action="store_true", help="Include sensitive claims in stewardship scan")
|
|
335
337
|
steward.add_argument("--apply", action="store_true", help="Apply proposed status transitions")
|
|
336
338
|
steward.add_argument("--artifact-json", default="artifacts/steward/steward_report.json", help="Path to steward JSON report artifact")
|
|
@@ -463,6 +465,19 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
463
465
|
mine_rules_cmd.add_argument("--provider", default="claude_cli", help="LLM provider for this run (default: claude_cli)")
|
|
464
466
|
mine_rules_cmd.add_argument("--reset", action="store_true", help="Clear the stored watermark before running (re-scan from the start)")
|
|
465
467
|
|
|
468
|
+
verbatim_clean = sub.add_parser("verbatim-cleanup", help="Dedup the verbatim archive + optionally purge pre-#128 capture-bug junk (v3.23)")
|
|
469
|
+
verbatim_clean.add_argument("--analyze-only", dest="analyze_only", action="store_true", help="Report composition only; do not delete")
|
|
470
|
+
verbatim_clean.add_argument("--apply", action="store_true", help="Actually delete (default is dry-run)")
|
|
471
|
+
verbatim_clean.add_argument("--no-dedup", dest="no_dedup", action="store_true", help="Skip the (session_id, content) exact-dup pass")
|
|
472
|
+
verbatim_clean.add_argument("--purge-junk", dest="purge_junk", action="store_true", help="Also delete rows matching known pre-#128 junk prefixes (wiki-absorb prompt, etc.)")
|
|
473
|
+
|
|
474
|
+
detect_contra = sub.add_parser("detect-contradictions", help="Find semantic contradictions between topically-similar claims via an LLM judge (v3.22)")
|
|
475
|
+
detect_contra.add_argument("--limit", type=int, default=200, help="Max claims to load for pair sampling")
|
|
476
|
+
detect_contra.add_argument("--sample", type=int, default=50, help="Max candidate pairs to judge this run (caps LLM calls)")
|
|
477
|
+
detect_contra.add_argument("--sim-low", dest="sim_low", type=float, default=0.60, help="Lower similarity-band bound (below = unrelated)")
|
|
478
|
+
detect_contra.add_argument("--sim-high", dest="sim_high", type=float, default=0.92, help="Upper similarity-band bound (at/above = near-duplicates, dedup's job)")
|
|
479
|
+
detect_contra.add_argument("--apply", action="store_true", help="Flag the lower-confidence claim of each contradicting pair as conflicted (reversible)")
|
|
480
|
+
|
|
466
481
|
verify_cmd = sub.add_parser("verify-claims", help="Cross-check claims against current codebase")
|
|
467
482
|
verify_cmd.add_argument("--scope", default="", help="Scope filter")
|
|
468
483
|
verify_cmd.add_argument("--limit", type=int, default=200, help="Max claims to check")
|
|
@@ -832,6 +832,25 @@ def _handle_run_cycle(args: argparse.Namespace, service, parser: argparse.Argume
|
|
|
832
832
|
return 0
|
|
833
833
|
|
|
834
834
|
|
|
835
|
+
def _print_score_explanation(breakdown: dict | None) -> None:
|
|
836
|
+
"""Render per-stage score attribution for `query --explain`.
|
|
837
|
+
|
|
838
|
+
Shows query-relevance vs. the metadata boost terms and whether the
|
|
839
|
+
floor-ratio gate suppressed the boosts for this result.
|
|
840
|
+
"""
|
|
841
|
+
if not breakdown:
|
|
842
|
+
print(" explain: (no breakdown — legacy retrieval mode)")
|
|
843
|
+
return
|
|
844
|
+
terms = breakdown.get("boost_terms", {})
|
|
845
|
+
w = breakdown.get("weights", (0, 0, 0, 0))
|
|
846
|
+
applied = breakdown.get("boosts_applied", True)
|
|
847
|
+
gate = "applied" if applied else f"GATED (relevance < floor={breakdown.get('floor', 0.0):.3f})"
|
|
848
|
+
term_str = " ".join(f"{k}={v:+.3f}" for k, v in terms.items())
|
|
849
|
+
print(f" explain: relevance={breakdown.get('relevance', 0.0):.3f} "
|
|
850
|
+
f"boosts={breakdown.get('boosts_total', 0.0):+.3f} [{gate}] -> final={breakdown.get('final', 0.0):.3f}")
|
|
851
|
+
print(f" weights(l,c,f,v)={tuple(round(x, 2) for x in w)} boost_terms: {term_str}")
|
|
852
|
+
|
|
853
|
+
|
|
835
854
|
def _handle_query(args: argparse.Namespace, service, parser: argparse.ArgumentParser, effective_db: str) -> int:
|
|
836
855
|
resolve_allow_sensitive_access(allow_sensitive=args.allow_sensitive, context="cli.query")
|
|
837
856
|
if getattr(args, "as_of", ""):
|
|
@@ -876,6 +895,8 @@ def _handle_query(args: argparse.Namespace, service, parser: argparse.ArgumentPa
|
|
|
876
895
|
f"vec={sc['vector_score']:.3f} "
|
|
877
896
|
f"active={int(bool(ann.get('active')))} stale={int(bool(ann.get('stale')))} "
|
|
878
897
|
f"conflicted={int(bool(ann.get('conflicted')))} pinned={int(bool(ann.get('pinned')))}")
|
|
898
|
+
if getattr(args, "explain", False):
|
|
899
|
+
_print_score_explanation(row.get("breakdown"))
|
|
879
900
|
print(f"rows={len(rows_data)}")
|
|
880
901
|
return 0
|
|
881
902
|
|
|
@@ -1207,6 +1228,7 @@ def _handle_run_steward(args: argparse.Namespace, service, parser: argparse.Argu
|
|
|
1207
1228
|
probe_failure_threshold=args.probe_failure_threshold,
|
|
1208
1229
|
enable_semantic_probe=not args.disable_semantic_probe,
|
|
1209
1230
|
enable_tool_probe=not args.disable_tool_probe,
|
|
1231
|
+
enable_contradiction_probe=not getattr(args, "disable_contradiction_probe", False),
|
|
1210
1232
|
artifact_path=Path(args.artifact_json),
|
|
1211
1233
|
)
|
|
1212
1234
|
elapsed_ms = (time.perf_counter() - t0) * 1000
|
|
@@ -368,6 +368,71 @@ def _handle_mine_rules(args: argparse.Namespace, service, parser: argparse.Argum
|
|
|
368
368
|
return 0
|
|
369
369
|
|
|
370
370
|
|
|
371
|
+
def _handle_detect_contradictions(args: argparse.Namespace, service, parser: argparse.ArgumentParser, effective_db: str) -> int:
|
|
372
|
+
from memorymaster.contradiction_probe import run_probe
|
|
373
|
+
t0 = time.perf_counter()
|
|
374
|
+
result = run_probe(
|
|
375
|
+
effective_db, service,
|
|
376
|
+
limit=getattr(args, "limit", 200),
|
|
377
|
+
sample=getattr(args, "sample", 50),
|
|
378
|
+
sim_low=getattr(args, "sim_low", 0.60),
|
|
379
|
+
sim_high=getattr(args, "sim_high", 0.92),
|
|
380
|
+
apply=getattr(args, "apply", False),
|
|
381
|
+
)
|
|
382
|
+
elapsed_ms = (time.perf_counter() - t0) * 1000
|
|
383
|
+
if args.json_output:
|
|
384
|
+
print(_json_envelope(result, query_ms=elapsed_ms))
|
|
385
|
+
else:
|
|
386
|
+
ci = result["rate_ci"]
|
|
387
|
+
abort = f", ABORTED ({result['aborted_reason']})" if result.get("aborted_reason") else ""
|
|
388
|
+
print(
|
|
389
|
+
f"Contradictions: {result['contradictions']}/{result['judged']} judged "
|
|
390
|
+
f"(rate={result['rate']:.2f} CI95=[{ci[0]:.2f},{ci[1]:.2f}]) from "
|
|
391
|
+
f"{result['candidate_pairs']} candidate pairs; cache_hits={result['cache_hits']}, "
|
|
392
|
+
f"errors={result['judge_errors']}, flagged={result['flagged_conflicted']}{abort} ({elapsed_ms:.0f}ms)"
|
|
393
|
+
)
|
|
394
|
+
for f in result["found"][:20]:
|
|
395
|
+
print(f" [{f['severity']}] claims {f['claim_a_id']} <> {f['claim_b_id']} "
|
|
396
|
+
f"(sim={f['similarity']}): {f['reason']}")
|
|
397
|
+
return 0
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
def _handle_verbatim_cleanup(args: argparse.Namespace, service, parser: argparse.ArgumentParser, effective_db: str) -> int:
|
|
401
|
+
from memorymaster.verbatim_cleanup import analyze, cleanup
|
|
402
|
+
t0 = time.perf_counter()
|
|
403
|
+
if getattr(args, "analyze_only", False):
|
|
404
|
+
result = analyze(effective_db)
|
|
405
|
+
else:
|
|
406
|
+
result = cleanup(
|
|
407
|
+
effective_db,
|
|
408
|
+
dedup=not getattr(args, "no_dedup", False),
|
|
409
|
+
purge_junk=getattr(args, "purge_junk", False),
|
|
410
|
+
dry_run=not getattr(args, "apply", False),
|
|
411
|
+
)
|
|
412
|
+
elapsed_ms = (time.perf_counter() - t0) * 1000
|
|
413
|
+
if args.json_output:
|
|
414
|
+
print(_json_envelope(result, query_ms=elapsed_ms))
|
|
415
|
+
else:
|
|
416
|
+
if not result.get("verbatim_present", True):
|
|
417
|
+
print("verbatim-cleanup: verbatim_memories table not present; nothing to do")
|
|
418
|
+
elif "before_total" in result: # cleanup result
|
|
419
|
+
tag = "(dry-run)" if result["dry_run"] else "(applied)"
|
|
420
|
+
print(
|
|
421
|
+
f"verbatim-cleanup {tag}: dedup_deleted={result['dedup_deleted']}, "
|
|
422
|
+
f"junk_deleted={result['junk_deleted']}, "
|
|
423
|
+
f"before={result['before_total']} -> after={result['after_total']} "
|
|
424
|
+
f"({elapsed_ms:.0f}ms)"
|
|
425
|
+
)
|
|
426
|
+
else: # analyze result
|
|
427
|
+
print(
|
|
428
|
+
f"verbatim analyze: total={result['total']}, distinct={result['distinct_content']}, "
|
|
429
|
+
f"duplicate_extras={result['duplicate_extras']}, "
|
|
430
|
+
f"empty_role={result['empty_role_rows']}, junk_prefix={result['junk_prefix_rows']} "
|
|
431
|
+
f"({elapsed_ms:.0f}ms)"
|
|
432
|
+
)
|
|
433
|
+
return 0
|
|
434
|
+
|
|
435
|
+
|
|
371
436
|
def _handle_wiki_breakdown(args: argparse.Namespace, service, parser: argparse.ArgumentParser, effective_db: str) -> int:
|
|
372
437
|
from memorymaster.wiki_engine import breakdown
|
|
373
438
|
t0 = time.perf_counter()
|
|
@@ -729,6 +794,8 @@ COMMAND_HANDLERS: dict[str, object] = {
|
|
|
729
794
|
"bases-generate": _handle_bases_generate,
|
|
730
795
|
"mine-transcript": _handle_mine_transcript,
|
|
731
796
|
"mine-rules": _handle_mine_rules,
|
|
797
|
+
"detect-contradictions": _handle_detect_contradictions,
|
|
798
|
+
"verbatim-cleanup": _handle_verbatim_cleanup,
|
|
732
799
|
"verify-claims": _handle_verify_claims,
|
|
733
800
|
"extract-entities": _handle_extract_entities,
|
|
734
801
|
"entity-stats": _handle_entity_stats,
|
|
@@ -222,6 +222,11 @@ class Config:
|
|
|
222
222
|
llm_rerank: bool = False
|
|
223
223
|
rrf_tiebreaker_enabled: bool = False
|
|
224
224
|
rrf_tiebreaker_threshold: float = 0.01
|
|
225
|
+
# Floor-ratio gate (gbrain v0.35.6 "hybrid.floor_ratio"): metadata boosts
|
|
226
|
+
# (confidence/freshness/tier/pinned) only apply to candidates whose
|
|
227
|
+
# query-relevance (lexical+vector) is >= boost_floor_ratio * top relevance.
|
|
228
|
+
# 0.0 = disabled (boosts always apply) — preserves pre-v3.22 behaviour.
|
|
229
|
+
boost_floor_ratio: float = 0.0
|
|
225
230
|
|
|
226
231
|
# --- Initial confidence priors calibrated from validator outcomes ---
|
|
227
232
|
default_initial_confidence: float = DEFAULT_INITIAL_CONFIDENCE
|
|
@@ -397,6 +402,7 @@ def load_config(config_path: str | Path | None = None) -> Config:
|
|
|
397
402
|
_apply_env_bool(overrides, "MEMORYMASTER_LLM_RERANK", "llm_rerank")
|
|
398
403
|
_apply_env_bool(overrides, "MEMORYMASTER_RRF_TIEBREAKER", "rrf_tiebreaker_enabled")
|
|
399
404
|
_apply_env_float(overrides, "MEMORYMASTER_RRF_TIEBREAKER_THRESHOLD", "rrf_tiebreaker_threshold")
|
|
405
|
+
_apply_env_float(overrides, "MEMORYMASTER_BOOST_FLOOR_RATIO", "boost_floor_ratio")
|
|
400
406
|
_apply_env_retrieval_profiles(overrides)
|
|
401
407
|
|
|
402
408
|
# Filter to only valid Config fields
|