superlocalmemory 4.1.13 → 4.1.14
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.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +48 -0
- package/README.md +3 -3
- package/package.json +1 -8
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/CLAUDE.md +3 -3
- package/plugin/agents/slm-governance-advisor.md +1 -1
- package/plugin/agents/slm-loop-runner.md +1 -1
- package/plugin/agents/slm-memory-advisor.md +1 -1
- package/plugin/agents/slm-optimize-advisor.md +1 -1
- package/plugin/requirements.txt +1 -1
- package/plugin/skills/slm-cache/SKILL.md +1 -1
- package/plugin/skills/slm-compress/SKILL.md +1 -1
- package/plugin/skills/slm-governance/SKILL.md +1 -1
- package/plugin/skills/slm-graph/SKILL.md +1 -1
- package/plugin/skills/slm-loop/SKILL.md +1 -1
- package/plugin/skills/slm-mesh/SKILL.md +1 -1
- package/plugin/skills/slm-profile/SKILL.md +1 -1
- package/plugin/skills/slm-recall/SKILL.md +1 -1
- package/plugin/skills/slm-remember/SKILL.md +1 -1
- package/plugin/skills/slm-scope/SKILL.md +1 -1
- package/plugin/skills/slm-session/SKILL.md +1 -1
- package/plugin/skills/slm-status/SKILL.md +1 -1
- package/plugin-src/agents/slm-memory-advisor.md +1 -1
- package/plugin-src/agents/slm-optimize-advisor.md +1 -1
- package/plugin-src/rules/AGENTS.md +1 -1
- package/plugin-src/skills/slm-cache/SKILL.md +1 -1
- package/plugin-src/skills/slm-compress/SKILL.md +1 -1
- package/plugin-src/skills/slm-governance/SKILL.md +1 -1
- package/plugin-src/skills/slm-graph/SKILL.md +1 -1
- package/plugin-src/skills/slm-loop/SKILL.md +1 -1
- package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
- package/plugin-src/skills/slm-profile/SKILL.md +1 -1
- package/plugin-src/skills/slm-recall/SKILL.md +1 -1
- package/plugin-src/skills/slm-remember/SKILL.md +1 -1
- package/plugin-src/skills/slm-scope/SKILL.md +1 -1
- package/plugin-src/skills/slm-session/SKILL.md +1 -1
- package/plugin-src/skills/slm-status/SKILL.md +1 -1
- package/scripts/postinstall.js +71 -2
- package/pyproject.toml +0 -250
- package/src/superlocalmemory/__init__.py +0 -82
- package/src/superlocalmemory/access/__init__.py +0 -3
- package/src/superlocalmemory/access/rbac.py +0 -575
- package/src/superlocalmemory/attribution/__init__.py +0 -9
- package/src/superlocalmemory/attribution/signer.py +0 -173
- package/src/superlocalmemory/attribution/watermark.py +0 -189
- package/src/superlocalmemory/brain/__init__.py +0 -5
- package/src/superlocalmemory/brain/truth.py +0 -418
- package/src/superlocalmemory/cli/__init__.py +0 -5
- package/src/superlocalmemory/cli/__main__.py +0 -17
- package/src/superlocalmemory/cli/_lazy_init.py +0 -115
- package/src/superlocalmemory/cli/cache_cmd.py +0 -198
- package/src/superlocalmemory/cli/commands.py +0 -4710
- package/src/superlocalmemory/cli/compress_cmd.py +0 -151
- package/src/superlocalmemory/cli/context_commands.py +0 -193
- package/src/superlocalmemory/cli/daemon.py +0 -909
- package/src/superlocalmemory/cli/db_migrate.py +0 -150
- package/src/superlocalmemory/cli/diagnostics_cmd.py +0 -101
- package/src/superlocalmemory/cli/escape_hatch.py +0 -220
- package/src/superlocalmemory/cli/evidence_cmd.py +0 -103
- package/src/superlocalmemory/cli/gdpr_cmd.py +0 -792
- package/src/superlocalmemory/cli/gdpr_io.py +0 -109
- package/src/superlocalmemory/cli/help_cmd.py +0 -197
- package/src/superlocalmemory/cli/host_upgrades.py +0 -189
- package/src/superlocalmemory/cli/ingest_cmd.py +0 -327
- package/src/superlocalmemory/cli/json_output.py +0 -81
- package/src/superlocalmemory/cli/loop_cmd.py +0 -187
- package/src/superlocalmemory/cli/main.py +0 -1145
- package/src/superlocalmemory/cli/mesh_cmd.py +0 -38
- package/src/superlocalmemory/cli/migrate_cmd.py +0 -55
- package/src/superlocalmemory/cli/ops_cmd.py +0 -281
- package/src/superlocalmemory/cli/optimize_cmd.py +0 -179
- package/src/superlocalmemory/cli/optimize_constants.py +0 -31
- package/src/superlocalmemory/cli/pending_store.py +0 -296
- package/src/superlocalmemory/cli/proxy_cmd.py +0 -108
- package/src/superlocalmemory/cli/scale_engine_cmd.py +0 -56
- package/src/superlocalmemory/cli/service_installer.py +0 -373
- package/src/superlocalmemory/cli/setup_wizard.py +0 -1162
- package/src/superlocalmemory/cli/summary_cmd.py +0 -215
- package/src/superlocalmemory/cli/version_banner.py +0 -202
- package/src/superlocalmemory/cli/wizard_v3426_options.py +0 -129
- package/src/superlocalmemory/code_graph/__init__.py +0 -46
- package/src/superlocalmemory/code_graph/blast_radius.py +0 -177
- package/src/superlocalmemory/code_graph/bridge/__init__.py +0 -36
- package/src/superlocalmemory/code_graph/bridge/entity_resolver.py +0 -490
- package/src/superlocalmemory/code_graph/bridge/event_listeners.py +0 -206
- package/src/superlocalmemory/code_graph/bridge/fact_enricher.py +0 -159
- package/src/superlocalmemory/code_graph/bridge/hebbian_linker.py +0 -170
- package/src/superlocalmemory/code_graph/bridge/maintenance.py +0 -220
- package/src/superlocalmemory/code_graph/bridge/temporal_checker.py +0 -152
- package/src/superlocalmemory/code_graph/changes.py +0 -363
- package/src/superlocalmemory/code_graph/communities.py +0 -299
- package/src/superlocalmemory/code_graph/config.py +0 -154
- package/src/superlocalmemory/code_graph/database.py +0 -526
- package/src/superlocalmemory/code_graph/extractors/__init__.py +0 -95
- package/src/superlocalmemory/code_graph/extractors/python.py +0 -413
- package/src/superlocalmemory/code_graph/extractors/typescript.py +0 -556
- package/src/superlocalmemory/code_graph/flows.py +0 -350
- package/src/superlocalmemory/code_graph/git_hooks.py +0 -226
- package/src/superlocalmemory/code_graph/graph_engine.py +0 -295
- package/src/superlocalmemory/code_graph/graph_store.py +0 -335
- package/src/superlocalmemory/code_graph/incremental.py +0 -200
- package/src/superlocalmemory/code_graph/models.py +0 -130
- package/src/superlocalmemory/code_graph/parser.py +0 -687
- package/src/superlocalmemory/code_graph/resolver.py +0 -321
- package/src/superlocalmemory/code_graph/search.py +0 -460
- package/src/superlocalmemory/code_graph/service.py +0 -95
- package/src/superlocalmemory/code_graph/watcher.py +0 -207
- package/src/superlocalmemory/compliance/__init__.py +0 -0
- package/src/superlocalmemory/compliance/abac.py +0 -204
- package/src/superlocalmemory/compliance/audit.py +0 -385
- package/src/superlocalmemory/compliance/eu_ai_act.py +0 -101
- package/src/superlocalmemory/compliance/gdpr.py +0 -1479
- package/src/superlocalmemory/compliance/lifecycle.py +0 -158
- package/src/superlocalmemory/compliance/retention.py +0 -415
- package/src/superlocalmemory/compliance/scheduler.py +0 -217
- package/src/superlocalmemory/contracts/__init__.py +0 -1
- package/src/superlocalmemory/contracts/schemas/agent-experience-v1.schema.json +0 -92
- package/src/superlocalmemory/contracts/schemas/agent-integration-contract-v2.schema.json +0 -46
- package/src/superlocalmemory/contracts/schemas/cognitive-turn-receipt-v1.schema.json +0 -59
- package/src/superlocalmemory/contracts/v402.py +0 -62
- package/src/superlocalmemory/core/__init__.py +0 -0
- package/src/superlocalmemory/core/actor_context.py +0 -166
- package/src/superlocalmemory/core/admission.py +0 -769
- package/src/superlocalmemory/core/backend_orchestrator.py +0 -637
- package/src/superlocalmemory/core/block_hygiene.py +0 -147
- package/src/superlocalmemory/core/community_summary.py +0 -267
- package/src/superlocalmemory/core/component_healer.py +0 -144
- package/src/superlocalmemory/core/component_registry.py +0 -514
- package/src/superlocalmemory/core/config.py +0 -2204
- package/src/superlocalmemory/core/consolidation_engine.py +0 -983
- package/src/superlocalmemory/core/context_cache.py +0 -574
- package/src/superlocalmemory/core/derivation_lineage.py +0 -246
- package/src/superlocalmemory/core/embedding_worker.py +0 -208
- package/src/superlocalmemory/core/embeddings.py +0 -1052
- package/src/superlocalmemory/core/engine.py +0 -1395
- package/src/superlocalmemory/core/engine_capabilities.py +0 -24
- package/src/superlocalmemory/core/engine_ingestion.py +0 -983
- package/src/superlocalmemory/core/engine_lock.py +0 -75
- package/src/superlocalmemory/core/engine_wiring.py +0 -776
- package/src/superlocalmemory/core/entity_community.py +0 -178
- package/src/superlocalmemory/core/error_envelope.py +0 -60
- package/src/superlocalmemory/core/evidence_bundle.py +0 -528
- package/src/superlocalmemory/core/fact_consolidator.py +0 -812
- package/src/superlocalmemory/core/file_lock.py +0 -92
- package/src/superlocalmemory/core/graph_analyzer.py +0 -456
- package/src/superlocalmemory/core/graph_metrics.py +0 -597
- package/src/superlocalmemory/core/graph_pruner.py +0 -939
- package/src/superlocalmemory/core/health_monitor.py +0 -338
- package/src/superlocalmemory/core/hooks.py +0 -65
- package/src/superlocalmemory/core/ingest_gate.py +0 -133
- package/src/superlocalmemory/core/ingest_policy.py +0 -38
- package/src/superlocalmemory/core/ingestion_command.py +0 -1042
- package/src/superlocalmemory/core/injection.py +0 -434
- package/src/superlocalmemory/core/install_detector.py +0 -131
- package/src/superlocalmemory/core/key_expander.py +0 -138
- package/src/superlocalmemory/core/lifecycle_state.py +0 -153
- package/src/superlocalmemory/core/maintenance.py +0 -777
- package/src/superlocalmemory/core/maintenance_scheduler.py +0 -507
- package/src/superlocalmemory/core/materialization_control.py +0 -20
- package/src/superlocalmemory/core/mcp_embedder_proxy.py +0 -89
- package/src/superlocalmemory/core/memory_health.py +0 -266
- package/src/superlocalmemory/core/mode_capability.py +0 -111
- package/src/superlocalmemory/core/modes.py +0 -168
- package/src/superlocalmemory/core/mutations.py +0 -688
- package/src/superlocalmemory/core/ollama_embedder.py +0 -266
- package/src/superlocalmemory/core/ollama_validator.py +0 -315
- package/src/superlocalmemory/core/operation_policy.py +0 -92
- package/src/superlocalmemory/core/operation_policy_registry.py +0 -542
- package/src/superlocalmemory/core/operation_request.py +0 -127
- package/src/superlocalmemory/core/ops_remediation.py +0 -542
- package/src/superlocalmemory/core/pii.py +0 -105
- package/src/superlocalmemory/core/platform_utils.py +0 -138
- package/src/superlocalmemory/core/profiles.py +0 -234
- package/src/superlocalmemory/core/progressive_abstraction.py +0 -208
- package/src/superlocalmemory/core/projection_drain.py +0 -380
- package/src/superlocalmemory/core/queue_consumer.py +0 -168
- package/src/superlocalmemory/core/ram_lock.py +0 -160
- package/src/superlocalmemory/core/rate_limit.py +0 -151
- package/src/superlocalmemory/core/recall_gate.py +0 -95
- package/src/superlocalmemory/core/recall_pipeline.py +0 -1337
- package/src/superlocalmemory/core/recall_queue.py +0 -377
- package/src/superlocalmemory/core/recall_worker.py +0 -414
- package/src/superlocalmemory/core/registry.py +0 -121
- package/src/superlocalmemory/core/remember_admission.py +0 -161
- package/src/superlocalmemory/core/remember_runtime.py +0 -1190
- package/src/superlocalmemory/core/remote_mode.py +0 -214
- package/src/superlocalmemory/core/reranker_worker.py +0 -338
- package/src/superlocalmemory/core/safe_fs.py +0 -108
- package/src/superlocalmemory/core/scale_autopromote.py +0 -196
- package/src/superlocalmemory/core/scale_engine.py +0 -915
- package/src/superlocalmemory/core/score_contract.py +0 -82
- package/src/superlocalmemory/core/security_primitives.py +0 -672
- package/src/superlocalmemory/core/session_identity.py +0 -98
- package/src/superlocalmemory/core/shadow_router.py +0 -319
- package/src/superlocalmemory/core/slm_disabled.py +0 -85
- package/src/superlocalmemory/core/status_contract.py +0 -108
- package/src/superlocalmemory/core/store_pipeline.py +0 -1404
- package/src/superlocalmemory/core/summarizer.py +0 -200
- package/src/superlocalmemory/core/tier_manager.py +0 -461
- package/src/superlocalmemory/core/topic_signature.py +0 -156
- package/src/superlocalmemory/core/transactions/__init__.py +0 -78
- package/src/superlocalmemory/core/transactions/concrete_owners.py +0 -604
- package/src/superlocalmemory/core/transactions/erasure.py +0 -825
- package/src/superlocalmemory/core/transactions/manifest.py +0 -255
- package/src/superlocalmemory/core/transactions/manifest_key.py +0 -155
- package/src/superlocalmemory/core/transactions/obligations.py +0 -272
- package/src/superlocalmemory/core/transactions/owners.py +0 -114
- package/src/superlocalmemory/core/transactions/reconciler.py +0 -285
- package/src/superlocalmemory/core/transactions/service.py +0 -330
- package/src/superlocalmemory/core/worker_pool.py +0 -377
- package/src/superlocalmemory/core/working_memory.py +0 -288
- package/src/superlocalmemory/dynamics/__init__.py +0 -0
- package/src/superlocalmemory/dynamics/activation_guided_quantization.py +0 -374
- package/src/superlocalmemory/dynamics/eap_scheduler.py +0 -294
- package/src/superlocalmemory/dynamics/ebbinghaus_langevin_coupling.py +0 -171
- package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +0 -227
- package/src/superlocalmemory/encoding/__init__.py +0 -0
- package/src/superlocalmemory/encoding/auto_linker.py +0 -308
- package/src/superlocalmemory/encoding/cognitive_consolidator.py +0 -899
- package/src/superlocalmemory/encoding/consolidator.py +0 -472
- package/src/superlocalmemory/encoding/context_generator.py +0 -175
- package/src/superlocalmemory/encoding/emotional.py +0 -189
- package/src/superlocalmemory/encoding/entity_reflexion.py +0 -200
- package/src/superlocalmemory/encoding/entity_resolver.py +0 -687
- package/src/superlocalmemory/encoding/entropy_gate.py +0 -101
- package/src/superlocalmemory/encoding/fact_extractor.py +0 -877
- package/src/superlocalmemory/encoding/foresight.py +0 -93
- package/src/superlocalmemory/encoding/graph_builder.py +0 -346
- package/src/superlocalmemory/encoding/observation_builder.py +0 -177
- package/src/superlocalmemory/encoding/prospective_markers.py +0 -262
- package/src/superlocalmemory/encoding/scene_builder.py +0 -410
- package/src/superlocalmemory/encoding/signal_inference.py +0 -90
- package/src/superlocalmemory/encoding/temporal_parser.py +0 -432
- package/src/superlocalmemory/encoding/temporal_validator.py +0 -572
- package/src/superlocalmemory/encoding/type_router.py +0 -237
- package/src/superlocalmemory/evaluation/__init__.py +0 -13
- package/src/superlocalmemory/evaluation/calibration.py +0 -308
- package/src/superlocalmemory/evolution/__init__.py +0 -29
- package/src/superlocalmemory/evolution/blind_verifier.py +0 -122
- package/src/superlocalmemory/evolution/budget.py +0 -356
- package/src/superlocalmemory/evolution/evolution_store.py +0 -619
- package/src/superlocalmemory/evolution/llm_dispatch.py +0 -559
- package/src/superlocalmemory/evolution/model_selection.py +0 -175
- package/src/superlocalmemory/evolution/mutation_generator.py +0 -226
- package/src/superlocalmemory/evolution/skill_activator.py +0 -270
- package/src/superlocalmemory/evolution/skill_evolver.py +0 -928
- package/src/superlocalmemory/evolution/triggers.py +0 -376
- package/src/superlocalmemory/evolution/types.py +0 -114
- package/src/superlocalmemory/graph/__init__.py +0 -9
- package/src/superlocalmemory/graph/cozo_adjacency.py +0 -122
- package/src/superlocalmemory/graph/cozo_backend.py +0 -751
- package/src/superlocalmemory/hooks/__init__.py +0 -3
- package/src/superlocalmemory/hooks/_outcome_common.py +0 -523
- package/src/superlocalmemory/hooks/adapter_base.py +0 -347
- package/src/superlocalmemory/hooks/antigravity_adapter.py +0 -171
- package/src/superlocalmemory/hooks/auto_capture.py +0 -133
- package/src/superlocalmemory/hooks/auto_invoker.py +0 -521
- package/src/superlocalmemory/hooks/auto_parameterize.py +0 -147
- package/src/superlocalmemory/hooks/auto_recall.py +0 -191
- package/src/superlocalmemory/hooks/auto_recall_hook.py +0 -251
- package/src/superlocalmemory/hooks/before_web_hook.py +0 -131
- package/src/superlocalmemory/hooks/claude_code_hooks.py +0 -637
- package/src/superlocalmemory/hooks/codex_assets.py +0 -251
- package/src/superlocalmemory/hooks/codex_hooks.py +0 -186
- package/src/superlocalmemory/hooks/context_payload.py +0 -311
- package/src/superlocalmemory/hooks/copilot_adapter.py +0 -208
- package/src/superlocalmemory/hooks/cross_platform_connector.py +0 -90
- package/src/superlocalmemory/hooks/cursor_adapter.py +0 -173
- package/src/superlocalmemory/hooks/hook_daemon.py +0 -295
- package/src/superlocalmemory/hooks/hook_handlers.py +0 -822
- package/src/superlocalmemory/hooks/ide_connector.py +0 -246
- package/src/superlocalmemory/hooks/memory_protocol.py +0 -158
- package/src/superlocalmemory/hooks/portable_kit.py +0 -755
- package/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -183
- package/src/superlocalmemory/hooks/post_tool_outcome_hook.py +0 -351
- package/src/superlocalmemory/hooks/prewarm_auth.py +0 -187
- package/src/superlocalmemory/hooks/rules_engine.py +0 -99
- package/src/superlocalmemory/hooks/session_registry.py +0 -330
- package/src/superlocalmemory/hooks/stop_outcome_hook.py +0 -138
- package/src/superlocalmemory/hooks/sync_loop.py +0 -114
- package/src/superlocalmemory/hooks/topic_shift_hook.py +0 -302
- package/src/superlocalmemory/hooks/user_prompt_hook.py +0 -131
- package/src/superlocalmemory/hooks/user_prompt_rehash_hook.py +0 -210
- package/src/superlocalmemory/infra/__init__.py +0 -3
- package/src/superlocalmemory/infra/auth_middleware.py +0 -145
- package/src/superlocalmemory/infra/backup.py +0 -974
- package/src/superlocalmemory/infra/backup_obligations.py +0 -423
- package/src/superlocalmemory/infra/cache_manager.py +0 -267
- package/src/superlocalmemory/infra/cloud_backup.py +0 -788
- package/src/superlocalmemory/infra/daemon_identity.py +0 -300
- package/src/superlocalmemory/infra/data_root.py +0 -238
- package/src/superlocalmemory/infra/event_bus.py +0 -637
- package/src/superlocalmemory/infra/local_diagnostics.py +0 -327
- package/src/superlocalmemory/infra/pid_manager.py +0 -193
- package/src/superlocalmemory/infra/process_identity.py +0 -180
- package/src/superlocalmemory/infra/process_reaper.py +0 -624
- package/src/superlocalmemory/infra/rate_limiter.py +0 -228
- package/src/superlocalmemory/infra/self_heal.py +0 -401
- package/src/superlocalmemory/infra/version_integrity.py +0 -229
- package/src/superlocalmemory/ingestion/__init__.py +0 -13
- package/src/superlocalmemory/ingestion/adapter_manager.py +0 -255
- package/src/superlocalmemory/ingestion/base_adapter.py +0 -171
- package/src/superlocalmemory/ingestion/calendar_adapter.py +0 -349
- package/src/superlocalmemory/ingestion/credentials.py +0 -125
- package/src/superlocalmemory/ingestion/gmail_adapter.py +0 -378
- package/src/superlocalmemory/ingestion/parsers.py +0 -100
- package/src/superlocalmemory/ingestion/transcript_adapter.py +0 -161
- package/src/superlocalmemory/integrations/__init__.py +0 -1
- package/src/superlocalmemory/integrations/bounded_loops_mcp.py +0 -431
- package/src/superlocalmemory/integrations/bounded_loops_v051.py +0 -236
- package/src/superlocalmemory/learning/__init__.py +0 -0
- package/src/superlocalmemory/learning/adaptive.py +0 -172
- package/src/superlocalmemory/learning/arm_catalog.py +0 -97
- package/src/superlocalmemory/learning/assertion_miner.py +0 -403
- package/src/superlocalmemory/learning/bandit.py +0 -654
- package/src/superlocalmemory/learning/bandit_cache.py +0 -131
- package/src/superlocalmemory/learning/behavioral.py +0 -542
- package/src/superlocalmemory/learning/bootstrap.py +0 -298
- package/src/superlocalmemory/learning/consolidation_cycle.py +0 -398
- package/src/superlocalmemory/learning/consolidation_quantization_worker.py +0 -115
- package/src/superlocalmemory/learning/consolidation_worker.py +0 -261
- package/src/superlocalmemory/learning/cross_project.py +0 -408
- package/src/superlocalmemory/learning/database.py +0 -698
- package/src/superlocalmemory/learning/dedup_hnsw.py +0 -413
- package/src/superlocalmemory/learning/engagement.py +0 -487
- package/src/superlocalmemory/learning/engagement_features.py +0 -279
- package/src/superlocalmemory/learning/ensemble.py +0 -309
- package/src/superlocalmemory/learning/entity_compiler.py +0 -356
- package/src/superlocalmemory/learning/fact_outcome_joins.py +0 -207
- package/src/superlocalmemory/learning/features.py +0 -138
- package/src/superlocalmemory/learning/feedback.py +0 -724
- package/src/superlocalmemory/learning/forgetting_scheduler.py +0 -375
- package/src/superlocalmemory/learning/hnsw_dedup.py +0 -69
- package/src/superlocalmemory/learning/labeler.py +0 -85
- package/src/superlocalmemory/learning/legacy_migration.py +0 -316
- package/src/superlocalmemory/learning/lightgbm_subprocess.py +0 -236
- package/src/superlocalmemory/learning/memory_merge.py +0 -175
- package/src/superlocalmemory/learning/model_cache.py +0 -267
- package/src/superlocalmemory/learning/model_rollback.py +0 -281
- package/src/superlocalmemory/learning/outcome_queue.py +0 -306
- package/src/superlocalmemory/learning/outcomes.py +0 -286
- package/src/superlocalmemory/learning/pattern_miner.py +0 -465
- package/src/superlocalmemory/learning/pattern_miner_constants.py +0 -90
- package/src/superlocalmemory/learning/pcos.py +0 -291
- package/src/superlocalmemory/learning/project_context.py +0 -366
- package/src/superlocalmemory/learning/propensity.py +0 -131
- package/src/superlocalmemory/learning/ranker.py +0 -300
- package/src/superlocalmemory/learning/ranker_common.py +0 -163
- package/src/superlocalmemory/learning/ranker_retrain_legacy.py +0 -210
- package/src/superlocalmemory/learning/ranker_retrain_online.py +0 -423
- package/src/superlocalmemory/learning/reward.py +0 -888
- package/src/superlocalmemory/learning/reward_archive.py +0 -223
- package/src/superlocalmemory/learning/reward_boost.py +0 -211
- package/src/superlocalmemory/learning/reward_from_outcomes.py +0 -365
- package/src/superlocalmemory/learning/reward_model.py +0 -144
- package/src/superlocalmemory/learning/reward_proxy.py +0 -578
- package/src/superlocalmemory/learning/shadow_test.py +0 -524
- package/src/superlocalmemory/learning/signal_kinds.py +0 -79
- package/src/superlocalmemory/learning/signal_worker.py +0 -268
- package/src/superlocalmemory/learning/signals.py +0 -646
- package/src/superlocalmemory/learning/skill_performance_miner.py +0 -422
- package/src/superlocalmemory/learning/source_quality.py +0 -828
- package/src/superlocalmemory/learning/trigram_index.py +0 -548
- package/src/superlocalmemory/learning/workflows.py +0 -309
- package/src/superlocalmemory/llm/__init__.py +0 -0
- package/src/superlocalmemory/llm/backbone.py +0 -364
- package/src/superlocalmemory/loops/__init__.py +0 -58
- package/src/superlocalmemory/loops/budget.py +0 -58
- package/src/superlocalmemory/loops/engine.py +0 -174
- package/src/superlocalmemory/loops/ledger.py +0 -298
- package/src/superlocalmemory/loops/models.py +0 -152
- package/src/superlocalmemory/loops/rules.py +0 -52
- package/src/superlocalmemory/math/__init__.py +0 -0
- package/src/superlocalmemory/math/ebbinghaus.py +0 -352
- package/src/superlocalmemory/math/fisher.py +0 -356
- package/src/superlocalmemory/math/fisher_quantized.py +0 -255
- package/src/superlocalmemory/math/hopfield.py +0 -282
- package/src/superlocalmemory/math/langevin.py +0 -411
- package/src/superlocalmemory/math/polar_quant.py +0 -414
- package/src/superlocalmemory/math/qjl.py +0 -115
- package/src/superlocalmemory/math/sheaf.py +0 -261
- package/src/superlocalmemory/math/turbo_quant.py +0 -318
- package/src/superlocalmemory/mcp/__init__.py +0 -0
- package/src/superlocalmemory/mcp/_daemon_proxy.py +0 -203
- package/src/superlocalmemory/mcp/_pool_adapter.py +0 -181
- package/src/superlocalmemory/mcp/_stdin_guard.py +0 -60
- package/src/superlocalmemory/mcp/agent_context.py +0 -115
- package/src/superlocalmemory/mcp/cli_fallback.py +0 -602
- package/src/superlocalmemory/mcp/http_transport.py +0 -85
- package/src/superlocalmemory/mcp/profiles.py +0 -154
- package/src/superlocalmemory/mcp/resources.py +0 -281
- package/src/superlocalmemory/mcp/server.py +0 -480
- package/src/superlocalmemory/mcp/session_binding.py +0 -98
- package/src/superlocalmemory/mcp/shared.py +0 -112
- package/src/superlocalmemory/mcp/tools.py +0 -18
- package/src/superlocalmemory/mcp/tools_active.py +0 -958
- package/src/superlocalmemory/mcp/tools_brain.py +0 -298
- package/src/superlocalmemory/mcp/tools_code_graph.py +0 -1717
- package/src/superlocalmemory/mcp/tools_context.py +0 -239
- package/src/superlocalmemory/mcp/tools_core.py +0 -1112
- package/src/superlocalmemory/mcp/tools_evolution.py +0 -343
- package/src/superlocalmemory/mcp/tools_learning.py +0 -393
- package/src/superlocalmemory/mcp/tools_loops.py +0 -345
- package/src/superlocalmemory/mcp/tools_mesh.py +0 -429
- package/src/superlocalmemory/mcp/tools_ops.py +0 -115
- package/src/superlocalmemory/mcp/tools_optimize.py +0 -322
- package/src/superlocalmemory/mcp/tools_summaries.py +0 -147
- package/src/superlocalmemory/mcp/tools_v28.py +0 -292
- package/src/superlocalmemory/mcp/tools_v3.py +0 -398
- package/src/superlocalmemory/mcp/tools_v33.py +0 -507
- package/src/superlocalmemory/mesh/__init__.py +0 -12
- package/src/superlocalmemory/mesh/broker.py +0 -812
- package/src/superlocalmemory/mesh/broker_security.py +0 -470
- package/src/superlocalmemory/mesh/discovery.py +0 -365
- package/src/superlocalmemory/mesh/lock_protocol.py +0 -313
- package/src/superlocalmemory/mesh/node_identity.py +0 -97
- package/src/superlocalmemory/mesh/outbox_remote.py +0 -429
- package/src/superlocalmemory/mesh/remote_sync.py +0 -829
- package/src/superlocalmemory/mesh/state_sync.py +0 -286
- package/src/superlocalmemory/migrations/__init__.py +0 -5
- package/src/superlocalmemory/migrations/v3_4_25_to_v3_4_26.py +0 -144
- package/src/superlocalmemory/optimize/NOTICE +0 -6
- package/src/superlocalmemory/optimize/__init__.py +0 -0
- package/src/superlocalmemory/optimize/adapters/__init__.py +0 -68
- package/src/superlocalmemory/optimize/adapters/_agent_registry.py +0 -120
- package/src/superlocalmemory/optimize/adapters/anthropic_adapter.py +0 -112
- package/src/superlocalmemory/optimize/adapters/openai_adapter.py +0 -122
- package/src/superlocalmemory/optimize/adapters/wrap.py +0 -228
- package/src/superlocalmemory/optimize/cache/__init__.py +0 -31
- package/src/superlocalmemory/optimize/cache/boundary_store.py +0 -488
- package/src/superlocalmemory/optimize/cache/centroid_store.py +0 -199
- package/src/superlocalmemory/optimize/cache/context_key.py +0 -67
- package/src/superlocalmemory/optimize/cache/exact.py +0 -88
- package/src/superlocalmemory/optimize/cache/invalidation.py +0 -36
- package/src/superlocalmemory/optimize/cache/key_builder.py +0 -111
- package/src/superlocalmemory/optimize/cache/manager.py +0 -737
- package/src/superlocalmemory/optimize/cache/semantic.py +0 -637
- package/src/superlocalmemory/optimize/cache/stampede.py +0 -50
- package/src/superlocalmemory/optimize/compress/__init__.py +0 -17
- package/src/superlocalmemory/optimize/compress/align.py +0 -159
- package/src/superlocalmemory/optimize/compress/ccr.py +0 -116
- package/src/superlocalmemory/optimize/compress/prose_llmlingua.py +0 -71
- package/src/superlocalmemory/optimize/compress/router.py +0 -667
- package/src/superlocalmemory/optimize/config/__init__.py +0 -56
- package/src/superlocalmemory/optimize/config/defaults.py +0 -43
- package/src/superlocalmemory/optimize/config/schema.py +0 -327
- package/src/superlocalmemory/optimize/config/store.py +0 -270
- package/src/superlocalmemory/optimize/metrics/__init__.py +0 -8
- package/src/superlocalmemory/optimize/metrics/counters.py +0 -155
- package/src/superlocalmemory/optimize/metrics/estimator.py +0 -87
- package/src/superlocalmemory/optimize/metrics/exporters.py +0 -77
- package/src/superlocalmemory/optimize/metrics/persistence.py +0 -115
- package/src/superlocalmemory/optimize/proxy/__init__.py +0 -28
- package/src/superlocalmemory/optimize/proxy/_helpers.py +0 -730
- package/src/superlocalmemory/optimize/proxy/anthropic_surface.py +0 -375
- package/src/superlocalmemory/optimize/proxy/capture.py +0 -550
- package/src/superlocalmemory/optimize/proxy/gemini_surface.py +0 -528
- package/src/superlocalmemory/optimize/proxy/lifecycle.py +0 -126
- package/src/superlocalmemory/optimize/proxy/openai_surface.py +0 -465
- package/src/superlocalmemory/optimize/proxy/server.py +0 -199
- package/src/superlocalmemory/optimize/proxy/vertex_surface.py +0 -246
- package/src/superlocalmemory/optimize/storage/__init__.py +0 -0
- package/src/superlocalmemory/optimize/storage/db.py +0 -1185
- package/src/superlocalmemory/optimize/storage/schema.py +0 -205
- package/src/superlocalmemory/parameterization/__init__.py +0 -47
- package/src/superlocalmemory/parameterization/cross_project.py +0 -12
- package/src/superlocalmemory/parameterization/pattern_extractor.py +0 -584
- package/src/superlocalmemory/parameterization/pii_filter.py +0 -106
- package/src/superlocalmemory/parameterization/prompt_injector.py +0 -219
- package/src/superlocalmemory/parameterization/prompt_lifecycle.py +0 -281
- package/src/superlocalmemory/parameterization/soft_prompt_generator.py +0 -542
- package/src/superlocalmemory/parameterization/workflow_miner.py +0 -17
- package/src/superlocalmemory/reliability/__init__.py +0 -45
- package/src/superlocalmemory/reliability/join_liveness.py +0 -301
- package/src/superlocalmemory/reliability/prior_distance.py +0 -243
- package/src/superlocalmemory/retrieval/__init__.py +0 -0
- package/src/superlocalmemory/retrieval/agentic.py +0 -367
- package/src/superlocalmemory/retrieval/ann_index.py +0 -235
- package/src/superlocalmemory/retrieval/bm25_channel.py +0 -451
- package/src/superlocalmemory/retrieval/bridge_discovery.py +0 -253
- package/src/superlocalmemory/retrieval/channel_registry.py +0 -154
- package/src/superlocalmemory/retrieval/channel_status.py +0 -117
- package/src/superlocalmemory/retrieval/engine.py +0 -1615
- package/src/superlocalmemory/retrieval/entity_channel.py +0 -994
- package/src/superlocalmemory/retrieval/forgetting_filter.py +0 -160
- package/src/superlocalmemory/retrieval/fusion.py +0 -81
- package/src/superlocalmemory/retrieval/graph_adjacency.py +0 -219
- package/src/superlocalmemory/retrieval/hopfield_channel.py +0 -465
- package/src/superlocalmemory/retrieval/profile_channel.py +0 -105
- package/src/superlocalmemory/retrieval/quantization_aware_search.py +0 -147
- package/src/superlocalmemory/retrieval/remote_reranker.py +0 -758
- package/src/superlocalmemory/retrieval/reranker.py +0 -674
- package/src/superlocalmemory/retrieval/scope_policy.py +0 -126
- package/src/superlocalmemory/retrieval/semantic_channel.py +0 -638
- package/src/superlocalmemory/retrieval/spreading.py +0 -288
- package/src/superlocalmemory/retrieval/spreading_activation.py +0 -616
- package/src/superlocalmemory/retrieval/strategy.py +0 -248
- package/src/superlocalmemory/retrieval/temporal_channel.py +0 -433
- package/src/superlocalmemory/retrieval/temporal_frame.py +0 -102
- package/src/superlocalmemory/retrieval/temporal_utils.py +0 -122
- package/src/superlocalmemory/retrieval/temporal_validity_filter.py +0 -499
- package/src/superlocalmemory/retrieval/time_window.py +0 -181
- package/src/superlocalmemory/retrieval/vector_store.py +0 -863
- package/src/superlocalmemory/server/__init__.py +0 -1
- package/src/superlocalmemory/server/api.py +0 -310
- package/src/superlocalmemory/server/asset_versions.py +0 -171
- package/src/superlocalmemory/server/bandit_loops.py +0 -158
- package/src/superlocalmemory/server/config_file.py +0 -90
- package/src/superlocalmemory/server/consolidation_runner.py +0 -140
- package/src/superlocalmemory/server/egress_policy.py +0 -258
- package/src/superlocalmemory/server/loopback.py +0 -85
- package/src/superlocalmemory/server/middleware/__init__.py +0 -11
- package/src/superlocalmemory/server/middleware/security_headers.py +0 -144
- package/src/superlocalmemory/server/origin.py +0 -55
- package/src/superlocalmemory/server/profile_runtime.py +0 -515
- package/src/superlocalmemory/server/rbac_enforce.py +0 -194
- package/src/superlocalmemory/server/recall_health.py +0 -343
- package/src/superlocalmemory/server/recall_serializer.py +0 -320
- package/src/superlocalmemory/server/route_mutations.py +0 -104
- package/src/superlocalmemory/server/routes/__init__.py +0 -4
- package/src/superlocalmemory/server/routes/abstraction.py +0 -314
- package/src/superlocalmemory/server/routes/adapters.py +0 -63
- package/src/superlocalmemory/server/routes/agents.py +0 -303
- package/src/superlocalmemory/server/routes/backup.py +0 -869
- package/src/superlocalmemory/server/routes/behavioral.py +0 -659
- package/src/superlocalmemory/server/routes/brain.py +0 -1892
- package/src/superlocalmemory/server/routes/chat.py +0 -393
- package/src/superlocalmemory/server/routes/compliance.py +0 -533
- package/src/superlocalmemory/server/routes/config_api.py +0 -703
- package/src/superlocalmemory/server/routes/data_io.py +0 -329
- package/src/superlocalmemory/server/routes/entity.py +0 -237
- package/src/superlocalmemory/server/routes/events.py +0 -214
- package/src/superlocalmemory/server/routes/evolution.py +0 -510
- package/src/superlocalmemory/server/routes/helpers.py +0 -499
- package/src/superlocalmemory/server/routes/ingest.py +0 -137
- package/src/superlocalmemory/server/routes/insights.py +0 -366
- package/src/superlocalmemory/server/routes/learning.py +0 -834
- package/src/superlocalmemory/server/routes/learning_telemetry.py +0 -154
- package/src/superlocalmemory/server/routes/lifecycle.py +0 -184
- package/src/superlocalmemory/server/routes/memories.py +0 -1661
- package/src/superlocalmemory/server/routes/mesh.py +0 -517
- package/src/superlocalmemory/server/routes/mesh_lock.py +0 -54
- package/src/superlocalmemory/server/routes/mesh_state.py +0 -63
- package/src/superlocalmemory/server/routes/optimize.py +0 -197
- package/src/superlocalmemory/server/routes/prewarm.py +0 -173
- package/src/superlocalmemory/server/routes/profiles.py +0 -292
- package/src/superlocalmemory/server/routes/ratelimit.py +0 -132
- package/src/superlocalmemory/server/routes/rbac.py +0 -366
- package/src/superlocalmemory/server/routes/stats.py +0 -385
- package/src/superlocalmemory/server/routes/tiers.py +0 -222
- package/src/superlocalmemory/server/routes/timeline.py +0 -258
- package/src/superlocalmemory/server/routes/token.py +0 -90
- package/src/superlocalmemory/server/routes/v3_api.py +0 -3023
- package/src/superlocalmemory/server/routes/ws.py +0 -171
- package/src/superlocalmemory/server/security_middleware.py +0 -89
- package/src/superlocalmemory/server/ui.py +0 -354
- package/src/superlocalmemory/server/unified_daemon.py +0 -6326
- package/src/superlocalmemory/server/write_identity.py +0 -195
- package/src/superlocalmemory/storage/__init__.py +0 -0
- package/src/superlocalmemory/storage/_migration_internals.py +0 -638
- package/src/superlocalmemory/storage/_schema_version.py +0 -174
- package/src/superlocalmemory/storage/access_log.py +0 -170
- package/src/superlocalmemory/storage/admission_codec.py +0 -129
- package/src/superlocalmemory/storage/admission_journal.py +0 -843
- package/src/superlocalmemory/storage/agent_experience.py +0 -546
- package/src/superlocalmemory/storage/backup.py +0 -531
- package/src/superlocalmemory/storage/correction_cases.py +0 -670
- package/src/superlocalmemory/storage/database.py +0 -3180
- package/src/superlocalmemory/storage/deferred_writes.py +0 -209
- package/src/superlocalmemory/storage/embedding_codec.py +0 -200
- package/src/superlocalmemory/storage/embedding_migrator.py +0 -672
- package/src/superlocalmemory/storage/erasure_fence.py +0 -45
- package/src/superlocalmemory/storage/execution_learning.py +0 -285
- package/src/superlocalmemory/storage/external_evidence.py +0 -359
- package/src/superlocalmemory/storage/generation_fence.py +0 -63
- package/src/superlocalmemory/storage/lineage_retention.py +0 -236
- package/src/superlocalmemory/storage/logical_edges.py +0 -86
- package/src/superlocalmemory/storage/memory_write.py +0 -115
- package/src/superlocalmemory/storage/migration_runner.py +0 -895
- package/src/superlocalmemory/storage/migration_v33.py +0 -140
- package/src/superlocalmemory/storage/migrations/M001_add_signal_features_columns.py +0 -67
- package/src/superlocalmemory/storage/migrations/M002_model_state_history.py +0 -107
- package/src/superlocalmemory/storage/migrations/M003_migration_log.py +0 -38
- package/src/superlocalmemory/storage/migrations/M004_cross_platform_sync_log.py +0 -46
- package/src/superlocalmemory/storage/migrations/M005_bandit_tables.py +0 -75
- package/src/superlocalmemory/storage/migrations/M006_action_outcomes_reward.py +0 -75
- package/src/superlocalmemory/storage/migrations/M007_pending_outcomes.py +0 -63
- package/src/superlocalmemory/storage/migrations/M009_model_lineage.py +0 -94
- package/src/superlocalmemory/storage/migrations/M010_evolution_config.py +0 -80
- package/src/superlocalmemory/storage/migrations/M011_archive_and_merge.py +0 -87
- package/src/superlocalmemory/storage/migrations/M012_shadow_observations.py +0 -72
- package/src/superlocalmemory/storage/migrations/M013_bi_temporal_columns.py +0 -55
- package/src/superlocalmemory/storage/migrations/M014_v345_scale_ready.py +0 -45
- package/src/superlocalmemory/storage/migrations/M015_add_pinned_column.py +0 -58
- package/src/superlocalmemory/storage/migrations/M016_add_scope_support.py +0 -120
- package/src/superlocalmemory/storage/migrations/M017_ccq_scope_column.py +0 -79
- package/src/superlocalmemory/storage/migrations/M018_ingestion_operations.py +0 -120
- package/src/superlocalmemory/storage/migrations/M019_derivation_lineage.py +0 -54
- package/src/superlocalmemory/storage/migrations/M020_model_state_integrity.py +0 -52
- package/src/superlocalmemory/storage/migrations/M021_ingestion_log_profile.py +0 -108
- package/src/superlocalmemory/storage/migrations/M022_entity_aliases_profile.py +0 -86
- package/src/superlocalmemory/storage/migrations/M023_mesh_profile_isolation.py +0 -194
- package/src/superlocalmemory/storage/migrations/M024_rbac_users_roles.py +0 -87
- package/src/superlocalmemory/storage/migrations/M025_perf_indexes.py +0 -90
- package/src/superlocalmemory/storage/migrations/M026_rbac_memberships_fk.py +0 -136
- package/src/superlocalmemory/storage/migrations/M027_transferable_patterns_profile.py +0 -163
- package/src/superlocalmemory/storage/migrations/M028_fact_entity_associations.py +0 -305
- package/src/superlocalmemory/storage/migrations/M029_behavioral_history_indexes.py +0 -137
- package/src/superlocalmemory/storage/migrations/M030_entity_explorer_indexes.py +0 -93
- package/src/superlocalmemory/storage/migrations/M031_dead_letter_operations.py +0 -80
- package/src/superlocalmemory/storage/migrations/M032_write_coordinator_admission.py +0 -188
- package/src/superlocalmemory/storage/migrations/M033_projection_transactions.py +0 -148
- package/src/superlocalmemory/storage/migrations/M034_obligation_integrity.py +0 -58
- package/src/superlocalmemory/storage/migrations/M035_erasure_receipts.py +0 -113
- package/src/superlocalmemory/storage/migrations/M036_vector_row_map.py +0 -107
- package/src/superlocalmemory/storage/migrations/M037_manifest_hmac_version.py +0 -162
- package/src/superlocalmemory/storage/migrations/M038_learning_feedback_channel.py +0 -77
- package/src/superlocalmemory/storage/migrations/M039_scene_fact_members.py +0 -137
- package/src/superlocalmemory/storage/migrations/M040_agent_experience_receipts.py +0 -254
- package/src/superlocalmemory/storage/migrations/M041_external_evidence_receipts.py +0 -189
- package/src/superlocalmemory/storage/migrations/M042_correction_case_ledger.py +0 -245
- package/src/superlocalmemory/storage/migrations/M043_quarantine_display_summaries.py +0 -512
- package/src/superlocalmemory/storage/migrations/M044_play_carries_its_own_evidence.py +0 -127
- package/src/superlocalmemory/storage/migrations/M045_fact_outcome_score.py +0 -158
- package/src/superlocalmemory/storage/migrations/M046_prospective_memory_has_its_own_name.py +0 -620
- package/src/superlocalmemory/storage/migrations/M047_fisher_vectors_are_stored_like_every_other_vector.py +0 -306
- package/src/superlocalmemory/storage/migrations/M048_upcoming_holds_only_what_is_upcoming.py +0 -229
- package/src/superlocalmemory/storage/migrations/M049_a_schema_version_marker_is_one_row.py +0 -201
- package/src/superlocalmemory/storage/migrations/M050_execution_learning_v2.py +0 -70
- package/src/superlocalmemory/storage/migrations/__init__.py +0 -103
- package/src/superlocalmemory/storage/migrations.py +0 -333
- package/src/superlocalmemory/storage/models.py +0 -500
- package/src/superlocalmemory/storage/projection_outbox.py +0 -346
- package/src/superlocalmemory/storage/quantized_store.py +0 -280
- package/src/superlocalmemory/storage/read_connection.py +0 -115
- package/src/superlocalmemory/storage/retention_policy.py +0 -860
- package/src/superlocalmemory/storage/schema.py +0 -1108
- package/src/superlocalmemory/storage/schema_code_graph.py +0 -282
- package/src/superlocalmemory/storage/schema_v32.py +0 -382
- package/src/superlocalmemory/storage/schema_v3410.py +0 -159
- package/src/superlocalmemory/storage/schema_v3411.py +0 -149
- package/src/superlocalmemory/storage/schema_v343.py +0 -315
- package/src/superlocalmemory/storage/schema_v345.py +0 -109
- package/src/superlocalmemory/storage/schema_v347.py +0 -140
- package/src/superlocalmemory/storage/sqlite_vectors.py +0 -169
- package/src/superlocalmemory/storage/v2_migrator.py +0 -466
- package/src/superlocalmemory/storage/write_coordinator.py +0 -949
- package/src/superlocalmemory/storage/write_lock.py +0 -88
- package/src/superlocalmemory/summaries/__init__.py +0 -37
- package/src/superlocalmemory/summaries/base.py +0 -267
- package/src/superlocalmemory/summaries/daily_reflection.py +0 -340
- package/src/superlocalmemory/summaries/non_answer.py +0 -223
- package/src/superlocalmemory/summaries/project_work_log.py +0 -440
- package/src/superlocalmemory/summaries/session_summary.py +0 -311
- package/src/superlocalmemory/trust/__init__.py +0 -0
- package/src/superlocalmemory/trust/gate.py +0 -171
- package/src/superlocalmemory/trust/provenance.py +0 -124
- package/src/superlocalmemory/trust/scorer.py +0 -413
- package/src/superlocalmemory/trust/signals.py +0 -153
- package/src/superlocalmemory/ui/assets/slm-icon-white.svg +0 -64
- package/src/superlocalmemory/ui/assets/slm-icon.svg +0 -36
- package/src/superlocalmemory/ui/css/brain.css +0 -409
- package/src/superlocalmemory/ui/css/design-system.css +0 -696
- package/src/superlocalmemory/ui/css/legacy-dashboard.css +0 -663
- package/src/superlocalmemory/ui/css/neural-glass.css +0 -1599
- package/src/superlocalmemory/ui/css/od-bridge.css +0 -158
- package/src/superlocalmemory/ui/favicon.svg +0 -36
- package/src/superlocalmemory/ui/index.html +0 -1638
- package/src/superlocalmemory/ui/js/agents.js +0 -192
- package/src/superlocalmemory/ui/js/auto-settings.js +0 -624
- package/src/superlocalmemory/ui/js/brain.js +0 -1400
- package/src/superlocalmemory/ui/js/clusters.js +0 -326
- package/src/superlocalmemory/ui/js/compliance.js +0 -307
- package/src/superlocalmemory/ui/js/core.js +0 -566
- package/src/superlocalmemory/ui/js/dashboard.js +0 -503
- package/src/superlocalmemory/ui/js/event-delegation.js +0 -113
- package/src/superlocalmemory/ui/js/events.js +0 -178
- package/src/superlocalmemory/ui/js/fact-detail.js +0 -142
- package/src/superlocalmemory/ui/js/feedback.js +0 -339
- package/src/superlocalmemory/ui/js/graph-event-bus.js +0 -83
- package/src/superlocalmemory/ui/js/graph-filters.js +0 -220
- package/src/superlocalmemory/ui/js/graph-ui.js +0 -214
- package/src/superlocalmemory/ui/js/ide-status.js +0 -115
- package/src/superlocalmemory/ui/js/init.js +0 -54
- package/src/superlocalmemory/ui/js/knowledge-graph.js +0 -945
- package/src/superlocalmemory/ui/js/lifecycle.js +0 -387
- package/src/superlocalmemory/ui/js/math-health.js +0 -114
- package/src/superlocalmemory/ui/js/memories.js +0 -394
- package/src/superlocalmemory/ui/js/memory-chat.js +0 -371
- package/src/superlocalmemory/ui/js/memory-timeline.js +0 -265
- package/src/superlocalmemory/ui/js/modal.js +0 -733
- package/src/superlocalmemory/ui/js/ng-entities.js +0 -298
- package/src/superlocalmemory/ui/js/ng-health.js +0 -208
- package/src/superlocalmemory/ui/js/ng-ingestion.js +0 -203
- package/src/superlocalmemory/ui/js/ng-mesh.js +0 -374
- package/src/superlocalmemory/ui/js/ng-shell.js +0 -524
- package/src/superlocalmemory/ui/js/ng-skills.js +0 -663
- package/src/superlocalmemory/ui/js/od-agents.js +0 -588
- package/src/superlocalmemory/ui/js/od-auth-gate.js +0 -257
- package/src/superlocalmemory/ui/js/od-backup.js +0 -878
- package/src/superlocalmemory/ui/js/od-boundedloops.js +0 -324
- package/src/superlocalmemory/ui/js/od-brain.js +0 -1095
- package/src/superlocalmemory/ui/js/od-compliance-ext.js +0 -301
- package/src/superlocalmemory/ui/js/od-components.js +0 -147
- package/src/superlocalmemory/ui/js/od-entities.js +0 -622
- package/src/superlocalmemory/ui/js/od-graph.js +0 -776
- package/src/superlocalmemory/ui/js/od-health.js +0 -579
- package/src/superlocalmemory/ui/js/od-mcp.js +0 -508
- package/src/superlocalmemory/ui/js/od-memories.js +0 -1499
- package/src/superlocalmemory/ui/js/od-mesh.js +0 -645
- package/src/superlocalmemory/ui/js/od-operations.js +0 -1268
- package/src/superlocalmemory/ui/js/od-ops-health.js +0 -417
- package/src/superlocalmemory/ui/js/od-optimize.js +0 -828
- package/src/superlocalmemory/ui/js/od-settings.js +0 -1275
- package/src/superlocalmemory/ui/js/od-shell.js +0 -819
- package/src/superlocalmemory/ui/js/od-skills.js +0 -600
- package/src/superlocalmemory/ui/js/od-team.js +0 -265
- package/src/superlocalmemory/ui/js/optimize.js +0 -191
- package/src/superlocalmemory/ui/js/profiles.js +0 -362
- package/src/superlocalmemory/ui/js/quick-actions.js +0 -334
- package/src/superlocalmemory/ui/js/recall-lab.js +0 -373
- package/src/superlocalmemory/ui/js/search.js +0 -86
- package/src/superlocalmemory/ui/js/settings.js +0 -556
- package/src/superlocalmemory/ui/js/timeline.js +0 -62
- package/src/superlocalmemory/ui/js/trust-dashboard.js +0 -225
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/bootstrap-icons.css +0 -2018
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/bootstrap.bundle.min.js +0 -7
- package/src/superlocalmemory/ui/vendor/bootstrap.min.css +0 -6
- package/src/superlocalmemory/ui/vendor/d3.v7.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology-library.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/graphology.umd.min.js +0 -2
- package/src/superlocalmemory/ui/vendor/inter-ui/inter-variable.min.css +0 -8
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable-Italic.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/inter-ui/variable/InterVariable.woff2 +0 -0
- package/src/superlocalmemory/ui/vendor/sigma.min.js +0 -1
- package/src/superlocalmemory/vector/__init__.py +0 -9
- package/src/superlocalmemory/vector/lancedb_backend.py +0 -366
|
@@ -1,512 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
"""M043 — take model-written summaries out of the retrieval corpus.
|
|
4
|
-
|
|
5
|
-
Runs unattended on upgrade. Three steps, in this order, all idempotent:
|
|
6
|
-
|
|
7
|
-
1. PRESERVE — copy every consolidator-authored row's text into
|
|
8
|
-
``consolidated_summaries``, the display-only table, so nothing the user
|
|
9
|
-
could see today disappears from view.
|
|
10
|
-
2. WITHHOLD — set ``atomic_facts.quarantined = 1`` on those rows. They stay
|
|
11
|
-
on disk, with their provenance, and stop being answers.
|
|
12
|
-
3. RESTORE — un-hide genuine memories whose retention row says they are
|
|
13
|
-
maximally retained but whose zone says 'archive'.
|
|
14
|
-
|
|
15
|
-
WHY THIS IS A MIGRATION AND NOT A ONE-OFF SCRIPT
|
|
16
|
-
------------------------------------------------
|
|
17
|
-
About three quarters of this product's users are not engineers. A repair that
|
|
18
|
-
requires reading a runbook, cloning a repository or running SQL is a repair
|
|
19
|
-
they will not get. The store is the whole point of the product, so a defective
|
|
20
|
-
store has to fix itself on the next start, whether they installed by pip, npm
|
|
21
|
-
or from source.
|
|
22
|
-
|
|
23
|
-
DEFERRED, NOT EAGER
|
|
24
|
-
-------------------
|
|
25
|
-
``atomic_facts`` is bootstrapped by ``MemoryEngine.initialize()``, which runs
|
|
26
|
-
*after* ``apply_all``. Every existing migration that touches it — M011, M013,
|
|
27
|
-
M015, M016 — is deferred for that reason and this one is no different. Deferred
|
|
28
|
-
migrations are snapshotted: ``apply_deferred`` takes a verified backup lazily,
|
|
29
|
-
immediately before the first migration that will actually apply
|
|
30
|
-
(``migration_runner.py``, ``_ensure_snapshot``), using the sqlite3 backup API
|
|
31
|
-
rather than a file copy, which cannot snapshot a live WAL database.
|
|
32
|
-
|
|
33
|
-
WHAT IT IS REPAIRING, MEASURED
|
|
34
|
-
------------------------------
|
|
35
|
-
On the author's 5,089-fact store, before this ran:
|
|
36
|
-
|
|
37
|
-
rows written by the consolidator into atomic_facts 1,195
|
|
38
|
-
...retrieval-eligible (retention zone not archive) 307
|
|
39
|
-
...that are summaries of other summaries 353
|
|
40
|
-
...carrying a temporal_events row 0
|
|
41
|
-
...violating the declared FK to memories 1,195
|
|
42
|
-
genuine memories archived by consolidation 528
|
|
43
|
-
...archived by anything other than consolidation 0
|
|
44
|
-
...whose retention score is 1.0 (i.e. "keep") 528
|
|
45
|
-
|
|
46
|
-
Asked "what am I working on", ranks 1, 2 and 3 all read "Unfortunately, there
|
|
47
|
-
is no information available about 'Gateway', 'State', 'Bounded', or 'Claude' in
|
|
48
|
-
the provided text."
|
|
49
|
-
|
|
50
|
-
THE THREE PREDICATES, AND WHY EACH IS EXACT
|
|
51
|
-
-------------------------------------------
|
|
52
|
-
**Which rows are consolidator-authored.** ``memory_id = ''`` *and* present in
|
|
53
|
-
``fact_consolidations``. Verified to agree exactly on the real store: 1,195
|
|
54
|
-
either way, zero rows on either difference, and zero genuine facts with a
|
|
55
|
-
dangling ``memory_id`` that could be swept up by accident. Both halves are
|
|
56
|
-
required so that a future fact with an empty ``memory_id`` — or a consolidation
|
|
57
|
-
record pointing at a real fact — is left alone.
|
|
58
|
-
|
|
59
|
-
Content matching was considered and rejected. Only 34 of the 307
|
|
60
|
-
retrieval-eligible rows read as refusals; the other 273 are fluent, plausible,
|
|
61
|
-
generic prose that no honest predicate separates from a real summary. Repairing
|
|
62
|
-
by content would have cleared a ninth of the problem and looked finished.
|
|
63
|
-
|
|
64
|
-
**Which memories to un-hide.** ``lifecycle_zone IN ('archive','forgotten')``
|
|
65
|
-
together with ``retention_score > 0.8``. That combination is a contradiction on
|
|
66
|
-
its own terms: ``math/ebbinghaus.py:lifecycle_zone`` maps any score above 0.8 to
|
|
67
|
-
'active', so a row scoring 1.0 and filed under 'archive' was put there by
|
|
68
|
-
something that did not consult the score. Consolidation was that something, but
|
|
69
|
-
the predicate does not need to know it — which is what makes it safe to re-run
|
|
70
|
-
forever, and self-limiting: it describes an inconsistency, so it empties itself.
|
|
71
|
-
|
|
72
|
-
The restored zone is *recomputed* from the score with the same thresholds, not
|
|
73
|
-
guessed. Guessing 'warm' would have quietly demoted 528 facts that the maths
|
|
74
|
-
already called 'active'.
|
|
75
|
-
|
|
76
|
-
**Which summaries to preserve.** All of them, including the refusals. A reader
|
|
77
|
-
looking at their dashboard should see what their store actually generated;
|
|
78
|
-
silently dropping the embarrassing ones would hide the problem this repair
|
|
79
|
-
exists to fix. W5 renders them, and its own tests cover not showing junk as
|
|
80
|
-
though it were insight.
|
|
81
|
-
"""
|
|
82
|
-
|
|
83
|
-
from __future__ import annotations
|
|
84
|
-
|
|
85
|
-
import logging
|
|
86
|
-
import sqlite3
|
|
87
|
-
|
|
88
|
-
logger = logging.getLogger(__name__)
|
|
89
|
-
|
|
90
|
-
NAME = "M043_quarantine_display_summaries"
|
|
91
|
-
DB_TARGET = "memory"
|
|
92
|
-
|
|
93
|
-
#: Kept short and STABLE. The runner hashes this text and fails a completed
|
|
94
|
-
#: migration whose hash has drifted, so it must not be edited to track changes
|
|
95
|
-
#: in ``apply()``. The work lives in ``apply()`` because it is conditional data
|
|
96
|
-
#: movement that one DDL script cannot express.
|
|
97
|
-
DDL = "-- M043: see apply(); preserve, withhold, restore"
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
#: Retention thresholds, mirroring ``math/ebbinghaus.py::lifecycle_zone`` and
|
|
101
|
-
#: ``ForgettingConfig`` defaults (archive_threshold 0.2, forget_threshold 0.05).
|
|
102
|
-
#: A migration is SQL and cannot read the user's config, so these are the
|
|
103
|
-
#: shipped defaults. That is safe here because this expression is only ever
|
|
104
|
-
#: applied to rows whose score is already above 0.8 — the top branch — where no
|
|
105
|
-
#: threshold below it can change the answer.
|
|
106
|
-
_ZONE_FROM_SCORE = """
|
|
107
|
-
CASE
|
|
108
|
-
WHEN retention_score > 0.8 THEN 'active'
|
|
109
|
-
WHEN retention_score > 0.5 THEN 'warm'
|
|
110
|
-
WHEN retention_score > 0.2 THEN 'cold'
|
|
111
|
-
WHEN retention_score > 0.05 THEN 'archive'
|
|
112
|
-
ELSE 'forgotten'
|
|
113
|
-
END
|
|
114
|
-
"""
|
|
115
|
-
|
|
116
|
-
#: Rows the fact consolidator wrote directly into the retrieval corpus.
|
|
117
|
-
_CONSOLIDATOR_ROWS = """
|
|
118
|
-
SELECT af.fact_id
|
|
119
|
-
FROM atomic_facts af
|
|
120
|
-
WHERE af.memory_id = ''
|
|
121
|
-
AND af.fact_id IN (
|
|
122
|
-
SELECT consolidated_fact_id FROM fact_consolidations
|
|
123
|
-
)
|
|
124
|
-
"""
|
|
125
|
-
|
|
126
|
-
#: A genuine memory that consolidation hid.
|
|
127
|
-
#:
|
|
128
|
-
#: BY PROVENANCE, NOT BY SCORE. The first version of this required
|
|
129
|
-
#: ``retention_score > 0.8``, reasoning that a score above 0.8 maps to 'active'
|
|
130
|
-
#: so zone 'archive' must be a contradiction. Every one of the 528 hidden
|
|
131
|
-
#: memories on the author's store scored exactly 1.0, so it worked there — and
|
|
132
|
-
#: that store is the LUCKY shape. Those rows scored 1.0 because they had no
|
|
133
|
-
#: prior retention row and the schema default is 1.0.
|
|
134
|
-
#:
|
|
135
|
-
#: On a store where the forgetting scheduler has been running (the default,
|
|
136
|
-
#: ``ForgettingConfig.enabled = True``) a consolidation victim carries whatever
|
|
137
|
-
#: score it had drifted to — typically 0.21 to 0.80 — because
|
|
138
|
-
#: ``set_fact_lifecycle_zone`` moves the zone and leaves the score alone. The
|
|
139
|
-
#: score-based predicate does not see those rows at all: they stay archived,
|
|
140
|
-
#: ``verify()`` returns true because it cannot see them either, and ``doctor``
|
|
141
|
-
#: reports healthy while the memories remain unreachable. A repair that is
|
|
142
|
-
#: silent about what it failed to repair is worse than one that fails loudly.
|
|
143
|
-
#:
|
|
144
|
-
#: So the test is the same one the withhold step uses: was this row a
|
|
145
|
-
#: consolidation source? That is recorded, and it does not depend on a number
|
|
146
|
-
#: that something else was free to change afterwards.
|
|
147
|
-
#:
|
|
148
|
-
#: Self-correcting rather than indiscriminate: the zone is RECOMPUTED from the
|
|
149
|
-
#: score, so a source that has genuinely faded maps straight back to
|
|
150
|
-
#: archive/forgotten and nothing moves. Only a row whose own score says it
|
|
151
|
-
#: should be reachable becomes reachable.
|
|
152
|
-
_WRONGLY_HIDDEN_BASE = """
|
|
153
|
-
SELECT r.fact_id
|
|
154
|
-
FROM fact_retention r
|
|
155
|
-
JOIN atomic_facts af ON af.fact_id = r.fact_id
|
|
156
|
-
WHERE r.lifecycle_zone IN ('archive', 'forgotten')
|
|
157
|
-
AND af.memory_id <> ''
|
|
158
|
-
AND ({extra})
|
|
159
|
-
"""
|
|
160
|
-
|
|
161
|
-
#: The provenance half. Only usable when the ledger exists, which is why this
|
|
162
|
-
#: is composed at call time rather than being one constant: a first version
|
|
163
|
-
#: baked the subquery in and ``verify()`` then raised "no such table:
|
|
164
|
-
#: fact_consolidations" on a store without a ledger -- caught by the test for
|
|
165
|
-
#: exactly that store shape.
|
|
166
|
-
_ARCHIVED_BY_CONSOLIDATION = """
|
|
167
|
-
af.fact_id IN (
|
|
168
|
-
SELECT je.value
|
|
169
|
-
FROM fact_consolidations fc, json_each(fc.source_fact_ids) je
|
|
170
|
-
WHERE json_valid(fc.source_fact_ids)
|
|
171
|
-
)
|
|
172
|
-
"""
|
|
173
|
-
|
|
174
|
-
#: The score half: hidden while the retention maths says to keep.
|
|
175
|
-
_SCORED_TO_KEEP = "r.retention_score > 0.8"
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
def _wrongly_hidden(conn: sqlite3.Connection) -> str:
|
|
179
|
-
"""The restore predicate, using whichever halves this store supports."""
|
|
180
|
-
if _table_exists(conn, "fact_consolidations"):
|
|
181
|
-
return _WRONGLY_HIDDEN_BASE.format(
|
|
182
|
-
extra=f"{_SCORED_TO_KEEP} OR {_ARCHIVED_BY_CONSOLIDATION}"
|
|
183
|
-
)
|
|
184
|
-
return _WRONGLY_HIDDEN_BASE.format(extra=_SCORED_TO_KEEP)
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
def apply(conn: sqlite3.Connection) -> None:
|
|
188
|
-
"""Preserve, withhold, restore. Atomic, and safe to run again."""
|
|
189
|
-
if not _table_exists(conn, "atomic_facts"):
|
|
190
|
-
# Nothing to repair on a store whose corpus does not exist yet. Not an
|
|
191
|
-
# error: a fresh install reaches this migration with the table created
|
|
192
|
-
# moments earlier, and a store older than the table has no rows to fix.
|
|
193
|
-
logger.debug("M043: atomic_facts absent, nothing to repair")
|
|
194
|
-
return
|
|
195
|
-
if not _has_column(conn, "atomic_facts", "quarantined"):
|
|
196
|
-
# storage.schema.create_all_tables adds it at every engine init, so
|
|
197
|
-
# reaching here means engine init has not run against this store.
|
|
198
|
-
# Adding it is cheap and keeps the migration independent of that order.
|
|
199
|
-
conn.execute(
|
|
200
|
-
"ALTER TABLE atomic_facts ADD COLUMN quarantined "
|
|
201
|
-
"INTEGER NOT NULL DEFAULT 0"
|
|
202
|
-
)
|
|
203
|
-
if not _table_exists(conn, "consolidated_summaries"):
|
|
204
|
-
# UNCONDITIONALLY, because verify() requires it and verify() is what the
|
|
205
|
-
# runner consults on every later start.
|
|
206
|
-
#
|
|
207
|
-
# A first draft created it only inside _preserve, which is skipped when
|
|
208
|
-
# there is no provenance ledger. On a store with no ledger the migration
|
|
209
|
-
# therefore applied, recorded 'complete', and then failed verify() on
|
|
210
|
-
# the NEXT start -- and since repair() is apply(), it failed again and
|
|
211
|
-
# was reported as a failed migration forever. Two existing
|
|
212
|
-
# idempotency tests caught it. The lesson generalises: everything
|
|
213
|
-
# verify() asserts has to be produced on every path through apply(),
|
|
214
|
-
# not only on the path that happens to need it.
|
|
215
|
-
#
|
|
216
|
-
# The DDL is imported, not restated, so the two definitions cannot
|
|
217
|
-
# drift apart.
|
|
218
|
-
from superlocalmemory.storage.schema import CONSOLIDATED_SUMMARIES_DDL
|
|
219
|
-
|
|
220
|
-
conn.executescript(CONSOLIDATED_SUMMARIES_DDL)
|
|
221
|
-
|
|
222
|
-
# No provenance ledger means no consolidator-authored rows can be
|
|
223
|
-
# identified, so there is nothing to preserve or withhold. The restore step
|
|
224
|
-
# is independent of it and still runs — a store can have wrongly-hidden
|
|
225
|
-
# memories without having the ledger that explains how they got that way.
|
|
226
|
-
#
|
|
227
|
-
# Written as a skip rather than an error after the first draft raised here
|
|
228
|
-
# and broke three existing migration-runner tests, which drive
|
|
229
|
-
# apply_deferred against minimal fixtures. A repair that only works on a
|
|
230
|
-
# fully-bootstrapped store is a repair that will not run on the store that
|
|
231
|
-
# needs it most.
|
|
232
|
-
has_ledger = _table_exists(conn, "fact_consolidations")
|
|
233
|
-
|
|
234
|
-
conn.execute("BEGIN IMMEDIATE")
|
|
235
|
-
try:
|
|
236
|
-
preserved = _preserve(conn) if has_ledger else 0
|
|
237
|
-
withheld = _withhold(conn) if has_ledger else 0
|
|
238
|
-
restored = _restore(conn)
|
|
239
|
-
conn.execute("COMMIT")
|
|
240
|
-
except sqlite3.Error:
|
|
241
|
-
try:
|
|
242
|
-
conn.execute("ROLLBACK")
|
|
243
|
-
except sqlite3.Error: # pragma: no cover — best effort
|
|
244
|
-
pass
|
|
245
|
-
raise
|
|
246
|
-
|
|
247
|
-
# INFO, not debug. This changes what the user's next recall returns, so it
|
|
248
|
-
# belongs in the log they can actually see.
|
|
249
|
-
if preserved or withheld or restored:
|
|
250
|
-
logger.info(
|
|
251
|
-
"M043 memory repair: %d summaries preserved for display, "
|
|
252
|
-
"%d withheld from recall, %d memories restored to recall",
|
|
253
|
-
preserved, withheld, restored,
|
|
254
|
-
)
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
def _preserve(conn: sqlite3.Connection) -> int:
|
|
258
|
-
"""Copy consolidator rows into the display table. Returns rows added."""
|
|
259
|
-
before = _count(conn, "SELECT COUNT(*) FROM consolidated_summaries")
|
|
260
|
-
# The entity a summary was written about is not recoverable from the row —
|
|
261
|
-
# entities_json holds the whole cluster's pool — so entity_id is left empty
|
|
262
|
-
# and entity_name carries the summary's own leading label when it has one.
|
|
263
|
-
# source_fact_ids comes from the provenance ledger, which does know.
|
|
264
|
-
conn.execute("""
|
|
265
|
-
INSERT INTO consolidated_summaries
|
|
266
|
-
(summary_id, profile_id, entity_id, entity_name, content,
|
|
267
|
-
source_fact_ids, source_count, char_count, generated_by,
|
|
268
|
-
scope, shared_with, source_earliest, source_latest, created_at)
|
|
269
|
-
SELECT af.fact_id,
|
|
270
|
-
af.profile_id,
|
|
271
|
-
'',
|
|
272
|
-
'',
|
|
273
|
-
af.content,
|
|
274
|
-
COALESCE(
|
|
275
|
-
(SELECT fc.source_fact_ids FROM fact_consolidations fc
|
|
276
|
-
WHERE fc.consolidated_fact_id = af.fact_id
|
|
277
|
-
AND json_valid(fc.source_fact_ids)
|
|
278
|
-
ORDER BY fc.created_at DESC LIMIT 1),
|
|
279
|
-
'[]'
|
|
280
|
-
),
|
|
281
|
-
-- Count only sources that are the owner's OWN memories.
|
|
282
|
-
--
|
|
283
|
-
-- Two wrong answers were tried first. evidence_count reached 450
|
|
284
|
-
-- on one row, because the old reinforce-or-insert path bumped it
|
|
285
|
-
-- every time it saw the same summary text again. The length of
|
|
286
|
-
-- the provenance array is 10, which is closer but still a lie:
|
|
287
|
-
-- 353 of these summaries are summaries OF SUMMARIES, and on the
|
|
288
|
-
-- author's store the first row's ten "sources" are all
|
|
289
|
-
-- consolidator rows written 10-20 seconds apart. Reporting that
|
|
290
|
-
-- as "10 memories summarised" tells the owner this is a digest
|
|
291
|
-
-- of ten things they said, when it is a digest of ten things the
|
|
292
|
-
-- summarizer said.
|
|
293
|
-
--
|
|
294
|
-
-- So: count the sources that have a parent memory. A
|
|
295
|
-
-- summary-of-summaries therefore reports 0, which is the honest
|
|
296
|
-
-- number, and the endpoint ranks it below one that covers real
|
|
297
|
-
-- memories.
|
|
298
|
-
-- json_valid guards every json_each in this file. Without it
|
|
299
|
-
-- ONE malformed source_fact_ids anywhere in the ledger makes
|
|
300
|
-
-- json_each raise, apply() roll back, verify() stay false, and
|
|
301
|
-
-- repair() re-raise on every start for the life of the store —
|
|
302
|
-
-- a single bad row taking the whole repair down with it.
|
|
303
|
-
(SELECT COUNT(*) FROM atomic_facts src
|
|
304
|
-
WHERE src.memory_id <> ''
|
|
305
|
-
AND src.fact_id IN (
|
|
306
|
-
SELECT je.value FROM fact_consolidations fc,
|
|
307
|
-
json_each(fc.source_fact_ids) je
|
|
308
|
-
WHERE fc.consolidated_fact_id = af.fact_id
|
|
309
|
-
AND json_valid(fc.source_fact_ids))),
|
|
310
|
-
LENGTH(af.content),
|
|
311
|
-
'migrated',
|
|
312
|
-
COALESCE(af.scope, 'personal'),
|
|
313
|
-
af.shared_with,
|
|
314
|
-
-- Coverage window over those same genuine sources only.
|
|
315
|
-
-- A first draft spanned every source and produced
|
|
316
|
-
-- "2026-08-18 to 2026-08-18" on a row whose sources were ten
|
|
317
|
-
-- summaries written seconds apart -- the span of a summarisation
|
|
318
|
-
-- run, presented as the stretch of work it covers. NULL when
|
|
319
|
-
-- there are no genuine sources, and the dashboard then shows no
|
|
320
|
-
-- span rather than a false one.
|
|
321
|
-
(SELECT MIN(src.created_at) FROM atomic_facts src
|
|
322
|
-
WHERE src.memory_id <> ''
|
|
323
|
-
AND src.fact_id IN (
|
|
324
|
-
SELECT je.value FROM fact_consolidations fc,
|
|
325
|
-
json_each(fc.source_fact_ids) je
|
|
326
|
-
WHERE fc.consolidated_fact_id = af.fact_id
|
|
327
|
-
AND json_valid(fc.source_fact_ids))),
|
|
328
|
-
(SELECT MAX(src.created_at) FROM atomic_facts src
|
|
329
|
-
WHERE src.memory_id <> ''
|
|
330
|
-
AND src.fact_id IN (
|
|
331
|
-
SELECT je.value FROM fact_consolidations fc,
|
|
332
|
-
json_each(fc.source_fact_ids) je
|
|
333
|
-
WHERE fc.consolidated_fact_id = af.fact_id
|
|
334
|
-
AND json_valid(fc.source_fact_ids))),
|
|
335
|
-
af.created_at
|
|
336
|
-
FROM atomic_facts af
|
|
337
|
-
WHERE af.fact_id IN (""" + _CONSOLIDATOR_ROWS + """)
|
|
338
|
-
-- UNTARGETED. `ON CONFLICT (profile_id, entity_id, content)` names one
|
|
339
|
-
-- constraint and raises on any other, and this table has two: that
|
|
340
|
-
-- unique triple, and summary_id as primary key. summary_id is the
|
|
341
|
-
-- source fact_id, so a row whose CONTENT changed between runs conflicts
|
|
342
|
-
-- on the primary key, which the targeted form does not catch --
|
|
343
|
-
-- reproduced as `IntegrityError: UNIQUE constraint failed:
|
|
344
|
-
-- consolidated_summaries.summary_id`. Because the runner calls
|
|
345
|
-
-- repair() (which is apply()) whenever verify() fails, that failure
|
|
346
|
-
-- would then repeat on every single start, forever.
|
|
347
|
-
--
|
|
348
|
-
-- Untargeted DO NOTHING absorbs both. Losing the newer text is the
|
|
349
|
-
-- right trade: this is a display copy of a row that is about to be
|
|
350
|
-
-- withheld, and the first copy taken is the one the owner has already
|
|
351
|
-
-- been shown.
|
|
352
|
-
ON CONFLICT DO NOTHING
|
|
353
|
-
""")
|
|
354
|
-
return _count(conn, "SELECT COUNT(*) FROM consolidated_summaries") - before
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
def _withhold(conn: sqlite3.Connection) -> int:
|
|
358
|
-
"""Mark consolidator rows quarantined. Returns rows changed."""
|
|
359
|
-
cur = conn.execute(
|
|
360
|
-
"UPDATE atomic_facts SET quarantined = 1 "
|
|
361
|
-
"WHERE COALESCE(quarantined, 0) = 0 "
|
|
362
|
-
" AND fact_id IN (" + _CONSOLIDATOR_ROWS + ")"
|
|
363
|
-
)
|
|
364
|
-
return int(cur.rowcount or 0)
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
def _restore(conn: sqlite3.Connection) -> int:
|
|
368
|
-
"""Un-hide memories consolidation archived. Returns rows changed.
|
|
369
|
-
|
|
370
|
-
Needs both tables: ``fact_retention`` to hold the zone, and
|
|
371
|
-
``fact_consolidations`` for the provenance half of the predicate. Without
|
|
372
|
-
the ledger it falls back to the score-only test, which is strictly weaker
|
|
373
|
-
but is all a store with no ledger can support.
|
|
374
|
-
"""
|
|
375
|
-
if not _table_exists(conn, "fact_retention"):
|
|
376
|
-
return 0
|
|
377
|
-
cur = conn.execute(
|
|
378
|
-
"UPDATE fact_retention SET lifecycle_zone = (" + _ZONE_FROM_SCORE + ") "
|
|
379
|
-
"WHERE fact_id IN (" + _wrongly_hidden(conn) + ")"
|
|
380
|
-
)
|
|
381
|
-
changed = int(cur.rowcount or 0)
|
|
382
|
-
if changed:
|
|
383
|
-
_sync_lifecycle_mirror(conn)
|
|
384
|
-
return changed
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
def _sync_lifecycle_mirror(conn: sqlite3.Connection) -> None:
|
|
388
|
-
"""Bring atomic_facts.lifecycle back in line with the canonical zone.
|
|
389
|
-
|
|
390
|
-
Same mapping core/lifecycle_state.py applies: archive/forgotten map to
|
|
391
|
-
'archived', every other zone keeps its own name.
|
|
392
|
-
"""
|
|
393
|
-
conn.execute("""
|
|
394
|
-
UPDATE atomic_facts
|
|
395
|
-
SET lifecycle = (
|
|
396
|
-
SELECT CASE
|
|
397
|
-
WHEN r.lifecycle_zone IN ('archive', 'forgotten')
|
|
398
|
-
THEN 'archived'
|
|
399
|
-
ELSE r.lifecycle_zone
|
|
400
|
-
END
|
|
401
|
-
FROM fact_retention r
|
|
402
|
-
WHERE r.fact_id = atomic_facts.fact_id
|
|
403
|
-
)
|
|
404
|
-
WHERE lifecycle = 'archived'
|
|
405
|
-
AND fact_id IN (
|
|
406
|
-
SELECT fact_id FROM fact_retention
|
|
407
|
-
WHERE lifecycle_zone NOT IN ('archive', 'forgotten')
|
|
408
|
-
)
|
|
409
|
-
""")
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
def unmet(conn: sqlite3.Connection) -> str:
|
|
413
|
-
"""Which check does not hold, named. Empty string when all of them do.
|
|
414
|
-
|
|
415
|
-
``verify()`` returns a bare boolean, so when a completed migration stops
|
|
416
|
-
verifying the runner can only say "safe repair did not restore M043". This
|
|
417
|
-
checks five separate things, and that sentence names none of them -- a user
|
|
418
|
-
hitting it had to come back and ask which, and so did we. This is the same
|
|
419
|
-
gap that ``migration_failure_reasons`` closed one level up, left open one
|
|
420
|
-
level down.
|
|
421
|
-
"""
|
|
422
|
-
if not _table_exists(conn, "atomic_facts"):
|
|
423
|
-
return ""
|
|
424
|
-
if not _has_column(conn, "atomic_facts", "quarantined"):
|
|
425
|
-
return "atomic_facts has no 'quarantined' column"
|
|
426
|
-
if not _table_exists(conn, "consolidated_summaries"):
|
|
427
|
-
return "the consolidated_summaries display table is missing"
|
|
428
|
-
if _table_exists(conn, "fact_consolidations"):
|
|
429
|
-
n = _count(
|
|
430
|
-
conn,
|
|
431
|
-
"SELECT COUNT(*) FROM atomic_facts WHERE COALESCE(quarantined, 0) = 0 "
|
|
432
|
-
" AND fact_id IN (" + _CONSOLIDATOR_ROWS + ")",
|
|
433
|
-
)
|
|
434
|
-
if n:
|
|
435
|
-
return f"{n} model-written summaries are not withheld from recall"
|
|
436
|
-
n = _count(conn, """
|
|
437
|
-
SELECT COUNT(*) FROM atomic_facts af
|
|
438
|
-
WHERE af.fact_id IN (""" + _CONSOLIDATOR_ROWS + """)
|
|
439
|
-
AND NOT EXISTS (
|
|
440
|
-
SELECT 1 FROM consolidated_summaries cs
|
|
441
|
-
WHERE cs.profile_id = af.profile_id
|
|
442
|
-
AND (cs.summary_id = af.fact_id
|
|
443
|
-
OR cs.content = af.content)
|
|
444
|
-
)
|
|
445
|
-
""")
|
|
446
|
-
if n:
|
|
447
|
-
return f"{n} withheld summaries have no display copy"
|
|
448
|
-
if _table_exists(conn, "fact_retention"):
|
|
449
|
-
n = _count(conn, "SELECT COUNT(*) FROM (" + _wrongly_hidden(conn) + ")")
|
|
450
|
-
if n:
|
|
451
|
-
return f"{n} real memories are hidden from recall and should not be"
|
|
452
|
-
return ""
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
def blocks_serving(conn: sqlite3.Connection) -> bool:
|
|
456
|
-
"""Should a daemon refuse to serve while this check does not hold?
|
|
457
|
-
|
|
458
|
-
Only when the SCHEMA is missing. The two schema conditions here -- the
|
|
459
|
-
column and the display table -- mean queries would hit something that is not
|
|
460
|
-
there, so refusing is right. The other three are about DATA: a summary that
|
|
461
|
-
should be withheld is not withheld, or a real memory is hidden. Those make
|
|
462
|
-
some answers worse; they do not stop the store working.
|
|
463
|
-
|
|
464
|
-
The distinction matters because this ``verify()`` is a standing guard over
|
|
465
|
-
data that ordinary use can re-violate -- a consolidation pass hiding one more
|
|
466
|
-
memory is enough. Treating that like a missing table meant one drifted row
|
|
467
|
-
could return 503 on every route indefinitely, with a manual restart the only
|
|
468
|
-
way out. That is an outage caused by a quality check, which is worse than the
|
|
469
|
-
thing the check is for.
|
|
470
|
-
|
|
471
|
-
Reported as #125, where a user's daemon sat unusable on exactly this.
|
|
472
|
-
"""
|
|
473
|
-
if not _table_exists(conn, "atomic_facts"):
|
|
474
|
-
return False
|
|
475
|
-
if not _has_column(conn, "atomic_facts", "quarantined"):
|
|
476
|
-
return True
|
|
477
|
-
return not _table_exists(conn, "consolidated_summaries")
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
def verify(conn: sqlite3.Connection) -> bool:
|
|
481
|
-
"""Whether the repair's end-state holds.
|
|
482
|
-
|
|
483
|
-
Called on every start for an already-complete migration. Returning False
|
|
484
|
-
routes to ``repair()``, which makes this a standing guard: if pollution ever
|
|
485
|
-
reappears, the next daemon start withholds it without anyone asking.
|
|
486
|
-
|
|
487
|
-
Thin wrapper over ``unmet()`` so the two can never disagree about what
|
|
488
|
-
"verified" means.
|
|
489
|
-
"""
|
|
490
|
-
return not unmet(conn)
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
def repair(conn: sqlite3.Connection) -> None:
|
|
494
|
-
"""Re-run the repair. It is idempotent, so this is simply apply()."""
|
|
495
|
-
apply(conn)
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
def _table_exists(conn: sqlite3.Connection, table: str) -> bool:
|
|
499
|
-
return conn.execute(
|
|
500
|
-
"SELECT 1 FROM sqlite_master WHERE type='table' AND name=?", (table,),
|
|
501
|
-
).fetchone() is not None
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
def _has_column(conn: sqlite3.Connection, table: str, column: str) -> bool:
|
|
505
|
-
return any(
|
|
506
|
-
row[1] == column for row in conn.execute(f"PRAGMA table_info({table})")
|
|
507
|
-
)
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
def _count(conn: sqlite3.Connection, sql: str) -> int:
|
|
511
|
-
row = conn.execute(sql).fetchone()
|
|
512
|
-
return int(row[0]) if row else 0
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
|
|
2
|
-
# Licensed under AGPL-3.0-or-later - see LICENSE file
|
|
3
|
-
|
|
4
|
-
"""M044 — a bandit play records which memories it actually showed.
|
|
5
|
-
|
|
6
|
-
WHY
|
|
7
|
-
---
|
|
8
|
-
A play is settled later, from evidence: did anything downstream reference one of
|
|
9
|
-
the memories this query surfaced? ``reward_proxy`` answered "which memories" by
|
|
10
|
-
reading ``learning_signals`` for the same ``query_id`` — rows written by the
|
|
11
|
-
recall path's ``enqueue(SignalBatch(...))``.
|
|
12
|
-
|
|
13
|
-
That enqueue is off, deliberately. It writes twenty exposure rows per query, it
|
|
14
|
-
was the source of a 2,675x inflation in the ranking-phase counter, and the code
|
|
15
|
-
comment gives a second reason: *"even a non-blocking enqueue eventually writes
|
|
16
|
-
canonical/learning state and turns dashboard polling into contention."*
|
|
17
|
-
|
|
18
|
-
So the evidence lookup had no evidence to read, and every settlement fell
|
|
19
|
-
through to the 120-second default of 0.5. Measured on a live production store::
|
|
20
|
-
|
|
21
|
-
SUM(alpha) = SUM(beta) = 867.5 = 165 priors + 1,405 plays x 0.5
|
|
22
|
-
|
|
23
|
-
An exact match on both sides across 165 arms: every one of 1,405 settlements
|
|
24
|
-
applied the neutral prior. Thompson sampling on Beta(a, a) is a coin flip, so
|
|
25
|
-
retrieval strategy was being chosen at random.
|
|
26
|
-
|
|
27
|
-
The fix is for the play to carry its own evidence. One column, written once per
|
|
28
|
-
recorded play, holding the handful of fact_ids that were actually shown — rather
|
|
29
|
-
than reinstating twenty rows per query in a table that gates a phase counter.
|
|
30
|
-
|
|
31
|
-
WHY A COLUMN AND NOT A TABLE
|
|
32
|
-
----------------------------
|
|
33
|
-
This is one small JSON array per play, read exactly once by the settler and
|
|
34
|
-
then dead. A child table would need its own index, its own retention sweep, and
|
|
35
|
-
its own profile_id for erasure. The column is deleted with its play by the
|
|
36
|
-
existing ``retention_sweep``, which is the behaviour we want and get for free.
|
|
37
|
-
|
|
38
|
-
BACK-COMPATIBILITY
|
|
39
|
-
------------------
|
|
40
|
-
Existing rows keep NULL. The settler falls back to the ``learning_signals``
|
|
41
|
-
lookup when the column is empty, so plays recorded before this migration settle
|
|
42
|
-
exactly as they did before — and installs that still run the enqueue keep
|
|
43
|
-
working unchanged.
|
|
44
|
-
"""
|
|
45
|
-
|
|
46
|
-
from __future__ import annotations
|
|
47
|
-
|
|
48
|
-
import sqlite3
|
|
49
|
-
|
|
50
|
-
NAME = "M044_play_carries_its_own_evidence"
|
|
51
|
-
DB_TARGET = "learning"
|
|
52
|
-
|
|
53
|
-
_TABLE = "bandit_plays"
|
|
54
|
-
_COLUMN = "shown_fact_ids"
|
|
55
|
-
|
|
56
|
-
#: Recorded for the runner's DDL hash. SQLite has no ``ADD COLUMN IF NOT
|
|
57
|
-
#: EXISTS``, so ``apply()`` below runs instead of this string; it is kept
|
|
58
|
-
#: accurate because the hash is what detects a migration being edited after it
|
|
59
|
-
#: has shipped.
|
|
60
|
-
DDL = """
|
|
61
|
-
ALTER TABLE bandit_plays ADD COLUMN shown_fact_ids TEXT;
|
|
62
|
-
"""
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
def _columns(conn: sqlite3.Connection) -> set[str]:
|
|
66
|
-
try:
|
|
67
|
-
return {
|
|
68
|
-
row[1] for row in conn.execute(f"PRAGMA table_info({_TABLE})")
|
|
69
|
-
}
|
|
70
|
-
except sqlite3.Error:
|
|
71
|
-
return set()
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
def _table_exists(conn: sqlite3.Connection) -> bool:
|
|
75
|
-
try:
|
|
76
|
-
return conn.execute(
|
|
77
|
-
"SELECT name FROM sqlite_master WHERE type='table' AND name=?",
|
|
78
|
-
(_TABLE,),
|
|
79
|
-
).fetchone() is not None
|
|
80
|
-
except sqlite3.Error:
|
|
81
|
-
return False
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
def verify(conn: sqlite3.Connection) -> bool:
|
|
85
|
-
"""End state: the column exists.
|
|
86
|
-
|
|
87
|
-
Everything ``verify`` asserts must be produced by every path through
|
|
88
|
-
``apply`` — including the path where the table is absent. 4.0.10 shipped an
|
|
89
|
-
M043 whose ``verify`` required a table its ``apply`` created only
|
|
90
|
-
conditionally, which made the migration fail permanently on stores that
|
|
91
|
-
lacked it. Hence the branch below: no table means M005 has not run, this
|
|
92
|
-
migration has nothing to do, and saying so is the end state.
|
|
93
|
-
"""
|
|
94
|
-
if not _table_exists(conn):
|
|
95
|
-
return True
|
|
96
|
-
return _COLUMN in _columns(conn)
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
def apply(conn: sqlite3.Connection) -> None:
|
|
100
|
-
"""Add the column if it is missing. Idempotent.
|
|
101
|
-
|
|
102
|
-
Runs instead of ``DDL`` (the runner prefers a module-level ``apply``)
|
|
103
|
-
because ``ALTER TABLE ... ADD COLUMN`` raises when the column is already
|
|
104
|
-
there, and SQLite cannot guard that inside one script.
|
|
105
|
-
"""
|
|
106
|
-
if not _table_exists(conn):
|
|
107
|
-
# M005 owns bandit_plays and is a declared dependency, so this means a
|
|
108
|
-
# store where the bandit tables were never created. Nothing to alter.
|
|
109
|
-
return
|
|
110
|
-
if _COLUMN in _columns(conn):
|
|
111
|
-
return
|
|
112
|
-
conn.execute(f"ALTER TABLE {_TABLE} ADD COLUMN {_COLUMN} TEXT")
|
|
113
|
-
if not verify(conn): # pragma: no cover — defensive
|
|
114
|
-
raise sqlite3.OperationalError(
|
|
115
|
-
f"M044: {_TABLE}.{_COLUMN} absent after ALTER"
|
|
116
|
-
)
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
def repair(conn: sqlite3.Connection) -> None:
|
|
120
|
-
"""Identical to ``apply`` — and that is safe only because it is additive.
|
|
121
|
-
|
|
122
|
-
``repair`` == ``apply`` is a trap in general: if ``verify`` can return a
|
|
123
|
-
false negative, the runner retries forever. Here ``verify`` reads
|
|
124
|
-
``PRAGMA table_info``, which is the same fact ``apply`` establishes, so a
|
|
125
|
-
false negative would require the ALTER to have silently not happened.
|
|
126
|
-
"""
|
|
127
|
-
apply(conn)
|