topos-node 1.3.41__tar.gz → 1.3.43__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 (765) hide show
  1. {topos_node-1.3.41/topos_node.egg-info → topos_node-1.3.43}/PKG-INFO +1 -1
  2. {topos_node-1.3.41 → topos_node-1.3.43}/pyproject.toml +1 -1
  3. {topos_node-1.3.41 → topos_node-1.3.43}/topos/__version__.py +2 -2
  4. {topos_node-1.3.41 → topos_node-1.3.43}/topos/protocol/narrowing_vocabulary.json +3 -1
  5. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/game_layer.py +69 -0
  6. topos_node-1.3.43/topos/query/graph_lane.py +152 -0
  7. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/narrowing.py +2 -0
  8. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/pipeline.py +22 -2
  9. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/retrieval.py +56 -1
  10. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/scope_registry.json +129 -0
  11. {topos_node-1.3.41 → topos_node-1.3.43}/topos/sources/bundled_canonical_triples.py +37 -0
  12. {topos_node-1.3.41 → topos_node-1.3.43}/topos/sources/install_service.py +135 -4
  13. {topos_node-1.3.41 → topos_node-1.3.43}/topos/upgrades/manifests.json +12 -0
  14. {topos_node-1.3.41 → topos_node-1.3.43/topos_node.egg-info}/PKG-INFO +1 -1
  15. {topos_node-1.3.41 → topos_node-1.3.43}/topos_node.egg-info/SOURCES.txt +1 -0
  16. {topos_node-1.3.41 → topos_node-1.3.43}/LICENSE +0 -0
  17. {topos_node-1.3.41 → topos_node-1.3.43}/MANIFEST.in +0 -0
  18. {topos_node-1.3.41 → topos_node-1.3.43}/README.md +0 -0
  19. {topos_node-1.3.41 → topos_node-1.3.43}/setup.cfg +0 -0
  20. {topos_node-1.3.41 → topos_node-1.3.43}/shared/__init__.py +0 -0
  21. {topos_node-1.3.41 → topos_node-1.3.43}/shared/filtering.py +0 -0
  22. {topos_node-1.3.41 → topos_node-1.3.43}/shared/schema_registry.py +0 -0
  23. {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_active_database_binding.py +0 -0
  24. {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_active_ingestion_binding.py +0 -0
  25. {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_extensions.py +0 -0
  26. {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_gate_leg_hermeticity.py +0 -0
  27. {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_llm_integrations_storage.py +0 -0
  28. {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_local_gate_composition.py +0 -0
  29. {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_owner_database_hermeticity.py +0 -0
  30. {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_prewarm_first_run.py +0 -0
  31. {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_profile_hygiene.py +0 -0
  32. {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_profiles.py +0 -0
  33. {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_protocol_handled_types.py +0 -0
  34. {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_query_field_contract.py +0 -0
  35. {topos_node-1.3.41 → topos_node-1.3.43}/tests/test_system_computer_name.py +0 -0
  36. {topos_node-1.3.41 → topos_node-1.3.43}/topos/__init__.py +0 -0
  37. {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/__init__.py +0 -0
  38. {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/dataset_resolution.py +0 -0
  39. {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/duckdb_adapter.py +0 -0
  40. {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/luck_surface.py +0 -0
  41. {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/messenger_communities.py +0 -0
  42. {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/messenger_directed.py +0 -0
  43. {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/messenger_graph.py +0 -0
  44. {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/messenger_labels.py +0 -0
  45. {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/person_graph.py +0 -0
  46. {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/person_overlay.py +0 -0
  47. {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/profiles.py +0 -0
  48. {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/query_engine.py +0 -0
  49. {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/raw_queries.py +0 -0
  50. {topos_node-1.3.41 → topos_node-1.3.43}/topos/analytics/relationship_reads.py +0 -0
  51. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/__init__.py +0 -0
  52. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/analytics.py +0 -0
  53. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/app_registry.py +0 -0
  54. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/backup.py +0 -0
  55. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/community_naming_config.py +0 -0
  56. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/compute_remote.py +0 -0
  57. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/connected_apps.py +0 -0
  58. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/conversation_context.py +0 -0
  59. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/data_commit.py +0 -0
  60. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/data_explorer_table_prefs.py +0 -0
  61. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/database_explorer.py +0 -0
  62. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/db.py +0 -0
  63. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/device.py +0 -0
  64. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/disk_space_config.py +0 -0
  65. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/engine_run.py +0 -0
  66. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/enrichment.py +0 -0
  67. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/enrichment_lab.py +0 -0
  68. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/facts_llm_config.py +0 -0
  69. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/filter_lab.py +0 -0
  70. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/health.py +0 -0
  71. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/home_chat.py +0 -0
  72. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/ingestion_api.py +0 -0
  73. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/ingestion_compat.py +0 -0
  74. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/ingestion_sources.py +0 -0
  75. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/intelligence_lifecycle.py +0 -0
  76. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/llm.py +0 -0
  77. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/local_mcp.py +0 -0
  78. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/messenger_analytics.py +0 -0
  79. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/privacy_disclose.py +0 -0
  80. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/query_api.py +0 -0
  81. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/runtime_bootstrap.py +0 -0
  82. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/sanitization_ollama_config.py +0 -0
  83. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/shell.py +0 -0
  84. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/signal.py +0 -0
  85. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/signal_extraction_config.py +0 -0
  86. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/source_install.py +0 -0
  87. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/source_scrub.py +0 -0
  88. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/sources.py +0 -0
  89. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/sources_overview.py +0 -0
  90. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/sync.py +0 -0
  91. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/tool_index.py +0 -0
  92. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/ui_config.py +0 -0
  93. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/uma_data.py +0 -0
  94. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/upgrades.py +0 -0
  95. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/usage.py +0 -0
  96. {topos_node-1.3.41 → topos_node-1.3.43}/topos/api/user_identity.py +0 -0
  97. {topos_node-1.3.41 → topos_node-1.3.43}/topos/app.py +0 -0
  98. {topos_node-1.3.41 → topos_node-1.3.43}/topos/auth.py +0 -0
  99. {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/__init__.py +0 -0
  100. {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/declared_field_map.py +0 -0
  101. {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/mappers/__init__.py +0 -0
  102. {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/mappers/base.py +0 -0
  103. {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
  104. {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
  105. {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/mappers/demo_mappers.py +0 -0
  106. {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/mappers/documents_mapper.py +0 -0
  107. {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
  108. {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
  109. {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/mappers/grok_mapper.py +0 -0
  110. {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
  111. {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/models.py +0 -0
  112. {topos_node-1.3.41 → topos_node-1.3.43}/topos/canonicalization/resolver.py +0 -0
  113. {topos_node-1.3.41 → topos_node-1.3.43}/topos/cli/__init__.py +0 -0
  114. {topos_node-1.3.41 → topos_node-1.3.43}/topos/cli/__main__.py +0 -0
  115. {topos_node-1.3.41 → topos_node-1.3.43}/topos/cli/assets/topos_blk_rounded.png +0 -0
  116. {topos_node-1.3.41 → topos_node-1.3.43}/topos/cli/assets/topos_white.png +0 -0
  117. {topos_node-1.3.41 → topos_node-1.3.43}/topos/cli/commands.py +0 -0
  118. {topos_node-1.3.41 → topos_node-1.3.43}/topos/cli/profile_cmd.py +0 -0
  119. {topos_node-1.3.41 → topos_node-1.3.43}/topos/cli/reprocess_cmd.py +0 -0
  120. {topos_node-1.3.41 → topos_node-1.3.43}/topos/cli/setup_models_cmd.py +0 -0
  121. {topos_node-1.3.41 → topos_node-1.3.43}/topos/cli/tray.py +0 -0
  122. {topos_node-1.3.41 → topos_node-1.3.43}/topos/config/__init__.py +0 -0
  123. {topos_node-1.3.41 → topos_node-1.3.43}/topos/config/conversation_context_llm.py +0 -0
  124. {topos_node-1.3.41 → topos_node-1.3.43}/topos/config/facts_llm.py +0 -0
  125. {topos_node-1.3.41 → topos_node-1.3.43}/topos/config/local_model_builds.py +0 -0
  126. {topos_node-1.3.41 → topos_node-1.3.43}/topos/config/model_packs.py +0 -0
  127. {topos_node-1.3.41 → topos_node-1.3.43}/topos/config/node_function_providers.py +0 -0
  128. {topos_node-1.3.41 → topos_node-1.3.43}/topos/config/sanitization_ollama.py +0 -0
  129. {topos_node-1.3.41 → topos_node-1.3.43}/topos/config/settings.py +0 -0
  130. {topos_node-1.3.41 → topos_node-1.3.43}/topos/config/signal_extraction.py +0 -0
  131. {topos_node-1.3.41 → topos_node-1.3.43}/topos/config/uvicorn_logging.json +0 -0
  132. {topos_node-1.3.41 → topos_node-1.3.43}/topos/contacts/__init__.py +0 -0
  133. {topos_node-1.3.41 → topos_node-1.3.43}/topos/contacts/identity.py +0 -0
  134. {topos_node-1.3.41 → topos_node-1.3.43}/topos/control_plane_client.py +0 -0
  135. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/__init__.py +0 -0
  136. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/api_models.py +0 -0
  137. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/connection_resilience.py +0 -0
  138. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/db_health.py +0 -0
  139. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/device_helpers.py +0 -0
  140. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/errors.py +0 -0
  141. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/events.py +0 -0
  142. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/__init__.py +0 -0
  143. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/common.py +0 -0
  144. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/complexity.py +0 -0
  145. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/config.py +0 -0
  146. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/contacts_import.py +0 -0
  147. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/database_explorer.py +0 -0
  148. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/derivation.py +0 -0
  149. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/device.py +0 -0
  150. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/enrichment.py +0 -0
  151. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/enrichment_lab.py +0 -0
  152. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/filter_lab.py +0 -0
  153. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/graph_query.py +0 -0
  154. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/graph_summary.py +0 -0
  155. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/home_chat.py +0 -0
  156. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/ingest.py +0 -0
  157. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/mcp_client_elevations.py +0 -0
  158. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/mcp_clients.py +0 -0
  159. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/messages.py +0 -0
  160. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/messenger_analytics.py +0 -0
  161. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/query.py +0 -0
  162. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/registry.py +0 -0
  163. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/routines.py +0 -0
  164. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/signal_features.py +0 -0
  165. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/sources.py +0 -0
  166. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/timeline_daily.py +0 -0
  167. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/tool_index.py +0 -0
  168. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/handlers/uma.py +0 -0
  169. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/logging.py +0 -0
  170. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/metrics.py +0 -0
  171. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/routine_access.py +0 -0
  172. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/startup_banner.py +0 -0
  173. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/state.py +0 -0
  174. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/table_layers.py +0 -0
  175. {topos_node-1.3.41 → topos_node-1.3.43}/topos/core/types.py +0 -0
  176. {topos_node-1.3.41 → topos_node-1.3.43}/topos/data_explorer_row_delete.py +0 -0
  177. {topos_node-1.3.41 → topos_node-1.3.43}/topos/data_explorer_table_prefs.py +0 -0
  178. {topos_node-1.3.41 → topos_node-1.3.43}/topos/data_explorer_tables.py +0 -0
  179. {topos_node-1.3.41 → topos_node-1.3.43}/topos/defaults.py +0 -0
  180. {topos_node-1.3.41 → topos_node-1.3.43}/topos/disclosure/__init__.py +0 -0
  181. {topos_node-1.3.41 → topos_node-1.3.43}/topos/disclosure/canonical_writer.py +0 -0
  182. {topos_node-1.3.41 → topos_node-1.3.43}/topos/disclosure/content_policy.py +0 -0
  183. {topos_node-1.3.41 → topos_node-1.3.43}/topos/disclosure/field_registry.py +0 -0
  184. {topos_node-1.3.41 → topos_node-1.3.43}/topos/disclosure/privacy_layer.py +0 -0
  185. {topos_node-1.3.41 → topos_node-1.3.43}/topos/disclosure/tier.py +0 -0
  186. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/__init__.py +0 -0
  187. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/backends/__init__.py +0 -0
  188. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/backends/base.py +0 -0
  189. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/backends/generative_prompts.py +0 -0
  190. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/backends/generative_response.py +0 -0
  191. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/backends/huggingface.py +0 -0
  192. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/backends/ollama.py +0 -0
  193. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/backends/openai.py +0 -0
  194. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/backends/openai_compatible.py +0 -0
  195. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/backends/redpill.py +0 -0
  196. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/backends/stub.py +0 -0
  197. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/client.py +0 -0
  198. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/disk_space.py +0 -0
  199. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/engine.py +0 -0
  200. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/hosted_llm_wallet.py +0 -0
  201. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/intake.py +0 -0
  202. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/memory_utils.py +0 -0
  203. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/model_cache.py +0 -0
  204. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/model_manager.py +0 -0
  205. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/ollama_install.py +0 -0
  206. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/ollama_pull.py +0 -0
  207. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/ollama_runtime.py +0 -0
  208. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/ollama_setup_guidance.py +0 -0
  209. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/pipeline_memory.py +0 -0
  210. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/queue_manager.py +0 -0
  211. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/registration.py +0 -0
  212. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/result_formatter.py +0 -0
  213. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/router.py +0 -0
  214. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/scoped_token.py +0 -0
  215. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/tasks.py +0 -0
  216. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/torch_runtime.py +0 -0
  217. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/transport.py +0 -0
  218. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/usage_guard.py +0 -0
  219. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/usage_observation.py +0 -0
  220. {topos_node-1.3.41 → topos_node-1.3.43}/topos/engine/validator.py +0 -0
  221. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/__init__.py +0 -0
  222. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/catalog.py +0 -0
  223. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/derivation_recovery.py +0 -0
  224. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/derived_tables.py +0 -0
  225. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/job_readiness.py +0 -0
  226. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/job_writer.py +0 -0
  227. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/__init__.py +0 -0
  228. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/base.py +0 -0
  229. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/__init__.py +0 -0
  230. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
  231. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
  232. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
  233. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
  234. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
  235. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
  236. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/derivation_job.py +0 -0
  237. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/derived_object_embeddings_job.py +0 -0
  238. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
  239. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
  240. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
  241. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
  242. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
  243. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
  244. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
  245. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
  246. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
  247. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
  248. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
  249. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
  250. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
  251. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/raw/__init__.py +0 -0
  252. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
  253. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/raw/language_job.py +0 -0
  254. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
  255. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
  256. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/model_overrides.py +0 -0
  257. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/models/__init__.py +0 -0
  258. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/models/manager.py +0 -0
  259. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/models/mvp_defaults.py +0 -0
  260. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/models/registry.py +0 -0
  261. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/models/versioning.py +0 -0
  262. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/orchestrator.py +0 -0
  263. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/pipeline_activity.py +0 -0
  264. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/processor.py +0 -0
  265. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/progress_bar.py +0 -0
  266. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/record_progress.py +0 -0
  267. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/registry_contract.py +0 -0
  268. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/signal_derivation_config.json +0 -0
  269. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment/source_overrides.py +0 -0
  270. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment_lab/__init__.py +0 -0
  271. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment_lab/bundles.py +0 -0
  272. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment_lab/model_resolve.py +0 -0
  273. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment_lab/schema.py +0 -0
  274. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment_lab/service.py +0 -0
  275. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment_lab/store.py +0 -0
  276. {topos_node-1.3.41 → topos_node-1.3.43}/topos/enrichment_lab/worker.py +0 -0
  277. {topos_node-1.3.41 → topos_node-1.3.43}/topos/evals/__init__.py +0 -0
  278. {topos_node-1.3.41 → topos_node-1.3.43}/topos/evals/enrichment_eval.py +0 -0
  279. {topos_node-1.3.41 → topos_node-1.3.43}/topos/extensions.py +0 -0
  280. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/__init__.py +0 -0
  281. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/canonical.py +0 -0
  282. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/engine.py +0 -0
  283. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/entropy.py +0 -0
  284. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/focus.py +0 -0
  285. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/graph_metrics.py +0 -0
  286. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/influence.py +0 -0
  287. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/projection.py +0 -0
  288. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/snapshots.py +0 -0
  289. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/store.py +0 -0
  290. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/topic_merge.py +0 -0
  291. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/topics.py +0 -0
  292. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/topics_daily.py +0 -0
  293. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/complexity/volatility.py +0 -0
  294. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/__init__.py +0 -0
  295. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/_scales.yaml +0 -0
  296. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/admin.legal.yaml +0 -0
  297. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/aspirations.goals.yaml +0 -0
  298. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/behavior.habits.yaml +0 -0
  299. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/behavior.preferences.yaml +0 -0
  300. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/beliefs.civic.yaml +0 -0
  301. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/beliefs.spiritual.yaml +0 -0
  302. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/communication.style.yaml +0 -0
  303. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/community.membership.yaml +0 -0
  304. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/craft.tooling.yaml +0 -0
  305. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/expertise.knowledge.yaml +0 -0
  306. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/finances.economics.yaml +0 -0
  307. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/health.lifestyle.yaml +0 -0
  308. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/health.mental.yaml +0 -0
  309. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/health.physical.yaml +0 -0
  310. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/household.pets.yaml +0 -0
  311. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/identity.core.yaml +0 -0
  312. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/interests.taste.yaml +0 -0
  313. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/life.events.yaml +0 -0
  314. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/narrative.self.yaml +0 -0
  315. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/net.capability.yaml +0 -0
  316. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/obligations.commitments.yaml +0 -0
  317. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/personality.traits.yaml +0 -0
  318. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/places.mobility.yaml +0 -0
  319. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/possessions.assets.yaml +0 -0
  320. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/relationships.social.yaml +0 -0
  321. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/values.motivation.yaml +0 -0
  322. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/vocab/dispositions.yaml +0 -0
  323. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/vocab/expertise.yaml +0 -0
  324. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/vocab/habits.yaml +0 -0
  325. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/vocab/interests.yaml +0 -0
  326. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/vocab/preferences.yaml +0 -0
  327. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/vocab/stances.yaml +0 -0
  328. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/vocab/tools.yaml +0 -0
  329. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/vocab/values.yaml +0 -0
  330. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/bundled_packs/work.career.yaml +0 -0
  331. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/candidates.py +0 -0
  332. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/guard.py +0 -0
  333. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/kernels.py +0 -0
  334. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/net_subject_policy.py +0 -0
  335. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/packs.py +0 -0
  336. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/person_bridge.py +0 -0
  337. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/prefilter.py +0 -0
  338. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/registry.py +0 -0
  339. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/report_card.py +0 -0
  340. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/router.py +0 -0
  341. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/social_bench.py +0 -0
  342. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/social_kernels.py +0 -0
  343. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/surfaces.py +0 -0
  344. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/synthesize.py +0 -0
  345. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/template.py +0 -0
  346. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/verify.py +0 -0
  347. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/derivation/writer.py +0 -0
  348. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/__init__.py +0 -0
  349. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/affinity.py +0 -0
  350. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/affinity_owner.py +0 -0
  351. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/affinity_quality.py +0 -0
  352. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/chatgpt_declared.py +0 -0
  353. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/community_names.py +0 -0
  354. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/community_naming.py +0 -0
  355. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/consolidation.py +0 -0
  356. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/context_vectors.py +0 -0
  357. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/cypher.py +0 -0
  358. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/declared_mappings.py +0 -0
  359. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/dossier.py +0 -0
  360. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/edges.py +0 -0
  361. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/fact_materializer.py +0 -0
  362. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/graph_enrichers.py +0 -0
  363. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/graph_refresh.py +0 -0
  364. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/graph_search.py +0 -0
  365. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/linking.py +0 -0
  366. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/maintenance.py +0 -0
  367. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/owner.py +0 -0
  368. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/reads.py +0 -0
  369. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/rebuild_subprocess.py +0 -0
  370. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/resolver.py +0 -0
  371. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/entities/structured_fields.py +0 -0
  372. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/facts/__init__.py +0 -0
  373. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/facts/extract.py +0 -0
  374. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/facts/llm_extract.py +0 -0
  375. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/facts/reads.py +0 -0
  376. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/facts/store.py +0 -0
  377. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/facts/verdicts.py +0 -0
  378. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/fit/evaluator.py +0 -0
  379. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/fit/opportunity_types.json +0 -0
  380. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/lifecycle/__init__.py +0 -0
  381. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/lifecycle/blackhole.py +0 -0
  382. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/lifecycle/blackhole_guard.py +0 -0
  383. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/lifecycle/blackhole_llm.py +0 -0
  384. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/lifecycle/blackhole_rebuild.py +0 -0
  385. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/lifecycle/derived_scrub.py +0 -0
  386. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/lifecycle/exclusions.py +0 -0
  387. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/lifecycle/gc.py +0 -0
  388. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/provenance/__init__.py +0 -0
  389. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/provenance/posture.py +0 -0
  390. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/provenance/roles.py +0 -0
  391. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/__init__.py +0 -0
  392. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/brief_canonical_loader.py +0 -0
  393. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/brief_ontology.py +0 -0
  394. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/brief_renderer.py +0 -0
  395. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/brief_schemas.py +0 -0
  396. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/chunking.py +0 -0
  397. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/cluster_labels.py +0 -0
  398. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/conversation_context.py +0 -0
  399. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/conversation_windows.py +0 -0
  400. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/data_health.py +0 -0
  401. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/brief_ontologies.json +0 -0
  402. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/intentions.json +0 -0
  403. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/interests.json +0 -0
  404. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/memory.json +0 -0
  405. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/places.json +0 -0
  406. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/profile.json +0 -0
  407. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/relationships.json +0 -0
  408. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/resources.json +0 -0
  409. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
  410. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/time.json +0 -0
  411. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/wellbeing.json +0 -0
  412. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/definitions/work.json +0 -0
  413. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/derived_index.py +0 -0
  414. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/derived_spec.py +0 -0
  415. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/dimension_briefs.py +0 -0
  416. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/dimension_definition_loader.py +0 -0
  417. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/dimension_profiles.py +0 -0
  418. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/dimension_registry.py +0 -0
  419. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/embed_context.py +0 -0
  420. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/extraction/artifact_router.py +0 -0
  421. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/extraction/artifact_store.py +0 -0
  422. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/extraction/rule_extractors.py +0 -0
  423. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/graph_sanitize.py +0 -0
  424. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/hybrid_search.py +0 -0
  425. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/incremental_clustering.py +0 -0
  426. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/model_recommendations.py +0 -0
  427. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/query_embed_cache.py +0 -0
  428. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/schemas.py +0 -0
  429. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/service.py +0 -0
  430. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/signal_object_store.py +0 -0
  431. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/source_hydration.py +0 -0
  432. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/structured_signal.py +0 -0
  433. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/tool_index.py +0 -0
  434. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/topic_clustering.py +0 -0
  435. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/typed_stores/aggregates.py +0 -0
  436. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/typed_stores/commitments.py +0 -0
  437. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/typed_stores/rhythm.py +0 -0
  438. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
  439. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/vector_codec.py +0 -0
  440. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/vector_math.py +0 -0
  441. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/signal/vector_settings.py +0 -0
  442. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/stats/__init__.py +0 -0
  443. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/stats/definitions.py +0 -0
  444. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/stats/engine.py +0 -0
  445. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/stats/fold.py +0 -0
  446. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/stats/insights.py +0 -0
  447. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/timeline_projection.py +0 -0
  448. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/timeline_rollup.py +0 -0
  449. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/triage/__init__.py +0 -0
  450. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/triage/badges.py +0 -0
  451. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/triage/daily.py +0 -0
  452. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/triage/dashboard.py +0 -0
  453. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/triage/instruments.py +0 -0
  454. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/triage/intents.py +0 -0
  455. {topos_node-1.3.41 → topos_node-1.3.43}/topos/features/triage/readiness.py +0 -0
  456. {topos_node-1.3.41 → topos_node-1.3.43}/topos/filter_lab/__init__.py +0 -0
  457. {topos_node-1.3.41 → topos_node-1.3.43}/topos/filter_lab/bundles.py +0 -0
  458. {topos_node-1.3.41 → topos_node-1.3.43}/topos/filter_lab/schema.py +0 -0
  459. {topos_node-1.3.41 → topos_node-1.3.43}/topos/filter_lab/service.py +0 -0
  460. {topos_node-1.3.41 → topos_node-1.3.43}/topos/filter_lab/store.py +0 -0
  461. {topos_node-1.3.41 → topos_node-1.3.43}/topos/filter_lab/worker.py +0 -0
  462. {topos_node-1.3.41 → topos_node-1.3.43}/topos/home_chat/__init__.py +0 -0
  463. {topos_node-1.3.41 → topos_node-1.3.43}/topos/home_chat/schema.py +0 -0
  464. {topos_node-1.3.41 → topos_node-1.3.43}/topos/home_chat/store.py +0 -0
  465. {topos_node-1.3.41 → topos_node-1.3.43}/topos/hosted_pool_lease.py +0 -0
  466. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/__init__.py +0 -0
  467. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/canonical_pipeline.py +0 -0
  468. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/checkpoints/__init__.py +0 -0
  469. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
  470. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
  471. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/inbox_crypto.py +0 -0
  472. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/inbox_drain.py +0 -0
  473. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/ingest_helpers.py +0 -0
  474. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/jobs.py +0 -0
  475. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/journal_location_fanout.py +0 -0
  476. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/journal_time_log_normalize.py +0 -0
  477. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/local_exports.py +0 -0
  478. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/local_sync.py +0 -0
  479. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/log_preview.py +0 -0
  480. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/manager.py +0 -0
  481. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parser.py +0 -0
  482. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/__init__.py +0 -0
  483. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/base.py +0 -0
  484. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/browser_parser.py +0 -0
  485. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/calendar_parser.py +0 -0
  486. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
  487. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/chatgpt_export.py +0 -0
  488. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
  489. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
  490. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/documents_parser.py +0 -0
  491. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/github_activity_parser.py +0 -0
  492. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
  493. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/grok_parser.py +0 -0
  494. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/messenger_parser.py +0 -0
  495. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/parsers/voxterm_parser.py +0 -0
  496. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/progress.py +0 -0
  497. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/reprocess.py +0 -0
  498. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/sources/__init__.py +0 -0
  499. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/sources/base.py +0 -0
  500. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/sources/calendar.py +0 -0
  501. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/sources/chatgpt.py +0 -0
  502. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/sources/contact_importers.py +0 -0
  503. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/sources/grok.py +0 -0
  504. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/sources/imessage_reader.py +0 -0
  505. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/sources/signal_export_parser.py +0 -0
  506. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/sources/signal_reader.py +0 -0
  507. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/state_machine.py +0 -0
  508. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/triggers/__init__.py +0 -0
  509. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/triggers/file_trigger.py +0 -0
  510. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
  511. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/usage_inbox_dedupe.py +0 -0
  512. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/validation/__init__.py +0 -0
  513. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/validation/base.py +0 -0
  514. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/validation/schema_registry.py +0 -0
  515. {topos_node-1.3.41 → topos_node-1.3.43}/topos/ingestion/validation/schema_validator.py +0 -0
  516. {topos_node-1.3.41 → topos_node-1.3.43}/topos/lineage/__init__.py +0 -0
  517. {topos_node-1.3.41 → topos_node-1.3.43}/topos/lineage/provenance.py +0 -0
  518. {topos_node-1.3.41 → topos_node-1.3.43}/topos/lineage/tracker.py +0 -0
  519. {topos_node-1.3.41 → topos_node-1.3.43}/topos/llm_integrations_storage.py +0 -0
  520. {topos_node-1.3.41 → topos_node-1.3.43}/topos/mcp_clients.py +0 -0
  521. {topos_node-1.3.41 → topos_node-1.3.43}/topos/mcp_stdio_proxy.py +0 -0
  522. {topos_node-1.3.41 → topos_node-1.3.43}/topos/observability/__init__.py +0 -0
  523. {topos_node-1.3.41 → topos_node-1.3.43}/topos/observability/alerts.py +0 -0
  524. {topos_node-1.3.41 → topos_node-1.3.43}/topos/observability/metrics.py +0 -0
  525. {topos_node-1.3.41 → topos_node-1.3.43}/topos/observability/tracing.py +0 -0
  526. {topos_node-1.3.41 → topos_node-1.3.43}/topos/openai_client.py +0 -0
  527. {topos_node-1.3.41 → topos_node-1.3.43}/topos/owner_key.py +0 -0
  528. {topos_node-1.3.41 → topos_node-1.3.43}/topos/pipeline/__init__.py +0 -0
  529. {topos_node-1.3.41 → topos_node-1.3.43}/topos/pipeline/audit.py +0 -0
  530. {topos_node-1.3.41 → topos_node-1.3.43}/topos/pipeline/envelope.py +0 -0
  531. {topos_node-1.3.41 → topos_node-1.3.43}/topos/pipeline/job_runner.py +0 -0
  532. {topos_node-1.3.41 → topos_node-1.3.43}/topos/pipeline/job_store.py +0 -0
  533. {topos_node-1.3.41 → topos_node-1.3.43}/topos/pipeline/stages.py +0 -0
  534. {topos_node-1.3.41 → topos_node-1.3.43}/topos/pipeline/stub_enqueue.py +0 -0
  535. {topos_node-1.3.41 → topos_node-1.3.43}/topos/principal.py +0 -0
  536. {topos_node-1.3.41 → topos_node-1.3.43}/topos/profiles.py +0 -0
  537. {topos_node-1.3.41 → topos_node-1.3.43}/topos/projections/__init__.py +0 -0
  538. {topos_node-1.3.41 → topos_node-1.3.43}/topos/projections/vector_index/__init__.py +0 -0
  539. {topos_node-1.3.41 → topos_node-1.3.43}/topos/projections/vector_index/base.py +0 -0
  540. {topos_node-1.3.41 → topos_node-1.3.43}/topos/projections/vector_index/builders.py +0 -0
  541. {topos_node-1.3.41 → topos_node-1.3.43}/topos/projections/vector_index/health_checks.py +0 -0
  542. {topos_node-1.3.41 → topos_node-1.3.43}/topos/protocol/__init__.py +0 -0
  543. {topos_node-1.3.41 → topos_node-1.3.43}/topos/protocol/handled_message_types.json +0 -0
  544. {topos_node-1.3.41 → topos_node-1.3.43}/topos/protocol/query_field_contract.json +0 -0
  545. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/__init__.py +0 -0
  546. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/audit.py +0 -0
  547. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/closeness.py +0 -0
  548. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/cohort_resolvers.py +0 -0
  549. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/collaborators.py +0 -0
  550. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/ddr.py +0 -0
  551. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/disclosure.py +0 -0
  552. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/entity_window.py +0 -0
  553. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/exclusion.py +0 -0
  554. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/facts_direct.py +0 -0
  555. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/fingerprint.py +0 -0
  556. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/grant_cache.py +0 -0
  557. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/inference.py +0 -0
  558. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/intent.py +0 -0
  559. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/manifest.py +0 -0
  560. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/manifest_validation.py +0 -0
  561. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/minimizer.py +0 -0
  562. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/negotiation.py +0 -0
  563. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/packet_resolution.py +0 -0
  564. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/planner.py +0 -0
  565. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/runtime.py +0 -0
  566. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/scope_arbiter.py +0 -0
  567. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/scope_classifier.py +0 -0
  568. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/scope_head.py +0 -0
  569. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/scope_registry_loader.py +0 -0
  570. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/scope_shadow.py +0 -0
  571. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/session.py +0 -0
  572. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/session_utils.py +0 -0
  573. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/source_generation.py +0 -0
  574. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/truth_facts.py +0 -0
  575. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/truth_prompts.py +0 -0
  576. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/turn_classifier.py +0 -0
  577. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/types.py +0 -0
  578. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/verify.py +0 -0
  579. {topos_node-1.3.41 → topos_node-1.3.43}/topos/query/verify_modes.py +0 -0
  580. {topos_node-1.3.41 → topos_node-1.3.43}/topos/rate_limit.py +0 -0
  581. {topos_node-1.3.41 → topos_node-1.3.43}/topos/relay_stamp.py +0 -0
  582. {topos_node-1.3.41 → topos_node-1.3.43}/topos/routines/__init__.py +0 -0
  583. {topos_node-1.3.41 → topos_node-1.3.43}/topos/routines/schema.py +0 -0
  584. {topos_node-1.3.41 → topos_node-1.3.43}/topos/routines/store.py +0 -0
  585. {topos_node-1.3.41 → topos_node-1.3.43}/topos/runtime_housekeeping.py +0 -0
  586. {topos_node-1.3.41 → topos_node-1.3.43}/topos/runtime_shutdown.py +0 -0
  587. {topos_node-1.3.41 → topos_node-1.3.43}/topos/runtime_update.py +0 -0
  588. {topos_node-1.3.41 → topos_node-1.3.43}/topos/sanitization/__init__.py +0 -0
  589. {topos_node-1.3.41 → topos_node-1.3.43}/topos/sanitization/nsfw_classifier.py +0 -0
  590. {topos_node-1.3.41 → topos_node-1.3.43}/topos/sanitization/ollama_transforms.py +0 -0
  591. {topos_node-1.3.41 → topos_node-1.3.43}/topos/sanitization/prewarm.py +0 -0
  592. {topos_node-1.3.41 → topos_node-1.3.43}/topos/sanitization/privacy_filter.py +0 -0
  593. {topos_node-1.3.41 → topos_node-1.3.43}/topos/scope_resolution.py +0 -0
  594. {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/__init__.py +0 -0
  595. {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/container.py +0 -0
  596. {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/embeddings/__init__.py +0 -0
  597. {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/embeddings/base.py +0 -0
  598. {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/embeddings/local.py +0 -0
  599. {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/embeddings/remote.py +0 -0
  600. {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/interfaces.py +0 -0
  601. {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/llm/__init__.py +0 -0
  602. {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/llm/base.py +0 -0
  603. {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/llm/openai.py +0 -0
  604. {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/local.py +0 -0
  605. {topos_node-1.3.41 → topos_node-1.3.43}/topos/services/postgres.py +0 -0
  606. {topos_node-1.3.41 → topos_node-1.3.43}/topos/sources/__init__.py +0 -0
  607. {topos_node-1.3.41 → topos_node-1.3.43}/topos/sources/canonical_signal_defaults.py +0 -0
  608. {topos_node-1.3.41 → topos_node-1.3.43}/topos/sources/declared_field_map_spec.py +0 -0
  609. {topos_node-1.3.41 → topos_node-1.3.43}/topos/sources/definitions.py +0 -0
  610. {topos_node-1.3.41 → topos_node-1.3.43}/topos/sources/registry.py +0 -0
  611. {topos_node-1.3.41 → topos_node-1.3.43}/topos/sources/runtime_install.py +0 -0
  612. {topos_node-1.3.41 → topos_node-1.3.43}/topos/sources/scrub_attribution.py +0 -0
  613. {topos_node-1.3.41 → topos_node-1.3.43}/topos/sources/scrub_service.py +0 -0
  614. {topos_node-1.3.41 → topos_node-1.3.43}/topos/startup_banner.py +0 -0
  615. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/__init__.py +0 -0
  616. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/adapters/__init__.py +0 -0
  617. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/adapters/factory.py +0 -0
  618. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/adapters/fakes.py +0 -0
  619. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/adapters/postgres/stores.py +0 -0
  620. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/adapters/protocols.py +0 -0
  621. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/adapters/sqlite/__init__.py +0 -0
  622. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/adapters/sqlite/stores.py +0 -0
  623. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/adapters/sqlite/vector_search.py +0 -0
  624. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/__init__.py +0 -0
  625. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/activity_tables.py +0 -0
  626. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/ai_chat/__init__.py +0 -0
  627. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
  628. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/ai_chat/mapper.py +0 -0
  629. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/ai_chat/model.py +0 -0
  630. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/ai_chat/tables.py +0 -0
  631. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
  632. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/canonical_store.py +0 -0
  633. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/conversations_tables.py +0 -0
  634. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/journal_repair.py +0 -0
  635. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/mapping_store.py +0 -0
  636. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/canonical/postgres.py +0 -0
  637. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/__init__.py +0 -0
  638. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/client.py +0 -0
  639. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/connection_tuning.py +0 -0
  640. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/__init__.py +0 -0
  641. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
  642. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/actor_role_v1.py +0 -0
  643. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
  644. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
  645. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
  646. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/backup.py +0 -0
  647. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/backup_custody.py +0 -0
  648. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
  649. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
  650. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
  651. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
  652. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/community_names_v1.py +0 -0
  653. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/complexity_v1.py +0 -0
  654. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/conflict_provenance_v1.py +0 -0
  655. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
  656. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/derivation_factory_v1.py +0 -0
  657. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
  658. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/derivation_provenance_v1.py +0 -0
  659. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/derived_row_identity_v1.py +0 -0
  660. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/documents_v1.py +0 -0
  661. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/enrichment_record_progress_v1.py +0 -0
  662. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
  663. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
  664. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
  665. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
  666. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
  667. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
  668. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/entity_mentions_authored_v1.py +0 -0
  669. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/entity_review_candidate_bar_v1.py +0 -0
  670. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/entity_review_dedup_v1.py +0 -0
  671. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/entity_review_provenance_v1.py +0 -0
  672. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/episodes_v1.py +0 -0
  673. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
  674. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/fact_dimension_by_entity_type_v1.py +0 -0
  675. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
  676. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
  677. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
  678. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
  679. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
  680. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/journal_origin_dimension_v1.py +0 -0
  681. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/mention_table_stamp_backfill_v1.py +0 -0
  682. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
  683. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
  684. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/net_subject_policy_v1.py +0 -0
  685. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/pack_registry_v1.py +0 -0
  686. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
  687. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/query_artifacts_duration_ms_v1.py +0 -0
  688. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/registry.py +0 -0
  689. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/registry_checksums.json +0 -0
  690. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/remediation_person_model.py +0 -0
  691. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/retire_url_classification_v1.py +0 -0
  692. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/scope_source_generation.py +0 -0
  693. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
  694. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
  695. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/signal_objects.py +0 -0
  696. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
  697. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
  698. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
  699. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
  700. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
  701. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
  702. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
  703. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
  704. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
  705. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
  706. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
  707. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
  708. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
  709. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
  710. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
  711. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
  712. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
  713. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
  714. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
  715. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
  716. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
  717. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
  718. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/paths.py +0 -0
  719. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/postgres.py +0 -0
  720. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/schema.py +0 -0
  721. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/schema_probe.py +0 -0
  722. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/storage_breakdown.py +0 -0
  723. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/db/write_gate.py +0 -0
  724. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/derived_row_identity.py +0 -0
  725. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/enrichment/__init__.py +0 -0
  726. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
  727. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
  728. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/normalized/__init__.py +0 -0
  729. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/normalized/normalized_store.py +0 -0
  730. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/oplog/__init__.py +0 -0
  731. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/oplog/decision.py +0 -0
  732. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/oplog/oplog_store.py +0 -0
  733. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/oplog/postgres.py +0 -0
  734. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/person/identity_resolver.py +0 -0
  735. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/projections/__init__.py +0 -0
  736. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/projections/index_ops_store.py +0 -0
  737. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/projections/vector_index_store.py +0 -0
  738. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/raw/__init__.py +0 -0
  739. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/raw/browser_flat_tables.py +0 -0
  740. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/raw/file_store.py +0 -0
  741. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/raw/raw_store.py +0 -0
  742. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/raw/raw_tables_manager.py +0 -0
  743. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/raw/sqlite_raw_store.py +0 -0
  744. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/security/encryption.py +0 -0
  745. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/signal_identity.py +0 -0
  746. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/source_settings.py +0 -0
  747. {topos_node-1.3.41 → topos_node-1.3.43}/topos/storage/user_identity.py +0 -0
  748. {topos_node-1.3.41 → topos_node-1.3.43}/topos/sync/__init__.py +0 -0
  749. {topos_node-1.3.41 → topos_node-1.3.43}/topos/sync/client.py +0 -0
  750. {topos_node-1.3.41 → topos_node-1.3.43}/topos/sync_handlers.py +0 -0
  751. {topos_node-1.3.41 → topos_node-1.3.43}/topos/testing/__init__.py +0 -0
  752. {topos_node-1.3.41 → topos_node-1.3.43}/topos/testing/lifespan.py +0 -0
  753. {topos_node-1.3.41 → topos_node-1.3.43}/topos/uds.py +0 -0
  754. {topos_node-1.3.41 → topos_node-1.3.43}/topos/uma_contact_enrichment.py +0 -0
  755. {topos_node-1.3.41 → topos_node-1.3.43}/topos/uma_filters.py +0 -0
  756. {topos_node-1.3.41 → topos_node-1.3.43}/topos/uma_resource_id.py +0 -0
  757. {topos_node-1.3.41 → topos_node-1.3.43}/topos/uma_rpt.py +0 -0
  758. {topos_node-1.3.41 → topos_node-1.3.43}/topos/upgrades/__init__.py +0 -0
  759. {topos_node-1.3.41 → topos_node-1.3.43}/topos/upgrades/runner.py +0 -0
  760. {topos_node-1.3.41 → topos_node-1.3.43}/topos/utils/base_object.py +0 -0
  761. {topos_node-1.3.41 → topos_node-1.3.43}/topos/websocket_client.py +0 -0
  762. {topos_node-1.3.41 → topos_node-1.3.43}/topos_node.egg-info/dependency_links.txt +0 -0
  763. {topos_node-1.3.41 → topos_node-1.3.43}/topos_node.egg-info/entry_points.txt +0 -0
  764. {topos_node-1.3.41 → topos_node-1.3.43}/topos_node.egg-info/requires.txt +0 -0
  765. {topos_node-1.3.41 → topos_node-1.3.43}/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.41
3
+ Version: 1.3.43
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.41"
7
+ version = "1.3.43"
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.41"
4
- __version_info__ = (1, 3, 41)
3
+ __version__ = "1.3.43"
4
+ __version_info__ = (1, 3, 43)
5
5
 
6
6
  __all__ = ["__version__", "__version_info__"]
@@ -88,6 +88,7 @@
88
88
  "expand_boundary",
89
89
  "expand_boundary_downgrade",
90
90
  "first_source_ref_only",
91
+ "graph_lane",
91
92
  "gate_vetoed",
92
93
  "grantee_scrub_facts",
93
94
  "grantee_scrub_scores",
@@ -154,7 +155,8 @@
154
155
  "topic_thread_single_store",
155
156
  "unknown_scope",
156
157
  "unmatched_route",
157
- "unrecognized"
158
+ "unrecognized",
159
+ "world_knowledge_no_retrieval"
158
160
  ],
159
161
  "empty_causes": [
160
162
  "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
 
@@ -0,0 +1,152 @@
1
+ """The graph retrieval lane (S6, PLAN_QUERY_LOOP.md): edges as evidence.
2
+
3
+ Before this lane, 272 of 38,060 live edges were readable at query time — one
4
+ edge type, one cohort resolver. The relations the derivation layer builds
5
+ (``communicates_with``, ``co_occurrence``, ``pursues``, ``participates_in``,
6
+ ``located_at``, ``semantic_affinity``) had no reader on the answer path: the
7
+ "Who works on this with me?" probe returned topic-cluster fragments while a
8
+ 528-degree project hub sat unread one table away.
9
+
10
+ This lane contributes 1-hop neighborhoods of the query's linked entities as
11
+ ordinary fusion candidates — at canonical weight, never above (a lane reached
12
+ by a different key but carrying ordinary evidence fuses AT the canonical
13
+ weight; see the lane table in retrieval.py).
14
+
15
+ Privacy posture, deliberately minimal for v1:
16
+
17
+ * **Owner-only.** The lane runs only at ``disclosure_tier == "owner_raw"`` —
18
+ the same proxy the blackhole summary policy trusts, sound because
19
+ ``resolve_disclosure_tier`` never elevates a grantee there. For any other
20
+ tier the lane returns nothing and writes NO ledger receipt: a receipt for a
21
+ withheld lane is itself an existence signal.
22
+ * **Blackhole rides the exit wire.** Items carry the neighbor as
23
+ ``entity_id`` and the anchor as ``subject_entity_id`` — both members of
24
+ ``_BLACKHOLE_ENTITY_ID_KEYS`` — so ``_blackhole_policy_for_summary`` can
25
+ match EITHER endpoint: a black-holed entity can neither appear as a
26
+ neighbor nor be reached through as an anchor. (Owner items are stamped
27
+ ``blackhole_protected``, the taint feed Gate C needs; nothing is silently
28
+ dropped from the owner's own view.)
29
+ * **Anchor admission is the thread lane's.** Callers pass anchor ids that
30
+ already went through ``_entity_thread_entities`` — is_self dropped,
31
+ selector policy honored, fail-closed on an unreadable is_self.
32
+ """
33
+
34
+ from __future__ import annotations
35
+
36
+ import logging
37
+ from typing import Any, Dict, List, Optional
38
+
39
+ from ..features.entities.edges import top_edges
40
+ from . import narrowing as _N
41
+
42
+ logger = logging.getLogger(__name__)
43
+
44
+ #: Neighbors fetched per anchor before the global cap ranks by weight.
45
+ GRAPH_LANE_PER_ANCHOR_LIMIT = 10
46
+ #: Total items the lane may contribute to fusion (SUMMARY_ITEM_CAP is 25;
47
+ #: a graph that floods the packet would drown the content lanes).
48
+ GRAPH_LANE_MAX_ITEMS = 8
49
+
50
+ _EDGE_SENTENCES: Dict[str, str] = {
51
+ "communicates_with": "{a} communicates with {b}",
52
+ "co_occurrence": "{a} and {b} appear together",
53
+ "pursues": "{a} pursues {b}",
54
+ "participates_in": "{a} participates in {b}",
55
+ "located_at": "{a} is located at {b}",
56
+ "semantic_affinity": "{a} is closely related to {b}",
57
+ }
58
+
59
+
60
+ def _edge_sentence(anchor_name: str, neighbor_name: str, edge: Dict[str, Any]) -> str:
61
+ template = _EDGE_SENTENCES.get(
62
+ str(edge.get("edge_type") or ""), "{a} is linked to {b}"
63
+ )
64
+ sentence = template.format(a=anchor_name, b=neighbor_name)
65
+ evidence = edge.get("evidence_count")
66
+ if evidence:
67
+ sentence += f" ({evidence}×)"
68
+ return sentence
69
+
70
+
71
+ def graph_neighborhood_items(
72
+ conn: Any,
73
+ *,
74
+ anchor_ids: List[str],
75
+ anchor_names: Dict[str, str],
76
+ scope_id: str,
77
+ manifest: Any,
78
+ disclosure_tier: str,
79
+ ledger: Optional[Any] = None,
80
+ ) -> List[Dict[str, Any]]:
81
+ """1-hop neighborhoods of the anchors, as fusion-ready summary items.
82
+
83
+ Returns [] — with no ledger receipt — unless the tier is owner_raw and
84
+ the scope warrants relationship structure.
85
+ """
86
+ if str(disclosure_tier or "") != "owner_raw":
87
+ return []
88
+ tables = list(getattr(manifest, "canonical_tables", None) or [])
89
+ # relationship_context:read is the deliberate exception: its declared
90
+ # table is conversation_messages, but relationship STRUCTURE is exactly
91
+ # what the scope's own card advertises ("Who works on this with me?") —
92
+ # the same explicit-scope pattern the goals and emotions lanes use.
93
+ if "entity_edges" not in tables and str(scope_id) != "relationship_context:read":
94
+ return []
95
+ if conn is None or not anchor_ids:
96
+ return []
97
+
98
+ seen: set = set()
99
+ collected: List[Dict[str, Any]] = []
100
+ for anchor_id in anchor_ids:
101
+ anchor_name = anchor_names.get(anchor_id) or anchor_id
102
+ try:
103
+ edges = top_edges(conn, anchor_id, limit=GRAPH_LANE_PER_ANCHOR_LIMIT)
104
+ except Exception as exc: # noqa: BLE001 — one bad anchor must not kill the lane
105
+ logger.debug("graph lane: top_edges failed for %s: %s", anchor_id, exc)
106
+ continue
107
+ for edge in edges:
108
+ neighbor_id = str(edge.get("entity_id") or "")
109
+ edge_type = str(edge.get("edge_type") or "")
110
+ if not neighbor_id or not edge_type:
111
+ continue
112
+ key = (anchor_id, neighbor_id, edge_type)
113
+ if key in seen:
114
+ continue
115
+ seen.add(key)
116
+ neighbor_name = str(edge.get("entity_name") or neighbor_id)
117
+ event_at = edge.get("last_event_at") or edge.get("valid_from")
118
+ item: Dict[str, Any] = {
119
+ "topic": neighbor_name[:120],
120
+ "summary_text": _edge_sentence(anchor_name, neighbor_name, edge),
121
+ # Neighbor and anchor: both endpoints must be matchable by the
122
+ # blackhole exit wire (_BLACKHOLE_ENTITY_ID_KEYS).
123
+ "entity_id": neighbor_id,
124
+ "subject_entity_id": anchor_id,
125
+ "entity_type": edge.get("entity_type"),
126
+ "edge_type": edge_type,
127
+ "relevance_score": float(edge.get("weight") or 0.0),
128
+ "retrieval_source": f"graph:{edge_type}",
129
+ }
130
+ if event_at:
131
+ item["event_at"] = event_at
132
+ collected.append(item)
133
+
134
+ collected.sort(key=lambda i: i.get("relevance_score") or 0.0, reverse=True)
135
+ dropped = max(0, len(collected) - GRAPH_LANE_MAX_ITEMS)
136
+ items = collected[:GRAPH_LANE_MAX_ITEMS]
137
+ if items and ledger is not None:
138
+ try:
139
+ ledger.record(
140
+ _N.STAGE_RETRIEVAL,
141
+ "contributed",
142
+ "graph_lane",
143
+ dropped=dropped,
144
+ detail={
145
+ "anchors": len(anchor_ids),
146
+ "contributed": len(items),
147
+ "edge_types": sorted({i["edge_type"] for i in items}),
148
+ },
149
+ )
150
+ except Exception: # noqa: BLE001 — the ledger never breaks a turn
151
+ pass
152
+ return items
@@ -195,6 +195,7 @@ REASONS = frozenset(
195
195
  "embedded_subject_not_instruction",
196
196
  "entity_thread_is_self",
197
197
  "entity_thread_lane",
198
+ "graph_lane",
198
199
  "entity_thread_selector_not_accessible",
199
200
  "entity_thread_self_check_unavailable",
200
201
  "entity_thread_unresolved",
@@ -299,6 +300,7 @@ REASONS = frozenset(
299
300
  "source_has_live_tools",
300
301
  "source_ref",
301
302
  "summary_enrichment",
303
+ "world_knowledge_no_retrieval",
302
304
  # --- control plane: refusals that never reach the node. The human-readable
303
305
  # sentence stays on the response's own `deny_reason`; the ledger carries the code.
304
306
  "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
@@ -4716,7 +4716,10 @@ _NO_DECAY_FUSION_SOURCES = frozenset(
4716
4716
  # a RelationshipEdge or a dossier is a statement about how things ARE, not
4717
4717
  # an event that happened at a time. Decaying it would rank the owner's
4718
4718
  # mother below last night's chatter.
4719
- {"stat_insights", "facts_store", "entities", "briefs", "goals", "derived_objects"}
4719
+ # S6 "graph": an edge is a statement about how things stand between two
4720
+ # entities, not an event — decayed by created_at, the owner's closest
4721
+ # collaborator would rank below last night's chatter.
4722
+ {"stat_insights", "facts_store", "entities", "briefs", "goals", "derived_objects", "graph"}
4720
4723
  )
4721
4724
 
4722
4725
 
@@ -5634,6 +5637,7 @@ def _build_summary_items_unfiltered(
5634
5637
  entity_items: List[Dict[str, Any]] = []
5635
5638
  entity_thread_items: List[Dict[str, Any]] = []
5636
5639
  fact_store_items: List[Dict[str, Any]] = []
5640
+ graph_items: List[Dict[str, Any]] = []
5637
5641
  if query_text:
5638
5642
  try:
5639
5643
  from ..core.state import get_db_connection
@@ -5688,6 +5692,32 @@ def _build_summary_items_unfiltered(
5688
5692
  ledger=ledger,
5689
5693
  thread_sink=thread_sink,
5690
5694
  )
5695
+ # S6: the graph lane — the same resolution, one join outward.
5696
+ # `entity_context_items` says what the graph KNOWS about the
5697
+ # entity; the thread lane fetches its RECORDS; this contributes
5698
+ # its RELATIONS — the edges no lane could previously read. Own
5699
+ # try/except: a graph failure must not also kill the thread
5700
+ # lane (this block's outer except swallows everything).
5701
+ try:
5702
+ from .graph_lane import graph_neighborhood_items
5703
+
5704
+ anchor_ids, _skipped = _entity_thread_entities(
5705
+ conn, linked, manifest=manifest
5706
+ )
5707
+ graph_items = graph_neighborhood_items(
5708
+ conn,
5709
+ anchor_ids=anchor_ids,
5710
+ anchor_names={
5711
+ str(e.get("entity_id")): str(e.get("canonical_name") or "")
5712
+ for e in linked
5713
+ },
5714
+ scope_id=str(getattr(manifest, "scope_id", "") or ""),
5715
+ manifest=manifest,
5716
+ disclosure_tier=disclosure_tier,
5717
+ ledger=ledger,
5718
+ )
5719
+ except Exception as graph_exc: # noqa: BLE001
5720
+ logger.debug("graph lane skipped: %s", graph_exc)
5691
5721
  except Exception as exc:
5692
5722
  logger.debug("entity linking skipped: %s", exc)
5693
5723
 
@@ -5803,6 +5833,15 @@ def _build_summary_items_unfiltered(
5803
5833
  if ai_scope and canonical_items:
5804
5834
  min_per = dict(min_per or {})
5805
5835
  min_per["canonical"] = max(int(min_per.get("canonical") or 0), 3)
5836
+ # S6: the graph lane only produces items under the scopes that
5837
+ # advertise relationship STRUCTURE (relationship_context:read,
5838
+ # graph:read) — and on a rich corpus its RRF share at canonical
5839
+ # weight loses the top-25 to sixteen content lanes (measured on the
5840
+ # owner snapshot: 8 lane items, 0 survivors). Structure is the
5841
+ # product there, so it keeps a two-slot spine, same as goals.
5842
+ if graph_items:
5843
+ min_per = dict(min_per or {})
5844
+ min_per["graph"] = max(int(min_per.get("graph") or 0), 2)
5806
5845
  # NOTE: cosine similarity must NOT waive the zero-df gate — a strong hit
5807
5846
  # on the generic half of a query ("compiler rewrite") cannot evidence a
5808
5847
  # name the corpus does not contain ("Threnody-7"). The N-lane found
@@ -5822,6 +5861,11 @@ def _build_summary_items_unfiltered(
5822
5861
  # ordinary canonical evidence that arrived by a different key, so
5823
5862
  # it fuses at the canonical lane's own weight.
5824
5863
  ("entity_thread", 1.0, entity_thread_items),
5864
+ # S6: edges are ordinary evidence that arrived by the entity
5865
+ # key instead of a content key — the same argument as the
5866
+ # thread lane, so the same weight: beside the scope routes,
5867
+ # never above them.
5868
+ ("graph", 1.0, graph_items),
5825
5869
  # Q1. Same argument, same weight: evidence for a stated goal is
5826
5870
  # ordinary canonical evidence that arrived keyed to that goal's ids.
5827
5871
  # It is a joined minority lane beside the scope routes, never above
@@ -5858,6 +5902,7 @@ def _build_summary_items_unfiltered(
5858
5902
  + entity_items
5859
5903
  + derived_items
5860
5904
  + entity_thread_items
5905
+ + graph_items
5861
5906
  + commitment_items
5862
5907
  + goal_items
5863
5908
  + emotion_items
@@ -6638,6 +6683,16 @@ class DefaultSignalRetrievalAdapter:
6638
6683
  )
6639
6684
  if summaries:
6640
6685
  touched.append("signal")
6686
+ # S6: the graph store is declared touched when the graph lane
6687
+ # actually contributed — the Shortfall probe's assertion target
6688
+ # ("Who works on this with me?" must consult the graph, not
6689
+ # topic-cluster noise). Checked on items rather than threaded
6690
+ # through a sink: the lane's provenance prefix IS the signal.
6691
+ if any(
6692
+ str(item.get("retrieval_source") or "").startswith("graph:")
6693
+ for item in summaries
6694
+ ):
6695
+ touched.append("graph")
6641
6696
  # Surface the planner's parsed window so synthesis can state
6642
6697
  # which dates were searched ("nothing from 2026-07-16") instead
6643
6698
  # of inferring it from per-item timestamps. Summary mode only:
@@ -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": "live"
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.