topos-node 1.3.30__tar.gz → 1.3.32__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (720) hide show
  1. {topos_node-1.3.30/topos_node.egg-info → topos_node-1.3.32}/PKG-INFO +1 -1
  2. {topos_node-1.3.30 → topos_node-1.3.32}/pyproject.toml +1 -1
  3. {topos_node-1.3.30 → topos_node-1.3.32}/topos/__version__.py +2 -2
  4. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/aspirations.goals.yaml +2 -2
  5. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/health.mental.yaml +3 -3
  6. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/places.mobility.yaml +2 -2
  7. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/work.career.yaml +4 -4
  8. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/template.py +2 -2
  9. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/writer.py +51 -0
  10. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/fact_materializer.py +1 -1
  11. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/linking.py +1 -1
  12. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/facts/reads.py +7 -1
  13. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/facts/store.py +8 -1
  14. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/lifecycle/derived_scrub.py +14 -1
  15. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/facts_direct.py +79 -4
  16. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/game_layer.py +30 -2
  17. {topos_node-1.3.30 → topos_node-1.3.32}/topos/upgrades/manifests.json +12 -0
  18. {topos_node-1.3.30 → topos_node-1.3.32/topos_node.egg-info}/PKG-INFO +1 -1
  19. {topos_node-1.3.30 → topos_node-1.3.32}/LICENSE +0 -0
  20. {topos_node-1.3.30 → topos_node-1.3.32}/MANIFEST.in +0 -0
  21. {topos_node-1.3.30 → topos_node-1.3.32}/README.md +0 -0
  22. {topos_node-1.3.30 → topos_node-1.3.32}/setup.cfg +0 -0
  23. {topos_node-1.3.30 → topos_node-1.3.32}/shared/__init__.py +0 -0
  24. {topos_node-1.3.30 → topos_node-1.3.32}/shared/filtering.py +0 -0
  25. {topos_node-1.3.30 → topos_node-1.3.32}/shared/schema_registry.py +0 -0
  26. {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_active_database_binding.py +0 -0
  27. {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_active_ingestion_binding.py +0 -0
  28. {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_extensions.py +0 -0
  29. {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_gate_leg_hermeticity.py +0 -0
  30. {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_llm_integrations_storage.py +0 -0
  31. {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_local_gate_composition.py +0 -0
  32. {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_owner_database_hermeticity.py +0 -0
  33. {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_prewarm_first_run.py +0 -0
  34. {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_profile_hygiene.py +0 -0
  35. {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_profiles.py +0 -0
  36. {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_protocol_handled_types.py +0 -0
  37. {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_query_field_contract.py +0 -0
  38. {topos_node-1.3.30 → topos_node-1.3.32}/tests/test_system_computer_name.py +0 -0
  39. {topos_node-1.3.30 → topos_node-1.3.32}/topos/__init__.py +0 -0
  40. {topos_node-1.3.30 → topos_node-1.3.32}/topos/analytics/__init__.py +0 -0
  41. {topos_node-1.3.30 → topos_node-1.3.32}/topos/analytics/duckdb_adapter.py +0 -0
  42. {topos_node-1.3.30 → topos_node-1.3.32}/topos/analytics/messenger_communities.py +0 -0
  43. {topos_node-1.3.30 → topos_node-1.3.32}/topos/analytics/messenger_graph.py +0 -0
  44. {topos_node-1.3.30 → topos_node-1.3.32}/topos/analytics/messenger_labels.py +0 -0
  45. {topos_node-1.3.30 → topos_node-1.3.32}/topos/analytics/profiles.py +0 -0
  46. {topos_node-1.3.30 → topos_node-1.3.32}/topos/analytics/query_engine.py +0 -0
  47. {topos_node-1.3.30 → topos_node-1.3.32}/topos/analytics/raw_queries.py +0 -0
  48. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/__init__.py +0 -0
  49. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/analytics.py +0 -0
  50. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/app_registry.py +0 -0
  51. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/backup.py +0 -0
  52. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/community_naming_config.py +0 -0
  53. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/compute_remote.py +0 -0
  54. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/conversation_context.py +0 -0
  55. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/data_commit.py +0 -0
  56. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/data_explorer_table_prefs.py +0 -0
  57. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/database_explorer.py +0 -0
  58. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/db.py +0 -0
  59. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/device.py +0 -0
  60. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/engine_run.py +0 -0
  61. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/enrichment.py +0 -0
  62. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/enrichment_lab.py +0 -0
  63. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/facts_llm_config.py +0 -0
  64. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/filter_lab.py +0 -0
  65. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/health.py +0 -0
  66. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/home_chat.py +0 -0
  67. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/ingestion_api.py +0 -0
  68. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/ingestion_compat.py +0 -0
  69. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/ingestion_sources.py +0 -0
  70. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/intelligence_lifecycle.py +0 -0
  71. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/llm.py +0 -0
  72. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/local_mcp.py +0 -0
  73. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/messenger_analytics.py +0 -0
  74. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/privacy_disclose.py +0 -0
  75. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/query_api.py +0 -0
  76. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/runtime_bootstrap.py +0 -0
  77. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/sanitization_ollama_config.py +0 -0
  78. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/shell.py +0 -0
  79. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/signal.py +0 -0
  80. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/signal_extraction_config.py +0 -0
  81. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/source_install.py +0 -0
  82. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/source_scrub.py +0 -0
  83. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/sources.py +0 -0
  84. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/sources_overview.py +0 -0
  85. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/sync.py +0 -0
  86. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/tool_index.py +0 -0
  87. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/ui_config.py +0 -0
  88. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/uma_data.py +0 -0
  89. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/upgrades.py +0 -0
  90. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/usage.py +0 -0
  91. {topos_node-1.3.30 → topos_node-1.3.32}/topos/api/user_identity.py +0 -0
  92. {topos_node-1.3.30 → topos_node-1.3.32}/topos/app.py +0 -0
  93. {topos_node-1.3.30 → topos_node-1.3.32}/topos/auth.py +0 -0
  94. {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/__init__.py +0 -0
  95. {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/declared_field_map.py +0 -0
  96. {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/mappers/__init__.py +0 -0
  97. {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/mappers/base.py +0 -0
  98. {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
  99. {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
  100. {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/mappers/demo_mappers.py +0 -0
  101. {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/mappers/documents_mapper.py +0 -0
  102. {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
  103. {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
  104. {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/mappers/grok_mapper.py +0 -0
  105. {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
  106. {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/models.py +0 -0
  107. {topos_node-1.3.30 → topos_node-1.3.32}/topos/canonicalization/resolver.py +0 -0
  108. {topos_node-1.3.30 → topos_node-1.3.32}/topos/cli/__init__.py +0 -0
  109. {topos_node-1.3.30 → topos_node-1.3.32}/topos/cli/__main__.py +0 -0
  110. {topos_node-1.3.30 → topos_node-1.3.32}/topos/cli/assets/topos_blk_rounded.png +0 -0
  111. {topos_node-1.3.30 → topos_node-1.3.32}/topos/cli/assets/topos_white.png +0 -0
  112. {topos_node-1.3.30 → topos_node-1.3.32}/topos/cli/commands.py +0 -0
  113. {topos_node-1.3.30 → topos_node-1.3.32}/topos/cli/profile_cmd.py +0 -0
  114. {topos_node-1.3.30 → topos_node-1.3.32}/topos/cli/reprocess_cmd.py +0 -0
  115. {topos_node-1.3.30 → topos_node-1.3.32}/topos/cli/setup_models_cmd.py +0 -0
  116. {topos_node-1.3.30 → topos_node-1.3.32}/topos/cli/tray.py +0 -0
  117. {topos_node-1.3.30 → topos_node-1.3.32}/topos/config/__init__.py +0 -0
  118. {topos_node-1.3.30 → topos_node-1.3.32}/topos/config/conversation_context_llm.py +0 -0
  119. {topos_node-1.3.30 → topos_node-1.3.32}/topos/config/facts_llm.py +0 -0
  120. {topos_node-1.3.30 → topos_node-1.3.32}/topos/config/local_model_builds.py +0 -0
  121. {topos_node-1.3.30 → topos_node-1.3.32}/topos/config/model_packs.py +0 -0
  122. {topos_node-1.3.30 → topos_node-1.3.32}/topos/config/node_function_providers.py +0 -0
  123. {topos_node-1.3.30 → topos_node-1.3.32}/topos/config/sanitization_ollama.py +0 -0
  124. {topos_node-1.3.30 → topos_node-1.3.32}/topos/config/settings.py +0 -0
  125. {topos_node-1.3.30 → topos_node-1.3.32}/topos/config/signal_extraction.py +0 -0
  126. {topos_node-1.3.30 → topos_node-1.3.32}/topos/config/uvicorn_logging.json +0 -0
  127. {topos_node-1.3.30 → topos_node-1.3.32}/topos/contacts/__init__.py +0 -0
  128. {topos_node-1.3.30 → topos_node-1.3.32}/topos/contacts/identity.py +0 -0
  129. {topos_node-1.3.30 → topos_node-1.3.32}/topos/control_plane_client.py +0 -0
  130. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/__init__.py +0 -0
  131. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/api_models.py +0 -0
  132. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/connection_resilience.py +0 -0
  133. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/db_health.py +0 -0
  134. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/device_helpers.py +0 -0
  135. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/errors.py +0 -0
  136. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/events.py +0 -0
  137. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/__init__.py +0 -0
  138. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/common.py +0 -0
  139. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/complexity.py +0 -0
  140. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/config.py +0 -0
  141. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/contacts_import.py +0 -0
  142. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/database_explorer.py +0 -0
  143. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/derivation.py +0 -0
  144. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/device.py +0 -0
  145. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/enrichment.py +0 -0
  146. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/enrichment_lab.py +0 -0
  147. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/filter_lab.py +0 -0
  148. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/graph_query.py +0 -0
  149. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/home_chat.py +0 -0
  150. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/ingest.py +0 -0
  151. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/messages.py +0 -0
  152. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/messenger_analytics.py +0 -0
  153. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/query.py +0 -0
  154. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/registry.py +0 -0
  155. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/routines.py +0 -0
  156. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/signal_features.py +0 -0
  157. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/sources.py +0 -0
  158. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/timeline_daily.py +0 -0
  159. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/tool_index.py +0 -0
  160. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/handlers/uma.py +0 -0
  161. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/logging.py +0 -0
  162. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/metrics.py +0 -0
  163. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/routine_access.py +0 -0
  164. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/startup_banner.py +0 -0
  165. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/state.py +0 -0
  166. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/table_layers.py +0 -0
  167. {topos_node-1.3.30 → topos_node-1.3.32}/topos/core/types.py +0 -0
  168. {topos_node-1.3.30 → topos_node-1.3.32}/topos/data_explorer_row_delete.py +0 -0
  169. {topos_node-1.3.30 → topos_node-1.3.32}/topos/data_explorer_table_prefs.py +0 -0
  170. {topos_node-1.3.30 → topos_node-1.3.32}/topos/data_explorer_tables.py +0 -0
  171. {topos_node-1.3.30 → topos_node-1.3.32}/topos/disclosure/__init__.py +0 -0
  172. {topos_node-1.3.30 → topos_node-1.3.32}/topos/disclosure/canonical_writer.py +0 -0
  173. {topos_node-1.3.30 → topos_node-1.3.32}/topos/disclosure/content_policy.py +0 -0
  174. {topos_node-1.3.30 → topos_node-1.3.32}/topos/disclosure/field_registry.py +0 -0
  175. {topos_node-1.3.30 → topos_node-1.3.32}/topos/disclosure/privacy_layer.py +0 -0
  176. {topos_node-1.3.30 → topos_node-1.3.32}/topos/disclosure/tier.py +0 -0
  177. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/__init__.py +0 -0
  178. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/backends/__init__.py +0 -0
  179. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/backends/base.py +0 -0
  180. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/backends/generative_prompts.py +0 -0
  181. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/backends/generative_response.py +0 -0
  182. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/backends/huggingface.py +0 -0
  183. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/backends/ollama.py +0 -0
  184. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/backends/openai.py +0 -0
  185. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/backends/openai_compatible.py +0 -0
  186. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/backends/redpill.py +0 -0
  187. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/backends/stub.py +0 -0
  188. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/client.py +0 -0
  189. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/disk_space.py +0 -0
  190. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/engine.py +0 -0
  191. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/intake.py +0 -0
  192. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/memory_utils.py +0 -0
  193. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/model_cache.py +0 -0
  194. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/ollama_install.py +0 -0
  195. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/ollama_pull.py +0 -0
  196. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/ollama_setup_guidance.py +0 -0
  197. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/pipeline_memory.py +0 -0
  198. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/queue_manager.py +0 -0
  199. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/registration.py +0 -0
  200. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/result_formatter.py +0 -0
  201. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/router.py +0 -0
  202. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/scoped_token.py +0 -0
  203. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/tasks.py +0 -0
  204. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/torch_runtime.py +0 -0
  205. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/transport.py +0 -0
  206. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/usage_guard.py +0 -0
  207. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/usage_observation.py +0 -0
  208. {topos_node-1.3.30 → topos_node-1.3.32}/topos/engine/validator.py +0 -0
  209. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/__init__.py +0 -0
  210. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/catalog.py +0 -0
  211. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/derivation_recovery.py +0 -0
  212. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/derived_tables.py +0 -0
  213. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/job_readiness.py +0 -0
  214. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/job_writer.py +0 -0
  215. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/__init__.py +0 -0
  216. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/base.py +0 -0
  217. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/__init__.py +0 -0
  218. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
  219. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
  220. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
  221. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
  222. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
  223. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
  224. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/derivation_job.py +0 -0
  225. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
  226. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
  227. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
  228. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
  229. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
  230. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
  231. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
  232. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
  233. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
  234. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
  235. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
  236. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
  237. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
  238. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/raw/__init__.py +0 -0
  239. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
  240. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/raw/language_job.py +0 -0
  241. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
  242. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
  243. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/model_overrides.py +0 -0
  244. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/models/__init__.py +0 -0
  245. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/models/manager.py +0 -0
  246. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/models/mvp_defaults.py +0 -0
  247. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/models/registry.py +0 -0
  248. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/models/versioning.py +0 -0
  249. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/orchestrator.py +0 -0
  250. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/pipeline_activity.py +0 -0
  251. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/processor.py +0 -0
  252. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/progress_bar.py +0 -0
  253. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/registry_contract.py +0 -0
  254. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/signal_derivation_config.json +0 -0
  255. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment/source_overrides.py +0 -0
  256. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment_lab/__init__.py +0 -0
  257. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment_lab/bundles.py +0 -0
  258. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment_lab/model_resolve.py +0 -0
  259. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment_lab/schema.py +0 -0
  260. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment_lab/service.py +0 -0
  261. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment_lab/store.py +0 -0
  262. {topos_node-1.3.30 → topos_node-1.3.32}/topos/enrichment_lab/worker.py +0 -0
  263. {topos_node-1.3.30 → topos_node-1.3.32}/topos/evals/__init__.py +0 -0
  264. {topos_node-1.3.30 → topos_node-1.3.32}/topos/evals/enrichment_eval.py +0 -0
  265. {topos_node-1.3.30 → topos_node-1.3.32}/topos/extensions.py +0 -0
  266. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/__init__.py +0 -0
  267. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/canonical.py +0 -0
  268. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/engine.py +0 -0
  269. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/entropy.py +0 -0
  270. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/focus.py +0 -0
  271. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/graph_metrics.py +0 -0
  272. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/influence.py +0 -0
  273. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/projection.py +0 -0
  274. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/snapshots.py +0 -0
  275. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/store.py +0 -0
  276. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/topic_merge.py +0 -0
  277. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/topics.py +0 -0
  278. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/topics_daily.py +0 -0
  279. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/complexity/volatility.py +0 -0
  280. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/__init__.py +0 -0
  281. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/_scales.yaml +0 -0
  282. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/admin.legal.yaml +0 -0
  283. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/behavior.habits.yaml +0 -0
  284. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/behavior.preferences.yaml +0 -0
  285. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/beliefs.civic.yaml +0 -0
  286. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/beliefs.spiritual.yaml +0 -0
  287. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/communication.style.yaml +0 -0
  288. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/community.membership.yaml +0 -0
  289. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/craft.tooling.yaml +0 -0
  290. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/expertise.knowledge.yaml +0 -0
  291. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/finances.economics.yaml +0 -0
  292. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/health.lifestyle.yaml +0 -0
  293. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/health.physical.yaml +0 -0
  294. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/household.pets.yaml +0 -0
  295. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/identity.core.yaml +0 -0
  296. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/interests.taste.yaml +0 -0
  297. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/life.events.yaml +0 -0
  298. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/narrative.self.yaml +0 -0
  299. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/personality.traits.yaml +0 -0
  300. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/possessions.assets.yaml +0 -0
  301. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/relationships.social.yaml +0 -0
  302. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/values.motivation.yaml +0 -0
  303. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/dispositions.yaml +0 -0
  304. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/expertise.yaml +0 -0
  305. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/habits.yaml +0 -0
  306. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/interests.yaml +0 -0
  307. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/preferences.yaml +0 -0
  308. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/stances.yaml +0 -0
  309. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/tools.yaml +0 -0
  310. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/values.yaml +0 -0
  311. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/candidates.py +0 -0
  312. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/guard.py +0 -0
  313. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/packs.py +0 -0
  314. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/prefilter.py +0 -0
  315. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/registry.py +0 -0
  316. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/report_card.py +0 -0
  317. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/router.py +0 -0
  318. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/surfaces.py +0 -0
  319. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/synthesize.py +0 -0
  320. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/derivation/verify.py +0 -0
  321. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/__init__.py +0 -0
  322. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/affinity.py +0 -0
  323. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/affinity_owner.py +0 -0
  324. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/affinity_quality.py +0 -0
  325. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/community_names.py +0 -0
  326. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/community_naming.py +0 -0
  327. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/consolidation.py +0 -0
  328. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/context_vectors.py +0 -0
  329. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/cypher.py +0 -0
  330. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/declared_mappings.py +0 -0
  331. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/dossier.py +0 -0
  332. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/edges.py +0 -0
  333. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/graph_enrichers.py +0 -0
  334. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/graph_refresh.py +0 -0
  335. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/graph_search.py +0 -0
  336. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/maintenance.py +0 -0
  337. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/reads.py +0 -0
  338. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/rebuild_subprocess.py +0 -0
  339. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/entities/resolver.py +0 -0
  340. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/facts/__init__.py +0 -0
  341. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/facts/extract.py +0 -0
  342. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/facts/llm_extract.py +0 -0
  343. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/facts/verdicts.py +0 -0
  344. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/fit/evaluator.py +0 -0
  345. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/fit/opportunity_types.json +0 -0
  346. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/lifecycle/__init__.py +0 -0
  347. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/lifecycle/blackhole.py +0 -0
  348. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/lifecycle/blackhole_guard.py +0 -0
  349. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/lifecycle/blackhole_llm.py +0 -0
  350. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/lifecycle/blackhole_rebuild.py +0 -0
  351. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/lifecycle/exclusions.py +0 -0
  352. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/lifecycle/gc.py +0 -0
  353. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/provenance/__init__.py +0 -0
  354. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/provenance/posture.py +0 -0
  355. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/provenance/roles.py +0 -0
  356. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/__init__.py +0 -0
  357. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/brief_canonical_loader.py +0 -0
  358. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/brief_ontology.py +0 -0
  359. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/brief_renderer.py +0 -0
  360. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/brief_schemas.py +0 -0
  361. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/chunking.py +0 -0
  362. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/cluster_labels.py +0 -0
  363. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/conversation_context.py +0 -0
  364. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/data_health.py +0 -0
  365. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/brief_ontologies.json +0 -0
  366. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/intentions.json +0 -0
  367. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/interests.json +0 -0
  368. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/memory.json +0 -0
  369. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/places.json +0 -0
  370. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/profile.json +0 -0
  371. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/relationships.json +0 -0
  372. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/resources.json +0 -0
  373. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
  374. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/time.json +0 -0
  375. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/wellbeing.json +0 -0
  376. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/definitions/work.json +0 -0
  377. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/derived_spec.py +0 -0
  378. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/dimension_briefs.py +0 -0
  379. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/dimension_definition_loader.py +0 -0
  380. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/dimension_profiles.py +0 -0
  381. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/dimension_registry.py +0 -0
  382. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/embed_context.py +0 -0
  383. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/extraction/artifact_router.py +0 -0
  384. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/extraction/artifact_store.py +0 -0
  385. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/extraction/rule_extractors.py +0 -0
  386. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/graph_sanitize.py +0 -0
  387. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/hybrid_search.py +0 -0
  388. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/incremental_clustering.py +0 -0
  389. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/model_recommendations.py +0 -0
  390. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/query_embed_cache.py +0 -0
  391. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/schemas.py +0 -0
  392. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/service.py +0 -0
  393. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/signal_object_store.py +0 -0
  394. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/source_hydration.py +0 -0
  395. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/structured_signal.py +0 -0
  396. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/tool_index.py +0 -0
  397. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/topic_clustering.py +0 -0
  398. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/typed_stores/aggregates.py +0 -0
  399. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/typed_stores/commitments.py +0 -0
  400. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/typed_stores/rhythm.py +0 -0
  401. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
  402. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/vector_codec.py +0 -0
  403. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/vector_math.py +0 -0
  404. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/signal/vector_settings.py +0 -0
  405. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/stats/__init__.py +0 -0
  406. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/stats/definitions.py +0 -0
  407. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/stats/engine.py +0 -0
  408. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/stats/fold.py +0 -0
  409. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/stats/insights.py +0 -0
  410. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/timeline_projection.py +0 -0
  411. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/timeline_rollup.py +0 -0
  412. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/triage/__init__.py +0 -0
  413. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/triage/badges.py +0 -0
  414. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/triage/daily.py +0 -0
  415. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/triage/dashboard.py +0 -0
  416. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/triage/instruments.py +0 -0
  417. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/triage/intents.py +0 -0
  418. {topos_node-1.3.30 → topos_node-1.3.32}/topos/features/triage/readiness.py +0 -0
  419. {topos_node-1.3.30 → topos_node-1.3.32}/topos/filter_lab/__init__.py +0 -0
  420. {topos_node-1.3.30 → topos_node-1.3.32}/topos/filter_lab/bundles.py +0 -0
  421. {topos_node-1.3.30 → topos_node-1.3.32}/topos/filter_lab/schema.py +0 -0
  422. {topos_node-1.3.30 → topos_node-1.3.32}/topos/filter_lab/service.py +0 -0
  423. {topos_node-1.3.30 → topos_node-1.3.32}/topos/filter_lab/store.py +0 -0
  424. {topos_node-1.3.30 → topos_node-1.3.32}/topos/filter_lab/worker.py +0 -0
  425. {topos_node-1.3.30 → topos_node-1.3.32}/topos/home_chat/__init__.py +0 -0
  426. {topos_node-1.3.30 → topos_node-1.3.32}/topos/home_chat/schema.py +0 -0
  427. {topos_node-1.3.30 → topos_node-1.3.32}/topos/home_chat/store.py +0 -0
  428. {topos_node-1.3.30 → topos_node-1.3.32}/topos/hosted_pool_lease.py +0 -0
  429. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/__init__.py +0 -0
  430. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/canonical_pipeline.py +0 -0
  431. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/checkpoints/__init__.py +0 -0
  432. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
  433. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
  434. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/inbox_crypto.py +0 -0
  435. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/inbox_drain.py +0 -0
  436. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/ingest_helpers.py +0 -0
  437. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/jobs.py +0 -0
  438. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/journal_location_fanout.py +0 -0
  439. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/journal_time_log_normalize.py +0 -0
  440. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/local_sync.py +0 -0
  441. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/log_preview.py +0 -0
  442. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/manager.py +0 -0
  443. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parser.py +0 -0
  444. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/__init__.py +0 -0
  445. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/base.py +0 -0
  446. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/browser_parser.py +0 -0
  447. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/calendar_parser.py +0 -0
  448. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
  449. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
  450. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
  451. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/documents_parser.py +0 -0
  452. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/github_activity_parser.py +0 -0
  453. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
  454. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/grok_parser.py +0 -0
  455. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/messenger_parser.py +0 -0
  456. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/parsers/voxterm_parser.py +0 -0
  457. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/progress.py +0 -0
  458. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/reprocess.py +0 -0
  459. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/sources/__init__.py +0 -0
  460. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/sources/base.py +0 -0
  461. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/sources/calendar.py +0 -0
  462. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/sources/chatgpt.py +0 -0
  463. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/sources/contact_importers.py +0 -0
  464. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/sources/grok.py +0 -0
  465. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/sources/imessage_reader.py +0 -0
  466. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/sources/signal_export_parser.py +0 -0
  467. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/sources/signal_reader.py +0 -0
  468. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/state_machine.py +0 -0
  469. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/triggers/__init__.py +0 -0
  470. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/triggers/file_trigger.py +0 -0
  471. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
  472. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/usage_inbox_dedupe.py +0 -0
  473. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/validation/__init__.py +0 -0
  474. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/validation/base.py +0 -0
  475. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/validation/schema_registry.py +0 -0
  476. {topos_node-1.3.30 → topos_node-1.3.32}/topos/ingestion/validation/schema_validator.py +0 -0
  477. {topos_node-1.3.30 → topos_node-1.3.32}/topos/lineage/__init__.py +0 -0
  478. {topos_node-1.3.30 → topos_node-1.3.32}/topos/lineage/provenance.py +0 -0
  479. {topos_node-1.3.30 → topos_node-1.3.32}/topos/lineage/tracker.py +0 -0
  480. {topos_node-1.3.30 → topos_node-1.3.32}/topos/llm_integrations_storage.py +0 -0
  481. {topos_node-1.3.30 → topos_node-1.3.32}/topos/mcp_stdio_proxy.py +0 -0
  482. {topos_node-1.3.30 → topos_node-1.3.32}/topos/observability/__init__.py +0 -0
  483. {topos_node-1.3.30 → topos_node-1.3.32}/topos/observability/alerts.py +0 -0
  484. {topos_node-1.3.30 → topos_node-1.3.32}/topos/observability/metrics.py +0 -0
  485. {topos_node-1.3.30 → topos_node-1.3.32}/topos/observability/tracing.py +0 -0
  486. {topos_node-1.3.30 → topos_node-1.3.32}/topos/openai_client.py +0 -0
  487. {topos_node-1.3.30 → topos_node-1.3.32}/topos/pipeline/__init__.py +0 -0
  488. {topos_node-1.3.30 → topos_node-1.3.32}/topos/pipeline/audit.py +0 -0
  489. {topos_node-1.3.30 → topos_node-1.3.32}/topos/pipeline/envelope.py +0 -0
  490. {topos_node-1.3.30 → topos_node-1.3.32}/topos/pipeline/job_runner.py +0 -0
  491. {topos_node-1.3.30 → topos_node-1.3.32}/topos/pipeline/job_store.py +0 -0
  492. {topos_node-1.3.30 → topos_node-1.3.32}/topos/pipeline/stages.py +0 -0
  493. {topos_node-1.3.30 → topos_node-1.3.32}/topos/pipeline/stub_enqueue.py +0 -0
  494. {topos_node-1.3.30 → topos_node-1.3.32}/topos/profiles.py +0 -0
  495. {topos_node-1.3.30 → topos_node-1.3.32}/topos/projections/__init__.py +0 -0
  496. {topos_node-1.3.30 → topos_node-1.3.32}/topos/projections/vector_index/__init__.py +0 -0
  497. {topos_node-1.3.30 → topos_node-1.3.32}/topos/projections/vector_index/base.py +0 -0
  498. {topos_node-1.3.30 → topos_node-1.3.32}/topos/projections/vector_index/builders.py +0 -0
  499. {topos_node-1.3.30 → topos_node-1.3.32}/topos/projections/vector_index/health_checks.py +0 -0
  500. {topos_node-1.3.30 → topos_node-1.3.32}/topos/protocol/__init__.py +0 -0
  501. {topos_node-1.3.30 → topos_node-1.3.32}/topos/protocol/handled_message_types.json +0 -0
  502. {topos_node-1.3.30 → topos_node-1.3.32}/topos/protocol/narrowing_vocabulary.json +0 -0
  503. {topos_node-1.3.30 → topos_node-1.3.32}/topos/protocol/query_field_contract.json +0 -0
  504. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/__init__.py +0 -0
  505. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/audit.py +0 -0
  506. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/cohort_resolvers.py +0 -0
  507. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/ddr.py +0 -0
  508. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/disclosure.py +0 -0
  509. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/entity_window.py +0 -0
  510. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/exclusion.py +0 -0
  511. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/fingerprint.py +0 -0
  512. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/grant_cache.py +0 -0
  513. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/inference.py +0 -0
  514. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/intent.py +0 -0
  515. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/manifest.py +0 -0
  516. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/manifest_validation.py +0 -0
  517. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/minimizer.py +0 -0
  518. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/narrowing.py +0 -0
  519. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/negotiation.py +0 -0
  520. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/packet_resolution.py +0 -0
  521. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/pipeline.py +0 -0
  522. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/planner.py +0 -0
  523. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/retrieval.py +0 -0
  524. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/runtime.py +0 -0
  525. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/scope_arbiter.py +0 -0
  526. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/scope_classifier.py +0 -0
  527. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/scope_head.py +0 -0
  528. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/scope_registry.json +0 -0
  529. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/scope_registry_loader.py +0 -0
  530. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/scope_shadow.py +0 -0
  531. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/session.py +0 -0
  532. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/session_utils.py +0 -0
  533. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/source_generation.py +0 -0
  534. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/truth_facts.py +0 -0
  535. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/truth_prompts.py +0 -0
  536. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/turn_classifier.py +0 -0
  537. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/types.py +0 -0
  538. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/verify.py +0 -0
  539. {topos_node-1.3.30 → topos_node-1.3.32}/topos/query/verify_modes.py +0 -0
  540. {topos_node-1.3.30 → topos_node-1.3.32}/topos/rate_limit.py +0 -0
  541. {topos_node-1.3.30 → topos_node-1.3.32}/topos/routines/__init__.py +0 -0
  542. {topos_node-1.3.30 → topos_node-1.3.32}/topos/routines/schema.py +0 -0
  543. {topos_node-1.3.30 → topos_node-1.3.32}/topos/routines/store.py +0 -0
  544. {topos_node-1.3.30 → topos_node-1.3.32}/topos/runtime_housekeeping.py +0 -0
  545. {topos_node-1.3.30 → topos_node-1.3.32}/topos/runtime_shutdown.py +0 -0
  546. {topos_node-1.3.30 → topos_node-1.3.32}/topos/runtime_update.py +0 -0
  547. {topos_node-1.3.30 → topos_node-1.3.32}/topos/sanitization/__init__.py +0 -0
  548. {topos_node-1.3.30 → topos_node-1.3.32}/topos/sanitization/nsfw_classifier.py +0 -0
  549. {topos_node-1.3.30 → topos_node-1.3.32}/topos/sanitization/ollama_transforms.py +0 -0
  550. {topos_node-1.3.30 → topos_node-1.3.32}/topos/sanitization/prewarm.py +0 -0
  551. {topos_node-1.3.30 → topos_node-1.3.32}/topos/sanitization/privacy_filter.py +0 -0
  552. {topos_node-1.3.30 → topos_node-1.3.32}/topos/scope_resolution.py +0 -0
  553. {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/__init__.py +0 -0
  554. {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/container.py +0 -0
  555. {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/embeddings/__init__.py +0 -0
  556. {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/embeddings/base.py +0 -0
  557. {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/embeddings/local.py +0 -0
  558. {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/embeddings/remote.py +0 -0
  559. {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/interfaces.py +0 -0
  560. {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/llm/__init__.py +0 -0
  561. {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/llm/base.py +0 -0
  562. {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/llm/openai.py +0 -0
  563. {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/local.py +0 -0
  564. {topos_node-1.3.30 → topos_node-1.3.32}/topos/services/postgres.py +0 -0
  565. {topos_node-1.3.30 → topos_node-1.3.32}/topos/sources/__init__.py +0 -0
  566. {topos_node-1.3.30 → topos_node-1.3.32}/topos/sources/bundled_canonical_triples.py +0 -0
  567. {topos_node-1.3.30 → topos_node-1.3.32}/topos/sources/canonical_signal_defaults.py +0 -0
  568. {topos_node-1.3.30 → topos_node-1.3.32}/topos/sources/declared_field_map_spec.py +0 -0
  569. {topos_node-1.3.30 → topos_node-1.3.32}/topos/sources/definitions.py +0 -0
  570. {topos_node-1.3.30 → topos_node-1.3.32}/topos/sources/install_service.py +0 -0
  571. {topos_node-1.3.30 → topos_node-1.3.32}/topos/sources/registry.py +0 -0
  572. {topos_node-1.3.30 → topos_node-1.3.32}/topos/sources/runtime_install.py +0 -0
  573. {topos_node-1.3.30 → topos_node-1.3.32}/topos/sources/scrub_attribution.py +0 -0
  574. {topos_node-1.3.30 → topos_node-1.3.32}/topos/sources/scrub_service.py +0 -0
  575. {topos_node-1.3.30 → topos_node-1.3.32}/topos/startup_banner.py +0 -0
  576. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/__init__.py +0 -0
  577. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/adapters/__init__.py +0 -0
  578. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/adapters/factory.py +0 -0
  579. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/adapters/fakes.py +0 -0
  580. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/adapters/postgres/stores.py +0 -0
  581. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/adapters/protocols.py +0 -0
  582. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/adapters/sqlite/__init__.py +0 -0
  583. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/adapters/sqlite/stores.py +0 -0
  584. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/adapters/sqlite/vector_search.py +0 -0
  585. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/__init__.py +0 -0
  586. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/activity_tables.py +0 -0
  587. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/ai_chat/__init__.py +0 -0
  588. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
  589. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/ai_chat/mapper.py +0 -0
  590. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/ai_chat/model.py +0 -0
  591. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/ai_chat/tables.py +0 -0
  592. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
  593. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/canonical_store.py +0 -0
  594. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/conversations_tables.py +0 -0
  595. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/journal_repair.py +0 -0
  596. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/mapping_store.py +0 -0
  597. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/canonical/postgres.py +0 -0
  598. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/__init__.py +0 -0
  599. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/client.py +0 -0
  600. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/connection_tuning.py +0 -0
  601. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/__init__.py +0 -0
  602. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
  603. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/actor_role_v1.py +0 -0
  604. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
  605. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
  606. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
  607. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/backup.py +0 -0
  608. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
  609. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
  610. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
  611. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
  612. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/community_names_v1.py +0 -0
  613. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/complexity_v1.py +0 -0
  614. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/conflict_provenance_v1.py +0 -0
  615. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
  616. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/derivation_factory_v1.py +0 -0
  617. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
  618. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/derivation_provenance_v1.py +0 -0
  619. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/documents_v1.py +0 -0
  620. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/enrichment_record_progress_v1.py +0 -0
  621. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
  622. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
  623. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
  624. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
  625. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
  626. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
  627. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/entity_mentions_authored_v1.py +0 -0
  628. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/entity_review_candidate_bar_v1.py +0 -0
  629. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/entity_review_dedup_v1.py +0 -0
  630. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/entity_review_provenance_v1.py +0 -0
  631. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/episodes_v1.py +0 -0
  632. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
  633. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
  634. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
  635. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
  636. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
  637. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
  638. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/journal_origin_dimension_v1.py +0 -0
  639. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
  640. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
  641. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/pack_registry_v1.py +0 -0
  642. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
  643. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/query_artifacts_duration_ms_v1.py +0 -0
  644. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/registry.py +0 -0
  645. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/registry_checksums.json +0 -0
  646. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/remediation_person_model.py +0 -0
  647. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/retire_url_classification_v1.py +0 -0
  648. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/scope_source_generation.py +0 -0
  649. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
  650. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
  651. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/signal_objects.py +0 -0
  652. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
  653. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
  654. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
  655. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
  656. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
  657. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
  658. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
  659. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
  660. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
  661. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
  662. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
  663. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
  664. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
  665. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
  666. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
  667. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
  668. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
  669. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
  670. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
  671. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
  672. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
  673. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
  674. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/paths.py +0 -0
  675. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/postgres.py +0 -0
  676. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/schema.py +0 -0
  677. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/schema_probe.py +0 -0
  678. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/storage_breakdown.py +0 -0
  679. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/db/write_gate.py +0 -0
  680. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/enrichment/__init__.py +0 -0
  681. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
  682. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
  683. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/normalized/__init__.py +0 -0
  684. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/normalized/normalized_store.py +0 -0
  685. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/oplog/__init__.py +0 -0
  686. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/oplog/decision.py +0 -0
  687. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/oplog/oplog_store.py +0 -0
  688. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/oplog/postgres.py +0 -0
  689. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/person/identity_resolver.py +0 -0
  690. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/projections/__init__.py +0 -0
  691. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/projections/index_ops_store.py +0 -0
  692. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/projections/vector_index_store.py +0 -0
  693. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/raw/__init__.py +0 -0
  694. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/raw/browser_flat_tables.py +0 -0
  695. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/raw/file_store.py +0 -0
  696. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/raw/raw_store.py +0 -0
  697. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/raw/raw_tables_manager.py +0 -0
  698. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/raw/sqlite_raw_store.py +0 -0
  699. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/security/encryption.py +0 -0
  700. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/signal_identity.py +0 -0
  701. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/source_settings.py +0 -0
  702. {topos_node-1.3.30 → topos_node-1.3.32}/topos/storage/user_identity.py +0 -0
  703. {topos_node-1.3.30 → topos_node-1.3.32}/topos/sync/__init__.py +0 -0
  704. {topos_node-1.3.30 → topos_node-1.3.32}/topos/sync/client.py +0 -0
  705. {topos_node-1.3.30 → topos_node-1.3.32}/topos/sync_handlers.py +0 -0
  706. {topos_node-1.3.30 → topos_node-1.3.32}/topos/testing/__init__.py +0 -0
  707. {topos_node-1.3.30 → topos_node-1.3.32}/topos/testing/lifespan.py +0 -0
  708. {topos_node-1.3.30 → topos_node-1.3.32}/topos/uma_contact_enrichment.py +0 -0
  709. {topos_node-1.3.30 → topos_node-1.3.32}/topos/uma_filters.py +0 -0
  710. {topos_node-1.3.30 → topos_node-1.3.32}/topos/uma_resource_id.py +0 -0
  711. {topos_node-1.3.30 → topos_node-1.3.32}/topos/uma_rpt.py +0 -0
  712. {topos_node-1.3.30 → topos_node-1.3.32}/topos/upgrades/__init__.py +0 -0
  713. {topos_node-1.3.30 → topos_node-1.3.32}/topos/upgrades/runner.py +0 -0
  714. {topos_node-1.3.30 → topos_node-1.3.32}/topos/utils/base_object.py +0 -0
  715. {topos_node-1.3.30 → topos_node-1.3.32}/topos/websocket_client.py +0 -0
  716. {topos_node-1.3.30 → topos_node-1.3.32}/topos_node.egg-info/SOURCES.txt +0 -0
  717. {topos_node-1.3.30 → topos_node-1.3.32}/topos_node.egg-info/dependency_links.txt +0 -0
  718. {topos_node-1.3.30 → topos_node-1.3.32}/topos_node.egg-info/entry_points.txt +0 -0
  719. {topos_node-1.3.30 → topos_node-1.3.32}/topos_node.egg-info/requires.txt +0 -0
  720. {topos_node-1.3.30 → topos_node-1.3.32}/topos_node.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: topos-node
3
- Version: 1.3.30
3
+ Version: 1.3.32
4
4
  Summary: Topos personal AI engine (FastAPI): local data, sync, control plane WebSocket client
5
5
  License-Expression: Apache-2.0
6
6
  Project-URL: Homepage, https://topos.dialogues.ai
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "topos-node"
7
- version = "1.3.30"
7
+ version = "1.3.32"
8
8
  description = "Topos personal AI engine (FastAPI): local data, sync, control plane WebSocket client"
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -1,6 +1,6 @@
1
1
  """Topos Control Plane Version Information."""
2
2
 
3
- __version__ = "1.3.30"
4
- __version_info__ = (1, 3, 30)
3
+ __version__ = "1.3.32"
4
+ __version_info__ = (1, 3, 32)
5
5
 
6
6
  __all__ = ["__version__", "__version_info__"]
@@ -73,8 +73,8 @@ guidance:
73
73
  - "Authored-only: an assigned OKR is work context, not a personal goal, unless the owner adopts it in their own words."
74
74
  - "Idle wishes ('would love to someday') are aspirations, never goals — the horizon field is load-bearing."
75
75
  - "v0.2.4 A goal is STATED INTENT in the owner's own words ('Goal:', 'I want to', 'I will').
76
- Wry observations, jokes and family lore ('this is the closest I can keep that pattern
77
- going') are never goals — if the owner would be surprised to see it on their goal list,
76
+ Wry observations, jokes and family lore ('guess the family streak continues through me
77
+ ') are never goals — if the owner would be surprised to see it on their goal list,
78
78
  extract nothing."
79
79
  - "v0.2.4 goal_ref is a NAME (a few words), not a sentence — a goal_ref longer than ~8 words
80
80
  means the goal was never really named; prefer the Goal: header's own phrasing."
@@ -31,7 +31,7 @@ predicates:
31
31
  v0.2.4 — a state report is a FELT-STATE statement about how the owner is/was
32
32
  ("I am exhausted", "slept 8 hours, wild dreams", "so nervous with the talk").
33
33
  An intention, aspiration, reflection or observation is NOT a state, whatever
34
- dimension it brushes: "I need to be talking to more intelligent people" is a
34
+ dimension it brushes: "I need to be around more ambitious builders" is a
35
35
  want, not an energy report; "the talk motivated me to write" is a reflection,
36
36
  not a focus report. If the words don't describe how the owner FEELS or FELT,
37
37
  extract nothing.
@@ -70,9 +70,9 @@ eval:
70
70
  - {text: "Third week straight of terrible sleep, I'm running on fumes", role: authored,
71
71
  expect: [{predicate: mind.self_reported_state, value: {dimension: sleep_quality}}]}
72
72
  negative_controls:
73
- - {text: "I need to be talking to more intelligent people. To go out of my way to speak with people.", role: authored,
73
+ - {text: "I need to be around more ambitious builders. To go out of my way to find them.", role: authored,
74
74
  expect_not: [{predicate: mind.self_reported_state}], note: "v0.2.4 measured junk: a want is not an energy state"}
75
- - {text: "The talk at the end motivated me to write my own thought on coordination tools.", role: authored,
75
+ - {text: "The workshop at the end inspired me to draft my own essay on collaboration tools.", role: authored,
76
76
  expect_not: [{predicate: mind.self_reported_state}], note: "v0.2.4 measured junk: a reflection is not a focus state"}
77
77
  - {text: "Podcast episode about burnout culture in tech", role: ambient, expect: []}
78
78
  - {text: "My brother finally started therapy, proud of him", role: authored, expect: [], note: "third party"}
@@ -81,8 +81,8 @@ decisions:
81
81
  - >
82
82
  2026-08-26 (W5 gate, measured): role_policy tightened to authored_addressed —
83
83
  with ambient/observed allowed, OTHER PEOPLE'S messages became owner place-ties
84
- ("I am once again at Radio East" from a friend -> owner workplace_location;
85
- a friend's NJ parking find -> owner tie to New Jersey). 4/5 sampled accepts
84
+ ("I am once again at the Harbor Cafe" from a friend -> owner workplace_location;
85
+ a friend's parking find -> owner tie to that city). 4/5 sampled accepts
86
86
  were junk, dominated by this leak. Location-bearing ambient signals return
87
87
  via the no-LLM synthesizer lane (timestamps/geo), never via LLM reading of
88
88
  others' words.
@@ -117,12 +117,12 @@ eval:
117
117
  expect: [{predicate: work.project, value: {status: paused}}]}
118
118
  negative_controls:
119
119
  - {text: "Sounds like Dana's team is hiring three more", role: authored, expect: [], note: "other team's news"}
120
- - {text: "I applied to Tavus' job application today", role: authored, expect: [], note: "v0.2.2 measured junk: applied is NOT hired"}
121
- - {text: "I applied to the Google Startup Fund", role: authored, expect: [], note: "v0.2.2 measured junk: applying for funding is NOT started_venture"}
120
+ - {text: "I applied to Meridian's open role today", role: authored, expect: [], note: "v0.2.2 measured junk: applied is NOT hired"}
121
+ - {text: "I applied to the Horizon Startup Fund", role: authored, expect: [], note: "v0.2.2 measured junk: applying for funding is NOT started_venture"}
122
122
  - {text: "I filed for unemployment.", role: authored, expect: [{predicate: work.employment_shape, value: between_roles}],
123
123
  expect_not: [{predicate: work.career_event}], note: "v0.2.2: shape yes, event no"}
124
- - {text: "I took the ccat again. I got a 32.", role: authored, expect: [], note: "v0.2.2 measured junk: a test score is not an award"}
125
- - {text: "All day with Texas Ventures.", role: authored, expect_not: [{predicate: work.employer}], note: "v0.2.2 measured junk: co-presence is not employment"}
124
+ - {text: "I took the practice aptitude test again. Scored a 32.", role: authored, expect: [], note: "v0.2.2 measured junk: a test score is not an award"}
125
+ - {text: "All day with Harbor Ventures.", role: authored, expect_not: [{predicate: work.employer}], note: "v0.2.2 measured junk: co-presence is not employment"}
126
126
  - {text: "(newsletter: 'The 2026 layoff wave continues')", role: ambient, expect: []}
127
127
  calibration: {min_conf_for_assert: 0.65, ece_max: 0.15}
128
128
 
@@ -100,7 +100,7 @@ LOSS_EVIDENCE = ("died", "passed", "passing", "funeral", "loss of", "death", "re
100
100
 
101
101
  def relationship_role_check(role: str, person: str, record_text: str):
102
102
  """A1 role-evidence guard (measured 2026-08-26 full-run): the 27B verifier
103
- CONSISTENTLY accepts possessive misattribution ("Wiki and her boyfriend Luc"
103
+ CONSISTENTLY accepts possessive misattribution ("Nora and her boyfriend Theo"
104
104
  -> owner's partner) — textual support without subject discipline. Rules,
105
105
  all deterministic:
106
106
  1. A kin-term PERSON ("Mom", "brother") is self-evidencing -> owner.
@@ -239,7 +239,7 @@ Hard rules:
239
239
  - Extract only what this record actually states about the OWNER. No guesses, no world knowledge.
240
240
  - Every assertion MUST carry "about": "owner" if the fact is about the record's author-owner,
241
241
  "other:<name>" if the record states it about someone else (their appointment, their partner,
242
- their loss — e.g. "Wiki and her boyfriend Luc" -> about: "other:Wiki"), or "unclear" if you
242
+ their loss — e.g. "Nora and her boyfriend Theo" -> about: "other:Nora"), or "unclear" if you
243
243
  cannot tell. Facts about others are NOT discarded — they are routed to that person's dossier —
244
244
  so NEVER launder a third party's fact into "owner" to save it.
245
245
  The about field does NOT make extraction stricter: extract exactly what you would have
@@ -23,9 +23,23 @@ import uuid
23
23
  from datetime import datetime, timezone, timedelta
24
24
  from typing import Any, Dict, List, Optional
25
25
 
26
+ import os
27
+
26
28
  from topos.features.facts.store import FactStore, normalize_predicate, CONFLICT_CONFIDENCE_MARGIN
27
29
  from .guard import find_identifiers
28
30
  from .packs import Pack, Predicate
31
+
32
+ #: Whether a resolved `about=other:<name>` assertion may be WRITTEN to that person's
33
+ #: dossier. Default OFF, and it must stay off until a net-subject policy plane exists
34
+ #: (per-subject opt-in defaulting to off, a write-time BlackholeStore consult, and
35
+ #: pack-level `net_subject: allow|deny`). With it off, every outward assertion is
36
+ #: quarantined with reason `net_subject_disabled:<name>` and waits for a human.
37
+ #:
38
+ #: The env override exists so the policy work can be developed and tested against the
39
+ #: real path without editing the module. It is NOT a supported production setting: any
40
+ #: node that sets it is writing durable facts about people who never consented and
41
+ #: cannot, with no gate in front of the write.
42
+ NET_SUBJECT_WRITES_ENABLED = os.environ.get("TOPOS_NET_SUBJECT_WRITES") == "1"
29
43
  # extractor provenance must track the PROMPT actually used — a local copy of this
30
44
  # constant stamped every shadow-2..6 fact "shadow-1" (caught in W1.3 grading)
31
45
  from .template import TEMPLATE_VERSION
@@ -206,6 +220,43 @@ class DerivationWriter:
206
220
  # --- A3 (attribution ladder): route by subject BEFORE any owner-assert ---
207
221
  about = (about or "owner").strip()
208
222
  if about != "owner":
223
+ # --- net-subject kill switch (temporary; remove when the policy plane lands) ---
224
+ #
225
+ # Below this line, `about=other:<name>` that RESOLVES is written as a durable
226
+ # fact onto that person's dossier. There is currently no consent plane to
227
+ # authorise that: `net_subject` / `subject_axis` appear ZERO times in this
228
+ # engine, the control plane, the front end, or any of the 25 pack YAMLs; the
229
+ # Pack/Predicate dataclasses carry no subject field, so a pack can neither
230
+ # declare nor refuse an outward subject; `pack.disclosure_default` is stored
231
+ # on every registry row and never read; and BlackholeGuard is consulted only
232
+ # at READ time, so a blackholed person can still ACCRUE facts.
233
+ #
234
+ # Nothing has been written so far only because `_resolve_person` is an exact
235
+ # match on `entities.normalized_name` and fails on every third-party first
236
+ # name — 624 of 1,505 person entities are keyed on a phone number and only 36
237
+ # carry aliases. That is an accident of an unbuilt person spine, not a policy.
238
+ # The planned L0 (person spine) exists precisely to make that resolution
239
+ # succeed, which would silently switch automatic third-party dossier writing
240
+ # ON. The owner's standing decision is "off until asked".
241
+ #
242
+ # So: quarantine EVERY outward assertion, resolvable or not. Quarantine is
243
+ # already the reviewed path — the rows carry full provenance and the fact
244
+ # editor promotes them — so nothing is lost, only deferred to a human.
245
+ #
246
+ # REMOVE THIS BLOCK when the net-subject policy plane exists (plan L4-4:
247
+ # per-subject opt-in defaulting to off, a write-time BlackholeStore consult,
248
+ # and pack-level `net_subject: allow|deny`). Replace it with that lookup —
249
+ # do not simply delete it.
250
+ if about.startswith("other:") and not NET_SUBJECT_WRITES_ENABLED:
251
+ # Its own reason, deliberately: these are POLICY holds, not failures to
252
+ # identify a subject. Collapsing them into `about_unclear` would make a
253
+ # withheld-by-policy row indistinguishable from one the verifier could
254
+ # not attribute, and the review queue's whole value is that distinction.
255
+ self._quarantine(subject_entity_id, predicate, value, confidence,
256
+ reason=f"net_subject_disabled:{about[6:][:40]}",
257
+ pack=pack, source_refs=source_refs, quote=quote, about=about)
258
+ self.stats["net_subject_withheld"] = self.stats.get("net_subject_withheld", 0) + 1
259
+ return {"outcome": "quarantined", "reason": "net-subject writes disabled"}
209
260
  if about.startswith("other:"):
210
261
  other = self._resolve_person(about[6:])
211
262
  if other:
@@ -360,7 +360,7 @@ def _display_value(raw) -> str:
360
360
  return hv.strip()
361
361
  # NO fallback to arbitrary fields: a description/free-text value is
362
362
  # narrative, not identity — minting it produced sentence-named nodes
363
- # ("rode with albi on the way to…"). A structured value with no
363
+ # ("rode with a friend on the way to…"). A structured value with no
364
364
  # identity key mints nothing; the fact itself still exists.
365
365
  return ""
366
366
  return str(v or "").strip()
@@ -43,7 +43,7 @@ _LINK_STOPWORDS = frozenset(
43
43
 
44
44
  def _linkable_candidate(cand: str) -> bool:
45
45
  """A candidate name is linkable only if it carries at least one real word:
46
- ≥3 chars and not a function word. 'Luc' links; 'IS', 'Go', 'The One' do not."""
46
+ ≥3 chars and not a function word. 'Leo' links; 'IS', 'Go', 'The One' do not."""
47
47
  words = [w for w in cand.split() if w]
48
48
  if not words:
49
49
  return False
@@ -136,7 +136,13 @@ def list_facts(
136
136
  "period_start": payload.get("period_start"),
137
137
  "period_end": payload.get("period_end"),
138
138
  "confidence": payload.get("confidence", fact["confidence"]),
139
- "disclosure": payload.get("disclosure", "scoped"),
139
+ # Fail closed, and match the sibling reader 74 lines below, which
140
+ # already defaults to owner_only. A payload with no disclosure is
141
+ # a row nobody classified; reading it as shareable is the wrong
142
+ # direction to guess in, and the two readers disagreeing meant the
143
+ # same unclassified row was shareable on one path and private on
144
+ # the other.
145
+ "disclosure": payload.get("disclosure", "owner_only"),
140
146
  # Attribution: who asserted this claim (owner | contact:<id> |
141
147
  # assistant | page-author | …). Powers the person→ambient badge.
142
148
  "asserted_by": payload.get("asserted_by", "owner"),
@@ -110,7 +110,14 @@ class FactStore:
110
110
  confidence: float = 0.7,
111
111
  source_refs: Optional[List[Dict[str, Any]]] = None,
112
112
  valid_from: Optional[str] = None,
113
- disclosure: str = "scoped",
113
+ # Fail closed. Every in-tree caller passes this explicitly (verdicts.py,
114
+ # llm_extract.py, extract.py x2, truth_facts.py), so the default is only
115
+ # ever reached by a caller that forgot — and the safe thing to do with a
116
+ # claim about a person when nobody said how far it may travel is to keep
117
+ # it. This is the second fact write path: DerivationWriter pins owner_only
118
+ # by construction, and this one did not, so "facts are owner_only" was
119
+ # true of one lane and merely conventional in the other.
120
+ disclosure: str = "owner_only",
114
121
  period_start: Optional[str] = None,
115
122
  period_end: Optional[str] = None,
116
123
  asserted_by: str = "owner",
@@ -524,9 +524,22 @@ def sweep_orphans(conn: sqlite3.Connection) -> Dict[str, int]:
524
524
  """
525
525
  )
526
526
  out["embedding_entities"] = int(cursor.rowcount or 0)
527
+ # A conflict row is an orphan when the fact it CHALLENGES is gone. A3
528
+ # quarantine rows have no incumbent by design — an unroutable or withheld
529
+ # assertion is not challenging anything — so they carry the synthetic
530
+ # sentinel `quarantine:<reason>` (writer.py::_quarantine). That sentinel is
531
+ # never a signal_objects.object_id, so the orphan predicate matched every
532
+ # one of them: measured on the live node 2026-08-26, all 13 pending rows
533
+ # would be deleted by this sweep, and it fires on the owner's ordinary
534
+ # per-record exclusion flow. That queue is the human review path for
535
+ # third-party assertions — including health.condition about people who
536
+ # never consented — so deleting it silently discards exactly the decisions
537
+ # a person is supposed to make.
527
538
  cursor = conn.execute(
528
539
  """
529
- DELETE FROM fact_conflicts WHERE incumbent_object_id NOT IN (
540
+ DELETE FROM fact_conflicts
541
+ WHERE incumbent_object_id NOT LIKE 'quarantine:%'
542
+ AND incumbent_object_id NOT IN (
530
543
  SELECT object_id FROM signal_objects WHERE object_type='fact'
531
544
  )
532
545
  """
@@ -38,7 +38,8 @@ _ALIASES: List[tuple] = [
38
38
  (r"\b(career|fired|hired|promoted|laid off)\b", ["work.career_event"], False),
39
39
  (r"\bfamily member|my (family|relatives|parents|siblings|kids|children)\b",
40
40
  ["rel.relationship"], False),
41
- (r"\b(closest|inner circle|best friend)s?\b", ["rel.closeness_tier", "rel.relationship"], False),
41
+ (r"\b(closest|inner circle|close circle|close friend|best friend)s?\b",
42
+ ["rel.closeness_tier", "rel.relationship"], False),
42
43
  (r"\bchronotype|night owl|early bird\b", ["behavior.chronotype"], False),
43
44
  ]
44
45
 
@@ -66,19 +67,43 @@ def fetch_direct_facts(
66
67
  return None
67
68
  if special and packet_resolution != "facts_all":
68
69
  return None
69
- owner = conn.execute("SELECT entity_id FROM entities WHERE is_self=1").fetchone()
70
+ # `is_self` is not unique: live 2026-08-26 three entities carried it —
71
+ # ent_e73ff33ae330422b ("Owner", 178 facts) plus two "self" rows created that
72
+ # morning holding none. An unordered fetchone() picked the fact-bearing row by
73
+ # rowid luck; a vacuum or a rewrite of that row would have silently blanked
74
+ # every known-item answer. Prefer the self-entity that actually owns facts,
75
+ # entity_id as the tiebreak, so the choice is stable across rewrites. (No
76
+ # created_at in the ORDER BY: the query fixtures build a minimal `entities`
77
+ # table without it.)
78
+ owner = conn.execute(
79
+ """SELECT e.entity_id
80
+ FROM entities e
81
+ WHERE e.is_self=1
82
+ ORDER BY (SELECT COUNT(*) FROM signal_objects o
83
+ WHERE o.object_type='fact'
84
+ AND o.object_key LIKE 'fact:' || e.entity_id || ':%') DESC,
85
+ e.entity_id ASC
86
+ LIMIT 1"""
87
+ ).fetchone()
70
88
  if not owner:
71
89
  return None
72
90
  out: List[Dict[str, Any]] = []
73
91
  for pred in predicates:
92
+ # Delimiter-aware: a bare `{pred}%` prefix also swept sibling predicates.
93
+ # "Who's in my family?" asks for rel.relationship and was handed the 23
94
+ # rel.relationship_event rows too, so the answer listed people the owner
95
+ # merely met (live 2026-08-26: Vitalik Buterin returned as family). Match
96
+ # the exact key or the key plus its ':value' segment, nothing else.
97
+ # `_` is a LIKE wildcard and predicates contain it, so escape it.
98
+ like_pred = pred.replace("\\", "\\\\").replace("_", "\\_").replace("%", "\\%")
74
99
  rows = conn.execute(
75
100
  """SELECT object_key, payload_json, confidence, valid_from, valid_to,
76
101
  ontology_id, altitude
77
102
  FROM signal_objects
78
103
  WHERE object_type='fact' AND valid_to IS NULL
79
- AND object_key LIKE ?
104
+ AND (object_key = ? OR object_key LIKE ? ESCAPE '\\')
80
105
  ORDER BY valid_from DESC LIMIT 40""",
81
- (f"fact:{owner[0]}:{pred}%",),
106
+ (f"fact:{owner[0]}:{pred}", f"fact:{owner[0]}:{like_pred}:%"),
82
107
  ).fetchall()
83
108
  for key, payload_json, conf, vf, vt, pack, altitude in rows:
84
109
  try:
@@ -93,9 +118,27 @@ def fetch_direct_facts(
93
118
  "altitude": altitude or "stated", "pack": pack,
94
119
  "evidence_count": len(refs) if isinstance(refs, list) else 0,
95
120
  })
121
+ # Durable facts (a standing role/status: "mom, parent, active") outrank event
122
+ # facts ("met X at the saloon") in a known-item answer. Recency-only ordering
123
+ # let a month of introductions push the owner's parents past the compose cap:
124
+ # live 2026-08-26, "Who's in my family?" listed 16 met-events and cut
125
+ # mom/brother while keeping them in store. Stable sort keeps recency DESC
126
+ # within each band, so event feeds ("what happened with X?") are unaffected
127
+ # below the durable block.
128
+ out.sort(key=lambda f: 0 if _is_durable(f.get("value")) else 1)
96
129
  return out or None
97
130
 
98
131
 
132
+ def _is_durable(value: Any) -> bool:
133
+ """A fact whose value carries a standing role/status rather than an event."""
134
+ if isinstance(value, str):
135
+ try:
136
+ value = json.loads(value)
137
+ except (json.JSONDecodeError, TypeError):
138
+ return False
139
+ return isinstance(value, dict) and bool(value.get("role") or value.get("status"))
140
+
141
+
99
142
  def _fmt_value(v: Any) -> str:
100
143
  if isinstance(v, str):
101
144
  try:
@@ -107,6 +150,37 @@ def _fmt_value(v: Any) -> str:
107
150
  return str(v)
108
151
 
109
152
 
153
+ def _fact_labels(facts: List[Dict[str, Any]]) -> List[str]:
154
+ """Subject labels for `items`.
155
+
156
+ The game layer fills `items` speculatively from graph/score text before this
157
+ lane runs, and pipeline's `payload.update(direct)` only overwrites the keys
158
+ this lane returns. Leaving `items` behind shipped a correct `answer` next to a
159
+ contradicting list: live 2026-08-26 "Who's in my family?" carried Mom, Dad,
160
+ brother and grandma in `answer` while `items` held NER debris ("U", "AI",
161
+ "##os", "NAME"), and the local synthesis model answered from the debris.
162
+ """
163
+ out: List[str] = []
164
+ seen: set[str] = set()
165
+ for f in facts:
166
+ value = f.get("value")
167
+ if isinstance(value, str):
168
+ try:
169
+ value = json.loads(value)
170
+ except (json.JSONDecodeError, TypeError):
171
+ value = None
172
+ label = None
173
+ if isinstance(value, dict):
174
+ label = value.get("person") or value.get("name") or value.get("value")
175
+ if not label:
176
+ label = _fmt_value(f.get("value"))
177
+ label = str(label).strip()
178
+ if label and label not in seen:
179
+ seen.add(label)
180
+ out.append(label)
181
+ return out[:20]
182
+
183
+
110
184
  def compose_facts_answer(facts: List[Dict[str, Any]]) -> str:
111
185
  lines = []
112
186
  for f in facts[:20]:
@@ -140,5 +214,6 @@ def try_facts_direct(
140
214
  "answer_type": "facts",
141
215
  "answer": compose_facts_answer(facts),
142
216
  "facts": facts[:20],
217
+ "items": _fact_labels(facts),
143
218
  "facts_direct": True,
144
219
  }
@@ -55,6 +55,34 @@ def _extract_inference_evidence(context_packet: Dict[str, Any], *, limit: int =
55
55
  return evidence
56
56
 
57
57
 
58
+ #: Redaction writes these placeholders into stored text, and the NER pass then
59
+ #: extracts them as if they were names.
60
+ _REDACTION_PLACEHOLDERS = {"NAME", "ADDRESS", "DATE", "EMAIL", "PHONE", "URL", "LOCATION"}
61
+
62
+
63
+ def _looks_like_entity_label(value: str) -> bool:
64
+ """Reject debris that is not a name.
65
+
66
+ `graph.nodes` and `scores` carry raw NER output, which includes WordPiece
67
+ continuation tokens ("Topos" tokenizes to "Top" + "##os", and both are stored
68
+ as separate entities), redaction placeholders, and serialized fact blobs. Live
69
+ 2026-08-26 the answer to "Who's in my close circle?" was
70
+ ["U", "AI", "UMA", "Sara", "Marcus", "NAME", "Top", "##os", "VoxTerm A"].
71
+ """
72
+ v = value.strip()
73
+ if len(v) < 2 or len(v) > 60:
74
+ return False
75
+ if v.startswith("##"): # WordPiece continuation, never a standalone name
76
+ return False
77
+ if "{" in v or "}" in v: # serialized fact payload, not a label
78
+ return False
79
+ if v.upper() in _REDACTION_PLACEHOLDERS:
80
+ return False
81
+ if v.isupper() and len(v) <= 3: # bare acronym (U, AI, UMA), not a person here
82
+ return False
83
+ return True
84
+
85
+
58
86
  def _extract_entity_labels(context_packet: Dict[str, Any]) -> List[str]:
59
87
  labels: List[str] = []
60
88
  seen: set[str] = set()
@@ -64,7 +92,7 @@ def _extract_entity_labels(context_packet: Dict[str, Any]) -> List[str]:
64
92
  continue
65
93
  for key in ("label", "name", "node_id", "entity_text"):
66
94
  value = node.get(key)
67
- if value and str(value) not in seen:
95
+ if value and str(value) not in seen and _looks_like_entity_label(str(value)):
68
96
  seen.add(str(value))
69
97
  labels.append(str(value))
70
98
  for score in context_packet.get("scores") or []:
@@ -72,7 +100,7 @@ def _extract_entity_labels(context_packet: Dict[str, Any]) -> List[str]:
72
100
  continue
73
101
  for key in ("entity_text", "label", "topic", "summary_text"):
74
102
  value = score.get(key)
75
- if value and str(value) not in seen:
103
+ if value and str(value) not in seen and _looks_like_entity_label(str(value)):
76
104
  seen.add(str(value))
77
105
  labels.append(str(value))
78
106
  return labels[:10]
@@ -605,6 +605,18 @@
605
605
  "steps": [],
606
606
  "notes": []
607
607
  },
608
+ {
609
+ "version": "1.3.31",
610
+ "summary": "Release 1.3.31.",
611
+ "steps": [],
612
+ "notes": []
613
+ },
614
+ {
615
+ "version": "1.3.32",
616
+ "summary": "Release 1.3.32.",
617
+ "steps": [],
618
+ "notes": []
619
+ },
608
620
  {
609
621
  "version": "unreleased",
610
622
  "summary": "Staging entry for in-flight PRs. cut_release.py stamps this with the next version at release cut. Never executed by steps_between.",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: topos-node
3
- Version: 1.3.30
3
+ Version: 1.3.32
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
File without changes
File without changes
File without changes
File without changes
File without changes