topos-node 1.3.40__tar.gz → 1.3.42__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.
Files changed (764) hide show
  1. {topos_node-1.3.40/topos_node.egg-info → topos_node-1.3.42}/PKG-INFO +1 -1
  2. {topos_node-1.3.40 → topos_node-1.3.42}/pyproject.toml +1 -1
  3. {topos_node-1.3.40 → topos_node-1.3.42}/topos/__version__.py +2 -2
  4. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/graph_summary.py +5 -1
  5. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/projection.py +9 -1
  6. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/edges.py +12 -2
  7. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/graph_refresh.py +55 -0
  8. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/canonical_pipeline.py +26 -24
  9. {topos_node-1.3.40 → topos_node-1.3.42}/topos/protocol/narrowing_vocabulary.json +2 -1
  10. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/game_layer.py +69 -0
  11. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/narrowing.py +1 -0
  12. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/pipeline.py +22 -2
  13. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/scope_registry.json +129 -0
  14. {topos_node-1.3.40 → topos_node-1.3.42}/topos/sources/bundled_canonical_triples.py +37 -0
  15. {topos_node-1.3.40 → topos_node-1.3.42}/topos/sources/install_service.py +86 -4
  16. {topos_node-1.3.40 → topos_node-1.3.42}/topos/upgrades/manifests.json +12 -0
  17. {topos_node-1.3.40 → topos_node-1.3.42/topos_node.egg-info}/PKG-INFO +1 -1
  18. {topos_node-1.3.40 → topos_node-1.3.42}/LICENSE +0 -0
  19. {topos_node-1.3.40 → topos_node-1.3.42}/MANIFEST.in +0 -0
  20. {topos_node-1.3.40 → topos_node-1.3.42}/README.md +0 -0
  21. {topos_node-1.3.40 → topos_node-1.3.42}/setup.cfg +0 -0
  22. {topos_node-1.3.40 → topos_node-1.3.42}/shared/__init__.py +0 -0
  23. {topos_node-1.3.40 → topos_node-1.3.42}/shared/filtering.py +0 -0
  24. {topos_node-1.3.40 → topos_node-1.3.42}/shared/schema_registry.py +0 -0
  25. {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_active_database_binding.py +0 -0
  26. {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_active_ingestion_binding.py +0 -0
  27. {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_extensions.py +0 -0
  28. {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_gate_leg_hermeticity.py +0 -0
  29. {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_llm_integrations_storage.py +0 -0
  30. {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_local_gate_composition.py +0 -0
  31. {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_owner_database_hermeticity.py +0 -0
  32. {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_prewarm_first_run.py +0 -0
  33. {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_profile_hygiene.py +0 -0
  34. {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_profiles.py +0 -0
  35. {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_protocol_handled_types.py +0 -0
  36. {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_query_field_contract.py +0 -0
  37. {topos_node-1.3.40 → topos_node-1.3.42}/tests/test_system_computer_name.py +0 -0
  38. {topos_node-1.3.40 → topos_node-1.3.42}/topos/__init__.py +0 -0
  39. {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/__init__.py +0 -0
  40. {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/dataset_resolution.py +0 -0
  41. {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/duckdb_adapter.py +0 -0
  42. {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/luck_surface.py +0 -0
  43. {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/messenger_communities.py +0 -0
  44. {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/messenger_directed.py +0 -0
  45. {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/messenger_graph.py +0 -0
  46. {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/messenger_labels.py +0 -0
  47. {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/person_graph.py +0 -0
  48. {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/person_overlay.py +0 -0
  49. {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/profiles.py +0 -0
  50. {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/query_engine.py +0 -0
  51. {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/raw_queries.py +0 -0
  52. {topos_node-1.3.40 → topos_node-1.3.42}/topos/analytics/relationship_reads.py +0 -0
  53. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/__init__.py +0 -0
  54. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/analytics.py +0 -0
  55. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/app_registry.py +0 -0
  56. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/backup.py +0 -0
  57. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/community_naming_config.py +0 -0
  58. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/compute_remote.py +0 -0
  59. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/connected_apps.py +0 -0
  60. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/conversation_context.py +0 -0
  61. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/data_commit.py +0 -0
  62. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/data_explorer_table_prefs.py +0 -0
  63. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/database_explorer.py +0 -0
  64. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/db.py +0 -0
  65. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/device.py +0 -0
  66. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/disk_space_config.py +0 -0
  67. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/engine_run.py +0 -0
  68. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/enrichment.py +0 -0
  69. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/enrichment_lab.py +0 -0
  70. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/facts_llm_config.py +0 -0
  71. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/filter_lab.py +0 -0
  72. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/health.py +0 -0
  73. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/home_chat.py +0 -0
  74. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/ingestion_api.py +0 -0
  75. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/ingestion_compat.py +0 -0
  76. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/ingestion_sources.py +0 -0
  77. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/intelligence_lifecycle.py +0 -0
  78. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/llm.py +0 -0
  79. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/local_mcp.py +0 -0
  80. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/messenger_analytics.py +0 -0
  81. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/privacy_disclose.py +0 -0
  82. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/query_api.py +0 -0
  83. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/runtime_bootstrap.py +0 -0
  84. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/sanitization_ollama_config.py +0 -0
  85. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/shell.py +0 -0
  86. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/signal.py +0 -0
  87. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/signal_extraction_config.py +0 -0
  88. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/source_install.py +0 -0
  89. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/source_scrub.py +0 -0
  90. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/sources.py +0 -0
  91. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/sources_overview.py +0 -0
  92. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/sync.py +0 -0
  93. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/tool_index.py +0 -0
  94. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/ui_config.py +0 -0
  95. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/uma_data.py +0 -0
  96. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/upgrades.py +0 -0
  97. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/usage.py +0 -0
  98. {topos_node-1.3.40 → topos_node-1.3.42}/topos/api/user_identity.py +0 -0
  99. {topos_node-1.3.40 → topos_node-1.3.42}/topos/app.py +0 -0
  100. {topos_node-1.3.40 → topos_node-1.3.42}/topos/auth.py +0 -0
  101. {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/__init__.py +0 -0
  102. {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/declared_field_map.py +0 -0
  103. {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/mappers/__init__.py +0 -0
  104. {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/mappers/base.py +0 -0
  105. {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
  106. {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
  107. {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/mappers/demo_mappers.py +0 -0
  108. {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/mappers/documents_mapper.py +0 -0
  109. {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
  110. {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
  111. {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/mappers/grok_mapper.py +0 -0
  112. {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
  113. {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/models.py +0 -0
  114. {topos_node-1.3.40 → topos_node-1.3.42}/topos/canonicalization/resolver.py +0 -0
  115. {topos_node-1.3.40 → topos_node-1.3.42}/topos/cli/__init__.py +0 -0
  116. {topos_node-1.3.40 → topos_node-1.3.42}/topos/cli/__main__.py +0 -0
  117. {topos_node-1.3.40 → topos_node-1.3.42}/topos/cli/assets/topos_blk_rounded.png +0 -0
  118. {topos_node-1.3.40 → topos_node-1.3.42}/topos/cli/assets/topos_white.png +0 -0
  119. {topos_node-1.3.40 → topos_node-1.3.42}/topos/cli/commands.py +0 -0
  120. {topos_node-1.3.40 → topos_node-1.3.42}/topos/cli/profile_cmd.py +0 -0
  121. {topos_node-1.3.40 → topos_node-1.3.42}/topos/cli/reprocess_cmd.py +0 -0
  122. {topos_node-1.3.40 → topos_node-1.3.42}/topos/cli/setup_models_cmd.py +0 -0
  123. {topos_node-1.3.40 → topos_node-1.3.42}/topos/cli/tray.py +0 -0
  124. {topos_node-1.3.40 → topos_node-1.3.42}/topos/config/__init__.py +0 -0
  125. {topos_node-1.3.40 → topos_node-1.3.42}/topos/config/conversation_context_llm.py +0 -0
  126. {topos_node-1.3.40 → topos_node-1.3.42}/topos/config/facts_llm.py +0 -0
  127. {topos_node-1.3.40 → topos_node-1.3.42}/topos/config/local_model_builds.py +0 -0
  128. {topos_node-1.3.40 → topos_node-1.3.42}/topos/config/model_packs.py +0 -0
  129. {topos_node-1.3.40 → topos_node-1.3.42}/topos/config/node_function_providers.py +0 -0
  130. {topos_node-1.3.40 → topos_node-1.3.42}/topos/config/sanitization_ollama.py +0 -0
  131. {topos_node-1.3.40 → topos_node-1.3.42}/topos/config/settings.py +0 -0
  132. {topos_node-1.3.40 → topos_node-1.3.42}/topos/config/signal_extraction.py +0 -0
  133. {topos_node-1.3.40 → topos_node-1.3.42}/topos/config/uvicorn_logging.json +0 -0
  134. {topos_node-1.3.40 → topos_node-1.3.42}/topos/contacts/__init__.py +0 -0
  135. {topos_node-1.3.40 → topos_node-1.3.42}/topos/contacts/identity.py +0 -0
  136. {topos_node-1.3.40 → topos_node-1.3.42}/topos/control_plane_client.py +0 -0
  137. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/__init__.py +0 -0
  138. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/api_models.py +0 -0
  139. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/connection_resilience.py +0 -0
  140. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/db_health.py +0 -0
  141. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/device_helpers.py +0 -0
  142. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/errors.py +0 -0
  143. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/events.py +0 -0
  144. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/__init__.py +0 -0
  145. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/common.py +0 -0
  146. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/complexity.py +0 -0
  147. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/config.py +0 -0
  148. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/contacts_import.py +0 -0
  149. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/database_explorer.py +0 -0
  150. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/derivation.py +0 -0
  151. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/device.py +0 -0
  152. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/enrichment.py +0 -0
  153. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/enrichment_lab.py +0 -0
  154. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/filter_lab.py +0 -0
  155. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/graph_query.py +0 -0
  156. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/home_chat.py +0 -0
  157. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/ingest.py +0 -0
  158. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/mcp_client_elevations.py +0 -0
  159. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/mcp_clients.py +0 -0
  160. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/messages.py +0 -0
  161. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/messenger_analytics.py +0 -0
  162. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/query.py +0 -0
  163. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/registry.py +0 -0
  164. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/routines.py +0 -0
  165. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/signal_features.py +0 -0
  166. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/sources.py +0 -0
  167. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/timeline_daily.py +0 -0
  168. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/tool_index.py +0 -0
  169. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/handlers/uma.py +0 -0
  170. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/logging.py +0 -0
  171. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/metrics.py +0 -0
  172. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/routine_access.py +0 -0
  173. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/startup_banner.py +0 -0
  174. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/state.py +0 -0
  175. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/table_layers.py +0 -0
  176. {topos_node-1.3.40 → topos_node-1.3.42}/topos/core/types.py +0 -0
  177. {topos_node-1.3.40 → topos_node-1.3.42}/topos/data_explorer_row_delete.py +0 -0
  178. {topos_node-1.3.40 → topos_node-1.3.42}/topos/data_explorer_table_prefs.py +0 -0
  179. {topos_node-1.3.40 → topos_node-1.3.42}/topos/data_explorer_tables.py +0 -0
  180. {topos_node-1.3.40 → topos_node-1.3.42}/topos/defaults.py +0 -0
  181. {topos_node-1.3.40 → topos_node-1.3.42}/topos/disclosure/__init__.py +0 -0
  182. {topos_node-1.3.40 → topos_node-1.3.42}/topos/disclosure/canonical_writer.py +0 -0
  183. {topos_node-1.3.40 → topos_node-1.3.42}/topos/disclosure/content_policy.py +0 -0
  184. {topos_node-1.3.40 → topos_node-1.3.42}/topos/disclosure/field_registry.py +0 -0
  185. {topos_node-1.3.40 → topos_node-1.3.42}/topos/disclosure/privacy_layer.py +0 -0
  186. {topos_node-1.3.40 → topos_node-1.3.42}/topos/disclosure/tier.py +0 -0
  187. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/__init__.py +0 -0
  188. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/backends/__init__.py +0 -0
  189. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/backends/base.py +0 -0
  190. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/backends/generative_prompts.py +0 -0
  191. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/backends/generative_response.py +0 -0
  192. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/backends/huggingface.py +0 -0
  193. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/backends/ollama.py +0 -0
  194. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/backends/openai.py +0 -0
  195. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/backends/openai_compatible.py +0 -0
  196. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/backends/redpill.py +0 -0
  197. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/backends/stub.py +0 -0
  198. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/client.py +0 -0
  199. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/disk_space.py +0 -0
  200. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/engine.py +0 -0
  201. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/hosted_llm_wallet.py +0 -0
  202. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/intake.py +0 -0
  203. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/memory_utils.py +0 -0
  204. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/model_cache.py +0 -0
  205. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/model_manager.py +0 -0
  206. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/ollama_install.py +0 -0
  207. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/ollama_pull.py +0 -0
  208. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/ollama_runtime.py +0 -0
  209. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/ollama_setup_guidance.py +0 -0
  210. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/pipeline_memory.py +0 -0
  211. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/queue_manager.py +0 -0
  212. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/registration.py +0 -0
  213. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/result_formatter.py +0 -0
  214. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/router.py +0 -0
  215. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/scoped_token.py +0 -0
  216. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/tasks.py +0 -0
  217. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/torch_runtime.py +0 -0
  218. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/transport.py +0 -0
  219. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/usage_guard.py +0 -0
  220. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/usage_observation.py +0 -0
  221. {topos_node-1.3.40 → topos_node-1.3.42}/topos/engine/validator.py +0 -0
  222. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/__init__.py +0 -0
  223. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/catalog.py +0 -0
  224. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/derivation_recovery.py +0 -0
  225. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/derived_tables.py +0 -0
  226. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/job_readiness.py +0 -0
  227. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/job_writer.py +0 -0
  228. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/__init__.py +0 -0
  229. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/base.py +0 -0
  230. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/__init__.py +0 -0
  231. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
  232. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
  233. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
  234. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
  235. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
  236. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
  237. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/derivation_job.py +0 -0
  238. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/derived_object_embeddings_job.py +0 -0
  239. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
  240. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
  241. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
  242. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
  243. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
  244. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
  245. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
  246. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
  247. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
  248. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
  249. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
  250. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
  251. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
  252. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/raw/__init__.py +0 -0
  253. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
  254. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/raw/language_job.py +0 -0
  255. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
  256. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
  257. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/model_overrides.py +0 -0
  258. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/models/__init__.py +0 -0
  259. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/models/manager.py +0 -0
  260. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/models/mvp_defaults.py +0 -0
  261. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/models/registry.py +0 -0
  262. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/models/versioning.py +0 -0
  263. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/orchestrator.py +0 -0
  264. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/pipeline_activity.py +0 -0
  265. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/processor.py +0 -0
  266. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/progress_bar.py +0 -0
  267. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/record_progress.py +0 -0
  268. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/registry_contract.py +0 -0
  269. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/signal_derivation_config.json +0 -0
  270. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment/source_overrides.py +0 -0
  271. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment_lab/__init__.py +0 -0
  272. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment_lab/bundles.py +0 -0
  273. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment_lab/model_resolve.py +0 -0
  274. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment_lab/schema.py +0 -0
  275. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment_lab/service.py +0 -0
  276. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment_lab/store.py +0 -0
  277. {topos_node-1.3.40 → topos_node-1.3.42}/topos/enrichment_lab/worker.py +0 -0
  278. {topos_node-1.3.40 → topos_node-1.3.42}/topos/evals/__init__.py +0 -0
  279. {topos_node-1.3.40 → topos_node-1.3.42}/topos/evals/enrichment_eval.py +0 -0
  280. {topos_node-1.3.40 → topos_node-1.3.42}/topos/extensions.py +0 -0
  281. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/__init__.py +0 -0
  282. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/canonical.py +0 -0
  283. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/engine.py +0 -0
  284. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/entropy.py +0 -0
  285. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/focus.py +0 -0
  286. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/graph_metrics.py +0 -0
  287. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/influence.py +0 -0
  288. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/snapshots.py +0 -0
  289. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/store.py +0 -0
  290. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/topic_merge.py +0 -0
  291. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/topics.py +0 -0
  292. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/topics_daily.py +0 -0
  293. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/complexity/volatility.py +0 -0
  294. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/__init__.py +0 -0
  295. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/_scales.yaml +0 -0
  296. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/admin.legal.yaml +0 -0
  297. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/aspirations.goals.yaml +0 -0
  298. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/behavior.habits.yaml +0 -0
  299. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/behavior.preferences.yaml +0 -0
  300. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/beliefs.civic.yaml +0 -0
  301. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/beliefs.spiritual.yaml +0 -0
  302. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/communication.style.yaml +0 -0
  303. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/community.membership.yaml +0 -0
  304. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/craft.tooling.yaml +0 -0
  305. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/expertise.knowledge.yaml +0 -0
  306. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/finances.economics.yaml +0 -0
  307. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/health.lifestyle.yaml +0 -0
  308. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/health.mental.yaml +0 -0
  309. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/health.physical.yaml +0 -0
  310. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/household.pets.yaml +0 -0
  311. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/identity.core.yaml +0 -0
  312. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/interests.taste.yaml +0 -0
  313. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/life.events.yaml +0 -0
  314. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/narrative.self.yaml +0 -0
  315. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/net.capability.yaml +0 -0
  316. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/obligations.commitments.yaml +0 -0
  317. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/personality.traits.yaml +0 -0
  318. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/places.mobility.yaml +0 -0
  319. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/possessions.assets.yaml +0 -0
  320. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/relationships.social.yaml +0 -0
  321. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/values.motivation.yaml +0 -0
  322. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/dispositions.yaml +0 -0
  323. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/expertise.yaml +0 -0
  324. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/habits.yaml +0 -0
  325. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/interests.yaml +0 -0
  326. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/preferences.yaml +0 -0
  327. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/stances.yaml +0 -0
  328. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/tools.yaml +0 -0
  329. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/values.yaml +0 -0
  330. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/work.career.yaml +0 -0
  331. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/candidates.py +0 -0
  332. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/guard.py +0 -0
  333. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/kernels.py +0 -0
  334. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/net_subject_policy.py +0 -0
  335. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/packs.py +0 -0
  336. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/person_bridge.py +0 -0
  337. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/prefilter.py +0 -0
  338. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/registry.py +0 -0
  339. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/report_card.py +0 -0
  340. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/router.py +0 -0
  341. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/social_bench.py +0 -0
  342. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/social_kernels.py +0 -0
  343. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/surfaces.py +0 -0
  344. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/synthesize.py +0 -0
  345. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/template.py +0 -0
  346. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/verify.py +0 -0
  347. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/derivation/writer.py +0 -0
  348. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/__init__.py +0 -0
  349. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/affinity.py +0 -0
  350. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/affinity_owner.py +0 -0
  351. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/affinity_quality.py +0 -0
  352. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/chatgpt_declared.py +0 -0
  353. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/community_names.py +0 -0
  354. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/community_naming.py +0 -0
  355. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/consolidation.py +0 -0
  356. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/context_vectors.py +0 -0
  357. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/cypher.py +0 -0
  358. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/declared_mappings.py +0 -0
  359. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/dossier.py +0 -0
  360. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/fact_materializer.py +0 -0
  361. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/graph_enrichers.py +0 -0
  362. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/graph_search.py +0 -0
  363. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/linking.py +0 -0
  364. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/maintenance.py +0 -0
  365. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/owner.py +0 -0
  366. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/reads.py +0 -0
  367. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/rebuild_subprocess.py +0 -0
  368. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/resolver.py +0 -0
  369. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/entities/structured_fields.py +0 -0
  370. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/facts/__init__.py +0 -0
  371. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/facts/extract.py +0 -0
  372. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/facts/llm_extract.py +0 -0
  373. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/facts/reads.py +0 -0
  374. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/facts/store.py +0 -0
  375. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/facts/verdicts.py +0 -0
  376. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/fit/evaluator.py +0 -0
  377. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/fit/opportunity_types.json +0 -0
  378. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/lifecycle/__init__.py +0 -0
  379. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/lifecycle/blackhole.py +0 -0
  380. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/lifecycle/blackhole_guard.py +0 -0
  381. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/lifecycle/blackhole_llm.py +0 -0
  382. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/lifecycle/blackhole_rebuild.py +0 -0
  383. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/lifecycle/derived_scrub.py +0 -0
  384. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/lifecycle/exclusions.py +0 -0
  385. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/lifecycle/gc.py +0 -0
  386. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/provenance/__init__.py +0 -0
  387. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/provenance/posture.py +0 -0
  388. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/provenance/roles.py +0 -0
  389. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/__init__.py +0 -0
  390. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/brief_canonical_loader.py +0 -0
  391. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/brief_ontology.py +0 -0
  392. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/brief_renderer.py +0 -0
  393. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/brief_schemas.py +0 -0
  394. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/chunking.py +0 -0
  395. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/cluster_labels.py +0 -0
  396. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/conversation_context.py +0 -0
  397. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/conversation_windows.py +0 -0
  398. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/data_health.py +0 -0
  399. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/brief_ontologies.json +0 -0
  400. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/intentions.json +0 -0
  401. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/interests.json +0 -0
  402. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/memory.json +0 -0
  403. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/places.json +0 -0
  404. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/profile.json +0 -0
  405. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/relationships.json +0 -0
  406. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/resources.json +0 -0
  407. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
  408. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/time.json +0 -0
  409. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/wellbeing.json +0 -0
  410. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/definitions/work.json +0 -0
  411. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/derived_index.py +0 -0
  412. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/derived_spec.py +0 -0
  413. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/dimension_briefs.py +0 -0
  414. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/dimension_definition_loader.py +0 -0
  415. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/dimension_profiles.py +0 -0
  416. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/dimension_registry.py +0 -0
  417. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/embed_context.py +0 -0
  418. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/extraction/artifact_router.py +0 -0
  419. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/extraction/artifact_store.py +0 -0
  420. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/extraction/rule_extractors.py +0 -0
  421. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/graph_sanitize.py +0 -0
  422. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/hybrid_search.py +0 -0
  423. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/incremental_clustering.py +0 -0
  424. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/model_recommendations.py +0 -0
  425. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/query_embed_cache.py +0 -0
  426. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/schemas.py +0 -0
  427. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/service.py +0 -0
  428. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/signal_object_store.py +0 -0
  429. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/source_hydration.py +0 -0
  430. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/structured_signal.py +0 -0
  431. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/tool_index.py +0 -0
  432. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/topic_clustering.py +0 -0
  433. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/typed_stores/aggregates.py +0 -0
  434. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/typed_stores/commitments.py +0 -0
  435. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/typed_stores/rhythm.py +0 -0
  436. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
  437. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/vector_codec.py +0 -0
  438. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/vector_math.py +0 -0
  439. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/signal/vector_settings.py +0 -0
  440. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/stats/__init__.py +0 -0
  441. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/stats/definitions.py +0 -0
  442. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/stats/engine.py +0 -0
  443. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/stats/fold.py +0 -0
  444. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/stats/insights.py +0 -0
  445. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/timeline_projection.py +0 -0
  446. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/timeline_rollup.py +0 -0
  447. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/triage/__init__.py +0 -0
  448. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/triage/badges.py +0 -0
  449. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/triage/daily.py +0 -0
  450. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/triage/dashboard.py +0 -0
  451. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/triage/instruments.py +0 -0
  452. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/triage/intents.py +0 -0
  453. {topos_node-1.3.40 → topos_node-1.3.42}/topos/features/triage/readiness.py +0 -0
  454. {topos_node-1.3.40 → topos_node-1.3.42}/topos/filter_lab/__init__.py +0 -0
  455. {topos_node-1.3.40 → topos_node-1.3.42}/topos/filter_lab/bundles.py +0 -0
  456. {topos_node-1.3.40 → topos_node-1.3.42}/topos/filter_lab/schema.py +0 -0
  457. {topos_node-1.3.40 → topos_node-1.3.42}/topos/filter_lab/service.py +0 -0
  458. {topos_node-1.3.40 → topos_node-1.3.42}/topos/filter_lab/store.py +0 -0
  459. {topos_node-1.3.40 → topos_node-1.3.42}/topos/filter_lab/worker.py +0 -0
  460. {topos_node-1.3.40 → topos_node-1.3.42}/topos/home_chat/__init__.py +0 -0
  461. {topos_node-1.3.40 → topos_node-1.3.42}/topos/home_chat/schema.py +0 -0
  462. {topos_node-1.3.40 → topos_node-1.3.42}/topos/home_chat/store.py +0 -0
  463. {topos_node-1.3.40 → topos_node-1.3.42}/topos/hosted_pool_lease.py +0 -0
  464. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/__init__.py +0 -0
  465. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/checkpoints/__init__.py +0 -0
  466. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
  467. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
  468. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/inbox_crypto.py +0 -0
  469. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/inbox_drain.py +0 -0
  470. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/ingest_helpers.py +0 -0
  471. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/jobs.py +0 -0
  472. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/journal_location_fanout.py +0 -0
  473. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/journal_time_log_normalize.py +0 -0
  474. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/local_exports.py +0 -0
  475. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/local_sync.py +0 -0
  476. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/log_preview.py +0 -0
  477. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/manager.py +0 -0
  478. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parser.py +0 -0
  479. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/__init__.py +0 -0
  480. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/base.py +0 -0
  481. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/browser_parser.py +0 -0
  482. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/calendar_parser.py +0 -0
  483. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
  484. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/chatgpt_export.py +0 -0
  485. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
  486. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
  487. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/documents_parser.py +0 -0
  488. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/github_activity_parser.py +0 -0
  489. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
  490. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/grok_parser.py +0 -0
  491. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/messenger_parser.py +0 -0
  492. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/parsers/voxterm_parser.py +0 -0
  493. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/progress.py +0 -0
  494. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/reprocess.py +0 -0
  495. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/sources/__init__.py +0 -0
  496. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/sources/base.py +0 -0
  497. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/sources/calendar.py +0 -0
  498. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/sources/chatgpt.py +0 -0
  499. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/sources/contact_importers.py +0 -0
  500. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/sources/grok.py +0 -0
  501. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/sources/imessage_reader.py +0 -0
  502. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/sources/signal_export_parser.py +0 -0
  503. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/sources/signal_reader.py +0 -0
  504. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/state_machine.py +0 -0
  505. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/triggers/__init__.py +0 -0
  506. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/triggers/file_trigger.py +0 -0
  507. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
  508. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/usage_inbox_dedupe.py +0 -0
  509. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/validation/__init__.py +0 -0
  510. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/validation/base.py +0 -0
  511. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/validation/schema_registry.py +0 -0
  512. {topos_node-1.3.40 → topos_node-1.3.42}/topos/ingestion/validation/schema_validator.py +0 -0
  513. {topos_node-1.3.40 → topos_node-1.3.42}/topos/lineage/__init__.py +0 -0
  514. {topos_node-1.3.40 → topos_node-1.3.42}/topos/lineage/provenance.py +0 -0
  515. {topos_node-1.3.40 → topos_node-1.3.42}/topos/lineage/tracker.py +0 -0
  516. {topos_node-1.3.40 → topos_node-1.3.42}/topos/llm_integrations_storage.py +0 -0
  517. {topos_node-1.3.40 → topos_node-1.3.42}/topos/mcp_clients.py +0 -0
  518. {topos_node-1.3.40 → topos_node-1.3.42}/topos/mcp_stdio_proxy.py +0 -0
  519. {topos_node-1.3.40 → topos_node-1.3.42}/topos/observability/__init__.py +0 -0
  520. {topos_node-1.3.40 → topos_node-1.3.42}/topos/observability/alerts.py +0 -0
  521. {topos_node-1.3.40 → topos_node-1.3.42}/topos/observability/metrics.py +0 -0
  522. {topos_node-1.3.40 → topos_node-1.3.42}/topos/observability/tracing.py +0 -0
  523. {topos_node-1.3.40 → topos_node-1.3.42}/topos/openai_client.py +0 -0
  524. {topos_node-1.3.40 → topos_node-1.3.42}/topos/owner_key.py +0 -0
  525. {topos_node-1.3.40 → topos_node-1.3.42}/topos/pipeline/__init__.py +0 -0
  526. {topos_node-1.3.40 → topos_node-1.3.42}/topos/pipeline/audit.py +0 -0
  527. {topos_node-1.3.40 → topos_node-1.3.42}/topos/pipeline/envelope.py +0 -0
  528. {topos_node-1.3.40 → topos_node-1.3.42}/topos/pipeline/job_runner.py +0 -0
  529. {topos_node-1.3.40 → topos_node-1.3.42}/topos/pipeline/job_store.py +0 -0
  530. {topos_node-1.3.40 → topos_node-1.3.42}/topos/pipeline/stages.py +0 -0
  531. {topos_node-1.3.40 → topos_node-1.3.42}/topos/pipeline/stub_enqueue.py +0 -0
  532. {topos_node-1.3.40 → topos_node-1.3.42}/topos/principal.py +0 -0
  533. {topos_node-1.3.40 → topos_node-1.3.42}/topos/profiles.py +0 -0
  534. {topos_node-1.3.40 → topos_node-1.3.42}/topos/projections/__init__.py +0 -0
  535. {topos_node-1.3.40 → topos_node-1.3.42}/topos/projections/vector_index/__init__.py +0 -0
  536. {topos_node-1.3.40 → topos_node-1.3.42}/topos/projections/vector_index/base.py +0 -0
  537. {topos_node-1.3.40 → topos_node-1.3.42}/topos/projections/vector_index/builders.py +0 -0
  538. {topos_node-1.3.40 → topos_node-1.3.42}/topos/projections/vector_index/health_checks.py +0 -0
  539. {topos_node-1.3.40 → topos_node-1.3.42}/topos/protocol/__init__.py +0 -0
  540. {topos_node-1.3.40 → topos_node-1.3.42}/topos/protocol/handled_message_types.json +0 -0
  541. {topos_node-1.3.40 → topos_node-1.3.42}/topos/protocol/query_field_contract.json +0 -0
  542. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/__init__.py +0 -0
  543. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/audit.py +0 -0
  544. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/closeness.py +0 -0
  545. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/cohort_resolvers.py +0 -0
  546. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/collaborators.py +0 -0
  547. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/ddr.py +0 -0
  548. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/disclosure.py +0 -0
  549. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/entity_window.py +0 -0
  550. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/exclusion.py +0 -0
  551. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/facts_direct.py +0 -0
  552. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/fingerprint.py +0 -0
  553. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/grant_cache.py +0 -0
  554. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/inference.py +0 -0
  555. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/intent.py +0 -0
  556. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/manifest.py +0 -0
  557. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/manifest_validation.py +0 -0
  558. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/minimizer.py +0 -0
  559. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/negotiation.py +0 -0
  560. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/packet_resolution.py +0 -0
  561. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/planner.py +0 -0
  562. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/retrieval.py +0 -0
  563. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/runtime.py +0 -0
  564. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/scope_arbiter.py +0 -0
  565. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/scope_classifier.py +0 -0
  566. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/scope_head.py +0 -0
  567. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/scope_registry_loader.py +0 -0
  568. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/scope_shadow.py +0 -0
  569. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/session.py +0 -0
  570. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/session_utils.py +0 -0
  571. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/source_generation.py +0 -0
  572. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/truth_facts.py +0 -0
  573. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/truth_prompts.py +0 -0
  574. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/turn_classifier.py +0 -0
  575. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/types.py +0 -0
  576. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/verify.py +0 -0
  577. {topos_node-1.3.40 → topos_node-1.3.42}/topos/query/verify_modes.py +0 -0
  578. {topos_node-1.3.40 → topos_node-1.3.42}/topos/rate_limit.py +0 -0
  579. {topos_node-1.3.40 → topos_node-1.3.42}/topos/relay_stamp.py +0 -0
  580. {topos_node-1.3.40 → topos_node-1.3.42}/topos/routines/__init__.py +0 -0
  581. {topos_node-1.3.40 → topos_node-1.3.42}/topos/routines/schema.py +0 -0
  582. {topos_node-1.3.40 → topos_node-1.3.42}/topos/routines/store.py +0 -0
  583. {topos_node-1.3.40 → topos_node-1.3.42}/topos/runtime_housekeeping.py +0 -0
  584. {topos_node-1.3.40 → topos_node-1.3.42}/topos/runtime_shutdown.py +0 -0
  585. {topos_node-1.3.40 → topos_node-1.3.42}/topos/runtime_update.py +0 -0
  586. {topos_node-1.3.40 → topos_node-1.3.42}/topos/sanitization/__init__.py +0 -0
  587. {topos_node-1.3.40 → topos_node-1.3.42}/topos/sanitization/nsfw_classifier.py +0 -0
  588. {topos_node-1.3.40 → topos_node-1.3.42}/topos/sanitization/ollama_transforms.py +0 -0
  589. {topos_node-1.3.40 → topos_node-1.3.42}/topos/sanitization/prewarm.py +0 -0
  590. {topos_node-1.3.40 → topos_node-1.3.42}/topos/sanitization/privacy_filter.py +0 -0
  591. {topos_node-1.3.40 → topos_node-1.3.42}/topos/scope_resolution.py +0 -0
  592. {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/__init__.py +0 -0
  593. {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/container.py +0 -0
  594. {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/embeddings/__init__.py +0 -0
  595. {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/embeddings/base.py +0 -0
  596. {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/embeddings/local.py +0 -0
  597. {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/embeddings/remote.py +0 -0
  598. {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/interfaces.py +0 -0
  599. {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/llm/__init__.py +0 -0
  600. {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/llm/base.py +0 -0
  601. {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/llm/openai.py +0 -0
  602. {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/local.py +0 -0
  603. {topos_node-1.3.40 → topos_node-1.3.42}/topos/services/postgres.py +0 -0
  604. {topos_node-1.3.40 → topos_node-1.3.42}/topos/sources/__init__.py +0 -0
  605. {topos_node-1.3.40 → topos_node-1.3.42}/topos/sources/canonical_signal_defaults.py +0 -0
  606. {topos_node-1.3.40 → topos_node-1.3.42}/topos/sources/declared_field_map_spec.py +0 -0
  607. {topos_node-1.3.40 → topos_node-1.3.42}/topos/sources/definitions.py +0 -0
  608. {topos_node-1.3.40 → topos_node-1.3.42}/topos/sources/registry.py +0 -0
  609. {topos_node-1.3.40 → topos_node-1.3.42}/topos/sources/runtime_install.py +0 -0
  610. {topos_node-1.3.40 → topos_node-1.3.42}/topos/sources/scrub_attribution.py +0 -0
  611. {topos_node-1.3.40 → topos_node-1.3.42}/topos/sources/scrub_service.py +0 -0
  612. {topos_node-1.3.40 → topos_node-1.3.42}/topos/startup_banner.py +0 -0
  613. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/__init__.py +0 -0
  614. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/adapters/__init__.py +0 -0
  615. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/adapters/factory.py +0 -0
  616. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/adapters/fakes.py +0 -0
  617. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/adapters/postgres/stores.py +0 -0
  618. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/adapters/protocols.py +0 -0
  619. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/adapters/sqlite/__init__.py +0 -0
  620. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/adapters/sqlite/stores.py +0 -0
  621. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/adapters/sqlite/vector_search.py +0 -0
  622. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/__init__.py +0 -0
  623. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/activity_tables.py +0 -0
  624. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/ai_chat/__init__.py +0 -0
  625. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
  626. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/ai_chat/mapper.py +0 -0
  627. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/ai_chat/model.py +0 -0
  628. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/ai_chat/tables.py +0 -0
  629. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
  630. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/canonical_store.py +0 -0
  631. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/conversations_tables.py +0 -0
  632. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/journal_repair.py +0 -0
  633. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/mapping_store.py +0 -0
  634. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/canonical/postgres.py +0 -0
  635. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/__init__.py +0 -0
  636. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/client.py +0 -0
  637. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/connection_tuning.py +0 -0
  638. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/__init__.py +0 -0
  639. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
  640. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/actor_role_v1.py +0 -0
  641. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
  642. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
  643. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
  644. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/backup.py +0 -0
  645. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/backup_custody.py +0 -0
  646. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
  647. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
  648. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
  649. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
  650. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/community_names_v1.py +0 -0
  651. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/complexity_v1.py +0 -0
  652. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/conflict_provenance_v1.py +0 -0
  653. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
  654. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/derivation_factory_v1.py +0 -0
  655. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
  656. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/derivation_provenance_v1.py +0 -0
  657. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/derived_row_identity_v1.py +0 -0
  658. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/documents_v1.py +0 -0
  659. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/enrichment_record_progress_v1.py +0 -0
  660. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
  661. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
  662. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
  663. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
  664. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
  665. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
  666. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/entity_mentions_authored_v1.py +0 -0
  667. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/entity_review_candidate_bar_v1.py +0 -0
  668. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/entity_review_dedup_v1.py +0 -0
  669. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/entity_review_provenance_v1.py +0 -0
  670. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/episodes_v1.py +0 -0
  671. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
  672. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/fact_dimension_by_entity_type_v1.py +0 -0
  673. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
  674. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
  675. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
  676. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
  677. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
  678. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/journal_origin_dimension_v1.py +0 -0
  679. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/mention_table_stamp_backfill_v1.py +0 -0
  680. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
  681. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
  682. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/net_subject_policy_v1.py +0 -0
  683. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/pack_registry_v1.py +0 -0
  684. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
  685. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/query_artifacts_duration_ms_v1.py +0 -0
  686. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/registry.py +0 -0
  687. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/registry_checksums.json +0 -0
  688. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/remediation_person_model.py +0 -0
  689. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/retire_url_classification_v1.py +0 -0
  690. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/scope_source_generation.py +0 -0
  691. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
  692. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
  693. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/signal_objects.py +0 -0
  694. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
  695. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
  696. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
  697. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
  698. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
  699. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
  700. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
  701. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
  702. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
  703. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
  704. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
  705. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
  706. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
  707. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
  708. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
  709. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
  710. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
  711. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
  712. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
  713. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
  714. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
  715. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
  716. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/paths.py +0 -0
  717. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/postgres.py +0 -0
  718. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/schema.py +0 -0
  719. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/schema_probe.py +0 -0
  720. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/storage_breakdown.py +0 -0
  721. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/db/write_gate.py +0 -0
  722. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/derived_row_identity.py +0 -0
  723. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/enrichment/__init__.py +0 -0
  724. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
  725. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
  726. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/normalized/__init__.py +0 -0
  727. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/normalized/normalized_store.py +0 -0
  728. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/oplog/__init__.py +0 -0
  729. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/oplog/decision.py +0 -0
  730. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/oplog/oplog_store.py +0 -0
  731. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/oplog/postgres.py +0 -0
  732. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/person/identity_resolver.py +0 -0
  733. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/projections/__init__.py +0 -0
  734. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/projections/index_ops_store.py +0 -0
  735. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/projections/vector_index_store.py +0 -0
  736. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/raw/__init__.py +0 -0
  737. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/raw/browser_flat_tables.py +0 -0
  738. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/raw/file_store.py +0 -0
  739. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/raw/raw_store.py +0 -0
  740. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/raw/raw_tables_manager.py +0 -0
  741. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/raw/sqlite_raw_store.py +0 -0
  742. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/security/encryption.py +0 -0
  743. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/signal_identity.py +0 -0
  744. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/source_settings.py +0 -0
  745. {topos_node-1.3.40 → topos_node-1.3.42}/topos/storage/user_identity.py +0 -0
  746. {topos_node-1.3.40 → topos_node-1.3.42}/topos/sync/__init__.py +0 -0
  747. {topos_node-1.3.40 → topos_node-1.3.42}/topos/sync/client.py +0 -0
  748. {topos_node-1.3.40 → topos_node-1.3.42}/topos/sync_handlers.py +0 -0
  749. {topos_node-1.3.40 → topos_node-1.3.42}/topos/testing/__init__.py +0 -0
  750. {topos_node-1.3.40 → topos_node-1.3.42}/topos/testing/lifespan.py +0 -0
  751. {topos_node-1.3.40 → topos_node-1.3.42}/topos/uds.py +0 -0
  752. {topos_node-1.3.40 → topos_node-1.3.42}/topos/uma_contact_enrichment.py +0 -0
  753. {topos_node-1.3.40 → topos_node-1.3.42}/topos/uma_filters.py +0 -0
  754. {topos_node-1.3.40 → topos_node-1.3.42}/topos/uma_resource_id.py +0 -0
  755. {topos_node-1.3.40 → topos_node-1.3.42}/topos/uma_rpt.py +0 -0
  756. {topos_node-1.3.40 → topos_node-1.3.42}/topos/upgrades/__init__.py +0 -0
  757. {topos_node-1.3.40 → topos_node-1.3.42}/topos/upgrades/runner.py +0 -0
  758. {topos_node-1.3.40 → topos_node-1.3.42}/topos/utils/base_object.py +0 -0
  759. {topos_node-1.3.40 → topos_node-1.3.42}/topos/websocket_client.py +0 -0
  760. {topos_node-1.3.40 → topos_node-1.3.42}/topos_node.egg-info/SOURCES.txt +0 -0
  761. {topos_node-1.3.40 → topos_node-1.3.42}/topos_node.egg-info/dependency_links.txt +0 -0
  762. {topos_node-1.3.40 → topos_node-1.3.42}/topos_node.egg-info/entry_points.txt +0 -0
  763. {topos_node-1.3.40 → topos_node-1.3.42}/topos_node.egg-info/requires.txt +0 -0
  764. {topos_node-1.3.40 → topos_node-1.3.42}/topos_node.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: topos-node
3
- Version: 1.3.40
3
+ Version: 1.3.42
4
4
  Summary: Topos personal AI engine (FastAPI): local data, sync, control plane WebSocket client
5
5
  License-Expression: Apache-2.0
6
6
  Project-URL: Homepage, https://topos.dialogues.ai
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "topos-node"
7
- version = "1.3.40"
7
+ version = "1.3.42"
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"
@@ -1,6 +1,6 @@
1
1
  """Topos Control Plane Version Information."""
2
2
 
3
- __version__ = "1.3.40"
4
- __version_info__ = (1, 3, 40)
3
+ __version__ = "1.3.42"
4
+ __version_info__ = (1, 3, 42)
5
5
 
6
6
  __all__ = ["__version__", "__version_info__"]
@@ -44,8 +44,12 @@ def _counts() -> Dict[str, Any]:
44
44
  except Exception: # noqa: BLE001
45
45
  out[key] = None
46
46
  try:
47
+ # The column is `last_run_at` -- what _mark_materialized writes. This read
48
+ # `materialized_at`, which does not exist, and the per-field try/except
49
+ # turned that into a permanent null rather than an error: shipped in
50
+ # 1.3.40 and noticed only because the live reply carried the null.
47
51
  row = conn.execute(
48
- "SELECT MAX(materialized_at) FROM graph_materialization_state"
52
+ "SELECT MAX(last_run_at) FROM graph_materialization_state"
49
53
  ).fetchone()
50
54
  out["materialized_at"] = row[0] if row else None
51
55
  except Exception: # noqa: BLE001
@@ -401,7 +401,15 @@ class EvidenceCache:
401
401
  for row in conn.execute(
402
402
  f"""
403
403
  SELECT src_entity_id, dst_entity_id, edge_type, weight, evidence_count,
404
- COALESCE(last_event_at, valid_from, created_at) AS event_at
404
+ -- last_event_at ONLY. valid_from is when the node started
405
+ -- believing the relation (a recompute's clock for part_of
406
+ -- and other structural edges) and created_at is the row's
407
+ -- own birth; neither is an event. The fallback made an
408
+ -- undated edge report activity at rebuild time, which is
409
+ -- the defect fixed for the graph window in edges.py.
410
+ -- EvidenceCache.add tolerates None: weight still counts,
411
+ -- no date is invented.
412
+ last_event_at AS event_at
405
413
  FROM entity_edges
406
414
  WHERE valid_to IS NULL
407
415
  AND LOWER(TRIM(edge_type)) IN ({placeholders})
@@ -562,11 +562,21 @@ def graph_snapshot(
562
562
  clause = ""
563
563
  else:
564
564
  clause = " AND valid_to IS NULL"
565
+ # A TIME window asks "did anything happen between these dates". Only
566
+ # last_event_at answers that. valid_from is when the node started BELIEVING
567
+ # the relation -- for a structural edge written by a recompute (semantic
568
+ # affinity, part_of) that is the recompute's clock, and it carries no event
569
+ # at all. The old COALESCE fallback read that clock as activity, so every
570
+ # entity touched by a rebuild appeared in "the last 11 days" no matter when
571
+ # it was last mentioned: 69 of 4,602 dormant entities on the reference node,
572
+ # 60 of them through exactly these undated edges. An undated edge is no
573
+ # evidence of activity in any window; it stays in the unwindowed views,
574
+ # where valid_from remains the right recency key for ORDER BY.
565
575
  if after:
566
- clause += " AND COALESCE(last_event_at, valid_from) >= ?"
576
+ clause += " AND last_event_at IS NOT NULL AND last_event_at >= ?"
567
577
  where_params.append(after)
568
578
  if before:
569
- clause += " AND COALESCE(last_event_at, valid_from) <= ?"
579
+ clause += " AND last_event_at IS NOT NULL AND last_event_at <= ?"
570
580
  where_params.append(before)
571
581
 
572
582
  where_sql = (
@@ -28,6 +28,7 @@ import asyncio
28
28
  import logging
29
29
  import os
30
30
  import threading
31
+ from typing import Any, Dict
31
32
  from datetime import datetime, timezone
32
33
  from typing import Any, Callable, Dict, Optional
33
34
 
@@ -253,6 +254,60 @@ def gc_status() -> Dict[str, Any]:
253
254
  return {"enabled": _gc_enabled(), "pending": _GC_TIMER is not None, **_GC_LAST}
254
255
 
255
256
 
257
+ def refresh_now_if_dirty() -> Dict[str, Any]:
258
+ """Rebuild the graph inline, right now, if it is dirty and nothing is deriving.
259
+
260
+ Written for one caller: the post-canonical pipeline, at the point between
261
+ canonical enrichment and signal derivation. The debounced mark cannot do
262
+ this job there -- its timer fires ~90s later, by which time signal
263
+ derivation has raised the in-flight counter and _fire re-arms the timer
264
+ instead of rebuilding (DEBUG-logged). It keeps re-arming until derivation
265
+ ends, so the mid-import refresh collapses into the end-of-pipeline one. On
266
+ a file import that phase runs for hours, so "the graph fills before the
267
+ long phase" never happened. Measured on a 20-stage import: zero mid-import
268
+ rebuilds.
269
+
270
+ Costs a rebuild (~7-9 minutes on a 17k-edge node) inside the import, which
271
+ is the point. Skipped when the graph is not dirty, so a re-import that
272
+ changed nothing pays nothing.
273
+ """
274
+ from ...core.state import get_db_connection
275
+ from ...enrichment.pipeline_activity import is_derivation_in_flight
276
+
277
+ if not _enabled():
278
+ return {"skipped": "disabled"}
279
+ if is_derivation_in_flight():
280
+ return {"skipped": "derivation in flight"}
281
+ conn = get_db_connection()
282
+ if conn is None:
283
+ return {"skipped": "no database"}
284
+ try:
285
+ row = conn.execute(
286
+ "SELECT dirty_generation, materialized_generation FROM graph_materialization_state WHERE id=1"
287
+ ).fetchone()
288
+ except Exception as exc: # noqa: BLE001
289
+ return {"skipped": f"state unreadable: {exc}"}
290
+ if not row or int(row[0]) <= int(row[1]):
291
+ return {"skipped": "not dirty"}
292
+ logger.info("graph refresh: inline, before signal derivation")
293
+ try:
294
+ _refresher._rebuild_fn()
295
+ return {"ran": True}
296
+ except WriteGateDeferred as exc:
297
+ _refresher.mark()
298
+ return {"skipped": f"deferred: {exc}"}
299
+ finally:
300
+ # This runs on an asyncio.to_thread worker. Pooled threads are reused;
301
+ # the rebuild route closes its thread-local connection for the same
302
+ # reason, or every call leaks one.
303
+ try:
304
+ from ...core.state import close_thread_db_connection
305
+
306
+ close_thread_db_connection()
307
+ except Exception: # noqa: BLE001 — cleanup must not mask the result
308
+ pass
309
+
310
+
256
311
  def mark_graph_dirty() -> None:
257
312
  """Enrichment completed for a source — schedule a debounced graph rebuild."""
258
313
  try:
@@ -893,30 +893,6 @@ async def run_post_canonical_pipeline(
893
893
  logger.error("[PIPELINE:ENRICHMENT] post-canonical failed: %s", exc, exc_info=True)
894
894
  outcome["canonical_enrichment"] = {"errors": [str(exc)]}
895
895
 
896
- # Materialise the graph HERE, not only at the end of the pipeline.
897
- #
898
- # The entity data lands early -- the entities job writes entities,
899
- # message_entities and entity_mentions batch by batch -- but the graph
900
- # a person actually looks at is derived by rebuild_entity_graph, and
901
- # the only mark was after signal derivation. On a file import that is
902
- # 13 more stages and hours of model work, so everything landed in the
903
- # database with no visible change to the graph until the very end.
904
- #
905
- # One mark here, one at the end: two rebuilds per import. Deliberately
906
- # NOT one per job. graph_refresh is single-flight and a mark landing
907
- # mid-rebuild schedules exactly one follow-up, so marking per job would
908
- # chain rebuilds back to back for the whole import and take CPU from
909
- # the model work that is already the slow part.
910
- try:
911
- from ..features.entities.graph_refresh import mark_graph_dirty
912
-
913
- mark_graph_dirty()
914
- logger.info(
915
- "[PIPELINE:ENRICHMENT] graph marked dirty after canonical enrichment "
916
- "so the graph fills before signal derivation runs"
917
- )
918
- except Exception as exc: # noqa: BLE001 — refresh must never break ingest
919
- logger.debug("mid-import graph refresh mark skipped: %s", exc)
920
896
  elif canonical_jobs and enrichment_trigger == "manual":
921
897
  logger.debug(
922
898
  "[PIPELINE:ENRICHMENT] Skipping canonical enrichment (manual trigger): source_id=%s records=%d",
@@ -930,6 +906,32 @@ async def run_post_canonical_pipeline(
930
906
  signal_gate_open = (
931
907
  enrichment_trigger == "automatic" or force_signal or job_names is not None
932
908
  )
909
+ # Fill the graph HERE, before the long phase -- and actually do it.
910
+ #
911
+ # The entity data lands early; the graph a person looks at is derived by
912
+ # rebuild_entity_graph. The first version of this marked the graph dirty
913
+ # after canonical enrichment and left the rebuild to the debounced
914
+ # refresher. Two things defeated it, both measured on a live 20-stage
915
+ # import: the mark sat inside the enrichment guard, so an import with
916
+ # nothing left to enrich never marked at all; and the refresher's timer
917
+ # fires ~90s later, by which time signal derivation has raised its
918
+ # in-flight counter and the refresh re-arms itself until derivation ends
919
+ # -- collapsing into the end-of-pipeline rebuild. Zero mid-import
920
+ # rebuilds, every time.
921
+ #
922
+ # So: mark, then rebuild inline while nothing is deriving. ~7-9 minutes on
923
+ # a 17k-edge node, inside the import, which is the point. Skipped when the
924
+ # graph is not dirty, so a re-import that changed nothing pays nothing.
925
+ if canonical_records:
926
+ try:
927
+ from ..features.entities.graph_refresh import mark_graph_dirty, refresh_now_if_dirty
928
+
929
+ mark_graph_dirty()
930
+ outcome["graph_fill"] = await asyncio.to_thread(refresh_now_if_dirty)
931
+ logger.info("[PIPELINE:GRAPH] mid-import graph fill: %s", outcome["graph_fill"])
932
+ except Exception as exc: # noqa: BLE001 -- the graph must never break ingest
933
+ logger.warning("mid-import graph fill skipped: %s", exc)
934
+
933
935
  if run_signal and signal_jobs and not signal_gate_open:
934
936
  logger.debug(
935
937
  "[PIPELINE:SIGNAL_DERIVE] Skipping signal derivation (manual trigger): source_id=%s records=%d",
@@ -154,7 +154,8 @@
154
154
  "topic_thread_single_store",
155
155
  "unknown_scope",
156
156
  "unmatched_route",
157
- "unrecognized"
157
+ "unrecognized",
158
+ "world_knowledge_no_retrieval"
158
159
  ],
159
160
  "empty_causes": [
160
161
  "gate_vetoed",
@@ -106,6 +106,75 @@ def _extract_entity_labels(context_packet: Dict[str, Any]) -> List[str]:
106
106
  return labels[:10]
107
107
 
108
108
 
109
+ #: availability:read licenses free/busy ONLY. The three sets below are the
110
+ #: ENTIRE licensed vocabulary of an availability inference answer — a person
111
+ #: name or a meeting title has no slot in it, so enforcement is a closed-set
112
+ #: membership check, never a redaction pattern that has to recognize names.
113
+ _AVAILABILITY_ANSWERS = frozenset({"yes", "conditional", "no", "unknown"})
114
+ _AVAILABILITY_BANDS = frozenset(
115
+ {"overlap_found", "negotiable_overlap", "no_overlap", "unknown"}
116
+ )
117
+ #: Free text can only leave through a key, so unknown keys are dropped rather
118
+ #: than inspected. Everything listed is either closed-set or pipeline-stamped
119
+ #: metadata (exclusion/truncated/empty_cause carry slugs and integers only).
120
+ _AVAILABILITY_ALLOWED_KEYS = frozenset(
121
+ {
122
+ "access_mode",
123
+ "scope_id",
124
+ "answer_type",
125
+ "band",
126
+ "answer",
127
+ "confidence",
128
+ "items",
129
+ "deferred",
130
+ "redaction",
131
+ "exclusion",
132
+ "truncated",
133
+ "empty_cause",
134
+ "packet_resolution",
135
+ "packet_resolution_reason",
136
+ "principal_cls",
137
+ }
138
+ )
139
+
140
+
141
+ def is_availability_scope(scope_id: str) -> bool:
142
+ return "availability" in (scope_id or "")
143
+
144
+
145
+ def enforce_availability_inference_contract(payload: Dict[str, Any]) -> Dict[str, Any]:
146
+ """Free/busy-only egress gate for availability inference payloads.
147
+
148
+ The branches in ``DefaultGameLayer.apply`` already emit only closed-set
149
+ values for this scope — but the pipeline lanes that run AFTER the game
150
+ layer ``update()`` the payload in place, and any of them can re-open what
151
+ the game layer refused. Live 2026-09-02 the LLM inference lane did exactly
152
+ that: the who-guard's ``answer: "unknown"`` left the engine as a contact's
153
+ full name at confidence 1. This function is the last owner of the payload
154
+ before it is serialized, so a violation here is scrubbed to "unknown"
155
+ rather than trusted, and the scrub is declared via ``redaction`` (a
156
+ closed-set slug) instead of happening silently.
157
+ """
158
+ out = {k: v for k, v in payload.items() if k in _AVAILABILITY_ALLOWED_KEYS}
159
+ scrubbed = len(out) != len(payload)
160
+ if out.get("answer_type") not in ("band", "list"):
161
+ out["answer_type"] = "band"
162
+ scrubbed = True
163
+ if str(out.get("band") or "unknown") not in _AVAILABILITY_BANDS:
164
+ out.pop("band", None)
165
+ scrubbed = True
166
+ if str(out.get("answer")) not in _AVAILABILITY_ANSWERS:
167
+ out["answer"] = "unknown"
168
+ out["confidence"] = 0.0
169
+ scrubbed = True
170
+ if out.get("items"):
171
+ out["items"] = []
172
+ scrubbed = True
173
+ if scrubbed:
174
+ out["redaction"] = "availability_free_busy_only"
175
+ return out
176
+
177
+
109
178
  class DefaultGameLayer:
110
179
  reveal_strategy: RevealStrategy = RevealStrategy.DIRECT
111
180
 
@@ -299,6 +299,7 @@ REASONS = frozenset(
299
299
  "source_has_live_tools",
300
300
  "source_ref",
301
301
  "summary_enrichment",
302
+ "world_knowledge_no_retrieval",
302
303
  # --- control plane: refusals that never reach the node. The human-readable
303
304
  # sentence stays on the response's own `deny_reason`; the ledger carries the code.
304
305
  "access_mode_above_ceiling",
@@ -16,7 +16,11 @@ from .ddr import StageTimings, build_disclosure_decision_record, now_ms
16
16
  from .disclosure import DisclosureFilterPipeline
17
17
  from .fingerprint import compute_retrieval_fingerprint
18
18
  from .packet_resolution import effective_packet_resolution
19
- from .game_layer import DefaultGameLayer
19
+ from .game_layer import (
20
+ DefaultGameLayer,
21
+ enforce_availability_inference_contract,
22
+ is_availability_scope,
23
+ )
20
24
  from .inference import run_query_inference
21
25
  from .intent import compute_intent_hash
22
26
  from .manifest import ScopeResolutionManifest
@@ -779,7 +783,17 @@ class QueryPipelineOrchestrator:
779
783
  query_text=query_text,
780
784
  )
781
785
  timings.game_layer_ms = now_ms() - _t0
782
- if access_mode == "inference" and public.payload.get("answer_type") != "band":
786
+ # availability:read licenses free/busy only, so the game layer's output
787
+ # (band, or the who-guard's refusal) is FINAL for this scope — same
788
+ # contract as `band`/`facts` below: deterministic answer_types are
789
+ # final. The lanes below `update()` the payload in place, and on
790
+ # 2026-09-02 the LLM lane overwrote the who-guard's "unknown" with a
791
+ # contact's full name at confidence 1 — the refusal has answer_type
792
+ # "list", which both lanes treated as an invitation.
793
+ availability_final = access_mode == "inference" and is_availability_scope(scope_id)
794
+ if (access_mode == "inference"
795
+ and not availability_final
796
+ and public.payload.get("answer_type") != "band"):
783
797
  # C7 facts-direct (W3.1): a known-item ask with live facts gets its
784
798
  # exact values, validity dates and evidence counts with ZERO LLM —
785
799
  # same contract as `band`: deterministic answer_types are final.
@@ -820,6 +834,7 @@ class QueryPipelineOrchestrator:
820
834
  if direct is not None:
821
835
  public.payload.update(direct)
822
836
  if (access_mode == "inference"
837
+ and not availability_final
823
838
  and public.payload.get("answer_type") not in ("band", "facts")):
824
839
  _t0 = now_ms()
825
840
  inf = await asyncio.to_thread(
@@ -831,6 +846,11 @@ class QueryPipelineOrchestrator:
831
846
  )
832
847
  public.payload.update(inf)
833
848
  timings.inference_ms = now_ms() - _t0
849
+ if availability_final:
850
+ # Closed-set egress scrub, applied even though the lanes above are
851
+ # gated off: the payload has one last owner before serialization,
852
+ # and a lane added later must hit this wall, not the wire.
853
+ public.payload = enforce_availability_inference_contract(public.payload)
834
854
 
835
855
  public_dict = public.to_dict()
836
856
  # Declared, never silent: every turn says what resolution actually applied and
@@ -186,6 +186,110 @@
186
186
  "canonical_address_book"
187
187
  ]
188
188
  },
189
+ {
190
+ "scope_id": "facts:read",
191
+ "description": "Derived facts about the owner from standard packs (work, interests, preferences, places, behavior): predicate/value pairs with validity windows. Excludes special-class packs \u2014 health, inner-state and finances live behind facts_sensitive:read.",
192
+ "example_questions": [
193
+ "What do the derivation packs know about my work?",
194
+ "Which projects am I recorded as pursuing?",
195
+ "What are my stated preferences?"
196
+ ],
197
+ "primary_dimensions": [
198
+ "Profile"
199
+ ],
200
+ "raw_tables": [],
201
+ "canonical_tables": [],
202
+ "signal_objects": [
203
+ "fact"
204
+ ],
205
+ "summary_objects": [
206
+ "fact"
207
+ ],
208
+ "inference_objects": [
209
+ "fact"
210
+ ],
211
+ "default_mode_ceiling": "inference",
212
+ "implementation_status": "stub",
213
+ "fact_classes": [
214
+ "standard"
215
+ ]
216
+ },
217
+ {
218
+ "scope_id": "facts_sensitive:read",
219
+ "description": "Derived facts from special-class packs: health, inner state (mind.*), and finances (money.*). Split from facts:read so a grant can carry everyday facts without carrying these; mirrors the engine's facts vs facts_all packet distinction.",
220
+ "example_questions": [
221
+ "What medications am I recorded as taking?",
222
+ "What does the pack record about my reported state?"
223
+ ],
224
+ "primary_dimensions": [
225
+ "Profile"
226
+ ],
227
+ "raw_tables": [],
228
+ "canonical_tables": [],
229
+ "signal_objects": [
230
+ "fact"
231
+ ],
232
+ "summary_objects": [
233
+ "fact"
234
+ ],
235
+ "inference_objects": [
236
+ "fact"
237
+ ],
238
+ "default_mode_ceiling": "inference",
239
+ "implementation_status": "stub",
240
+ "fact_classes": [
241
+ "special"
242
+ ]
243
+ },
244
+ {
245
+ "scope_id": "goals:read",
246
+ "description": "Stated and derived goals: the user_goals store and Goal signal objects, with their dates and status. Aspirations are sensitive; answers are summaries and bands, not raw dumps.",
247
+ "example_questions": [
248
+ "What goals have I set this quarter?",
249
+ "Which goals went quiet?"
250
+ ],
251
+ "primary_dimensions": [
252
+ "Profile"
253
+ ],
254
+ "raw_tables": [],
255
+ "canonical_tables": [
256
+ "user_goals"
257
+ ],
258
+ "signal_objects": [
259
+ "Goal",
260
+ "user_goals"
261
+ ],
262
+ "summary_objects": [
263
+ "Goal"
264
+ ],
265
+ "inference_objects": [
266
+ "Goal"
267
+ ],
268
+ "default_mode_ceiling": "inference",
269
+ "implementation_status": "stub"
270
+ },
271
+ {
272
+ "scope_id": "graph:read",
273
+ "description": "The entity graph: people, projects, places and topics as nodes, and the derived relations between them (communicates_with, co_occurrence, pursues, participates_in, located_at). Structure and strength, resolved through aliases; not message text.",
274
+ "example_questions": [
275
+ "Who is connected to this project?",
276
+ "What links me to this person?",
277
+ "Which people bridge my communities?"
278
+ ],
279
+ "primary_dimensions": [
280
+ "Relationships"
281
+ ],
282
+ "raw_tables": [
283
+ "entities",
284
+ "entity_edges"
285
+ ],
286
+ "canonical_tables": [],
287
+ "signal_objects": [],
288
+ "summary_objects": [],
289
+ "inference_objects": [],
290
+ "default_mode_ceiling": "raw",
291
+ "implementation_status": "stub"
292
+ },
189
293
  {
190
294
  "scope_id": "health:read",
191
295
  "description": "Wellbeing signals from journal entries and role-filtered message emotions: moods, wellness summaries, and wellness scores.",
@@ -381,6 +485,31 @@
381
485
  "calendar_stub"
382
486
  ]
383
487
  },
488
+ {
489
+ "scope_id": "topics:read",
490
+ "description": "Derived topic clusters and their membership: what themes the owner's activity organizes into, by dimension. Labels and counts; member pointers stay on the node.",
491
+ "example_questions": [
492
+ "What themes does my work cluster into?",
493
+ "How big is each interest cluster?"
494
+ ],
495
+ "primary_dimensions": [
496
+ "Interests"
497
+ ],
498
+ "raw_tables": [],
499
+ "canonical_tables": [
500
+ "topic_clusters",
501
+ "topic_cluster_members"
502
+ ],
503
+ "signal_objects": [
504
+ "message_topics"
505
+ ],
506
+ "summary_objects": [
507
+ "message_topics"
508
+ ],
509
+ "inference_objects": [],
510
+ "default_mode_ceiling": "summary",
511
+ "implementation_status": "stub"
512
+ },
384
513
  {
385
514
  "scope_id": "work_context:read",
386
515
  "description": "Work goals and context: roles, skills and employment history from profile records, plus goals extracted from AI conversations and owner journals.",
@@ -32,6 +32,17 @@ BUNDLED_CANONICAL_TRIPLES: Dict[str, Tuple[str, str]] = {
32
32
  "gcal.events.v1": ("google_calendar", "schedule"),
33
33
  }
34
34
 
35
+ # Known drift variants of bundled schema ids, seen in the wild: a 2026-07
36
+ # operator install template invented "gdrive.files.v1" (the bundled id is
37
+ # "gdrive.file.v1"). Deliberately NOT keys of BUNDLED_CANONICAL_TRIPLES: an
38
+ # exact key makes normalize_canonical_source_payload raise and rehydrate
39
+ # demote, and the live drive_files install carries this schema with no bundled
40
+ # replacement to fall back to — enforcement would orphan a working connector.
41
+ # Callers use bundled_schema_drift() and decide per source_id.
42
+ BUNDLED_SCHEMA_ALIASES: Dict[str, str] = {
43
+ "gdrive.files.v1": "gdrive.file.v1",
44
+ }
45
+
35
46
  VALID_CANONICAL_GROUP_IDS = frozenset(
36
47
  {
37
48
  "ai_messages",
@@ -97,6 +108,32 @@ def bundled_lane_conflict(payload: Dict[str, Any]) -> Optional[str]:
97
108
  )
98
109
 
99
110
 
111
+ def bundled_schema_drift(payload: Dict[str, Any]) -> Optional[str]:
112
+ """Reason when the payload's schema is a drift variant of a bundled id and
113
+ its declared lane contradicts the bundled triple, else None.
114
+
115
+ Advisory, unlike bundled_lane_conflict: the caller decides whether the row
116
+ can be retired (its source_id has a bundled replacement) or only reported.
117
+ """
118
+ group_id = str(payload.get("canonical_group_id") or "").strip()
119
+ if not group_id:
120
+ return None
121
+ for key in (
122
+ str(payload.get("schema_id") or "").strip(),
123
+ str(payload.get("parser_id") or "").strip(),
124
+ ):
125
+ bundled_key = BUNDLED_SCHEMA_ALIASES.get(key)
126
+ if not bundled_key:
127
+ continue
128
+ _, bundled_lane = BUNDLED_CANONICAL_TRIPLES[bundled_key]
129
+ if group_id != bundled_lane:
130
+ return (
131
+ f"schema {key!r} is a drift variant of bundled {bundled_key!r} and "
132
+ f"canonical_group_id {group_id!r} contradicts bundled lane {bundled_lane!r}"
133
+ )
134
+ return None
135
+
136
+
100
137
  def normalize_canonical_source_payload(payload: Dict[str, Any]) -> Dict[str, Any]:
101
138
  """
102
139
  Fill bundled canonical_mapper_id from schema/parser; drop deprecated connected flag.