topos-node 1.3.30__tar.gz → 1.3.32__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.
- {topos_node-1.3.30/topos_node.egg-info → topos_node-1.3.32}/PKG-INFO +1 -1
- {topos_node-1.3.30 → topos_node-1.3.32}/pyproject.toml +1 -1
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/__version__.py +2 -2
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/aspirations.goals.yaml +2 -2
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/health.mental.yaml +3 -3
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/places.mobility.yaml +2 -2
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/work.career.yaml +4 -4
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/template.py +2 -2
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/writer.py +51 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/fact_materializer.py +1 -1
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/linking.py +1 -1
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/facts/reads.py +7 -1
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/facts/store.py +8 -1
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/lifecycle/derived_scrub.py +14 -1
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/facts_direct.py +79 -4
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/game_layer.py +30 -2
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/upgrades/manifests.json +12 -0
- {topos_node-1.3.30 → topos_node-1.3.32/topos_node.egg-info}/PKG-INFO +1 -1
- {topos_node-1.3.30 → topos_node-1.3.32}/LICENSE +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/MANIFEST.in +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/README.md +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/setup.cfg +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/shared/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/shared/filtering.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/shared/schema_registry.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_active_database_binding.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_active_ingestion_binding.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_extensions.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_gate_leg_hermeticity.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_llm_integrations_storage.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_local_gate_composition.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_owner_database_hermeticity.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_prewarm_first_run.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_profile_hygiene.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_profiles.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_protocol_handled_types.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_query_field_contract.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_system_computer_name.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/analytics/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/analytics/duckdb_adapter.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/analytics/messenger_communities.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/analytics/messenger_graph.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/analytics/messenger_labels.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/analytics/profiles.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/analytics/query_engine.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/analytics/raw_queries.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/analytics.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/app_registry.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/backup.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/community_naming_config.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/compute_remote.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/conversation_context.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/data_commit.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/data_explorer_table_prefs.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/database_explorer.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/db.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/device.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/engine_run.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/enrichment.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/enrichment_lab.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/facts_llm_config.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/filter_lab.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/health.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/home_chat.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/ingestion_api.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/ingestion_compat.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/ingestion_sources.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/intelligence_lifecycle.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/llm.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/local_mcp.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/messenger_analytics.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/privacy_disclose.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/query_api.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/runtime_bootstrap.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/sanitization_ollama_config.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/shell.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/signal.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/signal_extraction_config.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/source_install.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/source_scrub.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/sources.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/sources_overview.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/sync.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/tool_index.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/ui_config.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/uma_data.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/upgrades.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/usage.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/user_identity.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/app.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/auth.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/declared_field_map.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/mappers/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/mappers/base.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/mappers/demo_mappers.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/mappers/documents_mapper.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/mappers/grok_mapper.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/models.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/resolver.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/cli/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/cli/__main__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/cli/assets/topos_blk_rounded.png +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/cli/assets/topos_white.png +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/cli/commands.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/cli/profile_cmd.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/cli/reprocess_cmd.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/cli/setup_models_cmd.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/cli/tray.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/config/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/config/conversation_context_llm.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/config/facts_llm.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/config/local_model_builds.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/config/model_packs.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/config/node_function_providers.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/config/sanitization_ollama.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/config/settings.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/config/signal_extraction.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/config/uvicorn_logging.json +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/contacts/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/contacts/identity.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/control_plane_client.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/api_models.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/connection_resilience.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/db_health.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/device_helpers.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/errors.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/events.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/common.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/complexity.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/config.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/contacts_import.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/database_explorer.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/derivation.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/device.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/enrichment.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/enrichment_lab.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/filter_lab.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/graph_query.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/home_chat.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/ingest.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/messages.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/messenger_analytics.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/query.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/registry.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/routines.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/signal_features.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/sources.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/timeline_daily.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/tool_index.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/uma.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/logging.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/metrics.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/routine_access.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/startup_banner.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/state.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/table_layers.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/types.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/data_explorer_row_delete.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/data_explorer_table_prefs.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/data_explorer_tables.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/disclosure/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/disclosure/canonical_writer.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/disclosure/content_policy.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/disclosure/field_registry.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/disclosure/privacy_layer.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/disclosure/tier.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/backends/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/backends/base.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/backends/generative_prompts.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/backends/generative_response.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/backends/huggingface.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/backends/ollama.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/backends/openai.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/backends/openai_compatible.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/backends/redpill.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/backends/stub.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/client.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/disk_space.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/engine.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/intake.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/memory_utils.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/model_cache.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/ollama_install.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/ollama_pull.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/ollama_setup_guidance.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/pipeline_memory.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/queue_manager.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/registration.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/result_formatter.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/router.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/scoped_token.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/tasks.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/torch_runtime.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/transport.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/usage_guard.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/usage_observation.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/validator.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/catalog.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/derivation_recovery.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/derived_tables.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/job_readiness.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/job_writer.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/base.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/derivation_job.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/raw/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/raw/language_job.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/model_overrides.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/models/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/models/manager.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/models/mvp_defaults.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/models/registry.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/models/versioning.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/orchestrator.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/pipeline_activity.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/processor.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/progress_bar.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/registry_contract.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/signal_derivation_config.json +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/source_overrides.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment_lab/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment_lab/bundles.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment_lab/model_resolve.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment_lab/schema.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment_lab/service.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment_lab/store.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment_lab/worker.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/evals/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/evals/enrichment_eval.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/extensions.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/canonical.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/engine.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/entropy.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/focus.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/graph_metrics.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/influence.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/projection.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/snapshots.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/store.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/topic_merge.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/topics.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/topics_daily.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/volatility.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/_scales.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/admin.legal.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/behavior.habits.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/behavior.preferences.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/beliefs.civic.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/beliefs.spiritual.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/communication.style.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/community.membership.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/craft.tooling.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/expertise.knowledge.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/finances.economics.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/health.lifestyle.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/health.physical.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/household.pets.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/identity.core.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/interests.taste.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/life.events.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/narrative.self.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/personality.traits.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/possessions.assets.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/relationships.social.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/values.motivation.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/dispositions.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/expertise.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/habits.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/interests.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/preferences.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/stances.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/tools.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/values.yaml +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/candidates.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/guard.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/packs.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/prefilter.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/registry.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/report_card.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/router.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/surfaces.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/synthesize.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/verify.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/affinity.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/affinity_owner.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/affinity_quality.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/community_names.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/community_naming.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/consolidation.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/context_vectors.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/cypher.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/declared_mappings.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/dossier.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/edges.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/graph_enrichers.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/graph_refresh.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/graph_search.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/maintenance.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/reads.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/rebuild_subprocess.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/resolver.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/facts/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/facts/extract.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/facts/llm_extract.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/facts/verdicts.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/fit/evaluator.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/fit/opportunity_types.json +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/lifecycle/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/lifecycle/blackhole.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/lifecycle/blackhole_guard.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/lifecycle/blackhole_llm.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/lifecycle/blackhole_rebuild.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/lifecycle/exclusions.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/lifecycle/gc.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/provenance/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/provenance/posture.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/provenance/roles.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/brief_canonical_loader.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/brief_ontology.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/brief_renderer.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/brief_schemas.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/chunking.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/cluster_labels.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/conversation_context.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/data_health.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/brief_ontologies.json +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/intentions.json +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/interests.json +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/memory.json +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/places.json +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/profile.json +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/relationships.json +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/resources.json +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/time.json +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/wellbeing.json +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/work.json +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/derived_spec.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/dimension_briefs.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/dimension_definition_loader.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/dimension_profiles.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/dimension_registry.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/embed_context.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/extraction/artifact_router.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/extraction/artifact_store.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/extraction/rule_extractors.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/graph_sanitize.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/hybrid_search.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/incremental_clustering.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/model_recommendations.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/query_embed_cache.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/schemas.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/service.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/signal_object_store.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/source_hydration.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/structured_signal.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/tool_index.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/topic_clustering.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/typed_stores/aggregates.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/typed_stores/commitments.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/typed_stores/rhythm.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/vector_codec.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/vector_math.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/vector_settings.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/stats/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/stats/definitions.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/stats/engine.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/stats/fold.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/stats/insights.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/timeline_projection.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/timeline_rollup.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/triage/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/triage/badges.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/triage/daily.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/triage/dashboard.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/triage/instruments.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/triage/intents.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/triage/readiness.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/filter_lab/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/filter_lab/bundles.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/filter_lab/schema.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/filter_lab/service.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/filter_lab/store.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/filter_lab/worker.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/home_chat/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/home_chat/schema.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/home_chat/store.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/hosted_pool_lease.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/canonical_pipeline.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/checkpoints/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/inbox_crypto.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/inbox_drain.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/ingest_helpers.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/jobs.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/journal_location_fanout.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/journal_time_log_normalize.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/local_sync.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/log_preview.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/manager.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parser.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/base.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/browser_parser.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/calendar_parser.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/documents_parser.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/github_activity_parser.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/grok_parser.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/messenger_parser.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/voxterm_parser.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/progress.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/reprocess.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/sources/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/sources/base.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/sources/calendar.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/sources/chatgpt.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/sources/contact_importers.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/sources/grok.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/sources/imessage_reader.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/sources/signal_export_parser.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/sources/signal_reader.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/state_machine.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/triggers/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/triggers/file_trigger.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/usage_inbox_dedupe.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/validation/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/validation/base.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/validation/schema_registry.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/validation/schema_validator.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/lineage/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/lineage/provenance.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/lineage/tracker.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/llm_integrations_storage.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/mcp_stdio_proxy.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/observability/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/observability/alerts.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/observability/metrics.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/observability/tracing.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/openai_client.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/pipeline/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/pipeline/audit.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/pipeline/envelope.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/pipeline/job_runner.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/pipeline/job_store.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/pipeline/stages.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/pipeline/stub_enqueue.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/profiles.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/projections/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/projections/vector_index/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/projections/vector_index/base.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/projections/vector_index/builders.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/projections/vector_index/health_checks.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/protocol/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/protocol/handled_message_types.json +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/protocol/narrowing_vocabulary.json +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/protocol/query_field_contract.json +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/audit.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/cohort_resolvers.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/ddr.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/disclosure.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/entity_window.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/exclusion.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/fingerprint.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/grant_cache.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/inference.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/intent.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/manifest.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/manifest_validation.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/minimizer.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/narrowing.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/negotiation.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/packet_resolution.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/pipeline.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/planner.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/retrieval.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/runtime.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/scope_arbiter.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/scope_classifier.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/scope_head.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/scope_registry.json +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/scope_registry_loader.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/scope_shadow.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/session.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/session_utils.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/source_generation.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/truth_facts.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/truth_prompts.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/turn_classifier.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/types.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/verify.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/verify_modes.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/rate_limit.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/routines/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/routines/schema.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/routines/store.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/runtime_housekeeping.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/runtime_shutdown.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/runtime_update.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/sanitization/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/sanitization/nsfw_classifier.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/sanitization/ollama_transforms.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/sanitization/prewarm.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/sanitization/privacy_filter.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/scope_resolution.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/container.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/embeddings/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/embeddings/base.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/embeddings/local.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/embeddings/remote.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/interfaces.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/llm/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/llm/base.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/llm/openai.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/local.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/postgres.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/sources/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/sources/bundled_canonical_triples.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/sources/canonical_signal_defaults.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/sources/declared_field_map_spec.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/sources/definitions.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/sources/install_service.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/sources/registry.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/sources/runtime_install.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/sources/scrub_attribution.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/sources/scrub_service.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/startup_banner.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/adapters/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/adapters/factory.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/adapters/fakes.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/adapters/postgres/stores.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/adapters/protocols.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/adapters/sqlite/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/adapters/sqlite/stores.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/adapters/sqlite/vector_search.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/activity_tables.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/ai_chat/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/ai_chat/mapper.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/ai_chat/model.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/ai_chat/tables.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/canonical_store.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/conversations_tables.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/journal_repair.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/mapping_store.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/postgres.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/client.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/connection_tuning.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/actor_role_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/backup.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/community_names_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/complexity_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/conflict_provenance_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/derivation_factory_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/derivation_provenance_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/documents_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/enrichment_record_progress_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/entity_mentions_authored_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/entity_review_candidate_bar_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/entity_review_dedup_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/entity_review_provenance_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/episodes_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/journal_origin_dimension_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/pack_registry_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/query_artifacts_duration_ms_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/registry.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/registry_checksums.json +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/remediation_person_model.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/retire_url_classification_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/scope_source_generation.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/signal_objects.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/paths.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/postgres.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/schema.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/schema_probe.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/storage_breakdown.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/write_gate.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/enrichment/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/normalized/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/normalized/normalized_store.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/oplog/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/oplog/decision.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/oplog/oplog_store.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/oplog/postgres.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/person/identity_resolver.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/projections/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/projections/index_ops_store.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/projections/vector_index_store.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/raw/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/raw/browser_flat_tables.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/raw/file_store.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/raw/raw_store.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/raw/raw_tables_manager.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/raw/sqlite_raw_store.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/security/encryption.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/signal_identity.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/source_settings.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/user_identity.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/sync/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/sync/client.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/sync_handlers.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/testing/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/testing/lifespan.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/uma_contact_enrichment.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/uma_filters.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/uma_resource_id.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/uma_rpt.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/upgrades/__init__.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/upgrades/runner.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/utils/base_object.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos/websocket_client.py +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos_node.egg-info/SOURCES.txt +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos_node.egg-info/dependency_links.txt +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos_node.egg-info/entry_points.txt +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos_node.egg-info/requires.txt +0 -0
- {topos_node-1.3.30 → topos_node-1.3.32}/topos_node.egg-info/top_level.txt +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "topos-node"
|
|
7
|
-
version = "1.3.
|
|
7
|
+
version = "1.3.32"
|
|
8
8
|
description = "Topos personal AI engine (FastAPI): local data, sync, control plane WebSocket client"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "Apache-2.0"
|
|
@@ -73,8 +73,8 @@ guidance:
|
|
|
73
73
|
- "Authored-only: an assigned OKR is work context, not a personal goal, unless the owner adopts it in their own words."
|
|
74
74
|
- "Idle wishes ('would love to someday') are aspirations, never goals — the horizon field is load-bearing."
|
|
75
75
|
- "v0.2.4 A goal is STATED INTENT in the owner's own words ('Goal:', 'I want to', 'I will').
|
|
76
|
-
Wry observations, jokes and family lore ('
|
|
77
|
-
|
|
76
|
+
Wry observations, jokes and family lore ('guess the family streak continues through me
|
|
77
|
+
') are never goals — if the owner would be surprised to see it on their goal list,
|
|
78
78
|
extract nothing."
|
|
79
79
|
- "v0.2.4 goal_ref is a NAME (a few words), not a sentence — a goal_ref longer than ~8 words
|
|
80
80
|
means the goal was never really named; prefer the Goal: header's own phrasing."
|
{topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/health.mental.yaml
RENAMED
|
@@ -31,7 +31,7 @@ predicates:
|
|
|
31
31
|
v0.2.4 — a state report is a FELT-STATE statement about how the owner is/was
|
|
32
32
|
("I am exhausted", "slept 8 hours, wild dreams", "so nervous with the talk").
|
|
33
33
|
An intention, aspiration, reflection or observation is NOT a state, whatever
|
|
34
|
-
dimension it brushes: "I need to be
|
|
34
|
+
dimension it brushes: "I need to be around more ambitious builders" is a
|
|
35
35
|
want, not an energy report; "the talk motivated me to write" is a reflection,
|
|
36
36
|
not a focus report. If the words don't describe how the owner FEELS or FELT,
|
|
37
37
|
extract nothing.
|
|
@@ -70,9 +70,9 @@ eval:
|
|
|
70
70
|
- {text: "Third week straight of terrible sleep, I'm running on fumes", role: authored,
|
|
71
71
|
expect: [{predicate: mind.self_reported_state, value: {dimension: sleep_quality}}]}
|
|
72
72
|
negative_controls:
|
|
73
|
-
- {text: "I need to be
|
|
73
|
+
- {text: "I need to be around more ambitious builders. To go out of my way to find them.", role: authored,
|
|
74
74
|
expect_not: [{predicate: mind.self_reported_state}], note: "v0.2.4 measured junk: a want is not an energy state"}
|
|
75
|
-
- {text: "The
|
|
75
|
+
- {text: "The workshop at the end inspired me to draft my own essay on collaboration tools.", role: authored,
|
|
76
76
|
expect_not: [{predicate: mind.self_reported_state}], note: "v0.2.4 measured junk: a reflection is not a focus state"}
|
|
77
77
|
- {text: "Podcast episode about burnout culture in tech", role: ambient, expect: []}
|
|
78
78
|
- {text: "My brother finally started therapy, proud of him", role: authored, expect: [], note: "third party"}
|
{topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/places.mobility.yaml
RENAMED
|
@@ -81,8 +81,8 @@ decisions:
|
|
|
81
81
|
- >
|
|
82
82
|
2026-08-26 (W5 gate, measured): role_policy tightened to authored_addressed —
|
|
83
83
|
with ambient/observed allowed, OTHER PEOPLE'S messages became owner place-ties
|
|
84
|
-
("I am once again at
|
|
85
|
-
a friend's
|
|
84
|
+
("I am once again at the Harbor Cafe" from a friend -> owner workplace_location;
|
|
85
|
+
a friend's parking find -> owner tie to that city). 4/5 sampled accepts
|
|
86
86
|
were junk, dominated by this leak. Location-bearing ambient signals return
|
|
87
87
|
via the no-LLM synthesizer lane (timestamps/geo), never via LLM reading of
|
|
88
88
|
others' words.
|
{topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/work.career.yaml
RENAMED
|
@@ -117,12 +117,12 @@ eval:
|
|
|
117
117
|
expect: [{predicate: work.project, value: {status: paused}}]}
|
|
118
118
|
negative_controls:
|
|
119
119
|
- {text: "Sounds like Dana's team is hiring three more", role: authored, expect: [], note: "other team's news"}
|
|
120
|
-
- {text: "I applied to
|
|
121
|
-
- {text: "I applied to the
|
|
120
|
+
- {text: "I applied to Meridian's open role today", role: authored, expect: [], note: "v0.2.2 measured junk: applied is NOT hired"}
|
|
121
|
+
- {text: "I applied to the Horizon Startup Fund", role: authored, expect: [], note: "v0.2.2 measured junk: applying for funding is NOT started_venture"}
|
|
122
122
|
- {text: "I filed for unemployment.", role: authored, expect: [{predicate: work.employment_shape, value: between_roles}],
|
|
123
123
|
expect_not: [{predicate: work.career_event}], note: "v0.2.2: shape yes, event no"}
|
|
124
|
-
- {text: "I took the
|
|
125
|
-
- {text: "All day with
|
|
124
|
+
- {text: "I took the practice aptitude test again. Scored a 32.", role: authored, expect: [], note: "v0.2.2 measured junk: a test score is not an award"}
|
|
125
|
+
- {text: "All day with Harbor Ventures.", role: authored, expect_not: [{predicate: work.employer}], note: "v0.2.2 measured junk: co-presence is not employment"}
|
|
126
126
|
- {text: "(newsletter: 'The 2026 layoff wave continues')", role: ambient, expect: []}
|
|
127
127
|
calibration: {min_conf_for_assert: 0.65, ece_max: 0.15}
|
|
128
128
|
|
|
@@ -100,7 +100,7 @@ LOSS_EVIDENCE = ("died", "passed", "passing", "funeral", "loss of", "death", "re
|
|
|
100
100
|
|
|
101
101
|
def relationship_role_check(role: str, person: str, record_text: str):
|
|
102
102
|
"""A1 role-evidence guard (measured 2026-08-26 full-run): the 27B verifier
|
|
103
|
-
CONSISTENTLY accepts possessive misattribution ("
|
|
103
|
+
CONSISTENTLY accepts possessive misattribution ("Nora and her boyfriend Theo"
|
|
104
104
|
-> owner's partner) — textual support without subject discipline. Rules,
|
|
105
105
|
all deterministic:
|
|
106
106
|
1. A kin-term PERSON ("Mom", "brother") is self-evidencing -> owner.
|
|
@@ -239,7 +239,7 @@ Hard rules:
|
|
|
239
239
|
- Extract only what this record actually states about the OWNER. No guesses, no world knowledge.
|
|
240
240
|
- Every assertion MUST carry "about": "owner" if the fact is about the record's author-owner,
|
|
241
241
|
"other:<name>" if the record states it about someone else (their appointment, their partner,
|
|
242
|
-
their loss — e.g. "
|
|
242
|
+
their loss — e.g. "Nora and her boyfriend Theo" -> about: "other:Nora"), or "unclear" if you
|
|
243
243
|
cannot tell. Facts about others are NOT discarded — they are routed to that person's dossier —
|
|
244
244
|
so NEVER launder a third party's fact into "owner" to save it.
|
|
245
245
|
The about field does NOT make extraction stricter: extract exactly what you would have
|
|
@@ -23,9 +23,23 @@ import uuid
|
|
|
23
23
|
from datetime import datetime, timezone, timedelta
|
|
24
24
|
from typing import Any, Dict, List, Optional
|
|
25
25
|
|
|
26
|
+
import os
|
|
27
|
+
|
|
26
28
|
from topos.features.facts.store import FactStore, normalize_predicate, CONFLICT_CONFIDENCE_MARGIN
|
|
27
29
|
from .guard import find_identifiers
|
|
28
30
|
from .packs import Pack, Predicate
|
|
31
|
+
|
|
32
|
+
#: Whether a resolved `about=other:<name>` assertion may be WRITTEN to that person's
|
|
33
|
+
#: dossier. Default OFF, and it must stay off until a net-subject policy plane exists
|
|
34
|
+
#: (per-subject opt-in defaulting to off, a write-time BlackholeStore consult, and
|
|
35
|
+
#: pack-level `net_subject: allow|deny`). With it off, every outward assertion is
|
|
36
|
+
#: quarantined with reason `net_subject_disabled:<name>` and waits for a human.
|
|
37
|
+
#:
|
|
38
|
+
#: The env override exists so the policy work can be developed and tested against the
|
|
39
|
+
#: real path without editing the module. It is NOT a supported production setting: any
|
|
40
|
+
#: node that sets it is writing durable facts about people who never consented and
|
|
41
|
+
#: cannot, with no gate in front of the write.
|
|
42
|
+
NET_SUBJECT_WRITES_ENABLED = os.environ.get("TOPOS_NET_SUBJECT_WRITES") == "1"
|
|
29
43
|
# extractor provenance must track the PROMPT actually used — a local copy of this
|
|
30
44
|
# constant stamped every shadow-2..6 fact "shadow-1" (caught in W1.3 grading)
|
|
31
45
|
from .template import TEMPLATE_VERSION
|
|
@@ -206,6 +220,43 @@ class DerivationWriter:
|
|
|
206
220
|
# --- A3 (attribution ladder): route by subject BEFORE any owner-assert ---
|
|
207
221
|
about = (about or "owner").strip()
|
|
208
222
|
if about != "owner":
|
|
223
|
+
# --- net-subject kill switch (temporary; remove when the policy plane lands) ---
|
|
224
|
+
#
|
|
225
|
+
# Below this line, `about=other:<name>` that RESOLVES is written as a durable
|
|
226
|
+
# fact onto that person's dossier. There is currently no consent plane to
|
|
227
|
+
# authorise that: `net_subject` / `subject_axis` appear ZERO times in this
|
|
228
|
+
# engine, the control plane, the front end, or any of the 25 pack YAMLs; the
|
|
229
|
+
# Pack/Predicate dataclasses carry no subject field, so a pack can neither
|
|
230
|
+
# declare nor refuse an outward subject; `pack.disclosure_default` is stored
|
|
231
|
+
# on every registry row and never read; and BlackholeGuard is consulted only
|
|
232
|
+
# at READ time, so a blackholed person can still ACCRUE facts.
|
|
233
|
+
#
|
|
234
|
+
# Nothing has been written so far only because `_resolve_person` is an exact
|
|
235
|
+
# match on `entities.normalized_name` and fails on every third-party first
|
|
236
|
+
# name — 624 of 1,505 person entities are keyed on a phone number and only 36
|
|
237
|
+
# carry aliases. That is an accident of an unbuilt person spine, not a policy.
|
|
238
|
+
# The planned L0 (person spine) exists precisely to make that resolution
|
|
239
|
+
# succeed, which would silently switch automatic third-party dossier writing
|
|
240
|
+
# ON. The owner's standing decision is "off until asked".
|
|
241
|
+
#
|
|
242
|
+
# So: quarantine EVERY outward assertion, resolvable or not. Quarantine is
|
|
243
|
+
# already the reviewed path — the rows carry full provenance and the fact
|
|
244
|
+
# editor promotes them — so nothing is lost, only deferred to a human.
|
|
245
|
+
#
|
|
246
|
+
# REMOVE THIS BLOCK when the net-subject policy plane exists (plan L4-4:
|
|
247
|
+
# per-subject opt-in defaulting to off, a write-time BlackholeStore consult,
|
|
248
|
+
# and pack-level `net_subject: allow|deny`). Replace it with that lookup —
|
|
249
|
+
# do not simply delete it.
|
|
250
|
+
if about.startswith("other:") and not NET_SUBJECT_WRITES_ENABLED:
|
|
251
|
+
# Its own reason, deliberately: these are POLICY holds, not failures to
|
|
252
|
+
# identify a subject. Collapsing them into `about_unclear` would make a
|
|
253
|
+
# withheld-by-policy row indistinguishable from one the verifier could
|
|
254
|
+
# not attribute, and the review queue's whole value is that distinction.
|
|
255
|
+
self._quarantine(subject_entity_id, predicate, value, confidence,
|
|
256
|
+
reason=f"net_subject_disabled:{about[6:][:40]}",
|
|
257
|
+
pack=pack, source_refs=source_refs, quote=quote, about=about)
|
|
258
|
+
self.stats["net_subject_withheld"] = self.stats.get("net_subject_withheld", 0) + 1
|
|
259
|
+
return {"outcome": "quarantined", "reason": "net-subject writes disabled"}
|
|
209
260
|
if about.startswith("other:"):
|
|
210
261
|
other = self._resolve_person(about[6:])
|
|
211
262
|
if other:
|
|
@@ -360,7 +360,7 @@ def _display_value(raw) -> str:
|
|
|
360
360
|
return hv.strip()
|
|
361
361
|
# NO fallback to arbitrary fields: a description/free-text value is
|
|
362
362
|
# narrative, not identity — minting it produced sentence-named nodes
|
|
363
|
-
# ("rode with
|
|
363
|
+
# ("rode with a friend on the way to…"). A structured value with no
|
|
364
364
|
# identity key mints nothing; the fact itself still exists.
|
|
365
365
|
return ""
|
|
366
366
|
return str(v or "").strip()
|
|
@@ -43,7 +43,7 @@ _LINK_STOPWORDS = frozenset(
|
|
|
43
43
|
|
|
44
44
|
def _linkable_candidate(cand: str) -> bool:
|
|
45
45
|
"""A candidate name is linkable only if it carries at least one real word:
|
|
46
|
-
≥3 chars and not a function word. '
|
|
46
|
+
≥3 chars and not a function word. 'Leo' links; 'IS', 'Go', 'The One' do not."""
|
|
47
47
|
words = [w for w in cand.split() if w]
|
|
48
48
|
if not words:
|
|
49
49
|
return False
|
|
@@ -136,7 +136,13 @@ def list_facts(
|
|
|
136
136
|
"period_start": payload.get("period_start"),
|
|
137
137
|
"period_end": payload.get("period_end"),
|
|
138
138
|
"confidence": payload.get("confidence", fact["confidence"]),
|
|
139
|
-
|
|
139
|
+
# Fail closed, and match the sibling reader 74 lines below, which
|
|
140
|
+
# already defaults to owner_only. A payload with no disclosure is
|
|
141
|
+
# a row nobody classified; reading it as shareable is the wrong
|
|
142
|
+
# direction to guess in, and the two readers disagreeing meant the
|
|
143
|
+
# same unclassified row was shareable on one path and private on
|
|
144
|
+
# the other.
|
|
145
|
+
"disclosure": payload.get("disclosure", "owner_only"),
|
|
140
146
|
# Attribution: who asserted this claim (owner | contact:<id> |
|
|
141
147
|
# assistant | page-author | …). Powers the person→ambient badge.
|
|
142
148
|
"asserted_by": payload.get("asserted_by", "owner"),
|
|
@@ -110,7 +110,14 @@ class FactStore:
|
|
|
110
110
|
confidence: float = 0.7,
|
|
111
111
|
source_refs: Optional[List[Dict[str, Any]]] = None,
|
|
112
112
|
valid_from: Optional[str] = None,
|
|
113
|
-
|
|
113
|
+
# Fail closed. Every in-tree caller passes this explicitly (verdicts.py,
|
|
114
|
+
# llm_extract.py, extract.py x2, truth_facts.py), so the default is only
|
|
115
|
+
# ever reached by a caller that forgot — and the safe thing to do with a
|
|
116
|
+
# claim about a person when nobody said how far it may travel is to keep
|
|
117
|
+
# it. This is the second fact write path: DerivationWriter pins owner_only
|
|
118
|
+
# by construction, and this one did not, so "facts are owner_only" was
|
|
119
|
+
# true of one lane and merely conventional in the other.
|
|
120
|
+
disclosure: str = "owner_only",
|
|
114
121
|
period_start: Optional[str] = None,
|
|
115
122
|
period_end: Optional[str] = None,
|
|
116
123
|
asserted_by: str = "owner",
|
|
@@ -524,9 +524,22 @@ def sweep_orphans(conn: sqlite3.Connection) -> Dict[str, int]:
|
|
|
524
524
|
"""
|
|
525
525
|
)
|
|
526
526
|
out["embedding_entities"] = int(cursor.rowcount or 0)
|
|
527
|
+
# A conflict row is an orphan when the fact it CHALLENGES is gone. A3
|
|
528
|
+
# quarantine rows have no incumbent by design — an unroutable or withheld
|
|
529
|
+
# assertion is not challenging anything — so they carry the synthetic
|
|
530
|
+
# sentinel `quarantine:<reason>` (writer.py::_quarantine). That sentinel is
|
|
531
|
+
# never a signal_objects.object_id, so the orphan predicate matched every
|
|
532
|
+
# one of them: measured on the live node 2026-08-26, all 13 pending rows
|
|
533
|
+
# would be deleted by this sweep, and it fires on the owner's ordinary
|
|
534
|
+
# per-record exclusion flow. That queue is the human review path for
|
|
535
|
+
# third-party assertions — including health.condition about people who
|
|
536
|
+
# never consented — so deleting it silently discards exactly the decisions
|
|
537
|
+
# a person is supposed to make.
|
|
527
538
|
cursor = conn.execute(
|
|
528
539
|
"""
|
|
529
|
-
DELETE FROM fact_conflicts
|
|
540
|
+
DELETE FROM fact_conflicts
|
|
541
|
+
WHERE incumbent_object_id NOT LIKE 'quarantine:%'
|
|
542
|
+
AND incumbent_object_id NOT IN (
|
|
530
543
|
SELECT object_id FROM signal_objects WHERE object_type='fact'
|
|
531
544
|
)
|
|
532
545
|
"""
|
|
@@ -38,7 +38,8 @@ _ALIASES: List[tuple] = [
|
|
|
38
38
|
(r"\b(career|fired|hired|promoted|laid off)\b", ["work.career_event"], False),
|
|
39
39
|
(r"\bfamily member|my (family|relatives|parents|siblings|kids|children)\b",
|
|
40
40
|
["rel.relationship"], False),
|
|
41
|
-
(r"\b(closest|inner circle|best friend)s?\b",
|
|
41
|
+
(r"\b(closest|inner circle|close circle|close friend|best friend)s?\b",
|
|
42
|
+
["rel.closeness_tier", "rel.relationship"], False),
|
|
42
43
|
(r"\bchronotype|night owl|early bird\b", ["behavior.chronotype"], False),
|
|
43
44
|
]
|
|
44
45
|
|
|
@@ -66,19 +67,43 @@ def fetch_direct_facts(
|
|
|
66
67
|
return None
|
|
67
68
|
if special and packet_resolution != "facts_all":
|
|
68
69
|
return None
|
|
69
|
-
|
|
70
|
+
# `is_self` is not unique: live 2026-08-26 three entities carried it —
|
|
71
|
+
# ent_e73ff33ae330422b ("Owner", 178 facts) plus two "self" rows created that
|
|
72
|
+
# morning holding none. An unordered fetchone() picked the fact-bearing row by
|
|
73
|
+
# rowid luck; a vacuum or a rewrite of that row would have silently blanked
|
|
74
|
+
# every known-item answer. Prefer the self-entity that actually owns facts,
|
|
75
|
+
# entity_id as the tiebreak, so the choice is stable across rewrites. (No
|
|
76
|
+
# created_at in the ORDER BY: the query fixtures build a minimal `entities`
|
|
77
|
+
# table without it.)
|
|
78
|
+
owner = conn.execute(
|
|
79
|
+
"""SELECT e.entity_id
|
|
80
|
+
FROM entities e
|
|
81
|
+
WHERE e.is_self=1
|
|
82
|
+
ORDER BY (SELECT COUNT(*) FROM signal_objects o
|
|
83
|
+
WHERE o.object_type='fact'
|
|
84
|
+
AND o.object_key LIKE 'fact:' || e.entity_id || ':%') DESC,
|
|
85
|
+
e.entity_id ASC
|
|
86
|
+
LIMIT 1"""
|
|
87
|
+
).fetchone()
|
|
70
88
|
if not owner:
|
|
71
89
|
return None
|
|
72
90
|
out: List[Dict[str, Any]] = []
|
|
73
91
|
for pred in predicates:
|
|
92
|
+
# Delimiter-aware: a bare `{pred}%` prefix also swept sibling predicates.
|
|
93
|
+
# "Who's in my family?" asks for rel.relationship and was handed the 23
|
|
94
|
+
# rel.relationship_event rows too, so the answer listed people the owner
|
|
95
|
+
# merely met (live 2026-08-26: Vitalik Buterin returned as family). Match
|
|
96
|
+
# the exact key or the key plus its ':value' segment, nothing else.
|
|
97
|
+
# `_` is a LIKE wildcard and predicates contain it, so escape it.
|
|
98
|
+
like_pred = pred.replace("\\", "\\\\").replace("_", "\\_").replace("%", "\\%")
|
|
74
99
|
rows = conn.execute(
|
|
75
100
|
"""SELECT object_key, payload_json, confidence, valid_from, valid_to,
|
|
76
101
|
ontology_id, altitude
|
|
77
102
|
FROM signal_objects
|
|
78
103
|
WHERE object_type='fact' AND valid_to IS NULL
|
|
79
|
-
AND object_key LIKE ?
|
|
104
|
+
AND (object_key = ? OR object_key LIKE ? ESCAPE '\\')
|
|
80
105
|
ORDER BY valid_from DESC LIMIT 40""",
|
|
81
|
-
(f"fact:{owner[0]}:{pred}
|
|
106
|
+
(f"fact:{owner[0]}:{pred}", f"fact:{owner[0]}:{like_pred}:%"),
|
|
82
107
|
).fetchall()
|
|
83
108
|
for key, payload_json, conf, vf, vt, pack, altitude in rows:
|
|
84
109
|
try:
|
|
@@ -93,9 +118,27 @@ def fetch_direct_facts(
|
|
|
93
118
|
"altitude": altitude or "stated", "pack": pack,
|
|
94
119
|
"evidence_count": len(refs) if isinstance(refs, list) else 0,
|
|
95
120
|
})
|
|
121
|
+
# Durable facts (a standing role/status: "mom, parent, active") outrank event
|
|
122
|
+
# facts ("met X at the saloon") in a known-item answer. Recency-only ordering
|
|
123
|
+
# let a month of introductions push the owner's parents past the compose cap:
|
|
124
|
+
# live 2026-08-26, "Who's in my family?" listed 16 met-events and cut
|
|
125
|
+
# mom/brother while keeping them in store. Stable sort keeps recency DESC
|
|
126
|
+
# within each band, so event feeds ("what happened with X?") are unaffected
|
|
127
|
+
# below the durable block.
|
|
128
|
+
out.sort(key=lambda f: 0 if _is_durable(f.get("value")) else 1)
|
|
96
129
|
return out or None
|
|
97
130
|
|
|
98
131
|
|
|
132
|
+
def _is_durable(value: Any) -> bool:
|
|
133
|
+
"""A fact whose value carries a standing role/status rather than an event."""
|
|
134
|
+
if isinstance(value, str):
|
|
135
|
+
try:
|
|
136
|
+
value = json.loads(value)
|
|
137
|
+
except (json.JSONDecodeError, TypeError):
|
|
138
|
+
return False
|
|
139
|
+
return isinstance(value, dict) and bool(value.get("role") or value.get("status"))
|
|
140
|
+
|
|
141
|
+
|
|
99
142
|
def _fmt_value(v: Any) -> str:
|
|
100
143
|
if isinstance(v, str):
|
|
101
144
|
try:
|
|
@@ -107,6 +150,37 @@ def _fmt_value(v: Any) -> str:
|
|
|
107
150
|
return str(v)
|
|
108
151
|
|
|
109
152
|
|
|
153
|
+
def _fact_labels(facts: List[Dict[str, Any]]) -> List[str]:
|
|
154
|
+
"""Subject labels for `items`.
|
|
155
|
+
|
|
156
|
+
The game layer fills `items` speculatively from graph/score text before this
|
|
157
|
+
lane runs, and pipeline's `payload.update(direct)` only overwrites the keys
|
|
158
|
+
this lane returns. Leaving `items` behind shipped a correct `answer` next to a
|
|
159
|
+
contradicting list: live 2026-08-26 "Who's in my family?" carried Mom, Dad,
|
|
160
|
+
brother and grandma in `answer` while `items` held NER debris ("U", "AI",
|
|
161
|
+
"##os", "NAME"), and the local synthesis model answered from the debris.
|
|
162
|
+
"""
|
|
163
|
+
out: List[str] = []
|
|
164
|
+
seen: set[str] = set()
|
|
165
|
+
for f in facts:
|
|
166
|
+
value = f.get("value")
|
|
167
|
+
if isinstance(value, str):
|
|
168
|
+
try:
|
|
169
|
+
value = json.loads(value)
|
|
170
|
+
except (json.JSONDecodeError, TypeError):
|
|
171
|
+
value = None
|
|
172
|
+
label = None
|
|
173
|
+
if isinstance(value, dict):
|
|
174
|
+
label = value.get("person") or value.get("name") or value.get("value")
|
|
175
|
+
if not label:
|
|
176
|
+
label = _fmt_value(f.get("value"))
|
|
177
|
+
label = str(label).strip()
|
|
178
|
+
if label and label not in seen:
|
|
179
|
+
seen.add(label)
|
|
180
|
+
out.append(label)
|
|
181
|
+
return out[:20]
|
|
182
|
+
|
|
183
|
+
|
|
110
184
|
def compose_facts_answer(facts: List[Dict[str, Any]]) -> str:
|
|
111
185
|
lines = []
|
|
112
186
|
for f in facts[:20]:
|
|
@@ -140,5 +214,6 @@ def try_facts_direct(
|
|
|
140
214
|
"answer_type": "facts",
|
|
141
215
|
"answer": compose_facts_answer(facts),
|
|
142
216
|
"facts": facts[:20],
|
|
217
|
+
"items": _fact_labels(facts),
|
|
143
218
|
"facts_direct": True,
|
|
144
219
|
}
|
|
@@ -55,6 +55,34 @@ def _extract_inference_evidence(context_packet: Dict[str, Any], *, limit: int =
|
|
|
55
55
|
return evidence
|
|
56
56
|
|
|
57
57
|
|
|
58
|
+
#: Redaction writes these placeholders into stored text, and the NER pass then
|
|
59
|
+
#: extracts them as if they were names.
|
|
60
|
+
_REDACTION_PLACEHOLDERS = {"NAME", "ADDRESS", "DATE", "EMAIL", "PHONE", "URL", "LOCATION"}
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _looks_like_entity_label(value: str) -> bool:
|
|
64
|
+
"""Reject debris that is not a name.
|
|
65
|
+
|
|
66
|
+
`graph.nodes` and `scores` carry raw NER output, which includes WordPiece
|
|
67
|
+
continuation tokens ("Topos" tokenizes to "Top" + "##os", and both are stored
|
|
68
|
+
as separate entities), redaction placeholders, and serialized fact blobs. Live
|
|
69
|
+
2026-08-26 the answer to "Who's in my close circle?" was
|
|
70
|
+
["U", "AI", "UMA", "Sara", "Marcus", "NAME", "Top", "##os", "VoxTerm A"].
|
|
71
|
+
"""
|
|
72
|
+
v = value.strip()
|
|
73
|
+
if len(v) < 2 or len(v) > 60:
|
|
74
|
+
return False
|
|
75
|
+
if v.startswith("##"): # WordPiece continuation, never a standalone name
|
|
76
|
+
return False
|
|
77
|
+
if "{" in v or "}" in v: # serialized fact payload, not a label
|
|
78
|
+
return False
|
|
79
|
+
if v.upper() in _REDACTION_PLACEHOLDERS:
|
|
80
|
+
return False
|
|
81
|
+
if v.isupper() and len(v) <= 3: # bare acronym (U, AI, UMA), not a person here
|
|
82
|
+
return False
|
|
83
|
+
return True
|
|
84
|
+
|
|
85
|
+
|
|
58
86
|
def _extract_entity_labels(context_packet: Dict[str, Any]) -> List[str]:
|
|
59
87
|
labels: List[str] = []
|
|
60
88
|
seen: set[str] = set()
|
|
@@ -64,7 +92,7 @@ def _extract_entity_labels(context_packet: Dict[str, Any]) -> List[str]:
|
|
|
64
92
|
continue
|
|
65
93
|
for key in ("label", "name", "node_id", "entity_text"):
|
|
66
94
|
value = node.get(key)
|
|
67
|
-
if value and str(value) not in seen:
|
|
95
|
+
if value and str(value) not in seen and _looks_like_entity_label(str(value)):
|
|
68
96
|
seen.add(str(value))
|
|
69
97
|
labels.append(str(value))
|
|
70
98
|
for score in context_packet.get("scores") or []:
|
|
@@ -72,7 +100,7 @@ def _extract_entity_labels(context_packet: Dict[str, Any]) -> List[str]:
|
|
|
72
100
|
continue
|
|
73
101
|
for key in ("entity_text", "label", "topic", "summary_text"):
|
|
74
102
|
value = score.get(key)
|
|
75
|
-
if value and str(value) not in seen:
|
|
103
|
+
if value and str(value) not in seen and _looks_like_entity_label(str(value)):
|
|
76
104
|
seen.add(str(value))
|
|
77
105
|
labels.append(str(value))
|
|
78
106
|
return labels[:10]
|
|
@@ -605,6 +605,18 @@
|
|
|
605
605
|
"steps": [],
|
|
606
606
|
"notes": []
|
|
607
607
|
},
|
|
608
|
+
{
|
|
609
|
+
"version": "1.3.31",
|
|
610
|
+
"summary": "Release 1.3.31.",
|
|
611
|
+
"steps": [],
|
|
612
|
+
"notes": []
|
|
613
|
+
},
|
|
614
|
+
{
|
|
615
|
+
"version": "1.3.32",
|
|
616
|
+
"summary": "Release 1.3.32.",
|
|
617
|
+
"steps": [],
|
|
618
|
+
"notes": []
|
|
619
|
+
},
|
|
608
620
|
{
|
|
609
621
|
"version": "unreleased",
|
|
610
622
|
"summary": "Staging entry for in-flight PRs. cut_release.py stamps this with the next version at release cut. Never executed by steps_between.",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|