apsimo 1.3.1__tar.gz → 1.3.3__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 (1002) hide show
  1. {apsimo-1.3.1 → apsimo-1.3.3}/PKG-INFO +2 -2
  2. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/api/routers/host.py +19 -3
  3. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/graph/selection.py +22 -0
  4. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/setup_hermes.py +2 -2
  5. apsimo-1.3.3/apsimo/turns/history_references.py +41 -0
  6. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo.egg-info/PKG-INFO +2 -2
  7. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo.egg-info/SOURCES.txt +3 -0
  8. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo.egg-info/requires.txt +1 -1
  9. {apsimo-1.3.1 → apsimo-1.3.3}/pyproject.toml +2 -2
  10. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_hermes_native_tool_authority.py +10 -1
  11. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_hermes_turn_outbox.py +4 -1
  12. apsimo-1.3.3/tests/test_native_history_references.py +54 -0
  13. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_native_setup.py +2 -2
  14. apsimo-1.3.3/tests/test_recall_request_repetition.py +140 -0
  15. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_vectors.py +8 -3
  16. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom_p8_server_integration.py +8 -0
  17. {apsimo-1.3.1 → apsimo-1.3.3}/LICENSE +0 -0
  18. {apsimo-1.3.1 → apsimo-1.3.3}/README.md +0 -0
  19. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/__init__.py +0 -0
  20. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/__main__.py +0 -0
  21. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/agent/__init__.py +0 -0
  22. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/agent/client.py +0 -0
  23. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/agent/models.py +0 -0
  24. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/agents/__init__.py +0 -0
  25. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/agents/models.py +0 -0
  26. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/agents/store.py +0 -0
  27. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/agents/websocket.py +0 -0
  28. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/api/__init__.py +0 -0
  29. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/api/auth_telemetry.py +0 -0
  30. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/api/authority.py +0 -0
  31. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/api/contact_grants.py +0 -0
  32. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/api/middleware.py +0 -0
  33. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/api/routers/__init__.py +0 -0
  34. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/api/routers/commitment_work.py +0 -0
  35. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/api/routers/context_gate.py +0 -0
  36. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/api/routers/executions.py +0 -0
  37. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/api/routers/followup_plans.py +0 -0
  38. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/api/routers/governed_actions.py +0 -0
  39. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/api/routers/initiative_work.py +0 -0
  40. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/api/routers/mining.py +0 -0
  41. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/api/routers/observations.py +0 -0
  42. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/api/routers/social_state.py +0 -0
  43. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/api/routers/task_queue.py +0 -0
  44. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/api/routers/temporal_followups.py +0 -0
  45. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/api/routers/transport.py +0 -0
  46. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/api/routers/transport_ingress_api.py +0 -0
  47. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/api/schemas/__init__.py +0 -0
  48. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/api/schemas/host.py +0 -0
  49. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/autonomy/cli.py +0 -0
  50. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/autonomy/condition_worker.py +0 -0
  51. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/autonomy/config.py +0 -0
  52. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/autonomy/loop.py +0 -0
  53. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/autonomy/registry.py +0 -0
  54. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/autonomy/scheduler.py +0 -0
  55. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/autonomy/synthesis.py +0 -0
  56. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/backup.py +0 -0
  57. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/beliefs/__init__.py +0 -0
  58. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/beliefs/contradictions.py +0 -0
  59. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/beliefs/decay.py +0 -0
  60. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/beliefs/engine.py +0 -0
  61. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/beliefs/models.py +0 -0
  62. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/beliefs/promotion.py +0 -0
  63. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/beliefs/resolve.py +0 -0
  64. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/beliefs/source_claims.py +0 -0
  65. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/beliefs/source_projection.py +0 -0
  66. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/beliefs/source_time.py +0 -0
  67. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/beliefs/store.py +0 -0
  68. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/briefings/aggregators.py +0 -0
  69. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/briefings/composer.py +0 -0
  70. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/briefings/config.py +0 -0
  71. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/briefings/delivery.py +0 -0
  72. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/briefings/engagement.py +0 -0
  73. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/briefings/engine.py +0 -0
  74. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/briefings/enhancer.py +0 -0
  75. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/briefings/models.py +0 -0
  76. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/briefings/scheduler.py +0 -0
  77. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/briefings/store.py +0 -0
  78. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/chain/__init__.py +0 -0
  79. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/chain/block.py +0 -0
  80. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/chain/cli.py +0 -0
  81. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/chain/genesis.py +0 -0
  82. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/chain/identity.py +0 -0
  83. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/chain/keys.py +0 -0
  84. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/chain/local_keys.py +0 -0
  85. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/chain/manager.py +0 -0
  86. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/chain/node.py +0 -0
  87. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/chain/plugin_transactions.py +0 -0
  88. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/chain/protocol.py +0 -0
  89. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/chain/state_machine.py +0 -0
  90. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/chain/storage.py +0 -0
  91. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/chain/transactions.py +0 -0
  92. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/chain/validation.py +0 -0
  93. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/channels/__init__.py +0 -0
  94. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/channels/manifest.py +0 -0
  95. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/channels/migrations/001_channels_schema.sql +0 -0
  96. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/channels/phone_gateways.py +0 -0
  97. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/channels/presence.py +0 -0
  98. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/channels/router.py +0 -0
  99. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/channels/store.py +0 -0
  100. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/cli.py +0 -0
  101. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/cognition/__init__.py +0 -0
  102. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/cognition/charter.py +0 -0
  103. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/cognition/drive_governance.py +0 -0
  104. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/cognition/evidence_pipeline.py +0 -0
  105. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/cognition/external_events.py +0 -0
  106. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/cognition/goal_spine.py +0 -0
  107. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/cognition/introspection.py +0 -0
  108. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/cognition/prompt.py +0 -0
  109. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/cognition/runtime.py +0 -0
  110. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/cognition/trigger.py +0 -0
  111. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/commitments/__init__.py +0 -0
  112. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/commitments/local_work.py +0 -0
  113. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/commitments/store.py +0 -0
  114. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/commitments/work.py +0 -0
  115. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/compat.py +0 -0
  116. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/compression/__init__.py +0 -0
  117. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/connectors/__init__.py +0 -0
  118. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/connectors/base.py +0 -0
  119. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/connectors/caldav_calendar.py +0 -0
  120. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/connectors/fs_documents.py +0 -0
  121. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/connectors/imap_email.py +0 -0
  122. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/connectors/manager.py +0 -0
  123. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/connectors/webhook_pull.py +0 -0
  124. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contacts/__init__.py +0 -0
  125. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contacts/comms.py +0 -0
  126. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contacts/config.py +0 -0
  127. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contacts/exporters/__init__.py +0 -0
  128. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contacts/exporters/vcard.py +0 -0
  129. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contacts/identity_links.py +0 -0
  130. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contacts/importer.py +0 -0
  131. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contacts/importers/__init__.py +0 -0
  132. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contacts/importers/batch.py +0 -0
  133. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contacts/importers/macos_contacts.py +0 -0
  134. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contacts/migrations/001_contacts_schema.sql +0 -0
  135. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contacts/migrations/002_trust_scopes.sql +0 -0
  136. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contacts/migrations/003_open_gateway_enum.sql +0 -0
  137. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contacts/migrations/004_contact_provision_operations.sql +0 -0
  138. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contacts/migrations/005_identity_links.sql +0 -0
  139. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contacts/models.py +0 -0
  140. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contacts/scoring.py +0 -0
  141. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contacts/store.py +0 -0
  142. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contacts/transport_ingress.py +0 -0
  143. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contacts/world_bridge.py +0 -0
  144. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contextgate/__init__.py +0 -0
  145. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contextgate/chunker.py +0 -0
  146. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contextgate/estimate.py +0 -0
  147. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contextgate/gate.py +0 -0
  148. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/contextgate/retrieve.py +0 -0
  149. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/delivery/__init__.py +0 -0
  150. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/delivery/bridge.py +0 -0
  151. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/delivery/channels.py +0 -0
  152. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/delivery/classification.py +0 -0
  153. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/delivery/rate_limiter.py +0 -0
  154. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/delivery/reachout_policy.py +0 -0
  155. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/directed/__init__.py +0 -0
  156. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/directed/audit.py +0 -0
  157. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/directed/intake.py +0 -0
  158. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/directed/models.py +0 -0
  159. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/directed/service.py +0 -0
  160. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/directives/__init__.py +0 -0
  161. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/directives/evidence.py +0 -0
  162. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/directives/extractor.py +0 -0
  163. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/directives/guard.py +0 -0
  164. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/directives/models.py +0 -0
  165. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/directives/service.py +0 -0
  166. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/directives/store.py +0 -0
  167. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/doctor.py +0 -0
  168. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/environment.py +0 -0
  169. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/events/__init__.py +0 -0
  170. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/events/broadcaster.py +0 -0
  171. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/events/bus.py +0 -0
  172. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/events/journal.py +0 -0
  173. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/events/stream.py +0 -0
  174. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/events/types.py +0 -0
  175. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/execution_results.py +0 -0
  176. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/feedback/__init__.py +0 -0
  177. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/feedback/store.py +0 -0
  178. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/feeds/__init__.py +0 -0
  179. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/feeds/cli.py +0 -0
  180. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/feeds/engine.py +0 -0
  181. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/feeds/example-feed.yaml +0 -0
  182. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/feeds/hermes_cron.py +0 -0
  183. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/feeds/manager.py +0 -0
  184. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/feeds/spec.py +0 -0
  185. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/feeds/template.py +0 -0
  186. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/__init__.py +0 -0
  187. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/audit.py +0 -0
  188. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/communication_policy.py +0 -0
  189. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/config.py +0 -0
  190. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/context_provenance.py +0 -0
  191. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/env_risk.py +0 -0
  192. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/guard_audit.py +0 -0
  193. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/layers/__init__.py +0 -0
  194. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/layers/base.py +0 -0
  195. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/layers/l1_recipient.py +0 -0
  196. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/layers/l2_pii.py +0 -0
  197. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/layers/l3_cross_context.py +0 -0
  198. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/layers/l4_trust_tier.py +0 -0
  199. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/layers/l5_injection.py +0 -0
  200. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/layers/l6_review.py +0 -0
  201. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/layers/l7_delay.py +0 -0
  202. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/layers/tom2_epistemic.py +0 -0
  203. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/models.py +0 -0
  204. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/pending_dispatch.py +0 -0
  205. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/pipeline.py +0 -0
  206. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/rejection.py +0 -0
  207. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/response_guard.py +0 -0
  208. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/rulesets/injection_v1.yaml +0 -0
  209. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/surface_policy.py +0 -0
  210. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/gate/taint.py +0 -0
  211. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/genesis.json +0 -0
  212. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/goals/__init__.py +0 -0
  213. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/goals/config.py +0 -0
  214. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/goals/decomposer.py +0 -0
  215. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/goals/engine.py +0 -0
  216. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/goals/inference.py +0 -0
  217. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/goals/models.py +0 -0
  218. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/goals/priority.py +0 -0
  219. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/goals/queue_bridge.py +0 -0
  220. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/goals/replan.py +0 -0
  221. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/goals/schema.sql +0 -0
  222. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/goals/store.py +0 -0
  223. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/governed_actions.py +0 -0
  224. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/harness_integration/__init__.py +0 -0
  225. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/harness_integration/context.py +0 -0
  226. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/harness_integration/skills.py +0 -0
  227. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/identity/__init__.py +0 -0
  228. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/identity/participants.py +0 -0
  229. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/identity/resolver.py +0 -0
  230. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/identity_bootstrap/__init__.py +0 -0
  231. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/identity_bootstrap/builder.py +0 -0
  232. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/identity_bootstrap/corpus.py +0 -0
  233. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/identity_bootstrap/models.py +0 -0
  234. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/identity_bootstrap/runner.py +0 -0
  235. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/identity_bootstrap/seeders/__init__.py +0 -0
  236. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/identity_bootstrap/seeders/briefings.py +0 -0
  237. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/identity_bootstrap/seeders/chain.py +0 -0
  238. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/identity_bootstrap/seeders/goals.py +0 -0
  239. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/identity_bootstrap/seeders/memory.py +0 -0
  240. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/identity_bootstrap/seeders/neo4j_cognition.py +0 -0
  241. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/identity_bootstrap/seeders/relationship.py +0 -0
  242. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/identity_bootstrap/seeders/sessions.py +0 -0
  243. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/identity_bootstrap/seeders/skills.py +0 -0
  244. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/identity_bootstrap/seeders/task_queue.py +0 -0
  245. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/identity_bootstrap/seeders/world_model.py +0 -0
  246. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/identity_bootstrap/self_query.py +0 -0
  247. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/identity_bootstrap/self_reflection.py +0 -0
  248. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/identity_bootstrap/skill.py +0 -0
  249. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/identity_bootstrap/verifier.py +0 -0
  250. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/initiatives/__init__.py +0 -0
  251. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/initiatives/action_registry.py +0 -0
  252. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/initiatives/approval_authority.py +0 -0
  253. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/initiatives/approval_policy.py +0 -0
  254. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/initiatives/assignment.py +0 -0
  255. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/initiatives/backup_evidence.py +0 -0
  256. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/initiatives/context_freshness.py +0 -0
  257. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/initiatives/models.py +0 -0
  258. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/initiatives/native_work.py +0 -0
  259. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/initiatives/standing_approvals.py +0 -0
  260. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/initiatives/store.py +0 -0
  261. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/initiatives/temporal_followup.py +0 -0
  262. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/__init__.py +0 -0
  263. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/cognition/__init__.py +0 -0
  264. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/cognition/gap_detector.py +0 -0
  265. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/cognition/metalearner.py +0 -0
  266. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/cognition/metrics_collector.py +0 -0
  267. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/cognition/performance_index.py +0 -0
  268. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/cognition/registry.py +0 -0
  269. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/cognition/strategy_adjuster.py +0 -0
  270. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/cognition/types.py +0 -0
  271. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/components/__init__.py +0 -0
  272. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/components/anomaly_detector.py +0 -0
  273. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/components/initiative_engine.py +0 -0
  274. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/components/preference_learner.py +0 -0
  275. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/components/research_orchestrator.py +0 -0
  276. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/components/self_directed_thinker.py +0 -0
  277. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/components/self_reflector.py +0 -0
  278. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/components/session_continuity.py +0 -0
  279. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/components/task_planner.py +0 -0
  280. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/components/tool_learner.py +0 -0
  281. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/graph/__init__.py +0 -0
  282. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/graph/client.py +0 -0
  283. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/graph/consolidator.py +0 -0
  284. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/graph/distiller.py +0 -0
  285. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/graph/migrations.py +0 -0
  286. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/graph/queries.py +0 -0
  287. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/graph/recall.py +0 -0
  288. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/graph/reconciler.py +0 -0
  289. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/graph/schema.py +0 -0
  290. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/learning/__init__.py +0 -0
  291. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/learning/continuous_learner.py +0 -0
  292. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/learning/feedback_store.py +0 -0
  293. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/mind_model/__init__.py +0 -0
  294. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/mind_model/graph_baseline.py +0 -0
  295. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/mind_model/signal_collector.py +0 -0
  296. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/relationships/__init__.py +0 -0
  297. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/relationships/profiler.py +0 -0
  298. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/relationships/scorer.py +0 -0
  299. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/relationships/signal_floor.py +0 -0
  300. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/relationships/trust_tiers.py +0 -0
  301. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/synthesis/__init__.py +0 -0
  302. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/synthesis/connection_discoverer.py +0 -0
  303. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/synthesis/cross_domain_analyzer.py +0 -0
  304. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/synthesis/insight_deliverer.py +0 -0
  305. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/synthesis/insight_store.py +0 -0
  306. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/synthesis/insight_validator.py +0 -0
  307. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/synthesis/novelty_scorer.py +0 -0
  308. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/turn_middleware/__init__.py +0 -0
  309. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/intelligence/turn_middleware/memory_sync.py +0 -0
  310. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/mcp/__init__.py +0 -0
  311. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/mcp/__main__.py +0 -0
  312. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/mcp/config.py +0 -0
  313. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/mcp/server.py +0 -0
  314. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/migrations.py +0 -0
  315. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/mining/__init__.py +0 -0
  316. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/mining/corpus.py +0 -0
  317. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/mining/escalations.py +0 -0
  318. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/mining/models.py +0 -0
  319. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/mining/store.py +0 -0
  320. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/models/__init__.py +0 -0
  321. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/models/memory.py +0 -0
  322. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/models/mesh.py +0 -0
  323. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/models/person.py +0 -0
  324. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/models/signal.py +0 -0
  325. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/observations/__init__.py +0 -0
  326. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/observations/store.py +0 -0
  327. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/patterns/__init__.py +0 -0
  328. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/patterns/extract.py +0 -0
  329. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/patterns/store.py +0 -0
  330. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/persona/__init__.py +0 -0
  331. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/persona/engine.py +0 -0
  332. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/persona/manifest.py +0 -0
  333. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/projects/__init__.py +0 -0
  334. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/projects/engine.py +0 -0
  335. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/projects/event_outbox.py +0 -0
  336. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/projects/models.py +0 -0
  337. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/projects/planner.py +0 -0
  338. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/projects/store.py +0 -0
  339. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/proposals/__init__.py +0 -0
  340. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/proposals/engine.py +0 -0
  341. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/proposals/models.py +0 -0
  342. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/qualification/__init__.py +0 -0
  343. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/qualification/cases.py +0 -0
  344. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/qualification/cli.py +0 -0
  345. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/qualification/memory_cases.py +0 -0
  346. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/qualification/records.py +0 -0
  347. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/qualification/report.py +0 -0
  348. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/qualification/runner.py +0 -0
  349. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/qualification/structured_cases.py +0 -0
  350. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/reasoning/__init__.py +0 -0
  351. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/reasoning/executor.py +0 -0
  352. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/reasoning/loop.py +0 -0
  353. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/reasoning/native_tools/__init__.py +0 -0
  354. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/reasoning/native_tools/calculate.py +0 -0
  355. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/reasoning/native_tools/file_ops.py +0 -0
  356. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/reasoning/native_tools/web_search.py +0 -0
  357. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/reasoning/tool_policy.py +0 -0
  358. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/redact/__init__.py +0 -0
  359. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/repos/__init__.py +0 -0
  360. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/repos/mirrors.py +0 -0
  361. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/research/__init__.py +0 -0
  362. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/research/artifact.py +0 -0
  363. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/research/gatherer.py +0 -0
  364. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/research/pipeline.py +0 -0
  365. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/research/search/__init__.py +0 -0
  366. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/research/search/base.py +0 -0
  367. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/research/search/brave.py +0 -0
  368. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/research/search/cache.py +0 -0
  369. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/research/search/duckduckgo.py +0 -0
  370. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/research/search/orchestrator.py +0 -0
  371. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/research/search/serpapi.py +0 -0
  372. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/research/search/tavily.py +0 -0
  373. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/research/synthesizer.py +0 -0
  374. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/router/__init__.py +0 -0
  375. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/router/complexity_scorer.py +0 -0
  376. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/router/endpoints.py +0 -0
  377. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/router/fallback.py +0 -0
  378. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/router/functions.py +0 -0
  379. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/router/native_policy.py +0 -0
  380. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/router/router.py +0 -0
  381. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/router/self_learning.py +0 -0
  382. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/router/tiers.py +0 -0
  383. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/sandbox/__init__.py +0 -0
  384. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/sandbox/backend.py +0 -0
  385. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/sandbox/manager.py +0 -0
  386. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/scope_bounds.py +0 -0
  387. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/secrets/__init__.py +0 -0
  388. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/secrets/backends/__init__.py +0 -0
  389. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/secrets/backends/base.py +0 -0
  390. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/secrets/backends/env.py +0 -0
  391. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/secrets/backends/keyring.py +0 -0
  392. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/secrets/backends/onepassword.py +0 -0
  393. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/secrets/cli.py +0 -0
  394. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/secrets/manager.py +0 -0
  395. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/secrets/migration.py +0 -0
  396. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/secrets/types.py +0 -0
  397. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/seed.py +0 -0
  398. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/__init__.py +0 -0
  399. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/appraisals.py +0 -0
  400. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/benchmark.py +0 -0
  401. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/brief.py +0 -0
  402. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/event_concerns.py +0 -0
  403. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/execution_forecasts.py +0 -0
  404. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/expectations.py +0 -0
  405. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/experiments.py +0 -0
  406. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/journal.py +0 -0
  407. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/judgments.py +0 -0
  408. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/native_outcomes.py +0 -0
  409. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/params.py +0 -0
  410. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/perspective.py +0 -0
  411. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/reconcile.py +0 -0
  412. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/reply_forecasts.py +0 -0
  413. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/runtime_forecasts.py +0 -0
  414. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/runtime_models.py +0 -0
  415. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/settlement.py +0 -0
  416. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/situation.py +0 -0
  417. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/store.py +0 -0
  418. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/supervised.py +0 -0
  419. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/thinker.py +0 -0
  420. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/trust.py +0 -0
  421. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/self_model/workspace.py +0 -0
  422. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/server.py +0 -0
  423. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/services/__init__.py +0 -0
  424. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/services/agent_bridge.py +0 -0
  425. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/services/initiative_executor.py +0 -0
  426. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/services/instance.py +0 -0
  427. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/sessions/__init__.py +0 -0
  428. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/sessions/config.py +0 -0
  429. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/sessions/context_loader.py +0 -0
  430. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/sessions/federation_session.py +0 -0
  431. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/sessions/isolated_session.py +0 -0
  432. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/sessions/reports.py +0 -0
  433. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/sessions/store.py +0 -0
  434. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/setup.py +0 -0
  435. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/setup_local_work.py +0 -0
  436. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/setup_native_goals.py +0 -0
  437. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/setup_native_reviews.py +0 -0
  438. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/__init__.py +0 -0
  439. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/base.py +0 -0
  440. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/budget.py +0 -0
  441. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/executor.py +0 -0
  442. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/executors/__init__.py +0 -0
  443. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/executors/behavioral_correction.py +0 -0
  444. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/executors/capability_gap.py +0 -0
  445. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/executors/data_quality.py +0 -0
  446. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/executors/knowledge_acquisition.py +0 -0
  447. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/executors/operational_hygiene.py +0 -0
  448. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/executors/subsystem_health.py +0 -0
  449. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/hermes_export.py +0 -0
  450. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/index.py +0 -0
  451. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/learning/__init__.py +0 -0
  452. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/learning/novelty_detector.py +0 -0
  453. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/learning/pattern_extractor.py +0 -0
  454. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/learning/triggers.py +0 -0
  455. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/loader.py +0 -0
  456. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/migrations/002_progressive_loading.sql +0 -0
  457. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/migrations/backfill_triggers.py +0 -0
  458. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/models.py +0 -0
  459. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/packager.py +0 -0
  460. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/protocols.py +0 -0
  461. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/registry.py +0 -0
  462. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/runtime.py +0 -0
  463. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/sandbox_runner.py +0 -0
  464. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/scheduler.py +0 -0
  465. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/schema.py +0 -0
  466. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/security/__init__.py +0 -0
  467. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/security/guards.py +0 -0
  468. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills/security/scanner.py +0 -0
  469. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills_memory/__init__.py +0 -0
  470. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills_memory/distill.py +0 -0
  471. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills_memory/models.py +0 -0
  472. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills_memory/retrieve.py +0 -0
  473. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/skills_memory/store.py +0 -0
  474. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/surprise/__init__.py +0 -0
  475. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/surprise/accumulation.py +0 -0
  476. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/surprise/scorer.py +0 -0
  477. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/surprise/store.py +0 -0
  478. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/task_queue/__init__.py +0 -0
  479. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/task_queue/action_receipts.py +0 -0
  480. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/task_queue/approval_relay_canary.py +0 -0
  481. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/task_queue/config.py +0 -0
  482. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/task_queue/contract.py +0 -0
  483. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/task_queue/events.py +0 -0
  484. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/task_queue/governor.py +0 -0
  485. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/task_queue/handlers/__init__.py +0 -0
  486. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/task_queue/handlers/base.py +0 -0
  487. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/task_queue/handlers/inference.py +0 -0
  488. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/task_queue/handlers/monitoring.py +0 -0
  489. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/task_queue/handlers/registry.py +0 -0
  490. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/task_queue/handlers/subtask_handler.py +0 -0
  491. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/task_queue/handlers/system_maintenance.py +0 -0
  492. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/task_queue/mesh_integration.py +0 -0
  493. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/task_queue/models.py +0 -0
  494. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/task_queue/queue_manager.py +0 -0
  495. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/task_queue/routing.py +0 -0
  496. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/task_queue/scheduler.py +0 -0
  497. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/task_queue/schema.sql +0 -0
  498. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/task_queue/work_control.py +0 -0
  499. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/task_queue/worker.py +0 -0
  500. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/telemetry.py +0 -0
  501. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/tom/__init__.py +0 -0
  502. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/tom/affect.py +0 -0
  503. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/tom/approvals.py +0 -0
  504. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/tom/arcs.py +0 -0
  505. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/tom/asymmetry.py +0 -0
  506. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/tom/eligibility.py +0 -0
  507. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/tom/engagement.py +0 -0
  508. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/tom/exposure.py +0 -0
  509. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/tom/extractor.py +0 -0
  510. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/tom/fact_adapters.py +0 -0
  511. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/tom/facts.py +0 -0
  512. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/tom/integration.py +0 -0
  513. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/tom/leveled.py +0 -0
  514. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/tom/levels.py +0 -0
  515. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/tom/recipient_audit.py +0 -0
  516. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/tom/recipient_simulator.py +0 -0
  517. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/tom/source_lineage.py +0 -0
  518. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/tom/tom2.py +0 -0
  519. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/tom/visibility.py +0 -0
  520. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/tom/visibility_store.py +0 -0
  521. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/tools/__init__.py +0 -0
  522. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/tools/definitions.py +0 -0
  523. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/tools/handlers.py +0 -0
  524. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/toolsmith/__init__.py +0 -0
  525. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/toolsmith/authority.py +0 -0
  526. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/toolsmith/engine.py +0 -0
  527. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/toolsmith/integrity.py +0 -0
  528. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/toolsmith/miner.py +0 -0
  529. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/toolsmith/policy.py +0 -0
  530. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/toolsmith/registry.py +0 -0
  531. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/turns/__init__.py +0 -0
  532. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/turns/audio.py +0 -0
  533. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/turns/documents.py +0 -0
  534. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/turns/executions.py +0 -0
  535. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/turns/hermes_history.py +0 -0
  536. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/turns/hermes_kanban.py +0 -0
  537. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/turns/hermes_work.py +0 -0
  538. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/turns/idempotency.py +0 -0
  539. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/turns/local_work.py +0 -0
  540. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/turns/media.py +0 -0
  541. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/turns/reported_workers.py +0 -0
  542. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/turns/source_annotations.py +0 -0
  543. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/turns/source_attribution.py +0 -0
  544. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/turns/source_read.py +0 -0
  545. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/turns/source_vectors.py +0 -0
  546. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/turns/video.py +0 -0
  547. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/util/autonomy_preset.py +0 -0
  548. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/util/instance.py +0 -0
  549. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/util/model_output.py +0 -0
  550. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/util/quiet_hours.py +0 -0
  551. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/util/session_safety.py +0 -0
  552. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/util/temporal.py +0 -0
  553. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/vector/__init__.py +0 -0
  554. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/vector/backfill.py +0 -0
  555. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/vector/caption.py +0 -0
  556. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/vector/collections.py +0 -0
  557. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/vector/config.py +0 -0
  558. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/vector/embedder.py +0 -0
  559. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/vector/image_preprocess.py +0 -0
  560. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/vector/image_store.py +0 -0
  561. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/vector/indexes.py +0 -0
  562. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/vector/migrate.py +0 -0
  563. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/vector/multimodal_provider.py +0 -0
  564. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/vector/multimodal_types.py +0 -0
  565. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/vector/openai_provider.py +0 -0
  566. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/vector/query.py +0 -0
  567. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/vector/reranker.py +0 -0
  568. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/vector/safety_image.py +0 -0
  569. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/vector/scanner.py +0 -0
  570. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/vector/setup.py +0 -0
  571. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/vector/store.py +0 -0
  572. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/vector/tiers.py +0 -0
  573. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/work_orders.py +0 -0
  574. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/workers/__init__.py +0 -0
  575. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/workers/agent_bridge.py +0 -0
  576. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/workers/colony_worker.py +0 -0
  577. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/workers/queue_worker.py +0 -0
  578. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/workers/skills_sync.py +0 -0
  579. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/__init__.py +0 -0
  580. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/causal_maintenance.py +0 -0
  581. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/causal_policy.py +0 -0
  582. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/causal_query.py +0 -0
  583. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/confidence.py +0 -0
  584. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/config.py +0 -0
  585. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/constants.py +0 -0
  586. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/entities.py +0 -0
  587. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/expectation_resolvers.py +0 -0
  588. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/extraction/__init__.py +0 -0
  589. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/extraction/base.py +0 -0
  590. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/extraction/conversation_extractor.py +0 -0
  591. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/extraction/detector.py +0 -0
  592. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/extraction/document_extractor.py +0 -0
  593. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/extraction/formats/__init__.py +0 -0
  594. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/extraction/formats/csv_fmt.py +0 -0
  595. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/extraction/formats/html_fmt.py +0 -0
  596. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/extraction/formats/json_fmt.py +0 -0
  597. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/extraction/formats/pdf.py +0 -0
  598. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/extraction/formats/text.py +0 -0
  599. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/extraction/llm_extractor.py +0 -0
  600. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/extraction/pipeline.py +0 -0
  601. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/integrations/__init__.py +0 -0
  602. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/integrations/mind_model_bridge.py +0 -0
  603. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/integrations/social_intel_bridge.py +0 -0
  604. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/jobs/__init__.py +0 -0
  605. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/jobs/extraction_job.py +0 -0
  606. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/llm_extract.py +0 -0
  607. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/neo4j/__init__.py +0 -0
  608. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/neo4j/backend.py +0 -0
  609. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/observations.py +0 -0
  610. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/populator.py +0 -0
  611. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/postgres/__init__.py +0 -0
  612. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/postgres/backend.py +0 -0
  613. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/relationships.py +0 -0
  614. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/resolution/__init__.py +0 -0
  615. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/resolution/entity_resolver.py +0 -0
  616. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/resolution/merge_audit.py +0 -0
  617. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/resolution/merge_workflow.py +0 -0
  618. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/source_reports.py +0 -0
  619. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/sqlite/__init__.py +0 -0
  620. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/sqlite/backend.py +0 -0
  621. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/sqlite/schema.sql +0 -0
  622. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo/world_model/store.py +0 -0
  623. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo.egg-info/dependency_links.txt +0 -0
  624. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo.egg-info/entry_points.txt +0 -0
  625. {apsimo-1.3.1 → apsimo-1.3.3}/apsimo.egg-info/top_level.txt +0 -0
  626. {apsimo-1.3.1 → apsimo-1.3.3}/colony_sidecar/__init__.py +0 -0
  627. {apsimo-1.3.1 → apsimo-1.3.3}/setup.cfg +0 -0
  628. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_accepted_local_work.py +0 -0
  629. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_adaptive_params.py +0 -0
  630. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_affect.py +0 -0
  631. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_agent_action_routing.py +0 -0
  632. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_agent_api.py +0 -0
  633. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_agent_bridge.py +0 -0
  634. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_agent_bridge_service.py +0 -0
  635. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_agent_sdk.py +0 -0
  636. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_agent_sensor_loop.py +0 -0
  637. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_agent_snapshot.py +0 -0
  638. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_agent_store.py +0 -0
  639. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_annotated_recall_reinforcement.py +0 -0
  640. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_answer_source_lineage.py +0 -0
  641. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_appraisal_incident_decisions.py +0 -0
  642. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_approval_gate.py +0 -0
  643. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_approval_relay_canary.py +0 -0
  644. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_apsimo_compat.py +0 -0
  645. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_apsimo_harness_guidance.py +0 -0
  646. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_assignment_engine.py +0 -0
  647. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_audit_cleanup.py +0 -0
  648. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_auth_coverage.py +0 -0
  649. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_auth_migration_readiness.py +0 -0
  650. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_authz_scope_api.py +0 -0
  651. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_autonomy_preset.py +0 -0
  652. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_backup.py +0 -0
  653. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_backup_receipt_evidence.py +0 -0
  654. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_beliefs.py +0 -0
  655. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_bind_auth_guard.py +0 -0
  656. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_boundary_fail_closed.py +0 -0
  657. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_bounded_approval_authority.py +0 -0
  658. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_briefing_aggregators.py +0 -0
  659. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_canonical_scoped_context.py +0 -0
  660. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_canonical_source_read.py +0 -0
  661. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_causal_extract.py +0 -0
  662. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_causal_falsifiability.py +0 -0
  663. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_causal_maintenance.py +0 -0
  664. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_causal_policy.py +0 -0
  665. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_causal_query.py +0 -0
  666. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_causal_query_only_guard.py +0 -0
  667. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_chain_keys.py +0 -0
  668. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_channel_preferences.py +0 -0
  669. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_channel_registry.py +0 -0
  670. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_channel_store.py +0 -0
  671. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_cognition.py +0 -0
  672. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_cognition_evidence_pipeline.py +0 -0
  673. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_cognition_evidence_server_wiring.py +0 -0
  674. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_cognition_goal_spine.py +0 -0
  675. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_cognition_observability.py +0 -0
  676. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_cognition_p4_controlled_learning.py +0 -0
  677. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_cognition_p4_server_integration.py +0 -0
  678. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_cognition_p6_p7_server_wiring.py +0 -0
  679. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_cognition_p7_drive_governance.py +0 -0
  680. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_cognition_phase_b_runtime.py +0 -0
  681. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_cognition_phase_c_scheduler.py +0 -0
  682. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_cognition_server_wiring.py +0 -0
  683. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_colony_memory_provider.py +0 -0
  684. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_commitment_resolution.py +0 -0
  685. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_commitment_resolution_downgrade.py +0 -0
  686. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_commitment_resolution_schema.py +0 -0
  687. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_commitment_work.py +0 -0
  688. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_commitments.py +0 -0
  689. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_competence_reconciliation.py +0 -0
  690. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_compression.py +0 -0
  691. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_concern_resolution_receipts.py +0 -0
  692. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_condition_producer.py +0 -0
  693. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_connectors.py +0 -0
  694. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_contact_fact_recall.py +0 -0
  695. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_contact_policy_projection.py +0 -0
  696. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_contact_provisioning.py +0 -0
  697. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_contact_timezone.py +0 -0
  698. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_contacts_intro.py +0 -0
  699. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_contacts_persistence.py +0 -0
  700. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_context_gate.py +0 -0
  701. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_context_phase1.py +0 -0
  702. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_context_provenance.py +0 -0
  703. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_conversation_presence.py +0 -0
  704. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_conversation_turn_concerns.py +0 -0
  705. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_current_work_recall_selection.py +0 -0
  706. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_delivery_bridge_503.py +0 -0
  707. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_delivery_gateway_identity.py +0 -0
  708. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_delivery_reachout_routing.py +0 -0
  709. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_directed.py +0 -0
  710. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_directed_envelope.py +0 -0
  711. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_directed_reports.py +0 -0
  712. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_directed_trust.py +0 -0
  713. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_directive_sources.py +0 -0
  714. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_directives.py +0 -0
  715. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_distill.py +0 -0
  716. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_doctor.py +0 -0
  717. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_document_memory_guard.py +0 -0
  718. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_duckduckgo_provider.py +0 -0
  719. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_embedding_generations.py +0 -0
  720. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_enrolled_sender_turns.py +0 -0
  721. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_ensure_channel_id.py +0 -0
  722. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_env_risk.py +0 -0
  723. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_event_broadcasts.py +0 -0
  724. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_event_bus_types.py +0 -0
  725. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_event_concerns.py +0 -0
  726. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_event_stream_reliability.py +0 -0
  727. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_execution_forecasts.py +0 -0
  728. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_execution_input_purpose.py +0 -0
  729. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_execution_registry.py +0 -0
  730. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_expectations.py +0 -0
  731. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_expectations_v2.py +0 -0
  732. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_experiments.py +0 -0
  733. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_external_cognition_events.py +0 -0
  734. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_external_event_concerns.py +0 -0
  735. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_facts_backfill.py +0 -0
  736. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_feedback.py +0 -0
  737. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_followup_plans.py +0 -0
  738. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_forecast_learning.py +0 -0
  739. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_function_routing.py +0 -0
  740. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_gap_generators.py +0 -0
  741. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_genesis_manifest.py +0 -0
  742. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_global_pause.py +0 -0
  743. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_goal_dispatch_availability.py +0 -0
  744. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_goal_inference_provenance.py +0 -0
  745. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_goal_reader_imports.py +0 -0
  746. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_governed_actions.py +0 -0
  747. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_governed_research_handoff.py +0 -0
  748. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_graduated_approvals.py +0 -0
  749. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_grant_envelope.py +0 -0
  750. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_graph_reindex_metadata.py +0 -0
  751. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_guard_audit.py +0 -0
  752. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_guard_chat_mode.py +0 -0
  753. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_guard_derive_context.py +0 -0
  754. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_guard_enforce_policy.py +0 -0
  755. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_hermes_export.py +0 -0
  756. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_hermes_general_governance.py +0 -0
  757. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_hermes_history_import.py +0 -0
  758. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_hermes_plugin_contract.py +0 -0
  759. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_hermes_plugin_event_lifecycle.py +0 -0
  760. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_hermes_plugin_event_replay.py +0 -0
  761. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_hermes_plugin_guard_shadow.py +0 -0
  762. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_hermes_plugin_signals.py +0 -0
  763. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_hermes_plugin_turn_id.py +0 -0
  764. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_hermes_queue_stats_projection.py +0 -0
  765. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_hermes_setup.py +0 -0
  766. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_hermes_work_projection.py +0 -0
  767. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_host_input_provenance.py +0 -0
  768. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_hostworker_agreement.py +0 -0
  769. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_identity_continuity.py +0 -0
  770. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_identity_corrections.py +0 -0
  771. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_inference_context_gate.py +0 -0
  772. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_initiative_engine.py +0 -0
  773. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_initiative_evidence.py +0 -0
  774. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_initiative_executor.py +0 -0
  775. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_initiative_feedback.py +0 -0
  776. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_initiative_pipeline_v016.py +0 -0
  777. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_initiative_retry.py +0 -0
  778. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_initiative_store.py +0 -0
  779. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_input_source_lineage.py +0 -0
  780. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_insight_store.py +0 -0
  781. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_instance_service.py +0 -0
  782. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_instance_service_live.py +0 -0
  783. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_intelligence_components.py +0 -0
  784. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_intelligence_synthesis.py +0 -0
  785. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_introduction_initiatives.py +0 -0
  786. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_job_writeback.py +0 -0
  787. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_journal.py +0 -0
  788. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_legacy_fact_context.py +0 -0
  789. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_local_work_context.py +0 -0
  790. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_loop_stats_accuracy.py +0 -0
  791. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_mcp_config.py +0 -0
  792. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_mcp_server.py +0 -0
  793. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_media_read_reference_presentation.py +0 -0
  794. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_memory_decay.py +0 -0
  795. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_memory_formation.py +0 -0
  796. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_memory_governance.py +0 -0
  797. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_memory_promotion.py +0 -0
  798. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_memory_prune.py +0 -0
  799. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_memory_read_hydration.py +0 -0
  800. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_memory_response_schemas.py +0 -0
  801. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_migrations.py +0 -0
  802. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_mining.py +0 -0
  803. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_model_qualification_cli.py +0 -0
  804. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_model_qualification_memory.py +0 -0
  805. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_model_qualification_runner.py +0 -0
  806. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_model_qualification_structured.py +0 -0
  807. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_native_accepted_local_work.py +0 -0
  808. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_native_initiative_work.py +0 -0
  809. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_native_input_carrier.py +0 -0
  810. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_native_outcome_judgments.py +0 -0
  811. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_native_request_erasure.py +0 -0
  812. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_native_review_recurrence.py +0 -0
  813. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_native_source_image_read.py +0 -0
  814. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_native_source_read.py +0 -0
  815. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_native_source_video_read.py +0 -0
  816. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_neo4j_backend.py +0 -0
  817. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_operator_deck_read_truth.py +0 -0
  818. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_ordinary_context_briefings.py +0 -0
  819. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_owner_preferences.py +0 -0
  820. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_p2_wirings.py +0 -0
  821. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_partial_work_rendering.py +0 -0
  822. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_patterns.py +0 -0
  823. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_pending_work_coverage.py +0 -0
  824. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_persona.py +0 -0
  825. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_persona_setup_result.py +0 -0
  826. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_phase_capability_check.py +0 -0
  827. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_preset_loop_coupling.py +0 -0
  828. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_procedure_source_context.py +0 -0
  829. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_project_event_outbox.py +0 -0
  830. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_project_result_reconciliation_phase.py +0 -0
  831. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_projects.py +0 -0
  832. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_prompt_evals.py +0 -0
  833. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_proposals.py +0 -0
  834. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_provenance_population.py +0 -0
  835. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_pseudo_agi_production_chain.py +0 -0
  836. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_queue_completed_filter.py +0 -0
  837. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_queue_contract.py +0 -0
  838. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_quiet_hours_and_reload.py +0 -0
  839. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_reachout_policy.py +0 -0
  840. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_recall_hybrid.py +0 -0
  841. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_recall_person_boost.py +0 -0
  842. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_recall_ranking.py +0 -0
  843. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_recall_rerank.py +0 -0
  844. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_recall_source_presentation.py +0 -0
  845. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_recall_unified_context.py +0 -0
  846. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_recency.py +0 -0
  847. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_reflection_task_routing.py +0 -0
  848. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_rejection_loop.py +0 -0
  849. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_relationship_calendar_aggregators.py +0 -0
  850. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_relationship_score_refresh.py +0 -0
  851. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_relationship_signal_floor.py +0 -0
  852. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_relationships.py +0 -0
  853. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_reply_forecast_callback_order.py +0 -0
  854. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_reply_forecast_stops.py +0 -0
  855. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_reply_forecasts.py +0 -0
  856. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_repo_tools.py +0 -0
  857. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_reported_worker_status.py +0 -0
  858. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_request_capabilities.py +0 -0
  859. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_request_work_context.py +0 -0
  860. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_reranker_remote.py +0 -0
  861. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_research_orchestrator.py +0 -0
  862. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_resolve_messaging_handle.py +0 -0
  863. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_response_guard.py +0 -0
  864. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_response_guard_communication_policy.py +0 -0
  865. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_response_guard_endpoint.py +0 -0
  866. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_response_guard_surface_policy.py +0 -0
  867. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_router_tiers.py +0 -0
  868. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_runtime_model_observations.py +0 -0
  869. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_sandbox.py +0 -0
  870. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_scoped_api_authority.py +0 -0
  871. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_scoped_contact_resolution.py +0 -0
  872. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_secondary_review_contract.py +0 -0
  873. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_seed_retirement.py +0 -0
  874. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_selected_autonomy.py +0 -0
  875. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_self_directed_thinker.py +0 -0
  876. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_self_initiatives.py +0 -0
  877. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_self_judgment_opt_in.py +0 -0
  878. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_self_judgment_premises.py +0 -0
  879. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_self_judgments.py +0 -0
  880. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_self_model.py +0 -0
  881. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_self_perspective.py +0 -0
  882. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_selfhood_benchmark.py +0 -0
  883. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_session_reports.py +0 -0
  884. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_shared_facts.py +0 -0
  885. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_shared_local_undertaking.py +0 -0
  886. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_short_source_context.py +0 -0
  887. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_sidecar.py +0 -0
  888. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_signals_attribution.py +0 -0
  889. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_situation_spine.py +0 -0
  890. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_skill_approval.py +0 -0
  891. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_skill_attribution.py +0 -0
  892. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_skill_sandbox.py +0 -0
  893. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_skill_synthesis.py +0 -0
  894. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_skill_synthesis_wiring.py +0 -0
  895. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_skills_memory.py +0 -0
  896. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_social_context_flow.py +0 -0
  897. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_social_transport.py +0 -0
  898. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_annotation_claim_survivors.py +0 -0
  899. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_annotations.py +0 -0
  900. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_appraisals.py +0 -0
  901. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_attribution.py +0 -0
  902. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_audio.py +0 -0
  903. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_audio_claims.py +0 -0
  904. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_claim_budget.py +0 -0
  905. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_claim_diagnostics.py +0 -0
  906. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_claim_media_eligibility.py +0 -0
  907. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_claim_projection.py +0 -0
  908. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_claim_review.py +0 -0
  909. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_claim_subject_basis.py +0 -0
  910. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_document_read.py +0 -0
  911. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_documents.py +0 -0
  912. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_episode_admission.py +0 -0
  913. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_episode_memory.py +0 -0
  914. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_episode_revisions.py +0 -0
  915. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_event_precision.py +0 -0
  916. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_excerpt_lineage.py +0 -0
  917. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_image_read.py +0 -0
  918. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_media.py +0 -0
  919. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_memory_backup.py +0 -0
  920. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_time_query.py +0 -0
  921. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_source_video.py +0 -0
  922. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_sqlite_connection_ownership.py +0 -0
  923. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_supervised_rung.py +0 -0
  924. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_surprise.py +0 -0
  925. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_sweep_fixes.py +0 -0
  926. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_synthesis.py +0 -0
  927. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_telemetry_staleness.py +0 -0
  928. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_temporal.py +0 -0
  929. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_temporal_followups.py +0 -0
  930. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_temporal_index.py +0 -0
  931. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_test_environment_isolation.py +0 -0
  932. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_thinking_phase.py +0 -0
  933. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_thought_function_routing.py +0 -0
  934. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tick_phase_budget.py +0 -0
  935. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tier_endpoints.py +0 -0
  936. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_timeline.py +0 -0
  937. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom2_approvals.py +0 -0
  938. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom2_asymmetry.py +0 -0
  939. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom2_context.py +0 -0
  940. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom2_cross_gate.py +0 -0
  941. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom2_eligibility.py +0 -0
  942. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom2_epistemic_guard.py +0 -0
  943. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom2_exposure.py +0 -0
  944. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom2_kill_switch.py +0 -0
  945. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom2_level_coherence.py +0 -0
  946. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom2_leveled.py +0 -0
  947. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom2_levels.py +0 -0
  948. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom2_source_corrections.py +0 -0
  949. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom2_store.py +0 -0
  950. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom2_taint.py +0 -0
  951. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom2_wiring.py +0 -0
  952. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom_event_lineage.py +0 -0
  953. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom_extractor.py +0 -0
  954. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom_p8_arcs.py +0 -0
  955. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom_p8_boundary_corpus.py +0 -0
  956. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom_p8_fact_adapters.py +0 -0
  957. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom_p8_outbound_integration.py +0 -0
  958. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom_p8_recipient_audit.py +0 -0
  959. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom_p8_recipient_simulator.py +0 -0
  960. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom_p8_visibility.py +0 -0
  961. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom_p8_visibility_store.py +0 -0
  962. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tom_source_lineage.py +0 -0
  963. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tool_handlers_graph.py +0 -0
  964. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tool_provenance.py +0 -0
  965. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_tool_surface.py +0 -0
  966. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_toolsmith.py +0 -0
  967. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_transport_ingress.py +0 -0
  968. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_transport_ingress_api.py +0 -0
  969. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_trust_configure.py +0 -0
  970. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_trust_scopes.py +0 -0
  971. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_trust_scopes_p2.py +0 -0
  972. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_turn_idempotency_ledger.py +0 -0
  973. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_turn_idempotency_v2.py +0 -0
  974. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_turn_ner_entities.py +0 -0
  975. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_turn_source_erasure.py +0 -0
  976. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_turn_source_evidence.py +0 -0
  977. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_turn_survivor_delivery.py +0 -0
  978. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_validation_sweep_fixes.py +0 -0
  979. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_vector_vacuum.py +0 -0
  980. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_wizard_autonomy.py +0 -0
  981. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_work_ancestry_projection.py +0 -0
  982. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_work_control_production_blockers.py +0 -0
  983. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_work_control_v1.py +0 -0
  984. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_work_orders.py +0 -0
  985. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_work_read_surface_authority.py +0 -0
  986. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_work_source_coverage.py +0 -0
  987. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_worker_handler_boundaries.py +0 -0
  988. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_worker_heartbeat_truth.py +0 -0
  989. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_worker_http_authority.py +0 -0
  990. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_worker_integration.py +0 -0
  991. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_worker_lifecycle_durability.py +0 -0
  992. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_workers_governor.py +0 -0
  993. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_workers_install.py +0 -0
  994. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_workspace.py +0 -0
  995. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_world_context_query.py +0 -0
  996. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_world_entity_reinforcement.py +0 -0
  997. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_world_llm_extract.py +0 -0
  998. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_world_model_prune.py +0 -0
  999. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_world_observations.py +0 -0
  1000. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_world_populator.py +0 -0
  1001. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_world_quality.py +0 -0
  1002. {apsimo-1.3.1 → apsimo-1.3.3}/tests/test_world_supervised.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apsimo
