topos-node 1.5.8__tar.gz → 1.5.9__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 (931) hide show
  1. {topos_node-1.5.8/topos_node.egg-info → topos_node-1.5.9}/PKG-INFO +1 -1
  2. {topos_node-1.5.8 → topos_node-1.5.9}/pyproject.toml +1 -1
  3. {topos_node-1.5.8 → topos_node-1.5.9}/topos/__version__.py +2 -2
  4. {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/luck_surface.py +143 -70
  5. {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/messenger_directed.py +69 -22
  6. {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/relationship_reads.py +33 -3
  7. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/enrichment.py +16 -2
  8. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/sources_overview.py +2 -2
  9. {topos_node-1.5.8 → topos_node-1.5.9}/topos/app.py +7 -0
  10. {topos_node-1.5.8 → topos_node-1.5.9}/topos/control_plane_client.py +108 -2
  11. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/__init__.py +27 -4
  12. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/config.py +3 -3
  13. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/database_explorer.py +7 -5
  14. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/device.py +6 -3
  15. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/enrichment.py +4 -6
  16. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/messages.py +1 -1
  17. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/permissions_v2.py +4 -1
  18. topos_node-1.5.9/topos/core/handlers/registry.py +80 -0
  19. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/signal_features.py +1 -1
  20. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/backends/ollama.py +5 -0
  21. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/registration.py +37 -2
  22. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/orchestrator.py +7 -1
  23. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/record_progress.py +19 -0
  24. topos_node-1.5.9/topos/features/derivation/bench_evidence.py +108 -0
  25. topos_node-1.5.9/topos/features/derivation/bench_lineup.py +81 -0
  26. topos_node-1.5.9/topos/features/derivation/bench_readiness.py +164 -0
  27. topos_node-1.5.9/topos/features/derivation/bench_sources.py +258 -0
  28. topos_node-1.5.9/topos/features/derivation/goal_evidence.py +43 -0
  29. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/social_bench.py +141 -111
  30. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/facts/llm_extract.py +12 -9
  31. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/answer_checks.py +32 -1
  32. topos_node-1.5.9/topos/permissions_v2/answer_gate.py +158 -0
  33. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/answer_generation.py +453 -27
  34. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/answer_protocol.py +24 -1
  35. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/answer_release.py +296 -21
  36. topos_node-1.5.9/topos/permissions_v2/answer_time.py +330 -0
  37. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/answer_transport.py +45 -3
  38. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/entailment_grounding.py +5 -0
  39. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/entity_boundary.py +262 -8
  40. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/evidence.py +60 -3
  41. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/fact_preview.py +2 -0
  42. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/knowledge_contract.py +7 -4
  43. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/knowledge_projections.py +5 -1
  44. topos_node-1.5.9/topos/permissions_v2/loop_lag.py +170 -0
  45. topos_node-1.5.9/topos/permissions_v2/owner_account_words.py +116 -0
  46. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/projection_reviews.py +4 -2
  47. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/reconciliation_facts.py +3 -0
  48. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/refresh_loop.py +26 -7
  49. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/runtime.py +7 -0
  50. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/search_contract.py +5 -1
  51. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/search_index.py +69 -7
  52. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/search_lanes.py +48 -13
  53. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/search_release.py +357 -37
  54. topos_node-1.5.9/topos/permissions_v2/search_timing.py +910 -0
  55. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/search_transport.py +4 -2
  56. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/selective_facts.py +30 -0
  57. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/shadow_labeler_local.py +5 -0
  58. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/share_counts.py +2 -0
  59. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/switches.py +98 -3
  60. {topos_node-1.5.8 → topos_node-1.5.9}/topos/pipeline/job_runner.py +5 -1
  61. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/planner.py +31 -3
  62. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/retrieval.py +116 -29
  63. {topos_node-1.5.8 → topos_node-1.5.9}/topos/sanitization/ollama_transforms.py +3 -0
  64. {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/llm/openai.py +8 -0
  65. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/write_gate.py +145 -24
  66. {topos_node-1.5.8 → topos_node-1.5.9}/topos/upgrades/manifests.json +6 -0
  67. {topos_node-1.5.8 → topos_node-1.5.9/topos_node.egg-info}/PKG-INFO +1 -1
  68. {topos_node-1.5.8 → topos_node-1.5.9}/topos_node.egg-info/SOURCES.txt +8 -0
  69. topos_node-1.5.8/topos/core/handlers/registry.py +0 -43
  70. topos_node-1.5.8/topos/permissions_v2/answer_gate.py +0 -48
  71. topos_node-1.5.8/topos/permissions_v2/search_timing.py +0 -418
  72. {topos_node-1.5.8 → topos_node-1.5.9}/LICENSE +0 -0
  73. {topos_node-1.5.8 → topos_node-1.5.9}/MANIFEST.in +0 -0
  74. {topos_node-1.5.8 → topos_node-1.5.9}/README.md +0 -0
  75. {topos_node-1.5.8 → topos_node-1.5.9}/setup.cfg +0 -0
  76. {topos_node-1.5.8 → topos_node-1.5.9}/shared/__init__.py +0 -0
  77. {topos_node-1.5.8 → topos_node-1.5.9}/shared/filtering.py +0 -0
  78. {topos_node-1.5.8 → topos_node-1.5.9}/shared/schema_registry.py +0 -0
  79. {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_active_database_binding.py +0 -0
  80. {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_active_ingestion_binding.py +0 -0
  81. {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_app_relay_wiring.py +0 -0
  82. {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_extensions.py +0 -0
  83. {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_gate_leg_hermeticity.py +0 -0
  84. {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_hub_pipeline_offline_first.py +0 -0
  85. {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_lane_shards.py +0 -0
  86. {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_llm_integrations_storage.py +0 -0
  87. {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_local_gate_composition.py +0 -0
  88. {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_owner_database_hermeticity.py +0 -0
  89. {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_prewarm_first_run.py +0 -0
  90. {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_profile_hygiene.py +0 -0
  91. {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_profiles.py +0 -0
  92. {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_protocol_handled_types.py +0 -0
  93. {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_query_field_contract.py +0 -0
  94. {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_sync_dep_pins.py +0 -0
  95. {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_system_computer_name.py +0 -0
  96. {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_topos_home_hermeticity.py +0 -0
  97. {topos_node-1.5.8 → topos_node-1.5.9}/topos/__init__.py +0 -0
  98. {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/__init__.py +0 -0
  99. {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/dataset_resolution.py +0 -0
  100. {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/duckdb_adapter.py +0 -0
  101. {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/messenger_communities.py +0 -0
  102. {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/messenger_graph.py +0 -0
  103. {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/messenger_labels.py +0 -0
  104. {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/person_graph.py +0 -0
  105. {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/person_overlay.py +0 -0
  106. {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/profiles.py +0 -0
  107. {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/query_engine.py +0 -0
  108. {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/raw_queries.py +0 -0
  109. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/__init__.py +0 -0
  110. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/analytics.py +0 -0
  111. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/app_registry.py +0 -0
  112. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/backup.py +0 -0
  113. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/community_naming_config.py +0 -0
  114. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/compute_remote.py +0 -0
  115. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/connected_apps.py +0 -0
  116. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/conversation_context.py +0 -0
  117. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/data_commit.py +0 -0
  118. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/data_explorer_table_prefs.py +0 -0
  119. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/database_explorer.py +0 -0
  120. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/db.py +0 -0
  121. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/device.py +0 -0
  122. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/disk_space_config.py +0 -0
  123. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/engine_run.py +0 -0
  124. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/enrichment_lab.py +0 -0
  125. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/facts_llm_config.py +0 -0
  126. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/filter_lab.py +0 -0
  127. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/health.py +0 -0
  128. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/home_chat.py +0 -0
  129. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/ingestion_api.py +0 -0
  130. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/ingestion_compat.py +0 -0
  131. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/ingestion_sources.py +0 -0
  132. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/intelligence_lifecycle.py +0 -0
  133. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/llm.py +0 -0
  134. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/local_mcp.py +0 -0
  135. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/messenger_analytics.py +0 -0
  136. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/nsfw_maintenance.py +0 -0
  137. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/permissions_ai_chat_capture.py +0 -0
  138. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/permissions_capture_receipts.py +0 -0
  139. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/permissions_identity.py +0 -0
  140. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/permissions_ingestion.py +0 -0
  141. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/permissions_native_probe.py +0 -0
  142. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/permissions_search_maintenance.py +0 -0
  143. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/permissions_source_installs.py +0 -0
  144. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/privacy_disclose.py +0 -0
  145. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/query_api.py +0 -0
  146. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/runtime_bootstrap.py +0 -0
  147. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/sanitization_ollama_config.py +0 -0
  148. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/shell.py +0 -0
  149. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/signal.py +0 -0
  150. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/signal_extraction_config.py +0 -0
  151. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/source_install.py +0 -0
  152. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/source_retention.py +0 -0
  153. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/source_scrub.py +0 -0
  154. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/sources.py +0 -0
  155. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/sync.py +0 -0
  156. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/tool_index.py +0 -0
  157. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/ui_config.py +0 -0
  158. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/upgrades.py +0 -0
  159. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/usage.py +0 -0
  160. {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/user_identity.py +0 -0
  161. {topos_node-1.5.8 → topos_node-1.5.9}/topos/auth.py +0 -0
  162. {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/__init__.py +0 -0
  163. {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/declared_field_map.py +0 -0
  164. {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/mappers/__init__.py +0 -0
  165. {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/mappers/base.py +0 -0
  166. {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
  167. {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
  168. {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/mappers/demo_mappers.py +0 -0
  169. {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/mappers/documents_mapper.py +0 -0
  170. {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
  171. {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
  172. {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/mappers/grok_mapper.py +0 -0
  173. {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
  174. {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/mappers/transcript_mapper.py +0 -0
  175. {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/models.py +0 -0
  176. {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/resolver.py +0 -0
  177. {topos_node-1.5.8 → topos_node-1.5.9}/topos/cli/__init__.py +0 -0
  178. {topos_node-1.5.8 → topos_node-1.5.9}/topos/cli/__main__.py +0 -0
  179. {topos_node-1.5.8 → topos_node-1.5.9}/topos/cli/assets/topos_black.png +0 -0
  180. {topos_node-1.5.8 → topos_node-1.5.9}/topos/cli/assets/topos_blk_rounded.png +0 -0
  181. {topos_node-1.5.8 → topos_node-1.5.9}/topos/cli/assets/topos_white.png +0 -0
  182. {topos_node-1.5.8 → topos_node-1.5.9}/topos/cli/commands.py +0 -0
  183. {topos_node-1.5.8 → topos_node-1.5.9}/topos/cli/profile_cmd.py +0 -0
  184. {topos_node-1.5.8 → topos_node-1.5.9}/topos/cli/reprocess_cmd.py +0 -0
  185. {topos_node-1.5.8 → topos_node-1.5.9}/topos/cli/setup_models_cmd.py +0 -0
  186. {topos_node-1.5.8 → topos_node-1.5.9}/topos/cli/tray.py +0 -0
  187. {topos_node-1.5.8 → topos_node-1.5.9}/topos/config/__init__.py +0 -0
  188. {topos_node-1.5.8 → topos_node-1.5.9}/topos/config/conversation_context_llm.py +0 -0
  189. {topos_node-1.5.8 → topos_node-1.5.9}/topos/config/facts_llm.py +0 -0
  190. {topos_node-1.5.8 → topos_node-1.5.9}/topos/config/local_model_builds.py +0 -0
  191. {topos_node-1.5.8 → topos_node-1.5.9}/topos/config/model_packs.py +0 -0
  192. {topos_node-1.5.8 → topos_node-1.5.9}/topos/config/node_function_providers.py +0 -0
  193. {topos_node-1.5.8 → topos_node-1.5.9}/topos/config/sanitization_ollama.py +0 -0
  194. {topos_node-1.5.8 → topos_node-1.5.9}/topos/config/settings.py +0 -0
  195. {topos_node-1.5.8 → topos_node-1.5.9}/topos/config/signal_extraction.py +0 -0
  196. {topos_node-1.5.8 → topos_node-1.5.9}/topos/config/uvicorn_logging.json +0 -0
  197. {topos_node-1.5.8 → topos_node-1.5.9}/topos/contacts/__init__.py +0 -0
  198. {topos_node-1.5.8 → topos_node-1.5.9}/topos/contacts/identity.py +0 -0
  199. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/__init__.py +0 -0
  200. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/api_models.py +0 -0
  201. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/connection_resilience.py +0 -0
  202. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/db_health.py +0 -0
  203. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/device_helpers.py +0 -0
  204. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/errors.py +0 -0
  205. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/events.py +0 -0
  206. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/aggregate.py +0 -0
  207. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/common.py +0 -0
  208. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/complexity.py +0 -0
  209. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/contacts_import.py +0 -0
  210. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/derivation.py +0 -0
  211. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/enrichment_lab.py +0 -0
  212. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/filter_lab.py +0 -0
  213. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/graph_query.py +0 -0
  214. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/graph_summary.py +0 -0
  215. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/home_chat.py +0 -0
  216. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/ingest.py +0 -0
  217. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/mcp_client_elevations.py +0 -0
  218. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/mcp_clients.py +0 -0
  219. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/messenger_analytics.py +0 -0
  220. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/permissions_v2_bind.py +0 -0
  221. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/permissions_v2_identity.py +0 -0
  222. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/permissions_v2_ingestion.py +0 -0
  223. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/permissions_v2_owner.py +0 -0
  224. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/permissions_v2_release.py +0 -0
  225. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/query.py +0 -0
  226. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/routines.py +0 -0
  227. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/sources.py +0 -0
  228. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/timeline_daily.py +0 -0
  229. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/tool_index.py +0 -0
  230. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/logging.py +0 -0
  231. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/metrics.py +0 -0
  232. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/routine_access.py +0 -0
  233. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/startup_banner.py +0 -0
  234. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/state.py +0 -0
  235. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/table_layers.py +0 -0
  236. {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/types.py +0 -0
  237. {topos_node-1.5.8 → topos_node-1.5.9}/topos/data_explorer_row_delete.py +0 -0
  238. {topos_node-1.5.8 → topos_node-1.5.9}/topos/data_explorer_table_prefs.py +0 -0
  239. {topos_node-1.5.8 → topos_node-1.5.9}/topos/data_explorer_tables.py +0 -0
  240. {topos_node-1.5.8 → topos_node-1.5.9}/topos/defaults.py +0 -0
  241. {topos_node-1.5.8 → topos_node-1.5.9}/topos/disclosure/__init__.py +0 -0
  242. {topos_node-1.5.8 → topos_node-1.5.9}/topos/disclosure/canonical_writer.py +0 -0
  243. {topos_node-1.5.8 → topos_node-1.5.9}/topos/disclosure/content_policy.py +0 -0
  244. {topos_node-1.5.8 → topos_node-1.5.9}/topos/disclosure/disclosure_sweep.py +0 -0
  245. {topos_node-1.5.8 → topos_node-1.5.9}/topos/disclosure/field_registry.py +0 -0
  246. {topos_node-1.5.8 → topos_node-1.5.9}/topos/disclosure/nsfw_tags.py +0 -0
  247. {topos_node-1.5.8 → topos_node-1.5.9}/topos/disclosure/privacy_layer.py +0 -0
  248. {topos_node-1.5.8 → topos_node-1.5.9}/topos/disclosure/tier.py +0 -0
  249. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/__init__.py +0 -0
  250. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/backends/__init__.py +0 -0
  251. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/backends/base.py +0 -0
  252. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/backends/generative_prompts.py +0 -0
  253. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/backends/generative_response.py +0 -0
  254. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/backends/huggingface.py +0 -0
  255. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/backends/openai.py +0 -0
  256. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/backends/openai_compatible.py +0 -0
  257. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/backends/redpill.py +0 -0
  258. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/backends/stub.py +0 -0
  259. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/client.py +0 -0
  260. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/disk_space.py +0 -0
  261. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/engine.py +0 -0
  262. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/hosted_llm_wallet.py +0 -0
  263. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/intake.py +0 -0
  264. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/memory_utils.py +0 -0
  265. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/model_cache.py +0 -0
  266. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/model_manager.py +0 -0
  267. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/ollama_install.py +0 -0
  268. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/ollama_pull.py +0 -0
  269. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/ollama_runtime.py +0 -0
  270. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/ollama_setup_guidance.py +0 -0
  271. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/pipeline_memory.py +0 -0
  272. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/queue_manager.py +0 -0
  273. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/result_formatter.py +0 -0
  274. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/router.py +0 -0
  275. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/scoped_token.py +0 -0
  276. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/tasks.py +0 -0
  277. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/torch_runtime.py +0 -0
  278. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/transport.py +0 -0
  279. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/usage_guard.py +0 -0
  280. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/usage_observation.py +0 -0
  281. {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/validator.py +0 -0
  282. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/__init__.py +0 -0
  283. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/catalog.py +0 -0
  284. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/derivation_recovery.py +0 -0
  285. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/derived_tables.py +0 -0
  286. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/job_readiness.py +0 -0
  287. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/job_writer.py +0 -0
  288. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/__init__.py +0 -0
  289. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/base.py +0 -0
  290. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/__init__.py +0 -0
  291. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
  292. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
  293. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
  294. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
  295. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
  296. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
  297. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/derivation_job.py +0 -0
  298. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/derived_object_embeddings_job.py +0 -0
  299. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
  300. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
  301. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
  302. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
  303. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
  304. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
  305. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
  306. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
  307. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
  308. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
  309. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
  310. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
  311. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
  312. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/raw/__init__.py +0 -0
  313. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
  314. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/raw/language_job.py +0 -0
  315. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
  316. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
  317. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/model_overrides.py +0 -0
  318. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/models/__init__.py +0 -0
  319. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/models/manager.py +0 -0
  320. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/models/mvp_defaults.py +0 -0
  321. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/models/registry.py +0 -0
  322. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/models/versioning.py +0 -0
  323. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/pipeline_activity.py +0 -0
  324. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/processor.py +0 -0
  325. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/progress_bar.py +0 -0
  326. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/registry_contract.py +0 -0
  327. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/signal_derivation_config.json +0 -0
  328. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/source_overrides.py +0 -0
  329. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment_lab/__init__.py +0 -0
  330. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment_lab/bundles.py +0 -0
  331. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment_lab/model_resolve.py +0 -0
  332. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment_lab/schema.py +0 -0
  333. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment_lab/service.py +0 -0
  334. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment_lab/store.py +0 -0
  335. {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment_lab/worker.py +0 -0
  336. {topos_node-1.5.8 → topos_node-1.5.9}/topos/evals/__init__.py +0 -0
  337. {topos_node-1.5.8 → topos_node-1.5.9}/topos/evals/enrichment_eval.py +0 -0
  338. {topos_node-1.5.8 → topos_node-1.5.9}/topos/extensions.py +0 -0
  339. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/__init__.py +0 -0
  340. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/canonical.py +0 -0
  341. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/engine.py +0 -0
  342. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/entropy.py +0 -0
  343. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/focus.py +0 -0
  344. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/graph_metrics.py +0 -0
  345. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/influence.py +0 -0
  346. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/projection.py +0 -0
  347. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/snapshots.py +0 -0
  348. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/store.py +0 -0
  349. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/topic_merge.py +0 -0
  350. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/topics.py +0 -0
  351. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/topics_daily.py +0 -0
  352. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/volatility.py +0 -0
  353. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/__init__.py +0 -0
  354. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/_scales.yaml +0 -0
  355. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/admin.legal.yaml +0 -0
  356. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/aspirations.goals.yaml +0 -0
  357. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/behavior.habits.yaml +0 -0
  358. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/behavior.preferences.yaml +0 -0
  359. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/beliefs.civic.yaml +0 -0
  360. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/beliefs.spiritual.yaml +0 -0
  361. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/communication.style.yaml +0 -0
  362. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/community.membership.yaml +0 -0
  363. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/craft.tooling.yaml +0 -0
  364. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/expertise.knowledge.yaml +0 -0
  365. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/finances.economics.yaml +0 -0
  366. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/health.lifestyle.yaml +0 -0
  367. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/health.mental.yaml +0 -0
  368. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/health.physical.yaml +0 -0
  369. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/household.pets.yaml +0 -0
  370. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/identity.core.yaml +0 -0
  371. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/interests.taste.yaml +0 -0
  372. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/life.events.yaml +0 -0
  373. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/narrative.self.yaml +0 -0
  374. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/net.capability.yaml +0 -0
  375. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/net.character.yaml +0 -0
  376. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/obligations.commitments.yaml +0 -0
  377. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/personality.traits.yaml +0 -0
  378. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/places.mobility.yaml +0 -0
  379. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/possessions.assets.yaml +0 -0
  380. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/relationships.social.yaml +0 -0
  381. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/values.motivation.yaml +0 -0
  382. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/vocab/dispositions.yaml +0 -0
  383. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/vocab/expertise.yaml +0 -0
  384. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/vocab/habits.yaml +0 -0
  385. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/vocab/interests.yaml +0 -0
  386. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/vocab/preferences.yaml +0 -0
  387. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/vocab/stances.yaml +0 -0
  388. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/vocab/tools.yaml +0 -0
  389. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/vocab/values.yaml +0 -0
  390. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/work.career.yaml +0 -0
  391. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/candidates.py +0 -0
  392. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/commitments.py +0 -0
  393. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/guard.py +0 -0
  394. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/kernels.py +0 -0
  395. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/net_subject_policy.py +0 -0
  396. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/packs.py +0 -0
  397. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/person_bridge.py +0 -0
  398. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/person_reading.py +0 -0
  399. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/prefilter.py +0 -0
  400. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/registry.py +0 -0
  401. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/report_card.py +0 -0
  402. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/router.py +0 -0
  403. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/social_kernels.py +0 -0
  404. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/surfaces.py +0 -0
  405. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/synthesize.py +0 -0
  406. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/template.py +0 -0
  407. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/verify.py +0 -0
  408. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/writer.py +0 -0
  409. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/__init__.py +0 -0
  410. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/affinity.py +0 -0
  411. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/affinity_owner.py +0 -0
  412. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/affinity_quality.py +0 -0
  413. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/chatgpt_declared.py +0 -0
  414. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/community_names.py +0 -0
  415. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/community_naming.py +0 -0
  416. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/consolidation.py +0 -0
  417. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/context_vectors.py +0 -0
  418. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/cypher.py +0 -0
  419. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/declared_mappings.py +0 -0
  420. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/discourse_graph.py +0 -0
  421. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/dossier.py +0 -0
  422. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/edges.py +0 -0
  423. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/fact_materializer.py +0 -0
  424. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/graph_enrichers.py +0 -0
  425. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/graph_inputs.py +0 -0
  426. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/graph_refresh.py +0 -0
  427. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/graph_search.py +0 -0
  428. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/linking.py +0 -0
  429. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/maintenance.py +0 -0
  430. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/mention_lineage.py +0 -0
  431. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/mention_lineage_lane.py +0 -0
  432. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/owner.py +0 -0
  433. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/reads.py +0 -0
  434. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/rebuild_subprocess.py +0 -0
  435. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/resolver.py +0 -0
  436. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/structured_fields.py +0 -0
  437. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/facts/__init__.py +0 -0
  438. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/facts/evidence_time.py +0 -0
  439. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/facts/extract.py +0 -0
  440. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/facts/reactions.py +0 -0
  441. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/facts/reads.py +0 -0
  442. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/facts/store.py +0 -0
  443. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/facts/verdicts.py +0 -0
  444. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/fit/evaluator.py +0 -0
  445. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/fit/opportunity_types.json +0 -0
  446. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/__init__.py +0 -0
  447. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/blackhole.py +0 -0
  448. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/blackhole_guard.py +0 -0
  449. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/blackhole_llm.py +0 -0
  450. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/blackhole_rebuild.py +0 -0
  451. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/carry_diagnosis.py +0 -0
  452. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/contact_excludes.py +0 -0
  453. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/derived_scrub.py +0 -0
  454. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/exclusions.py +0 -0
  455. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/gc.py +0 -0
  456. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/off_limits_list.py +0 -0
  457. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/off_limits_view.py +0 -0
  458. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/record_protection.py +0 -0
  459. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/provenance/__init__.py +0 -0
  460. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/provenance/posture.py +0 -0
  461. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/provenance/roles.py +0 -0
  462. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/provenance/writer_class.py +0 -0
  463. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/__init__.py +0 -0
  464. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/brief_canonical_loader.py +0 -0
  465. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/brief_ontology.py +0 -0
  466. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/brief_renderer.py +0 -0
  467. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/brief_schemas.py +0 -0
  468. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/chunking.py +0 -0
  469. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/cluster_labels.py +0 -0
  470. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/conversation_context.py +0 -0
  471. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/conversation_windows.py +0 -0
  472. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/data_health.py +0 -0
  473. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/brief_ontologies.json +0 -0
  474. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/intentions.json +0 -0
  475. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/interests.json +0 -0
  476. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/memory.json +0 -0
  477. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/places.json +0 -0
  478. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/profile.json +0 -0
  479. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/relationships.json +0 -0
  480. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/resources.json +0 -0
  481. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
  482. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/time.json +0 -0
  483. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/wellbeing.json +0 -0
  484. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/work.json +0 -0
  485. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/derived_index.py +0 -0
  486. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/derived_spec.py +0 -0
  487. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/dimension_briefs.py +0 -0
  488. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/dimension_definition_loader.py +0 -0
  489. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/dimension_profiles.py +0 -0
  490. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/dimension_registry.py +0 -0
  491. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/embed_context.py +0 -0
  492. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/extraction/artifact_router.py +0 -0
  493. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/extraction/artifact_store.py +0 -0
  494. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/extraction/rule_extractors.py +0 -0
  495. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/graph_sanitize.py +0 -0
  496. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/hybrid_search.py +0 -0
  497. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/incremental_clustering.py +0 -0
  498. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/model_recommendations.py +0 -0
  499. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/query_embed_cache.py +0 -0
  500. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/schemas.py +0 -0
  501. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/service.py +0 -0
  502. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/signal_object_store.py +0 -0
  503. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/source_hydration.py +0 -0
  504. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/structured_signal.py +0 -0
  505. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/tool_index.py +0 -0
  506. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/topic_clustering.py +0 -0
  507. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/typed_stores/aggregates.py +0 -0
  508. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/typed_stores/commitments.py +0 -0
  509. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/typed_stores/rhythm.py +0 -0
  510. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
  511. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/vector_codec.py +0 -0
  512. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/vector_math.py +0 -0
  513. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/vector_settings.py +0 -0
  514. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/stats/__init__.py +0 -0
  515. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/stats/definitions.py +0 -0
  516. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/stats/engine.py +0 -0
  517. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/stats/fold.py +0 -0
  518. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/stats/insights.py +0 -0
  519. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/temporal/__init__.py +0 -0
  520. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/temporal/points.py +0 -0
  521. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/temporal/records.py +0 -0
  522. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/timeline_projection.py +0 -0
  523. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/timeline_rollup.py +0 -0
  524. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/triage/__init__.py +0 -0
  525. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/triage/badges.py +0 -0
  526. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/triage/daily.py +0 -0
  527. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/triage/dashboard.py +0 -0
  528. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/triage/instruments.py +0 -0
  529. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/triage/intents.py +0 -0
  530. {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/triage/readiness.py +0 -0
  531. {topos_node-1.5.8 → topos_node-1.5.9}/topos/filter_lab/__init__.py +0 -0
  532. {topos_node-1.5.8 → topos_node-1.5.9}/topos/filter_lab/bundles.py +0 -0
  533. {topos_node-1.5.8 → topos_node-1.5.9}/topos/filter_lab/schema.py +0 -0
  534. {topos_node-1.5.8 → topos_node-1.5.9}/topos/filter_lab/service.py +0 -0
  535. {topos_node-1.5.8 → topos_node-1.5.9}/topos/filter_lab/store.py +0 -0
  536. {topos_node-1.5.8 → topos_node-1.5.9}/topos/filter_lab/worker.py +0 -0
  537. {topos_node-1.5.8 → topos_node-1.5.9}/topos/home_chat/__init__.py +0 -0
  538. {topos_node-1.5.8 → topos_node-1.5.9}/topos/home_chat/memory.py +0 -0
  539. {topos_node-1.5.8 → topos_node-1.5.9}/topos/home_chat/schema.py +0 -0
  540. {topos_node-1.5.8 → topos_node-1.5.9}/topos/home_chat/store.py +0 -0
  541. {topos_node-1.5.8 → topos_node-1.5.9}/topos/hosted_pool_lease.py +0 -0
  542. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/__init__.py +0 -0
  543. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/canonical_pipeline.py +0 -0
  544. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/chatgpt_owner_snapshot.py +0 -0
  545. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/checkpoints/__init__.py +0 -0
  546. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
  547. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
  548. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/imessage_attributed_text.py +0 -0
  549. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/inbox_crypto.py +0 -0
  550. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/inbox_drain.py +0 -0
  551. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/ingest_helpers.py +0 -0
  552. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/jobs.py +0 -0
  553. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/journal_location_fanout.py +0 -0
  554. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/journal_time_log_normalize.py +0 -0
  555. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/local_exports.py +0 -0
  556. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/local_sync.py +0 -0
  557. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/local_sync_jobs.py +0 -0
  558. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/local_sync_schedule.py +0 -0
  559. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/log_preview.py +0 -0
  560. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/manager.py +0 -0
  561. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/owner_snapshot.py +0 -0
  562. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parser.py +0 -0
  563. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/__init__.py +0 -0
  564. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/base.py +0 -0
  565. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/browser_parser.py +0 -0
  566. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/calendar_parser.py +0 -0
  567. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
  568. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/chatgpt_export.py +0 -0
  569. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
  570. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
  571. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/documents_parser.py +0 -0
  572. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/github_activity_parser.py +0 -0
  573. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
  574. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/grok_parser.py +0 -0
  575. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/messenger_parser.py +0 -0
  576. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/transcript_parser.py +0 -0
  577. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/voxterm_parser.py +0 -0
  578. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/progress.py +0 -0
  579. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/reprocess.py +0 -0
  580. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/sources/__init__.py +0 -0
  581. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/sources/base.py +0 -0
  582. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/sources/calendar.py +0 -0
  583. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/sources/chatgpt.py +0 -0
  584. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/sources/contact_importers.py +0 -0
  585. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/sources/grok.py +0 -0
  586. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/sources/imessage_reader.py +0 -0
  587. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/sources/signal_export_parser.py +0 -0
  588. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/sources/signal_reader.py +0 -0
  589. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/state_machine.py +0 -0
  590. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/triggers/__init__.py +0 -0
  591. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/triggers/file_trigger.py +0 -0
  592. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
  593. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/usage_inbox_dedupe.py +0 -0
  594. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/validation/__init__.py +0 -0
  595. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/validation/base.py +0 -0
  596. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/validation/schema_registry.py +0 -0
  597. {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/validation/schema_validator.py +0 -0
  598. {topos_node-1.5.8 → topos_node-1.5.9}/topos/lineage/__init__.py +0 -0
  599. {topos_node-1.5.8 → topos_node-1.5.9}/topos/lineage/provenance.py +0 -0
  600. {topos_node-1.5.8 → topos_node-1.5.9}/topos/lineage/tracker.py +0 -0
  601. {topos_node-1.5.8 → topos_node-1.5.9}/topos/llm_integrations_storage.py +0 -0
  602. {topos_node-1.5.8 → topos_node-1.5.9}/topos/mcp_clients.py +0 -0
  603. {topos_node-1.5.8 → topos_node-1.5.9}/topos/mcp_stdio_proxy.py +0 -0
  604. {topos_node-1.5.8 → topos_node-1.5.9}/topos/node_stop.py +0 -0
  605. {topos_node-1.5.8 → topos_node-1.5.9}/topos/observability/__init__.py +0 -0
  606. {topos_node-1.5.8 → topos_node-1.5.9}/topos/observability/alerts.py +0 -0
  607. {topos_node-1.5.8 → topos_node-1.5.9}/topos/observability/metrics.py +0 -0
  608. {topos_node-1.5.8 → topos_node-1.5.9}/topos/observability/tracing.py +0 -0
  609. {topos_node-1.5.8 → topos_node-1.5.9}/topos/openai_client.py +0 -0
  610. {topos_node-1.5.8 → topos_node-1.5.9}/topos/owner_key.py +0 -0
  611. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/__init__.py +0 -0
  612. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/ai_chat_capture.py +0 -0
  613. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/automatic_message_review.py +0 -0
  614. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/automatic_review_worker.py +0 -0
  615. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/bind_protocol.py +0 -0
  616. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/canonical.py +0 -0
  617. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/canonical_floor.py +0 -0
  618. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/capture_receipts.py +0 -0
  619. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/chatgpt_coverage.py +0 -0
  620. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/checking_model.py +0 -0
  621. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/common_given_names.py +0 -0
  622. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/contract.py +0 -0
  623. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/english_short_words.py +0 -0
  624. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/evidence_families.py +0 -0
  625. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/evidence_review_runtime.py +0 -0
  626. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/evidence_reviews.py +0 -0
  627. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/evidence_time.py +0 -0
  628. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/exclusion_floor.py +0 -0
  629. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/fact_contract.py +0 -0
  630. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/fact_eligibility.py +0 -0
  631. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/fact_policy.py +0 -0
  632. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/fact_projection.py +0 -0
  633. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/forwarding.py +0 -0
  634. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/identity.py +0 -0
  635. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/identity_attestation.py +0 -0
  636. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/identity_dispatch.py +0 -0
  637. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/identity_protocol.py +0 -0
  638. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/imessage_reconciliation.py +0 -0
  639. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/imessage_standing.py +0 -0
  640. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/index_rebuilds.py +0 -0
  641. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/index_review_guard.py +0 -0
  642. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/inferred_facts.py +0 -0
  643. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/ingest_dispatch.py +0 -0
  644. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/ingest_protocol.py +0 -0
  645. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/ingest_provenance.py +0 -0
  646. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/ingest_snapshot_facts.py +0 -0
  647. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/interest_family.py +0 -0
  648. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/interest_index.py +0 -0
  649. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/interest_relabel.py +0 -0
  650. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/interest_review.py +0 -0
  651. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/journal_goal_field.py +0 -0
  652. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/ledger.py +0 -0
  653. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/ledger_retention.py +0 -0
  654. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/message_evidence.py +0 -0
  655. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/message_review_contract.py +0 -0
  656. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/native_claim_grounding.py +0 -0
  657. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/native_imessage_probe.py +0 -0
  658. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/node_protocol.py +0 -0
  659. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/opaque_ids.py +0 -0
  660. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/ownership.py +0 -0
  661. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/permitted_derivation.py +0 -0
  662. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/predicate_classes.py +0 -0
  663. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/projection_review_runtime.py +0 -0
  664. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/protection_clock.py +0 -0
  665. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/protection_doorbell.py +0 -0
  666. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/protocol.py +0 -0
  667. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/reconciliation_provenance.py +0 -0
  668. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/registry.py +0 -0
  669. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/release.py +0 -0
  670. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/self_bind.py +0 -0
  671. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/shadow_rubric.pinned.md +0 -0
  672. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/share_catalog.py +0 -0
  673. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/share_kinds.py +0 -0
  674. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/share_week.py +0 -0
  675. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/signing.py +0 -0
  676. {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/snapshot_message_facts.py +0 -0
  677. {topos_node-1.5.8 → topos_node-1.5.9}/topos/pipeline/__init__.py +0 -0
  678. {topos_node-1.5.8 → topos_node-1.5.9}/topos/pipeline/audit.py +0 -0
  679. {topos_node-1.5.8 → topos_node-1.5.9}/topos/pipeline/envelope.py +0 -0
  680. {topos_node-1.5.8 → topos_node-1.5.9}/topos/pipeline/job_secrets.py +0 -0
  681. {topos_node-1.5.8 → topos_node-1.5.9}/topos/pipeline/job_store.py +0 -0
  682. {topos_node-1.5.8 → topos_node-1.5.9}/topos/pipeline/stages.py +0 -0
  683. {topos_node-1.5.8 → topos_node-1.5.9}/topos/pipeline/stub_enqueue.py +0 -0
  684. {topos_node-1.5.8 → topos_node-1.5.9}/topos/principal.py +0 -0
  685. {topos_node-1.5.8 → topos_node-1.5.9}/topos/profiles.py +0 -0
  686. {topos_node-1.5.8 → topos_node-1.5.9}/topos/projections/__init__.py +0 -0
  687. {topos_node-1.5.8 → topos_node-1.5.9}/topos/projections/vector_index/__init__.py +0 -0
  688. {topos_node-1.5.8 → topos_node-1.5.9}/topos/projections/vector_index/base.py +0 -0
  689. {topos_node-1.5.8 → topos_node-1.5.9}/topos/projections/vector_index/builders.py +0 -0
  690. {topos_node-1.5.8 → topos_node-1.5.9}/topos/projections/vector_index/health_checks.py +0 -0
  691. {topos_node-1.5.8 → topos_node-1.5.9}/topos/protocol/__init__.py +0 -0
  692. {topos_node-1.5.8 → topos_node-1.5.9}/topos/protocol/handled_message_types.json +0 -0
  693. {topos_node-1.5.8 → topos_node-1.5.9}/topos/protocol/narrowing_vocabulary.json +0 -0
  694. {topos_node-1.5.8 → topos_node-1.5.9}/topos/protocol/query_field_contract.json +0 -0
  695. {topos_node-1.5.8 → topos_node-1.5.9}/topos/protocol/retrieval_text_contract.json +0 -0
  696. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/__init__.py +0 -0
  697. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/aggregate.py +0 -0
  698. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/audit.py +0 -0
  699. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/closeness.py +0 -0
  700. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/collaborators.py +0 -0
  701. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/ddr.py +0 -0
  702. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/disclosure.py +0 -0
  703. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/entity_window.py +0 -0
  704. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/exclusion.py +0 -0
  705. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/facts_direct.py +0 -0
  706. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/fingerprint.py +0 -0
  707. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/game_layer.py +0 -0
  708. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/graph_lane.py +0 -0
  709. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/inference.py +0 -0
  710. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/intent.py +0 -0
  711. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/journal_event_lane.py +0 -0
  712. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/manifest.py +0 -0
  713. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/manifest_validation.py +0 -0
  714. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/narrowing.py +0 -0
  715. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/overheard.py +0 -0
  716. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/packet_resolution.py +0 -0
  717. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/pipeline.py +0 -0
  718. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/runtime.py +0 -0
  719. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/scope_arbiter.py +0 -0
  720. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/scope_classifier.py +0 -0
  721. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/scope_head.py +0 -0
  722. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/scope_registry.json +0 -0
  723. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/scope_registry_loader.py +0 -0
  724. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/scope_shadow.py +0 -0
  725. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/session.py +0 -0
  726. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/session_utils.py +0 -0
  727. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/source_generation.py +0 -0
  728. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/truth_door.py +0 -0
  729. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/truth_facts.py +0 -0
  730. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/truth_prompts.py +0 -0
  731. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/turn_classifier.py +0 -0
  732. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/types.py +0 -0
  733. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/verify.py +0 -0
  734. {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/verify_modes.py +0 -0
  735. {topos_node-1.5.8 → topos_node-1.5.9}/topos/rate_limit.py +0 -0
  736. {topos_node-1.5.8 → topos_node-1.5.9}/topos/relay_stamp.py +0 -0
  737. {topos_node-1.5.8 → topos_node-1.5.9}/topos/routines/__init__.py +0 -0
  738. {topos_node-1.5.8 → topos_node-1.5.9}/topos/routines/permissions.py +0 -0
  739. {topos_node-1.5.8 → topos_node-1.5.9}/topos/routines/schema.py +0 -0
  740. {topos_node-1.5.8 → topos_node-1.5.9}/topos/routines/store.py +0 -0
  741. {topos_node-1.5.8 → topos_node-1.5.9}/topos/runtime_housekeeping.py +0 -0
  742. {topos_node-1.5.8 → topos_node-1.5.9}/topos/runtime_shutdown.py +0 -0
  743. {topos_node-1.5.8 → topos_node-1.5.9}/topos/runtime_update.py +0 -0
  744. {topos_node-1.5.8 → topos_node-1.5.9}/topos/sanitization/__init__.py +0 -0
  745. {topos_node-1.5.8 → topos_node-1.5.9}/topos/sanitization/explicit_wording.py +0 -0
  746. {topos_node-1.5.8 → topos_node-1.5.9}/topos/sanitization/hub_pipeline.py +0 -0
  747. {topos_node-1.5.8 → topos_node-1.5.9}/topos/sanitization/nsfw_classifier.py +0 -0
  748. {topos_node-1.5.8 → topos_node-1.5.9}/topos/sanitization/prewarm.py +0 -0
  749. {topos_node-1.5.8 → topos_node-1.5.9}/topos/sanitization/privacy_filter.py +0 -0
  750. {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/__init__.py +0 -0
  751. {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/container.py +0 -0
  752. {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/embeddings/__init__.py +0 -0
  753. {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/embeddings/base.py +0 -0
  754. {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/embeddings/local.py +0 -0
  755. {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/embeddings/remote.py +0 -0
  756. {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/interfaces.py +0 -0
  757. {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/llm/__init__.py +0 -0
  758. {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/llm/base.py +0 -0
  759. {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/local.py +0 -0
  760. {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/postgres.py +0 -0
  761. {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/__init__.py +0 -0
  762. {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/bundled_canonical_triples.py +0 -0
  763. {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/canonical_signal_defaults.py +0 -0
  764. {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/declared_field_map_spec.py +0 -0
  765. {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/definitions.py +0 -0
  766. {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/install_authority.py +0 -0
  767. {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/install_maintenance.py +0 -0
  768. {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/install_service.py +0 -0
  769. {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/registry.py +0 -0
  770. {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/retention.py +0 -0
  771. {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/runtime_install.py +0 -0
  772. {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/scrub_attribution.py +0 -0
  773. {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/scrub_service.py +0 -0
  774. {topos_node-1.5.8 → topos_node-1.5.9}/topos/startup_banner.py +0 -0
  775. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/__init__.py +0 -0
  776. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/adapters/__init__.py +0 -0
  777. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/adapters/factory.py +0 -0
  778. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/adapters/fakes.py +0 -0
  779. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/adapters/postgres/stores.py +0 -0
  780. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/adapters/protocols.py +0 -0
  781. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/adapters/sqlite/__init__.py +0 -0
  782. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/adapters/sqlite/stores.py +0 -0
  783. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/adapters/sqlite/vector_search.py +0 -0
  784. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/__init__.py +0 -0
  785. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/activity_tables.py +0 -0
  786. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/ai_chat/__init__.py +0 -0
  787. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
  788. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/ai_chat/mapper.py +0 -0
  789. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/ai_chat/model.py +0 -0
  790. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/ai_chat/tables.py +0 -0
  791. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
  792. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/canonical_store.py +0 -0
  793. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/conversations_tables.py +0 -0
  794. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/journal_repair.py +0 -0
  795. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/mapping_store.py +0 -0
  796. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/postgres.py +0 -0
  797. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/__init__.py +0 -0
  798. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/client.py +0 -0
  799. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/connection_tuning.py +0 -0
  800. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/__init__.py +0 -0
  801. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
  802. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/activity_writer_columns_v1.py +0 -0
  803. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/actor_role_v1.py +0 -0
  804. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
  805. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
  806. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
  807. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/backup.py +0 -0
  808. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/backup_custody.py +0 -0
  809. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
  810. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
  811. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
  812. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
  813. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/community_names_v1.py +0 -0
  814. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/complexity_v1.py +0 -0
  815. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/conflict_provenance_v1.py +0 -0
  816. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
  817. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/derivation_factory_v1.py +0 -0
  818. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
  819. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/derivation_provenance_v1.py +0 -0
  820. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/derived_row_identity_v1.py +0 -0
  821. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/documents_v1.py +0 -0
  822. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/enrichment_record_progress_v1.py +0 -0
  823. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
  824. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
  825. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
  826. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
  827. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
  828. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
  829. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/entity_mentions_authored_v1.py +0 -0
  830. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/entity_review_candidate_bar_v1.py +0 -0
  831. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/entity_review_dedup_v1.py +0 -0
  832. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/entity_review_provenance_v1.py +0 -0
  833. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/episodes_v1.py +0 -0
  834. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
  835. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/fact_dimension_by_entity_type_v1.py +0 -0
  836. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/home_chat_memories_v1.py +0 -0
  837. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
  838. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
  839. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
  840. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
  841. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
  842. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/journal_origin_dimension_v1.py +0 -0
  843. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/mention_table_stamp_backfill_v1.py +0 -0
  844. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
  845. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
  846. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/net_subject_policy_v1.py +0 -0
  847. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/off_limits_carried_waiting_v1.py +0 -0
  848. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/owner_only_records_v1.py +0 -0
  849. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/pack_registry_v1.py +0 -0
  850. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/permissions_fact_lineage_keys_v1.py +0 -0
  851. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/permissions_message_context_indexes_v1.py +0 -0
  852. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/permissions_read_path_indexes_v1.py +0 -0
  853. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
  854. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/query_artifacts_duration_ms_v1.py +0 -0
  855. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/registry.py +0 -0
  856. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/registry_checksums.json +0 -0
  857. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/remediation_person_model.py +0 -0
  858. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/retire_url_classification_v1.py +0 -0
  859. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/scope_source_generation.py +0 -0
  860. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
  861. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
  862. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/signal_objects.py +0 -0
  863. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
  864. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
  865. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
  866. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
  867. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/temporal_fields_v1.py +0 -0
  868. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/transcripts_v1.py +0 -0
  869. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
  870. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
  871. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
  872. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
  873. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
  874. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
  875. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
  876. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
  877. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
  878. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
  879. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
  880. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
  881. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
  882. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
  883. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
  884. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
  885. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
  886. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
  887. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/paths.py +0 -0
  888. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/postgres.py +0 -0
  889. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/schema.py +0 -0
  890. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/schema_probe.py +0 -0
  891. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/storage_breakdown.py +0 -0
  892. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/derived_row_identity.py +0 -0
  893. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/enrichment/__init__.py +0 -0
  894. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
  895. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
  896. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/normalized/__init__.py +0 -0
  897. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/normalized/normalized_store.py +0 -0
  898. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/oplog/__init__.py +0 -0
  899. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/oplog/decision.py +0 -0
  900. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/oplog/oplog_store.py +0 -0
  901. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/oplog/postgres.py +0 -0
  902. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/person/identity_resolver.py +0 -0
  903. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/projections/__init__.py +0 -0
  904. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/projections/index_ops_store.py +0 -0
  905. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/projections/vector_index_store.py +0 -0
  906. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/raw/__init__.py +0 -0
  907. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/raw/browser_flat_tables.py +0 -0
  908. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/raw/file_store.py +0 -0
  909. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/raw/raw_store.py +0 -0
  910. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/raw/raw_tables_manager.py +0 -0
  911. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/raw/sqlite_raw_store.py +0 -0
  912. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/security/encryption.py +0 -0
  913. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/signal_identity.py +0 -0
  914. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/source_settings.py +0 -0
  915. {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/user_identity.py +0 -0
  916. {topos_node-1.5.8 → topos_node-1.5.9}/topos/sync/__init__.py +0 -0
  917. {topos_node-1.5.8 → topos_node-1.5.9}/topos/sync/client.py +0 -0
  918. {topos_node-1.5.8 → topos_node-1.5.9}/topos/sync_handlers.py +0 -0
  919. {topos_node-1.5.8 → topos_node-1.5.9}/topos/testing/__init__.py +0 -0
  920. {topos_node-1.5.8 → topos_node-1.5.9}/topos/testing/lifespan.py +0 -0
  921. {topos_node-1.5.8 → topos_node-1.5.9}/topos/uds.py +0 -0
  922. {topos_node-1.5.8 → topos_node-1.5.9}/topos/uma_contact_enrichment.py +0 -0
  923. {topos_node-1.5.8 → topos_node-1.5.9}/topos/uma_filters.py +0 -0
  924. {topos_node-1.5.8 → topos_node-1.5.9}/topos/upgrades/__init__.py +0 -0
  925. {topos_node-1.5.8 → topos_node-1.5.9}/topos/upgrades/runner.py +0 -0
  926. {topos_node-1.5.8 → topos_node-1.5.9}/topos/utils/base_object.py +0 -0
  927. {topos_node-1.5.8 → topos_node-1.5.9}/topos/websocket_client.py +0 -0
  928. {topos_node-1.5.8 → topos_node-1.5.9}/topos_node.egg-info/dependency_links.txt +0 -0
  929. {topos_node-1.5.8 → topos_node-1.5.9}/topos_node.egg-info/entry_points.txt +0 -0
  930. {topos_node-1.5.8 → topos_node-1.5.9}/topos_node.egg-info/requires.txt +0 -0
  931. {topos_node-1.5.8 → topos_node-1.5.9}/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.5.8
3
+ Version: 1.5.9
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
@@ -9,7 +9,7 @@ build-backend = "setuptools.build_meta"
9
9
 
10
10
  [project]
11
11
  name = "topos-node"
12
- version = "1.5.8"
12
+ version = "1.5.9"
13
13
  description = "Topos personal AI engine (FastAPI): local data, sync, control plane WebSocket client"
14
14
  readme = "README.md"
15
15
  license = "Apache-2.0"
@@ -1,6 +1,6 @@
1
1
  """Topos Control Plane Version Information."""
2
2
 
3
- __version__ = "1.5.8"
4
- __version_info__ = (1, 5, 8)
3
+ __version__ = "1.5.9"
4
+ __version_info__ = (1, 5, 9)
5
5
 
6
6
  __all__ = ["__version__", "__version_info__"]
@@ -1,22 +1,8 @@
1
- """LSU-1..4 — Doing x Telling per work item, and the shuffle control that keeps it honest.
2
-
3
- Roberts's heuristic is `Luck = Doing x Telling`. This makes it computable over substrate
4
- that exists: role shapes as work items (G5), owner-authored messages as telling, dated
5
- journal/goal records as doing, and ego-removed communities as the breadth weight — because
6
- telling three people across a structural hole reaches further than telling ten inside one
7
- cluster.
8
-
9
- Three rules, all from the research note and PLAN_SOCIAL_GRAPH §5a:
10
-
11
- * **No score.** Every function here returns components with their evidence. The screen
12
- states them in words; nothing multiplies them into a number nobody can falsify.
13
- * **Abstention over guessing.** A message that does not clearly belong to a work item is
14
- dropped, never assigned. A wrong join poisons every number downstream, and the honest
15
- fallback (owner-confirmed matches) is budgeted for, not argued against.
16
- * **A shuffle control rides with every breadth figure.** If recipients are permuted at
17
- random and breadth does not fall, the number was counting the owner's messaging habits
18
- rather than a real spread — and the screen must say "indistinguishable from chance"
19
- instead of showing it.
1
+ """Recorded work references, communication coverage and possible conversation openings.
2
+
3
+ Counts are observations, not measures of work value, others' awareness, or predicted
4
+ luck. Recommendations need a named counterpart's topic context. Identity coverage and
5
+ relationship statistics are presented without inferring willingness or obligation.
20
6
  """
21
7
 
22
8
  from __future__ import annotations
@@ -418,8 +404,7 @@ def _community_by_participant(conn: Any, dataset_id: str) -> Dict[str, str]:
418
404
  def build_doing_events(conn: Any, items: List[Dict[str, Any]]) -> List[Tuple]:
419
405
  """Dated records of the owner doing the work — canonical mentions in the work sources.
420
406
 
421
- Dated by `event_at`, falling back to `created_at`: a mention with no date cannot join a
422
- month and would silently collapse the recurrence figure the screen reports.
407
+ Undated mentions do not join a period; extraction time is not a work event date.
423
408
  """
424
409
  by_norm = {i["work_item_id"]: i for i in items}
425
410
  wanted = {}
@@ -429,7 +414,7 @@ def build_doing_events(conn: Any, items: List[Dict[str, Any]]) -> List[Tuple]:
429
414
  try:
430
415
  rows = conn.execute(
431
416
  f"SELECT e.normalized_name, m.record_id, m.canonical_table, m.source_id,"
432
- f" COALESCE(m.event_at, m.created_at)"
417
+ f" m.event_at"
433
418
  f" FROM entity_mentions m JOIN entities e ON e.entity_id = m.entity_id"
434
419
  f" WHERE m.source_id IN ({placeholders})"
435
420
  f" AND e.entity_type IN ({','.join('?' for _ in WORK_ENTITY_TYPES)})",
@@ -478,18 +463,45 @@ def messaging_population(conn: Any, dataset_id: str,
478
463
  exchanged a DM with. "Reached 9 of 22 reachable" is a claim about this owner's actual
479
464
  social range; "9 of 37" quietly counted rooms with no door.
480
465
  """
481
- from .messenger_directed import MESSENGER_DIRECTED_EDGES_TABLE, SELF_KEY
466
+ from .person_graph import build_person_nodes
467
+ # Reuse the graph's human-only, owner-excluding identity contract. A group member,
468
+ # shortcode or a contact alias is not an additional reachable person.
469
+ try:
470
+ nodes = build_person_nodes(conn, dataset_id)
471
+ except sqlite3.Error:
472
+ return {}
473
+ keys = {str(key) for node in nodes if not node.get('is_owner')
474
+ for key in node.get('messenger_keys', [])}
475
+ return {key: communities.get(key, "") for key in keys}
482
476
 
477
+
478
+ def communication_coverage(conn, recipients, population):
479
+ """Use identical identities for counts, including peers without a known community."""
480
+ from .messenger_directed import resolve_peer_identities
481
+ keys = sorted(set(recipients) | set(population))
483
482
  try:
484
- keys = {str(r[0]) for r in conn.execute(
485
- f"SELECT DISTINCT from_key FROM {MESSENGER_DIRECTED_EDGES_TABLE}"
486
- f" WHERE dataset_id=? AND from_key != ?", (dataset_id, SELF_KEY))}
487
- keys |= {str(r[0]) for r in conn.execute(
488
- f"SELECT DISTINCT to_key FROM {MESSENGER_DIRECTED_EDGES_TABLE}"
489
- f" WHERE dataset_id=? AND to_key != ?", (dataset_id, SELF_KEY))}
483
+ identities = resolve_peer_identities(conn, keys)
490
484
  except sqlite3.Error:
491
- return dict(communities)
492
- return {k: v for k, v in communities.items() if k in keys and v}
485
+ identities = {}
486
+ def identity(key):
487
+ contact, entity, _ = identities.get(key, (None, None, None))
488
+ return 'contact:' + str(contact) if contact else ('entity:' + str(entity) if entity else key)
489
+ grouped = defaultdict(set)
490
+ for key, community in population.items():
491
+ if community:
492
+ grouped[identity(key)].add(community)
493
+ else:
494
+ grouped[identity(key)]
495
+ people = {key: next(iter(cs)) if len(cs) == 1 else '' for key, cs in grouped.items()}
496
+ heard = {identity(key) for key in recipients}
497
+ reached = heard & set(people)
498
+ known = {key: c for key,c in people.items() if c}
499
+ return {'population': people, 'known_population': known,
500
+ 'unique_recipient_keys': sorted({identity(key):key for key in sorted(recipients, reverse=True)}.values()),
501
+ 'recipients_in_population': sorted(reached),
502
+ 'recipients_outside_population': len(heard - set(people)),
503
+ 'people_without_recorded_telling': len(set(people) - reached),
504
+ 'communities_reached': {known[key] for key in reached if key in known}}
493
505
 
494
506
 
495
507
  def shuffle_control_breadth(recipients: List[str], communities: Dict[str, str],
@@ -564,7 +576,7 @@ def rollup(conn: Any, dataset_id: str) -> Dict[str, Any]:
564
576
  doing = build_doing_events(conn, items)
565
577
  communities = _community_by_participant(conn, dataset_id)
566
578
  population = messaging_population(conn, dataset_id, communities)
567
- all_communities = {c for c in population.values() if c}
579
+ all_communities = set(communication_coverage(conn, [], population)['known_population'].values())
568
580
 
569
581
  tell_by_item: Dict[str, List[Tuple]] = defaultdict(list)
570
582
  for t in telling:
@@ -580,8 +592,11 @@ def rollup(conn: Any, dataset_id: str) -> Dict[str, Any]:
580
592
  tells = tell_by_item.get(wid, [])
581
593
  dos = do_by_item.get(wid, [])
582
594
  recipients = sorted({t[2] for t in tells})
583
- reached = {t[3] for t in tells if t[3]}
584
- control = shuffle_control_breadth(recipients, population)
595
+ measured = communication_coverage(conn, recipients, population)
596
+ reached = measured['communities_reached']
597
+ known_population = measured['known_population']
598
+ known_recipients = [r for r in measured['recipients_in_population'] if r in known_population]
599
+ control = shuffle_control_breadth(known_recipients, known_population)
585
600
  breadth = len(reached)
586
601
  # The Roberts case, stated as data: built, and who never heard about it.
587
602
  unreached = sorted(all_communities - reached)
@@ -592,7 +607,12 @@ def rollup(conn: Any, dataset_id: str) -> Dict[str, Any]:
592
607
  "doing_events": len(dos),
593
608
  "doing_periods": len({d[4] for d in dos}),
594
609
  "telling_events": len(tells),
595
- "told_people": [{"key": r, "label": labels.get(r) or r} for r in recipients],
610
+ "told_people": [{"key": r, "label": labels.get(r) or r} for r in measured['unique_recipient_keys']],
611
+ "people_without_recorded_telling": measured['people_without_recorded_telling'],
612
+ "reachable_people": len(measured['population']),
613
+ "recipients_outside_population": measured['recipients_outside_population'],
614
+ "observation_status": "recorded_mentions_only_not_awareness_or_value",
615
+ "last_work_event_at": max((d[3] for d in dos), default=None),
596
616
  "communities_reached": breadth,
597
617
  "communities_total": len(all_communities),
598
618
  "communities_unreached": len(unreached),
@@ -621,7 +641,9 @@ def rollup(conn: Any, dataset_id: str) -> Dict[str, Any]:
621
641
  "control_basis": ("expected reach if the same number of people were drawn at"
622
642
  " random from everyone the owner exchanges DMs with"),
623
643
  "communities_known": len(all_communities),
624
- "reachable_people": len(population),
644
+ "reachable_people": len(communication_coverage(conn, [], population)['population']),
645
+ "measurement_limits": "Records of work and messages mentioning it; not work quality, others' awareness, willingness, or expected benefit.",
646
+ "population_basis": "human messaging counterparts from the person graph; owner excluded and aliases collapsed",
625
647
  "telling_measurable": messaging_present,
626
648
  "dataset_resolved_by_engine": resolved_by_engine,
627
649
  "dataset_requested": requested_dataset or None,
@@ -687,9 +709,71 @@ def deepen_score(base: float, explore: float) -> float:
687
709
  return round(float(base) * (1.0 - float(explore)), 4)
688
710
 
689
711
 
712
+ def _possible_help_offer(text: str) -> bool:
713
+ """A conservative offer cue, not a capability/readiness classifier.
714
+
715
+ Plain mentions and bulk invitations are insufficient. The source remains attached
716
+ because conditions, expiry and whether an offer was accepted need separate evidence.
717
+ """
718
+ return bool(re.search(
719
+ r"\b(?:I (?:can|could|would be happy to|am happy to) (?:help|review|introduce)|"
720
+ r"let me (?:help|review|introduce)|found (?:someone|some one) to work with you)\b",
721
+ str(text), re.I))
722
+
723
+
724
+ def work_conversation_openings(conn, dataset_id, items, *, now=None):
725
+ """Name potential conversations only when a peer's message establishes topic context.
726
+
727
+ Missing outgoing messages alone do not establish an opportunity. These are invitations
728
+ to consider a follow-up, not claims about interest, availability or predicted value.
729
+ """
730
+ from datetime import timedelta
731
+ from .messenger_directed import classify_conversations, load_messages, EDGE_KIND_DM
732
+ from ..features.derivation.bench_evidence import _instant
733
+ now = now or datetime.now(timezone.utc)
734
+ try:
735
+ kinds = classify_conversations(load_messages(conn, dataset_id))
736
+ rows = conn.execute("SELECT message_id,sender_id,content,event_at,conversation_id FROM conversation_messages WHERE dataset_id=? AND is_from_self=0 AND content IS NOT NULL", (dataset_id,)).fetchall()
737
+ except sqlite3.Error:
738
+ return []
739
+ definitions = compile_surfaces(conn, dataset_id, build_work_items(conn))
740
+ # Vendor/org mentions and broad topics are not, by themselves, the owner's projects.
741
+ current = {w['work_item_id']:w for w in items
742
+ if set(w.get('entity_types') or []) & {'project', 'product'}
743
+ and 'place' not in (w.get('entity_types') or [])
744
+ and _instant(w.get('last_work_event_at'))
745
+ and now - timedelta(days=60) <= _instant(w['last_work_event_at']) <= now}
746
+ try:
747
+ human_keys = {str(key) for row in conn.execute(
748
+ "SELECT a_key,b_key FROM messenger_dyad_stats WHERE dataset_id=? AND involves_self=1 AND peer_class='human'", (dataset_id,)) for key in row if key and key != 'self'}
749
+ except sqlite3.Error:
750
+ human_keys = set()
751
+ peers = _peer_labels(conn, dataset_id, sorted({str(r[1]) for r in rows if r[1]}))
752
+ selected = {}
753
+ for mid, peer, text, at, conv in rows:
754
+ when = _instant(at)
755
+ label = peers.get(str(peer))
756
+ if (str(peer) not in human_keys or not label or label == str(peer)
757
+ or '@' in label or not any(ch.isalpha() for ch in label)
758
+ or kinds.get(conv) != EDGE_KIND_DM or not _possible_help_offer(str(text))):
759
+ continue
760
+ if not when or not now - timedelta(days=180) <= when <= now:
761
+ continue
762
+ for wid in resolve_message_to_work_item(str(text), definitions):
763
+ if wid not in current:
764
+ continue
765
+ key = (wid, str(peer))
766
+ if key in selected and _instant(selected[key]['event_at']) >= when:
767
+ continue
768
+ selected[key] = {'work_item_id':wid, 'work_label':current[wid]['label'],
769
+ 'peer_key':str(peer), 'label':label, 'record_id':str(mid), 'event_at':str(at),
770
+ 'last_work_event_at':current[wid]['last_work_event_at']}
771
+ return sorted(selected.values(), key=lambda r:(_instant(r['event_at']), r['work_item_id'], r['peer_key']), reverse=True)
772
+
773
+
690
774
  def build_moves(conn: Any, dataset_id: str, *, explore: float = DEFAULT_EXPLORE,
691
775
  limit: int = MAX_MOVES) -> List[Dict[str, Any]]:
692
- """Ranked, evidence-carrying things the owner could actually do this week.
776
+ """Ranked possibilities to consider, with evidence and explicit unknown benefit.
693
777
 
694
778
  Rule-based on purpose: every input is already measured and every move can name the row
695
779
  it came from. A model that ranked these could not say why, and "why" is the only reason
@@ -707,35 +791,24 @@ def build_moves(conn: Any, dataset_id: str, *, explore: float = DEFAULT_EXPLORE,
707
791
 
708
792
  moves: List[Dict[str, Any]] = []
709
793
 
710
- # 1. Tell a community that has not heard. The inverse of LSU-2, and the move the whole
711
- # screen exists to produce.
712
- for item in items[:3]:
713
- unreached = int(item.get("communities_unreached") or 0)
714
- if unreached <= 0 or item.get("below_telling_floor"):
715
- continue
716
- benefit = _marginal_benefit(unreached, communities_total)
717
- # Quantify in CIRCLES only where breadth actually beat its control. On a corpus whose
718
- # communities are near-singletons (56 people across 37 of them) "28 circles have not
719
- # heard" sounds like a large structural opportunity while the same screen is saying,
720
- # correctly, that spread here is indistinguishable from chance. People are the
721
- # honest unit when the partition is that fine.
722
- untold_people = max(0, reachable_people - len(item.get("told_people") or []))
723
- if item.get("breadth_beats_chance"):
724
- reach_words = f"reaches up to {unreached} circles that know nothing about it"
725
- why_tail = f"{unreached} of {communities_total} circles you message have not heard."
726
- else:
727
- reach_words = f"reaches people among the {untold_people} who have not heard"
728
- why_tail = (f"{untold_people} of the {reachable_people} people you message have"
729
- f" not heard about it.")
794
+ # A coverage gap is a diagnostic, not evidence that another message is valuable.
795
+ for opening in work_conversation_openings(conn, dataset_id, items)[:3]:
730
796
  moves.append({
731
- "kind": "tell_unexposed_community",
732
- "title": f"Tell someone outside your usual circle about {item['label']}",
733
- "why": f"{item['doing_events']} recorded work events, and {why_tail}",
734
- "marginal_benefit": benefit,
735
- "marginal_benefit_words": reach_words,
736
- "evidence": {"work_item_id": item["work_item_id"],
737
- "communities_unreached": unreached},
738
- "score": reach_score(benefit, explore),
797
+ "kind": "discuss_work_with_contact",
798
+ "title": f"Consider discussing {opening['work_label']} with {opening['label']}",
799
+ "why": (f"Their message on {opening['event_at'][:10]} contains a possible help or introduction offer about this work; "
800
+ f"your latest work reference is {opening['last_work_event_at'][:10]}. "
801
+ "Check whether the offer still applies; this does not establish present willingness or an unanswered request."),
802
+ "marginal_benefit": 0.0,
803
+ "marginal_benefit_words": "Source-backed conversation context; benefit is unmeasured",
804
+ "evidence": {"work_item_id": opening['work_item_id'],
805
+ "peer_key": opening['peer_key'],
806
+ "table": "conversation_messages", "record_id": opening['record_id'],
807
+ "event_at": opening['event_at'],
808
+ "last_work_event_at": opening['last_work_event_at']},
809
+ "score": deepen_score(0.6, explore),
810
+ "score_basis": "context for a possible follow-up; not expected benefit",
811
+ "status": "suggestion_requiring_relevance_check",
739
812
  })
740
813
 
741
814
  try:
@@ -761,7 +834,7 @@ def build_moves(conn: Any, dataset_id: str, *, explore: float = DEFAULT_EXPLORE,
761
834
  "why": (f"{_days(alarm.get('recent_gap_days'))} since your last exchange, after "
762
835
  f"{alarm.get('total_msgs', 0)} messages."),
763
836
  "marginal_benefit": 0.0,
764
- "marginal_benefit_words": "deepens a tie you already have; adds no new circle",
837
+ "marginal_benefit_words": "Possible reconnection; interest and availability are unknown",
765
838
  "evidence": {"peer_key": alarm.get("peer_key")},
766
839
  "score": deepen_score(0.55, explore),
767
840
  })
@@ -777,7 +850,7 @@ def build_moves(conn: Any, dataset_id: str, *, explore: float = DEFAULT_EXPLORE,
777
850
  "why": (f"{row.get('total_msgs')} messages exchanged and no name on file, so this"
778
851
  f" person cannot appear in anything above."),
779
852
  "marginal_benefit": 0.0,
780
- "marginal_benefit_words": "unblocks every other suggestion about this person",
853
+ "marginal_benefit_words": "Improves identity coverage; relationship benefit is unknown",
781
854
  "evidence": {"peer_key": row.get("peer_key"),
782
855
  "total_msgs": row.get("total_msgs")},
783
856
  "score": 0.5,
@@ -794,10 +867,10 @@ def build_moves(conn: Any, dataset_id: str, *, explore: float = DEFAULT_EXPLORE,
794
867
  continue
795
868
  moves.append({
796
869
  "kind": "repay_imbalance",
797
- "title": f"Answer {label}",
798
- "why": "They have carried this conversation for a while.",
870
+ "title": f"Review your conversation with {label}",
871
+ "why": "More incoming than outgoing messages are recorded. Counts do not establish an unanswered request or an obligation.",
799
872
  "marginal_benefit": 0.0,
800
- "marginal_benefit_words": "keeps an existing tie alive; adds no new circle",
873
+ "marginal_benefit_words": "Check context before deciding whether a reply would help",
801
874
  "evidence": {"peer_key": row.get("peer_key"), "balance": balance},
802
875
  "score": deepen_score(0.45, explore),
803
876
  })
@@ -735,17 +735,40 @@ def attach_affect(conn: Any, dataset_id: str, acc: dict) -> dict:
735
735
 
736
736
  # --------------------------------------------------------------------------- L1-8: identity
737
737
 
738
- def resolve_peer_identities(conn: Any, peer_keys: list) -> dict:
739
- """peer_key -> (contact_id, entity_id, display_name|None), by identifier match.
738
+ def peer_identity_key(value: Any) -> str:
739
+ """Exact handles, plus equivalent US ten-digit/+1 phone spellings; never suffixes."""
740
+ import re
741
+ key = str(value or "").strip().lower()
742
+ if re.fullmatch(r"[+() .0-9-]+", key):
743
+ digits = re.sub(r"\D", "", key)
744
+ # A North American number only: area code and exchange each start 2-9. A bare
745
+ # eleven-digit run starting 1 (a mainland China mobile, say) is not read as +1.
746
+ nanp = len(digits) >= 10 and digits[-10] in "23456789" and digits[-7] in "23456789"
747
+ if len(digits) == 10 and nanp and not key.startswith("+"):
748
+ return "+1" + digits
749
+ if len(digits) == 11 and nanp and digits.startswith("1") and (key.startswith("+") or not key.isdigit()):
750
+ return "+" + digits
751
+ return key
752
+
753
+
754
+ def _agreed_names(hits) -> dict:
755
+ """casefolded name -> first spelling, over the hits' display names that read as names."""
756
+ names: dict = {}
757
+ for _, display in sorted(hits, key=lambda hit: (hit[0], hit[1] or "")):
758
+ if display and any(ch.isalpha() for ch in display) and "@" not in display:
759
+ names.setdefault(" ".join(display.casefold().split()), display)
760
+ return names
740
761
 
741
- The write-time half of the person spine that L1 carries nullable columns for. Ambiguity
742
- abstains: a key matching two contacts fills nothing, because a wrong person id on a
743
- relationship row is worse than a missing one — it survives joins silently.
744
762
 
745
- Measured before building (the reason this does NOT normalize formats): full digit-suffix
746
- normalization gains ZERO names on the live corpus. The unnamed majority fails because
747
- the address book never ingested a name for them at all (584 of 1,386 contacts carry
748
- one), not because formats disagree. What this resolves, it resolves exactly.
763
+ def resolve_peer_identities(conn: Any, peer_keys: list) -> dict:
764
+ """Resolve agreed display names without merging ambiguous contact/entity IDs.
765
+
766
+ Sync can create an unnamed contact beside a named address-book import for the same
767
+ handle. That is enough to display the one agreed name, not to choose a contact ID
768
+ or transfer person-specific facts. A handle that matches one contact exactly keeps
769
+ that contact's ids, as it did before spellings were folded (review of topos#116).
770
+ Without an exact match, conflicting names still abstain. International numbers,
771
+ email addresses and extensions never use loose suffix matching.
749
772
  """
750
773
  out: dict = {}
751
774
  if not peer_keys:
@@ -757,27 +780,51 @@ def resolve_peer_identities(conn: Any, peer_keys: list) -> dict:
757
780
  ent_rows = conn.execute(
758
781
  "SELECT contact_id, entity_id FROM entities"
759
782
  " WHERE contact_id IS NOT NULL AND entity_type='person'").fetchall()
760
- except Exception: # noqa: BLE001 — a corpus without these tables has no identities
783
+ except Exception: # noqa: BLE001 — optional legacy tables
761
784
  return out
762
785
  by_ident: dict = {}
786
+ by_exact: dict = {}
763
787
  for ident, cid, dn in ident_rows:
764
- k = str(ident or "").strip().lower()
765
- if k:
766
- by_ident.setdefault(k, set()).add((str(cid), str(dn or "") or None))
788
+ hit = (str(cid), str(dn or "").strip() or None)
789
+ key = peer_identity_key(ident)
790
+ if key:
791
+ by_ident.setdefault(key, set()).add(hit)
792
+ exact = str(ident or "").strip().lower()
793
+ if exact:
794
+ by_exact.setdefault(exact, set()).add(hit)
767
795
  ent_by_contact: dict = {}
768
796
  for cid, eid in ent_rows:
769
- ent_by_contact.setdefault(str(cid), []).append(str(eid))
797
+ ent_by_contact.setdefault(str(cid), set()).add(str(eid))
770
798
  for peer in peer_keys:
771
- k = str(peer or "").strip().lower()
772
- hits = by_ident.get(k) or set()
773
- cids = {c for c, _ in hits}
799
+ # A handle spelled exactly as one contact holds it keeps that contact's ids, as before
800
+ # the spellings were folded: a second spelling on another contact (most often an
801
+ # unnamed duplicate a sync made) must not turn an exact match into an ambiguous one.
802
+ # The name is the one every spelling agrees on, else that contact's own.
803
+ exact = by_exact.get(str(peer or "").strip().lower()) or set()
804
+ folded = by_ident.get(peer_identity_key(peer)) or set()
805
+ exact_cids = {cid for cid, _ in exact}
806
+ if not (folded or exact):
807
+ continue
808
+ names = _agreed_names(folded or exact)
809
+ if len(exact_cids) == 1:
810
+ cids = exact_cids
811
+ if len(names) > 1:
812
+ names = _agreed_names(exact)
813
+ if len(names) > 1:
814
+ names = {}
815
+ else:
816
+ cids = {cid for cid, _ in folded}
817
+ if len(names) > 1:
818
+ continue
819
+ name = next(iter(names.values()), None)
774
820
  if len(cids) != 1:
775
- continue # unknown, or ambiguous — abstain either way
821
+ if name:
822
+ out[peer] = (None, None, name)
823
+ continue
776
824
  cid = next(iter(cids))
777
- ents = ent_by_contact.get(cid) or []
778
- eid = ents[0] if len(ents) == 1 else None
779
- dn = next((d for _, d in hits if d), None)
780
- out[peer] = (cid, eid, dn)
825
+ entities = ent_by_contact.get(cid) or set()
826
+ eid = next(iter(entities)) if len(entities) == 1 else None
827
+ out[peer] = (cid, eid, name)
781
828
  return out
782
829
 
783
830
 
@@ -237,11 +237,41 @@ def read_relationship_signals(conn: Any, *, dataset_id: str, signal: str = "all"
237
237
  return out
238
238
 
239
239
 
240
- def read_bench(conn: Any) -> Dict[str, Any]:
241
- """THE BENCH, computed at read. Owner-only by construction."""
240
+ class _OffLimitsCheckUnavailable(Exception):
241
+ """The bench's Off-limits pass could not run."""
242
+
243
+
244
+ def read_bench(conn: Any, *, dataset_id: str = "") -> Dict[str, Any]:
245
+ """THE BENCH, computed at read. Owner-only by construction.
246
+
247
+ The bench leaves out a candidate who is Off-limits, but its purposes carry excerpts,
248
+ goal labels and the request text, any of which can name one. So the slate goes through
249
+ the query pipeline's own Off-limits pass (`_blackhole_policy_for_summary`) at the owner's
250
+ tier, as every other owner answer does (review of topos#116). For a request whose
251
+ principal is the owner's app (`OWNER_APP`) a role or person naming one is kept and
252
+ stamped `blackhole_protected`, the taint the control plane's hosted-model gate reads.
253
+ For every other caller (his outside clients, the routine lane, and a request that
254
+ carries no principal, such as the local HTTP route) it is dropped. The pass runs before
255
+ the lineup is chosen and counted, so no count describes what it removed. If the pass
256
+ cannot run, for any caller, the bench comes back empty and says why.
257
+ """
242
258
  from ..features.derivation.social_bench import build_bench_slate
259
+ from ..query.retrieval import _blackhole_policy_for_summary
260
+
261
+ def protected(items: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
262
+ try:
263
+ return _blackhole_policy_for_summary(list(items), conn=conn, disclosure_tier="owner_raw",
264
+ fail_closed=True)
265
+ except Exception as exc: # noqa: BLE001 -- an unchecked slate is never served, to the app either
266
+ raise _OffLimitsCheckUnavailable() from exc
243
267
 
244
- return build_bench_slate(conn)
268
+ try:
269
+ return build_bench_slate(conn, dataset_id=dataset_id or None, keep=protected)
270
+ except _OffLimitsCheckUnavailable:
271
+ return {"roles": [], "roles_without_candidates": [], "people_close_to_this_work": [],
272
+ "engagement_coverage": {},
273
+ "coverage": {"dataset_id": dataset_id or "", "status": "unavailable",
274
+ "reason": "off_limits_check_unavailable"}}
245
275
 
246
276
 
247
277
  def read_luck_surface(conn: Any, *, dataset_id: str,
@@ -62,6 +62,7 @@ _CANONICAL_TABLE_BY_GROUP: Dict[str, tuple[str, str]] = {
62
62
  # layering, so the automatic ingest path simply never marked anything.
63
63
  from ..enrichment.record_progress import ( # noqa: E402
64
64
  _mark_records_processed,
65
+ mark_records_processed_in_a_worker,
65
66
  _processed_record_ids,
66
67
  _record_identifier,
67
68
  )
@@ -519,8 +520,10 @@ async def _generic_backfill_core(
519
520
  # the whole point, since `processed` above counts OUTPUT ROWS CREATED, not
520
521
  # records attempted, and the two differ by exactly the empty results this
521
522
  # marker exists to stop re-scanning.
522
- marked = _mark_records_processed(
523
- db_conn, source_id, job_name, records, catalog_spec_version(job_name)
523
+ # In a worker thread, on its own connection (NR166 R3b): the marker takes the write gate, and this coroutine
524
+ # is on the app's loop.
525
+ marked = await mark_records_processed_in_a_worker(
526
+ get_db_connection, source_id, job_name, records, catalog_spec_version(job_name)
524
527
  )
525
528
 
526
529
  return {
@@ -1117,6 +1120,17 @@ async def _process_enrichment_core(
1117
1120
  }
1118
1121
 
1119
1122
 
1123
+ async def enrichment_status_off_loop(source_id: str, dataset_id: Optional[str] = None) -> Dict[str, Any]:
1124
+ """`_get_enrichment_status_core` on a worker thread, for the engine loop's handlers.
1125
+
1126
+ The status counts the source's canonical messages and loads them all to find the unprocessed ones
1127
+ (`_find_unprocessed_messages`), every query a plain blocking read. Awaited on the loop, the owner app's sources
1128
+ page held the engine loop for seconds per source: on the owner's node, 14 Oct 2026, the watchdog's stalled frames
1129
+ were this chain while a recipient's ask waited behind it. The worker gets its own connection (`get_db_connection`
1130
+ is per thread) and its own event loop for the coroutine; nothing in it touches the engine loop's objects."""
1131
+ return await asyncio.to_thread(asyncio.run, _get_enrichment_status_core(source_id, dataset_id))
1132
+
1133
+
1120
1134
  async def _get_enrichment_status_core(
1121
1135
  source_id: str,
1122
1136
  dataset_id: Optional[str] = None,
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from typing import Any, Dict, Set
4
4
 
5
- from .enrichment import _get_enrichment_status_core, _list_source_enrichments_core
5
+ from .enrichment import _list_source_enrichments_core, enrichment_status_off_loop
6
6
  from .source_install import _list_sources_core, _scope_from_payload
7
7
  from ..core.state import get_db_connection
8
8
  from ..storage.source_settings import get_source_settings
@@ -37,7 +37,7 @@ async def _get_sources_overview_core(payload: Dict[str, Any]) -> Dict[str, Any]:
37
37
  meta: Dict[str, Any] = {}
38
38
  if "enrichment_status" in include and source_def.get("enrichment_trigger") == "manual":
39
39
  try:
40
- meta["enrichment_status"] = await _get_enrichment_status_core(source_id, dataset_id)
40
+ meta["enrichment_status"] = await enrichment_status_off_loop(source_id, dataset_id)
41
41
  except Exception:
42
42
  pass
43
43
  if "settings" in include and source_def.get("source_type") == "local_sync" and conn and dataset_id:
@@ -292,6 +292,13 @@ async def startup_event() -> None:
292
292
  from . import node_stop
293
293
 
294
294
  node_stop.bind_loop(asyncio.get_running_loop())
295
+ # NR166 R3b: with attribution on, the log says what this loop was in whenever it has not run for a second.
296
+ from .permissions_v2 import loop_lag
297
+
298
+ loop_lag.watch(asyncio.get_running_loop(), "app")
299
+ from .storage.db import write_gate as _write_gate
300
+
301
+ _write_gate.name_event_loop(asyncio.get_running_loop(), "app") # its on-loop warning says which loop
295
302
  node_stop.set_background_reaper(_reap_background_tasks)
296
303
  add_shutdown_listener(node_stop.begin_stop)
297
304
  # This process holds the database, so its backups are the ones the model