3
- Version: 1.3.1
3
+ Version: 1.3.3
4
4
  Summary: Persistent identity, memory and autonomy for AI agents
5
5
  License-Expression: MIT
6
6
  Requires-Python: >=3.11
@@ -28,7 +28,7 @@ Requires-Dist: pandas>=2.0; extra == "vectors"
28
28
  Requires-Dist: pyarrow>=15.0; extra == "vectors"
29
29
  Requires-Dist: lancedb>=0.10; extra == "vectors"
30
30
  Provides-Extra: hermes
31
- Requires-Dist: apsimo-hermes<2,>=1.3.1; extra == "hermes"
31
+ Requires-Dist: apsimo-hermes<2,>=1.3.3; extra == "hermes"
32
32
  Provides-Extra: mcp
33
33
  Requires-Dist: mcp[cli]<2,>=1.0; extra == "mcp"
34
34
  Provides-Extra: lancedb
@@ -3109,10 +3109,14 @@ async def context_assemble(
3109
3109
  _per = _comms_log.last_per_channel(contact_id)
3110
3110
  if _per:
3111
3111
  _chs = ", ".join(f"{ch} {str(v['ts'])[:10]}" for ch, v in _per.items())
3112
- _bits.append(f"Channels used: {_chs}.")
3112
+ _bits.append(f"Recorded channels: {_chs}.")
3113
3113
  _lo = _comms_log.last_outbound(contact_id)
3114
3114
  if _lo:
3115
- _bits.append(f"I last reached out via {_lo['channel']} on {str(_lo['ts'])[:10]}.")
3115
+ _bits.append(
3116
+ f"Last recorded outgoing message: {_lo['channel']} on {str(_lo['ts'])[:10]}. "
3117
+ "This summary includes conversation replies; it does not establish "
3118
+ "proactive outreach or delivery."
3119
+ )
3116
3120
  if _commitment_store is not None:
3117
3121
  try:
3118
3122
  _cm = _commitment_store.list(person_id=contact_id, status=["pending", "overdue"], limit=5)
@@ -3748,6 +3752,12 @@ async def source_erasure_feed(contact_id: str, after: int = Query(0, ge=0), requ
3748
3752
  raise HTTPException(status_code=409, detail={"code": "erasure_history_mismatch"}) from exc
3749
3753
 
3750
3754
 
3755
+ class NativeHistoryReference(BaseModel):
3756
+ model_config = ConfigDict(extra='forbid')
3757
+ session_id: str = Field(min_length=1, max_length=256)
3758
+ message_hash: str = Field(pattern=r'^[0-9a-f]{64}$')
3759
+
3760
+
3751
3761
  class SourceFreshnessRequest(BaseModel):
3752
3762
  model_config = ConfigDict(extra='forbid')
3753
3763
  contact_id: str = Field(min_length=1, max_length=256)
@@ -3755,10 +3765,11 @@ class SourceFreshnessRequest(BaseModel):
3755
3765
  after: int = Field(default=0, ge=0)
3756
3766
  source_refs: list[SourceReference] = Field(max_length=512)
3757
3767
  unannotated_input_refs: list[SourceInputReference] = Field(default_factory=list, max_length=512)
3768
+ native_history_refs: list[NativeHistoryReference] = Field(default_factory=list, max_length=512)
3758
3769
 
3759
3770
  @model_validator(mode='after')
3760
3771
  def exact_source_selector(self):
3761
- if not self.source_refs and not self.unannotated_input_refs:
3772
+ if not self.source_refs and not self.unannotated_input_refs and not self.native_history_refs:
3762
3773
  raise ValueError('Exact source revisions or captured inputs are required')
3763
3774
  return self
3764
3775
 
@@ -3788,6 +3799,11 @@ async def source_freshness_feed(body: SourceFreshnessRequest, request: Request):
3788
3799
  current = ledger.source_references([ref.source_id for ref in body.source_refs],
3789
3800
  contact_id=person, session_id=body.session_id)
3790
3801
  page['sources_current'] = expected == {(ref['source_id'], ref['source_version']) for ref in current}
3802
+ if body.native_history_refs:
3803
+ from apsimo.turns.history_references import resolve
3804
+ page['native_history_matches'] = resolve(ledger, contact_id=person,
3805
+ session_id=body.session_id,
3806
+ references=[ref.model_dump() for ref in body.native_history_refs])
3791
3807
  if body.unannotated_input_refs:
3792
3808
  from apsimo.turns.source_annotations import inputs_unannotated
3793
3809
  refs = [ref.model_dump() for ref in body.unannotated_input_refs]
@@ -70,6 +70,21 @@ class RecallSelector:
70
70
  seen.add(key)
71
71
  unique.append(row)
72
72
  quotations = unique
73
+ def repeats_request(row):
74
+ # An exact repeat contributes no independent answer evidence. Keep
75
+ # it available as supplementary context, without classifying other
76
+ # questions, promoting speakers or changing its source bytes.
77
+ return bool(isinstance(query, str) and query.strip()
78
+ and row.get("kind") == "source_quote"
79
+ and row.get("epistemic_state") == "quotation"
80
+ and row.get("scope") == "person" and row.get("contact_id")
81
+ and row.get("role") in {"user", "assistant"}
82
+ and isinstance(row.get("content"), str)
83
+ and row["content"].strip() == query.strip()
84
+ and not any(row.get(key) for key in (
85
+ "atomic_evidence", "validity_status", "procedure_context",
86
+ "source_context", "_annotation_ids")))
87
+
73
88
  # Media is an independent candidate producer. Appending its first hit
74
89
  # after every text hit can exclude it from the bounded reranker before
75
90
  # relevance is assessed. Fuse its rank independently; it still shares
@@ -82,10 +97,17 @@ class RecallSelector:
82
97
  candidates = fuse_candidates(
83
98
  beliefs, text, limit=len(beliefs) + len(quotations),
84
99
  confidence_weighting=False, additional=(media,))
100
+ # Do this before bounded reranking, so repeated requests do not crowd
101
+ # out answer-bearing candidates before their relevance can be judged.
102
+ candidates.sort(key=repeats_request)
85
103
  ranked = await self.rerank(
86
104
  query, candidates, limit, confidence_weighting=False,
87
105
  candidate_limit=max(1, 4 * limit))
88
106
  ranked.sort(key=lambda row: row.get("relevance", 0), reverse=True)
107
+ # A semantic reranker can score the identical question highest. Preserve
108
+ # its abstention decisions and substantive order, then place only exact
109
+ # unqualified request repeats after the remaining evidence.
110
+ ranked.sort(key=repeats_request)
89
111
  return pack_memory_context(ranked, limit=limit, max_chars=max_chars)
90
112
 
91
113
  async def rerank(
@@ -233,8 +233,8 @@ def _interpreter(candidate):
233
233
  'from hermes_cli.plugins import get_plugin_manager; '
234
234
  'print(json.dumps({"version":importlib.metadata.version("hermes-agent")}))'],
235
235
  capture_output=True, text=True, timeout=30)
236
- if probe.returncode or json.loads(probe.stdout.splitlines()[-1]).get('version') not in {'0.21.0', '0.21.1'}:
237
- raise ValueError('Select the Python interpreter of Hermes 0.21.0 or 0.21.1 with its native dependencies installed')
236
+ if probe.returncode or json.loads(probe.stdout.splitlines()[-1]).get('version') not in {'0.21.0', '0.21.1', '0.21.2'}:
237
+ raise ValueError('Select the Python interpreter of Hermes 0.21.0, 0.21.1, or 0.21.2 with its native dependencies installed')
238
238
  return python
239
239
 
240
240
 
@@ -0,0 +1,41 @@
1
+ """Resolve host-observed message hashes to existing scoped source revisions.
2
+
3
+ No native transcript is uploaded or imported. A missing match is untracked
4
+ history, never a grant, a new source, or proof that an erasure did not happen.
5
+ """
6
+ from contextlib import closing
7
+ import json
8
+
9
+ from .idempotency import canonical_turn_digest, source_message_hash
10
+
11
+
12
+ def resolve(ledger, *, contact_id, session_id, references):
13
+ wanted = {(ref['session_id'], ref['message_hash']) for ref in references}
14
+ matches = {key: {'session_id': key[0], 'message_hash': key[1],
15
+ 'source_refs': [], 'erased': False} for key in wanted}
16
+ with closing(ledger._connect()) as conn:
17
+ # The request's current viewer/session controls visibility. The native
18
+ # session supplied for matching does not broaden that permission.
19
+ for origin in sorted({key[0] for key in wanted}):
20
+ rows = conn.execute('''SELECT * FROM turn_sources WHERE contact_id=?
21
+ AND session_id=? AND (scope='person' OR session_id=?)
22
+ AND NOT EXISTS (SELECT 1 FROM source_attribution_invalidations i
23
+ WHERE i.source_id=turn_sources.turn_id)''',
24
+ (contact_id, origin, session_id)).fetchall()
25
+ for row in rows:
26
+ messages = json.loads(row['messages_json'])
27
+ ref = {'source_id': row['turn_id'], 'source_version': canonical_turn_digest(messages)}
28
+ for message in messages:
29
+ key = origin, source_message_hash(origin, message)
30
+ if key in matches and ref not in matches[key]['source_refs']:
31
+ matches[key]['source_refs'].append(ref)
32
+ erased = conn.execute('''SELECT e.message_hashes_json FROM source_erasures e
33
+ LEFT JOIN source_erasure_revisions r USING(sequence)
34
+ WHERE e.contact_id=? AND e.session_id=?
35
+ AND (r.source_scope='person' OR e.session_id=? OR r.sequence IS NULL)''',
36
+ (contact_id, origin, session_id)).fetchall()
37
+ for row in erased:
38
+ for message_hash in json.loads(row['message_hashes_json']):
39
+ if (origin, message_hash) in matches:
40
+ matches[origin, message_hash]['erased'] = True
41
+ return [matches[key] for key in sorted(matches)]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apsimo
3
- Version: 1.3.1
3
+ Version: 1.3.3
4
4
  Summary: Persistent identity, memory and autonomy for AI agents
5
5
  License-Expression: MIT
6
6
  Requires-Python: >=3.11
@@ -28,7 +28,7 @@ Requires-Dist: pandas>=2.0; extra == "vectors"
28
28
  Requires-Dist: pyarrow>=15.0; extra == "vectors"
29
29
  Requires-Dist: lancedb>=0.10; extra == "vectors"
30
30
  Provides-Extra: hermes
31
- Requires-Dist: apsimo-hermes<2,>=1.3.1; extra == "hermes"
31
+ Requires-Dist: apsimo-hermes<2,>=1.3.3; extra == "hermes"
32
32
  Provides-Extra: mcp
33
33
  Requires-Dist: mcp[cli]<2,>=1.0; extra == "mcp"
34
34
  Provides-Extra: lancedb
@@ -530,6 +530,7 @@ apsimo/turns/executions.py
530
530
  apsimo/turns/hermes_history.py
531
531
  apsimo/turns/hermes_kanban.py
532
532
  apsimo/turns/hermes_work.py
533
+ apsimo/turns/history_references.py
533
534
  apsimo/turns/idempotency.py
534
535
  apsimo/turns/local_work.py
535
536
  apsimo/turns/media.py
@@ -797,6 +798,7 @@ tests/test_model_qualification_memory.py
797
798
  tests/test_model_qualification_runner.py
798
799
  tests/test_model_qualification_structured.py
799
800
  tests/test_native_accepted_local_work.py
801
+ tests/test_native_history_references.py
800
802
  tests/test_native_initiative_work.py
801
803
  tests/test_native_input_carrier.py
802
804
  tests/test_native_outcome_judgments.py
@@ -833,6 +835,7 @@ tests/test_reachout_policy.py
833
835
  tests/test_recall_hybrid.py
834
836
  tests/test_recall_person_boost.py
835
837
  tests/test_recall_ranking.py
838
+ tests/test_recall_request_repetition.py
836
839
  tests/test_recall_rerank.py
837
840
  tests/test_recall_source_presentation.py
838
841
  tests/test_recall_unified_context.py
@@ -35,7 +35,7 @@ beautifulsoup4>=4.12
35
35
  neo4j>=5.18
36
36
 
37
37
  [hermes]
38
- apsimo-hermes<2,>=1.3.1
38
+ apsimo-hermes<2,>=1.3.3
39
39
 
40
40
  [lancedb]
41
41
  lancedb>=0.6
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "apsimo"
7
- version = "1.3.1"
7
+ version = "1.3.3"
8
8
  description = "Persistent identity, memory and autonomy for AI agents"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -29,7 +29,7 @@ dependencies = [
29
29
  graph = ["neo4j>=5.18"]
30
30
  neo4j = ["neo4j>=5.18"]
31
31
  vectors = ["sentence-transformers>=3.0", "pandas>=2.0", "pyarrow>=15.0", "lancedb>=0.10"]
32
- hermes = ["apsimo-hermes>=1.3.1,<2"]
32
+ hermes = ["apsimo-hermes>=1.3.3,<2"]
33
33
  mcp = ["mcp[cli]>=1.0,<2"]
34
34
  lancedb = ["lancedb>=0.6", "pyarrow>=14.0", "pandas>=2.0"]
35
35
  postgres = ["asyncpg>=0.29"]
@@ -37,7 +37,16 @@ def test_owner_and_attested_system_keep_native_tools(runtime, sender, platform):
37
37
  _, ctx, _, _ = runtime
38
38
  _pre(ctx, session="s", task="t", turn="u", platform=platform, sender=sender)
39
39
  for name in NATIVE_TOOLS:
40
- assert call(ctx, name) == "executed"
40
+ # History now reconciles successful results against memory erasures.
41
+ # A native error needs no database fixture and must remain unchanged.
42
+ expected = (json.dumps({"success": False, "error": "fixture has no stored sessions"})
43
+ if name == "session_search" else "executed")
44
+ invoked = []
45
+ def dispatch(args):
46
+ invoked.append(args)
47
+ return expected
48
+ assert call(ctx, name, dispatch=dispatch) == expected
49
+ assert invoked == [{}]
41
50
 
42
51
 
43
52
  @pytest.mark.parametrize("overrides", [{"session": "other"}, {"task": "other"},
@@ -1197,7 +1197,8 @@ def test_colony_client_uses_one_absolute_deadline_across_http_phases():
1197
1197
  assert elapsed < 0.20
1198
1198
 
1199
1199
 
1200
- def test_colony_client_absolute_deadline_transport_accepts_exact_put():
1200
+ @pytest.mark.parametrize('channel_id', ['', 'email:thread-739'])
1201
+ def test_colony_client_absolute_deadline_transport_accepts_exact_put(channel_id):
1201
1202
  module = _load_client("colony_hermes_client_deadline_success_test")
1202
1203
  listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1203
1204
  listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
@@ -1242,6 +1243,7 @@ def test_colony_client_absolute_deadline_transport_accepts_exact_put():
1242
1243
  session_id="session-1",
1243
1244
  contact_id="cid-owner",
1244
1245
  turn_id="turn/one",
1246
+ channel_id=channel_id,
1245
1247
  timeout_seconds=0.20,
1246
1248
  ) is True
1247
1249
  finally:
@@ -1260,6 +1262,7 @@ def test_colony_client_absolute_deadline_transport_accepts_exact_put():
1260
1262
  "contact_id": "cid-owner",
1261
1263
  "session_id": "session-1",
1262
1264
  "turn_id": "turn/one",
1265
+ **({"channel_id": channel_id} if channel_id else {}),
1263
1266
  },
1264
1267
  "identity": {"host_id": "hermes"},
1265
1268
  }
@@ -0,0 +1,54 @@
1
+ import pytest
2
+
3
+ from apsimo.api.routers.host import SourceFreshnessRequest
4
+ from apsimo.turns import TurnIdempotencyLedger
5
+ from apsimo.turns.history_references import resolve
6
+ from apsimo.turns.idempotency import source_message_hash
7
+
8
+
9
+ def test_native_message_resolution_preserves_scope_and_erased_identity(tmp_path):
10
+ ledger = TurnIdempotencyLedger(tmp_path/'turns.db')
11
+ message = {'role': 'user', 'content': 'The specimen belongs in drawer twelve.'}
12
+ for turn, contact, scope in [('visible', 'owner', 'person'),
13
+ ('session-only', 'owner', 'session'),
14
+ ('foreign', 'guest', 'person')]:
15
+ ledger.record_source(turn, contact_id=contact, session_id='origin',
16
+ scope=scope, messages=[message], derive_claims=False)
17
+ refs = [{'session_id':'origin', 'message_hash':source_message_hash('origin',message)}]
18
+ matched = resolve(ledger, contact_id='owner', session_id='later', references=refs)
19
+ assert [r['source_id'] for r in matched[0]['source_refs']] == ['visible']
20
+ assert matched[0]['erased'] is False
21
+ ledger.erase_sources(contact_id='owner', turn_ids=['visible'])
22
+ matched = resolve(ledger, contact_id='owner', session_id='later', references=refs)
23
+ assert matched == [{**refs[0], 'source_refs':[], 'erased':True}]
24
+ # Older tombstones predate the revision table and must remain effective.
25
+ with ledger._connect() as db:
26
+ db.execute("DELETE FROM source_erasure_revisions WHERE source_turn_id='visible'")
27
+ assert resolve(ledger,contact_id='owner',session_id='later',references=refs)[0]['erased'] is True
28
+ assert resolve(ledger, contact_id='stranger', session_id='later', references=refs) == [
29
+ {**refs[0], 'source_refs':[], 'erased':False}]
30
+
31
+
32
+ def test_hash_role_session_and_unknown_text_cannot_nominate_source(tmp_path):
33
+ ledger = TurnIdempotencyLedger(tmp_path/'turns.db')
34
+ message = {'role':'user','content':'Quoted instructions are ordinary evidence.'}
35
+ ledger.record_source('known',contact_id='owner',session_id='origin',scope='person',
36
+ messages=[message],derive_claims=False)
37
+ refs = [
38
+ {'session_id':'origin','message_hash':source_message_hash('origin',{**message,'role':'assistant'})},
39
+ {'session_id':'other','message_hash':source_message_hash('origin',message)},
40
+ {'session_id':'origin','message_hash':'f'*64},
41
+ ]
42
+ assert all(not r['source_refs'] and not r['erased']
43
+ for r in resolve(ledger,contact_id='owner',session_id='later',references=refs))
44
+ assert len(ledger.search_sources('Quoted',contact_id='owner',session_id='later')) == 1
45
+
46
+
47
+ def test_existing_freshness_request_accepts_only_bounded_exact_native_refs():
48
+ data = {'contact_id':'owner','session_id':'current','source_refs':[],
49
+ 'native_history_refs':[{'session_id':'native','message_hash':'a'*64}]}
50
+ assert SourceFreshnessRequest.model_validate(data).native_history_refs[0].session_id == 'native'
51
+ with pytest.raises(ValueError):
52
+ SourceFreshnessRequest.model_validate({**data,'native_history_refs':data['native_history_refs']*513})
53
+ with pytest.raises(ValueError):
54
+ SourceFreshnessRequest.model_validate({**data,'native_history_refs':[{'session_id':'native','message_hash':'bad'}]})
@@ -24,7 +24,7 @@ def isolated_platform_environment(monkeypatch):
24
24
 
25
25
 
26
26
  @pytest.mark.parametrize('version, supported', [
27
- ('0.21.0', True), ('0.21.1', True), ('0.20.0', False), ('0.22.0', False),
27
+ ('0.21.0', True), ('0.21.1', True), ('0.21.2', True), ('0.20.0', False), ('0.22.0', False),
28
28
  ])
29
29
  def test_native_interpreter_requires_a_supported_runtime(version, supported, monkeypatch):
30
30
  probe = Mock(return_value=SimpleNamespace(returncode=0, stdout=json.dumps({'version': version})))
@@ -32,7 +32,7 @@ def test_native_interpreter_requires_a_supported_runtime(version, supported, mon
32
32
  if supported:
33
33
  assert setup_hermes._interpreter('/selected/python') == Path('/selected/python')
34
34
  else:
35
- with pytest.raises(ValueError, match='Hermes 0.21.0 or 0.21.1'):
35
+ with pytest.raises(ValueError, match='Hermes 0.21.0, 0.21.1, or 0.21.2'):
36
36
  setup_hermes._interpreter('/selected/python')
37
37
  assert probe.call_args.args[0][:3] == ['/selected/python', '-I', '-c']
38
38
  assert probe.call_args.kwargs['timeout'] == 30
@@ -0,0 +1,140 @@
1
+ """A previous copy of the request must not crowd out independent evidence."""
2
+ from copy import deepcopy
3
+ from datetime import datetime
4
+ import json
5
+
6
+ import pytest
7
+
8
+ from apsimo.intelligence.graph.recall import source_candidates
9
+ from apsimo.intelligence.graph.selection import RecallSelector
10
+ from apsimo.beliefs.source_projection import SourceClaimProjection
11
+ from apsimo.beliefs.source_time import interpret_time_query
12
+ from apsimo.turns.idempotency import TurnIdempotencyLedger, source_message_hash
13
+ from test_source_claim_projection import Model, claim
14
+
15
+
16
+ def quotation(identifier, text, role="user", **extra):
17
+ return dict(source_candidates([{
18
+ "turn_id": identifier, "role": role, "content": text,
19
+ "source_message_hash": identifier + "-version",
20
+ "scope": "person", "contact_id": "person-a", "session_id": "earlier",
21
+ }])[0], **extra)
22
+
23
+
24
+ @pytest.mark.asyncio
25
+ @pytest.mark.parametrize("mode", ["off", "shadow", "on", "failed"])
26
+ async def test_exact_request_is_supplementary_across_rerank_paths(monkeypatch, mode):
27
+ query = "Where is the spare connector?"
28
+ echo = quotation("question", query)
29
+ correction = quotation("correction", "The spare connector is now in drawer six.")
30
+ observation = quotation("observation", "The connector inspection found bent pins.", "assistant")
31
+ rows = [echo, observation, correction]
32
+ original = deepcopy(rows)
33
+ monkeypatch.setenv("COLONY_RECALL_RERANK", "on" if mode == "failed" else mode)
34
+ monkeypatch.delenv("COLONY_RECALL_RERANK_MIN_SCORE", raising=False)
35
+
36
+ async def rank(query, documents, top_k):
37
+ assert documents == [observation["content"], correction["content"], echo["content"]]
38
+ if mode == "failed":
39
+ raise RuntimeError("controlled unavailable reranker")
40
+ # Exact lexical/semantic overlap is not independent answer evidence.
41
+ return [{"index": i, "score": 100 if text == query else 2 - i}
42
+ for i, text in enumerate(documents)]
43
+
44
+ selected, context = await RecallSelector(rank).select_context(query, [], rows, limit=2)
45
+ assert [row["source_turn_id"] for row in selected] == ["observation", "correction"]
46
+ assert rows == original
47
+ assert '"role": "assistant"' in context and '"role": "user"' in context
48
+ assert len(context) <= 6000
49
+ # The source is still available when the complete packet fits.
50
+ selected, _ = await RecallSelector().select_context(query, [], rows, limit=3)
51
+ assert selected[-1]["source_turn_id"] == "question"
52
+
53
+
54
+ @pytest.mark.asyncio
55
+ @pytest.mark.parametrize("extra", [
56
+ {"atomic_evidence": True}, {"validity_status": "temporal_history"},
57
+ {"procedure_context": "complete"}, {"source_context": "complete"},
58
+ {"_annotation_ids": ["annotation"]}, {"scope": "session"},
59
+ {"contact_id": None}, {"epistemic_state": "derived_unverified"},
60
+ ])
61
+ async def test_qualified_or_uncertain_source_is_not_deprioritized(monkeypatch, extra):
62
+ monkeypatch.setenv("COLONY_RECALL_RERANK", "off")
63
+ query = "Where was the connector yesterday?"
64
+ qualified = quotation("qualified", query, **extra)
65
+ rows = [qualified, quotation("other", "An unrelated observation.", "assistant")]
66
+ selected, _ = await RecallSelector().select_context(query, [], rows, limit=1)
67
+ assert selected[0]["source_turn_id"] == "qualified"
68
+
69
+
70
+ @pytest.mark.asyncio
71
+ async def test_history_and_assistant_observations_keep_exact_bytes(monkeypatch):
72
+ monkeypatch.setenv("COLONY_RECALL_RERANK", "off")
73
+ query = "What did we ask and observe about the connector yesterday?"
74
+ rows = [quotation("question", "Where is the spare connector?"),
75
+ quotation("observation", "I measured its resistance as 4 ohms.", "assistant"),
76
+ quotation("tool", "Continuity test: PASS", "tool")]
77
+ selected, _ = await RecallSelector().select_context(query, [], rows, limit=3)
78
+ assert [(r["source_turn_id"], r["content"], r["role"]) for r in selected] == [
79
+ (r["source_turn_id"], r["content"], r["role"]) for r in rows]
80
+
81
+
82
+ @pytest.mark.asyncio
83
+ async def test_no_semantic_or_case_normalization(monkeypatch):
84
+ monkeypatch.setenv("COLONY_RECALL_RERANK", "off")
85
+ rows = [quotation("case-differs", "Where is the Connector?"),
86
+ quotation("observation", "The connector is in drawer six.")]
87
+ selected, _ = await RecallSelector().select_context("Where is the connector?", [], rows, limit=1)
88
+ assert selected[0]["source_turn_id"] == "case-differs"
89
+
90
+
91
+ @pytest.mark.asyncio
92
+ @pytest.mark.parametrize("admitted", [False, True])
93
+ async def test_pending_and_admitted_correction_survive_repeated_recall(tmp_path, monkeypatch, admitted):
94
+ """Reconstructed ingestion/FTS/projection/packing case, not a model benchmark."""
95
+ monkeypatch.setenv("COLONY_RECALL_RERANK", "off")
96
+ query = "Which drawer currently holds the spare connector? Use retained evidence and answer briefly."
97
+ old = "Remember this workshop fact: the spare connector is in drawer four."
98
+ correction = "Correction: the spare connector is now in drawer six. The previous drawer is outdated. Remember the correction."
99
+ ledger = TurnIdempotencyLedger(tmp_path / "source.db")
100
+ projection = SourceClaimProjection(ledger)
101
+ model = Model({
102
+ old: claim("the spare connector is in drawer four.", "drawer four", subject="spare connector", predicate="location"),
103
+ correction: claim(correction, "drawer six", subject="spare connector", predicate="location", operation="correct", match_prior=True),
104
+ })
105
+
106
+ def record(identifier, user, assistant, *, derive=False):
107
+ ledger.record_source(identifier, contact_id="person-a", session_id="earlier",
108
+ messages=[{"role": "user", "content": user}, {"role": "assistant", "content": assistant}],
109
+ occurred_at="2026-03-01T12:00:00+00:00", derive_claims=derive)
110
+
111
+ record("formation", old, "", derive=True)
112
+ assert await projection.process_one(model)
113
+ record("question-old", query.replace("currently ", ""),
114
+ "Drawer four. Per retained memory, the spare connector is in drawer four.")
115
+ record("correction", correction, "", derive=True)
116
+ record("question-new", query, "Drawer six. Per corrected memory, the spare connector is in drawer six.")
117
+ record("question-repeat", query, "")
118
+ if admitted:
119
+ assert await projection.process_one(model)
120
+ scope = {"contact_id": "person-a", "session_id": "fresh"}
121
+ hits = ledger.search_sources(query, **scope, limit=10)
122
+ beliefs, quotes = projection.prepare_context([], hits, **scope,
123
+ time_query=interpret_time_query(query, now=datetime.fromisoformat("2026-03-02T12:00:00+00:00")))
124
+ selected, context = await RecallSelector().select_context(query, beliefs, quotes, limit=5, max_chars=6000)
125
+ # Test evidence membership and exact attribution, not just the new value
126
+ # appearing in a prior assistant's answer or a source-ID metadata list.
127
+ if admitted:
128
+ assertions = [a for r in selected if r.get("content_format") == "source_assertions_v1"
129
+ for a in json.loads(r["content"])["assertions"]]
130
+ assert len(assertions) == 1
131
+ assert assertions[0]["source"] == "turn:correction"
132
+ assert assertions[0]["role"] == "user" and assertions[0]["quote"] == correction
133
+ else:
134
+ direct = [r for r in selected if r.get("source_turn_id") == "correction" and r.get("role") == "user"]
135
+ assert len(direct) == 1
136
+ assert direct[0]["content"] == correction
137
+ assert direct[0]["source_message_hash"] == source_message_hash("earlier", {"role": "user", "content": correction})
138
+ assert any(r.get("source_turn_id") == "formation" for r in selected)
139
+ assert any(r.get("role") == "assistant" for r in selected)
140
+ assert len(selected) <= 5 and len(context) <= 6000
@@ -102,17 +102,20 @@ async def test_repeated_semantic_questions_leave_room_for_evidence_and_survive_e
102
102
  monkeypatch.setenv('COLONY_RECALL_RERANK', 'on')
103
103
  monkeypatch.delenv('COLONY_RECALL_RERANK_MIN_SCORE', raising=False)
104
104
  selector = RecallSelector(rerank)
105
- async def recall():
105
+ async def recall(limit=5):
106
106
  lexical = ledger.search_sources(query, contact_id='c', session_id='later', limit=10)
107
107
  semantic, _ = await projection.search(query, contact_id='c', session_id='later', limit=20)
108
108
  hits = merge_source_hits(lexical, semantic)
109
109
  _, rows = claims.prepare_context([], hits, contact_id='c', session_id='later', time_query=MemoryTimeQuery())
110
- return rows, await selector.select_context(query, [], rows)
110
+ return rows, await selector.select_context(query, [], rows, limit=limit)
111
111
  rows, (selected, context) = await recall()
112
112
  duplicates = [row for row in rows if row['content'] == query]
113
113
  assert len(duplicates) == 5 # Fusion retains all occurrences for claim/time expansion.
114
114
  assert calls[0].count(query) == 1
115
- assert sum(row['content'] in useful for row in selected) == 4
115
+ assert {row['content'] for row in selected} == set(useful)
116
+ # Exact repeated requests are supplementary. A larger packet still exposes
117
+ # their intact lineage, and erasure must advance to a surviving occurrence.
118
+ _, (selected, _) = await recall(limit=6)
116
119
  retained = next(row for row in selected if row['content'] == query)
117
120
  for key in ('id', 'source_uri', 'source_turn_id', 'source_message_hash', 'occurred_at', 'ingested_at'):
118
121
  assert retained.get(key) == duplicates[0].get(key)
@@ -121,6 +124,8 @@ async def test_repeated_semantic_questions_leave_room_for_evidence_and_survive_e
121
124
  rows, (selected, context) = await recall()
122
125
  assert erased not in {row['source_turn_id'] for row in rows + selected}
123
126
  assert calls[-1].count(query) == 1
127
+ assert {row['content'] for row in selected} == set(useful)
128
+ _, (selected, _) = await recall(limit=6)
124
129
  replacement = next(row for row in selected if row['content'] == query)
125
130
  assert replacement['source_turn_id'] != erased
126
131
  assert replacement['source_message_hash'] != retained['source_message_hash']
@@ -680,6 +680,8 @@ async def test_p8_scoped_non_owner_queries_only_exact_person_commitments(
680
680
 
681
681
  @pytest.mark.asyncio
682
682
  async def test_p8_guest_comms_uses_neutral_owner_label(tmp_path, monkeypatch):
683
+ from colony_sidecar.contacts.comms import CommsLog
684
+
683
685
  monkeypatch.setenv("COLONY_RECIPIENT_SIMULATOR_MODE", "shadow")
684
686
  monkeypatch.setenv("COLONY_OWNER_CONTACT_ID", "owner")
685
687
  monkeypatch.setenv("COLONY_OWNER_NAME", "PRIVATE OWNER NAME")
@@ -689,6 +691,9 @@ async def test_p8_guest_comms_uses_neutral_owner_label(tmp_path, monkeypatch):
689
691
  _attach_p8_runtime(state_dir=tmp_path, facts_store=facts)
690
692
  spies = _PersonalContextSpies()
691
693
  spies.wire()
694
+ comms_log = CommsLog(str(tmp_path / "communications.db"))
695
+ comms_log.log("alice", channel="voice:thread", direction="out", summary="A routine reply.")
696
+ monkeypatch.setattr(host, "_comms_log", comms_log)
692
697
 
693
698
  response = await host.context_assemble(
694
699
  _context("alice"), request=_request(_authority("alice")))
@@ -698,6 +703,9 @@ async def test_p8_guest_comms_uses_neutral_owner_label(tmp_path, monkeypatch):
698
703
  )
699
704
  assert "PRIVATE OWNER NAME" not in comms.body
700
705
  assert "owner approval" in comms.body.lower()
706
+ assert "Last recorded outgoing message:" in comms.body
707
+ assert "does not establish proactive outreach or delivery" in comms.body
708
+ assert "I last reached out" not in comms.body
701
709
 
702
710
 
703
711
  @pytest.mark.asyncio
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes