loopx 0.5.0__tar.gz → 0.5.1__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 (959) hide show
  1. {loopx-0.5.0/loopx.egg-info → loopx-0.5.1}/PKG-INFO +13 -6
  2. {loopx-0.5.0 → loopx-0.5.1}/README.md +12 -5
  3. {loopx-0.5.0 → loopx-0.5.1}/loopx/__init__.py +1 -1
  4. {loopx-0.5.0 → loopx-0.5.1}/loopx/agent_onboarding.py +3 -1
  5. {loopx-0.5.0 → loopx-0.5.1}/loopx/bootstrap_command_pack.py +1 -1
  6. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/README.md +29 -0
  7. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/__init__.py +16 -4
  8. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/catalog_entry.py +26 -1
  9. loopx-0.5.1/loopx/capabilities/benchmark_toolkit/source_revision_fence.py +154 -0
  10. {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_actions.py +20 -65
  11. {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_agent.py +99 -17
  12. {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_lark_api.py +36 -1
  13. {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_runtime.py +217 -1
  14. {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_store.py +215 -1
  15. loopx-0.5.1/loopx/chat_todo_actions.py +82 -0
  16. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/benchmark_boundary.py +65 -2
  17. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/goal_channel.py +154 -0
  18. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/lark_inbox.py +22 -5
  19. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/registry_admin.py +1 -0
  20. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/registry_admin_configure.py +7 -0
  21. {loopx-0.5.0 → loopx-0.5.1}/loopx/configure_goal.py +55 -4
  22. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/activation_service.py +128 -10
  23. loopx-0.5.1/loopx/control_plane/goals/botmux_runtime.py +1475 -0
  24. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/goal_boundary.py +11 -1
  25. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/settlement.py +2 -1
  26. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/semantic_replan_writeback.py +65 -10
  27. loopx-0.5.1/loopx/dashboard_launcher.py +136 -0
  28. loopx-0.5.1/loopx/dsh_goal_mode/README.md +65 -0
  29. loopx-0.5.1/loopx/dsh_goal_mode/__init__.py +55 -0
  30. loopx-0.5.1/loopx/dsh_goal_mode/__main__.py +8 -0
  31. loopx-0.5.1/loopx/dsh_goal_mode/turn_host_adapter.py +465 -0
  32. {loopx-0.5.0 → loopx-0.5.1}/loopx/event_sourced_state.py +1 -0
  33. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/docs/lark-event-inbox.md +6 -5
  34. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/goal_topic_connections.py +280 -14
  35. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/goal_topic_runtime.py +127 -30
  36. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/inbox_reply.py +36 -6
  37. {loopx-0.5.0 → loopx-0.5.1}/loopx/host_loop_activation.py +8 -4
  38. {loopx-0.5.0 → loopx-0.5.1}/loopx/pi_goal_mode/README.md +13 -5
  39. {loopx-0.5.0 → loopx-0.5.1}/loopx/pi_goal_mode/loopx-goal.ts +17 -2
  40. {loopx-0.5.0 → loopx-0.5.1}/loopx/pi_goal_mode/pi-goal-loop-runtime.mjs +36 -1
  41. {loopx-0.5.0 → loopx-0.5.1}/loopx/state_refresh.py +62 -24
  42. loopx-0.5.1/loopx/web/chat/assets/index-Cx2exrQv.css +1 -0
  43. loopx-0.5.1/loopx/web/chat/assets/index-DlTni1Yi.js +107 -0
  44. {loopx-0.5.0 → loopx-0.5.1}/loopx/web/chat/index.html +2 -2
  45. {loopx-0.5.0 → loopx-0.5.1/loopx.egg-info}/PKG-INFO +13 -6
  46. {loopx-0.5.0 → loopx-0.5.1}/loopx.egg-info/SOURCES.txt +10 -2
  47. {loopx-0.5.0 → loopx-0.5.1}/pyproject.toml +2 -1
  48. {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-self-repair/references/repair-patterns.md +2 -0
  49. {loopx-0.5.0 → loopx-0.5.1}/tests/test_chat_lark_api_contract.py +74 -1
  50. {loopx-0.5.0 → loopx-0.5.1}/tests/test_dashboard_command.py +101 -0
  51. loopx-0.5.1/tests/test_dsh_goal_mode.py +239 -0
  52. {loopx-0.5.0 → loopx-0.5.1}/tests/test_host_loop_activation.py +2 -0
  53. {loopx-0.5.0 → loopx-0.5.1}/tests/test_license_metadata.py +2 -2
  54. {loopx-0.5.0 → loopx-0.5.1}/tests/test_pi_goal_mode.py +12 -0
  55. {loopx-0.5.0 → loopx-0.5.1}/tests/test_slash_command_install.py +2 -0
  56. loopx-0.5.0/loopx/dashboard_launcher.py +0 -65
  57. loopx-0.5.0/loopx/web/chat/assets/index-BOUhd8w2.js +0 -107
  58. loopx-0.5.0/loopx/web/chat/assets/index-C_e30CWC.css +0 -1
  59. {loopx-0.5.0 → loopx-0.5.1}/LICENSE +0 -0
  60. {loopx-0.5.0 → loopx-0.5.1}/LICENSE-MIT +0 -0
  61. {loopx-0.5.0 → loopx-0.5.1}/NOTICE +0 -0
  62. {loopx-0.5.0 → loopx-0.5.1}/loopx/agent_registry.py +0 -0
  63. {loopx-0.5.0 → loopx-0.5.1}/loopx/ark_managed_agent_host.py +0 -0
  64. {loopx-0.5.0 → loopx-0.5.1}/loopx/authority.py +0 -0
  65. {loopx-0.5.0 → loopx-0.5.1}/loopx/bootstrap.py +0 -0
  66. {loopx-0.5.0 → loopx-0.5.1}/loopx/boundary_authority.py +0 -0
  67. {loopx-0.5.0 → loopx-0.5.1}/loopx/canary/__init__.py +0 -0
  68. {loopx-0.5.0 → loopx-0.5.1}/loopx/canary/maintainability_ratchet.py +0 -0
  69. {loopx-0.5.0 → loopx-0.5.1}/loopx/canary/planner.py +0 -0
  70. {loopx-0.5.0 → loopx-0.5.1}/loopx/canary/premerge.py +0 -0
  71. {loopx-0.5.0 → loopx-0.5.1}/loopx/canary/qualification_profiles.py +0 -0
  72. {loopx-0.5.0 → loopx-0.5.1}/loopx/canary/quality_surface_catalog.py +0 -0
  73. {loopx-0.5.0 → loopx-0.5.1}/loopx/canary/release_profiles.py +0 -0
  74. {loopx-0.5.0 → loopx-0.5.1}/loopx/canary/runner.py +0 -0
  75. {loopx-0.5.0 → loopx-0.5.1}/loopx/canary/smoke_health.py +0 -0
  76. {loopx-0.5.0 → loopx-0.5.1}/loopx/canary/smoke_profiles.py +0 -0
  77. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/README.md +0 -0
  78. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/__init__.py +0 -0
  79. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/agent_turn_recall/README.md +0 -0
  80. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/agent_turn_recall/__init__.py +0 -0
  81. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/agent_turn_recall/catalog_entry.py +0 -0
  82. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/agent_turn_recall/cli.py +0 -0
  83. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/agent_turn_recall/core.py +0 -0
  84. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/README.md +0 -0
  85. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/__init__.py +0 -0
  86. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/bootstrap_contract.py +0 -0
  87. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/catalog_entry.py +0 -0
  88. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/cli.py +0 -0
  89. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/core.py +0 -0
  90. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/defaults.py +0 -0
  91. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/demo_e2e.py +0 -0
  92. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/demo_supervisor.py +0 -0
  93. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/evidence_packet.py +0 -0
  94. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/human_view.py +0 -0
  95. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/kernel.py +0 -0
  96. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/knn_demo_workspace.py +0 -0
  97. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/live_evidence.py +0 -0
  98. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/preset.py +0 -0
  99. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/research_state.py +0 -0
  100. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/role_profiles.py +0 -0
  101. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/rollout_append.py +0 -0
  102. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/terminal_result_contract.py +0 -0
  103. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/terminal_result_projection.py +0 -0
  104. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/terminal_result_query.py +0 -0
  105. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/terminal_results.py +0 -0
  106. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/user_contract.py +0 -0
  107. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/worker_loop.py +0 -0
  108. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/worker_runtime.py +0 -0
  109. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/worker_skill/SKILL.md +0 -0
  110. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/artifacts.py +0 -0
  111. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/container_binding.py +0 -0
  112. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/environment_access.py +0 -0
  113. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/experiment_board.py +0 -0
  114. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/integrity.py +0 -0
  115. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/native_codex_goal.py +0 -0
  116. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/native_codex_isolation.py +0 -0
  117. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/native_codex_profile.py +0 -0
  118. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/public_trajectory.py +0 -0
  119. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/run_permissions.py +0 -0
  120. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/catalog.py +0 -0
  121. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/change_quality/README.md +0 -0
  122. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/change_quality/__init__.py +0 -0
  123. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/change_quality/catalog_entry.py +0 -0
  124. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/change_quality/cli.py +0 -0
  125. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/change_quality/context.py +0 -0
  126. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/change_quality/oracles.py +0 -0
  127. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/change_quality/policy.py +0 -0
  128. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/change_quality/receipt.py +0 -0
  129. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/change_quality/result.py +0 -0
  130. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/change_quality/scope.py +0 -0
  131. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/change_quality/shadow.py +0 -0
  132. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/README.md +0 -0
  133. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/__init__.py +0 -0
  134. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/catalog_entry.py +0 -0
  135. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/cli.py +0 -0
  136. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/connector_packets.py +0 -0
  137. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/item_lifecycle.py +0 -0
  138. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/layout.py +0 -0
  139. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/markdown.py +0 -0
  140. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/schemas.py +0 -0
  141. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/social_browser_x.py +0 -0
  142. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/surface.py +0 -0
  143. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/templates/layout-catalog-v0.json +0 -0
  144. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/context_providers/__init__.py +0 -0
  145. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/context_providers/base.py +0 -0
  146. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/context_providers/factory.py +0 -0
  147. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/context_providers/openviking.py +0 -0
  148. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/context_providers/service_ownership.py +0 -0
  149. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/README.md +0 -0
  150. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/README.zh-CN.md +0 -0
  151. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/__init__.py +0 -0
  152. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/architecture.py +0 -0
  153. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/assembler.py +0 -0
  154. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/catalog_entry.py +0 -0
  155. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/cli.py +0 -0
  156. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/cursor_commit.py +0 -0
  157. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/outcome_feedback.py +0 -0
  158. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/packets.py +0 -0
  159. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/private_state.py +0 -0
  160. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/profile.py +0 -0
  161. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/providers.py +0 -0
  162. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/review_settlement.py +0 -0
  163. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/runtime.py +0 -0
  164. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/sources.py +0 -0
  165. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/documentation.py +0 -0
  166. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/README.md +0 -0
  167. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/README.zh-CN.md +0 -0
  168. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/__init__.py +0 -0
  169. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/activation.py +0 -0
  170. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/adaptive_replay_planner.py +0 -0
  171. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/catalog_entry.py +0 -0
  172. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/child_replay_runtime.py +0 -0
  173. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/composition_frontier.py +0 -0
  174. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/counterfactual_runtime.py +0 -0
  175. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/episode_runtime.py +0 -0
  176. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/harness_checkpoint.py +0 -0
  177. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/harness_gate.py +0 -0
  178. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/harness_runtime.py +0 -0
  179. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/replay_metrics.py +0 -0
  180. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/replay_runtime.py +0 -0
  181. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/resource_portfolio.py +0 -0
  182. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/result_log.py +0 -0
  183. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/router_state.py +0 -0
  184. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/source_history_reconcile.py +0 -0
  185. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/speculative_scheduler.py +0 -0
  186. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/todo_branch_plan.py +0 -0
  187. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/todo_evidence.py +0 -0
  188. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/trace_runtime.py +0 -0
  189. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/worker_branch_plan.py +0 -0
  190. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/integration_branch/README.md +0 -0
  191. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/integration_branch/__init__.py +0 -0
  192. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/integration_branch/catalog_entry.py +0 -0
  193. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/integration_branch/cli.py +0 -0
  194. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/integration_branch/core.py +0 -0
  195. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/README.md +0 -0
  196. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/README.zh-CN.md +0 -0
  197. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/__init__.py +0 -0
  198. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/acceptance_loop.py +0 -0
  199. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/candidate_evidence.py +0 -0
  200. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/candidate_preflight.py +0 -0
  201. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/catalog_entry.py +0 -0
  202. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/cli.py +0 -0
  203. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/cli_input.py +0 -0
  204. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/content_ops_cli.py +0 -0
  205. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/discovered_issue_promotion.py +0 -0
  206. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/docs/openviking-pilot-handoff.md +0 -0
  207. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/docs/protocols/issue-fix-acceptance-loop-v0.md +0 -0
  208. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/docs/protocols/issue-fix-discovered-issue-promotion-v0.md +0 -0
  209. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/docs/protocols/issue-fix-metrics-projection-v0.md +0 -0
  210. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/docs/protocols/issue-fix-reviewer-notification-sinks-v0.md +0 -0
  211. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/docs/protocols/issue-fix-reviewer-recommendation-v0.md +0 -0
  212. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/docs/protocols/issue-fix-reviewer-request-v0.md +0 -0
  213. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/docs/protocols/issue-fix-workflow-contract-v0.md +0 -0
  214. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/docs/state-kernel-domain-state-case-study.zh-CN.md +0 -0
  215. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/explore_projection.py +0 -0
  216. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/feasibility.py +0 -0
  217. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/github_public.py +0 -0
  218. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/intake_surface.py +0 -0
  219. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/metadata_preview.py +0 -0
  220. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/metrics_projection.py +0 -0
  221. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/metrics_supplement.py +0 -0
  222. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/metrics_supplement_cli.py +0 -0
  223. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/outcome_projection.py +0 -0
  224. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/periodic_report.py +0 -0
  225. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/pr_description.py +0 -0
  226. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/pr_gate_reconcile.py +0 -0
  227. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/pr_gate_reconcile_cli.py +0 -0
  228. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/pr_lifecycle.py +0 -0
  229. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/pr_lifecycle_rollout.py +0 -0
  230. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/pr_monitor_materialization.py +0 -0
  231. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/pr_review_ack.py +0 -0
  232. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/provider_hooks.py +0 -0
  233. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/repository_commit_evidence.py +0 -0
  234. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/repository_context.py +0 -0
  235. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/repository_memory.py +0 -0
  236. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/repository_memory_provider.py +0 -0
  237. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/repository_snapshot.py +0 -0
  238. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/reviewer_cli.py +0 -0
  239. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/reviewer_notification.py +0 -0
  240. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/reviewer_notification_drain.py +0 -0
  241. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/reviewer_recommendation.py +0 -0
  242. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/reviewer_request.py +0 -0
  243. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/reward_memory.py +0 -0
  244. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/workflow_plan.py +0 -0
  245. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/README.md +0 -0
  246. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/README.zh-CN.md +0 -0
  247. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/__init__.py +0 -0
  248. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/_validation.py +0 -0
  249. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/apply.py +0 -0
  250. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/architecture.py +0 -0
  251. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/catalog_entry.py +0 -0
  252. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/cli.py +0 -0
  253. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/decision_planning.py +0 -0
  254. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/explore_execution.py +0 -0
  255. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/intake.py +0 -0
  256. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/inventory.py +0 -0
  257. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/lifecycle.py +0 -0
  258. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/preparation.py +0 -0
  259. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/project_skill.py +0 -0
  260. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/ranking.py +0 -0
  261. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/readable_projection.py +0 -0
  262. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/rebuild.py +0 -0
  263. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/settlement.py +0 -0
  264. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/README.md +0 -0
  265. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/__init__.py +0 -0
  266. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/adapters.py +0 -0
  267. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/archive.py +0 -0
  268. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/bindings.py +0 -0
  269. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/catalog_entry.py +0 -0
  270. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/cli.py +0 -0
  271. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/core.py +0 -0
  272. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/extension_envelope.py +0 -0
  273. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/presets.py +0 -0
  274. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/profile.py +0 -0
  275. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/project_progress.py +0 -0
  276. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/triggers.py +0 -0
  277. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/pr_review_queue/README.md +0 -0
  278. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/pr_review_queue/__init__.py +0 -0
  279. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/pr_review_queue/catalog_entry.py +0 -0
  280. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/pr_review_queue/core.py +0 -0
  281. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/pr_review_queue/review_contract.py +0 -0
  282. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/project_skill_delivery/README.md +0 -0
  283. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/project_skill_delivery/__init__.py +0 -0
  284. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/project_skill_delivery/catalog_entry.py +0 -0
  285. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/project_skill_delivery/cli.py +0 -0
  286. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/project_skill_delivery/core.py +0 -0
  287. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/registry.py +0 -0
  288. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/repository_change_window/README.md +0 -0
  289. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/repository_change_window/__init__.py +0 -0
  290. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/repository_change_window/catalog_entry.py +0 -0
  291. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/repository_change_window/cli.py +0 -0
  292. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/repository_change_window/git_hook.py +0 -0
  293. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/repository_change_window/ledger.py +0 -0
  294. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/repository_change_window/policy.py +0 -0
  295. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/repository_change_window/repository.py +0 -0
  296. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/README.md +0 -0
  297. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/README.zh-CN.md +0 -0
  298. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/__init__.py +0 -0
  299. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/application.py +0 -0
  300. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/architecture.py +0 -0
  301. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/candidate_review.py +0 -0
  302. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/catalog_entry.py +0 -0
  303. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/cli.py +0 -0
  304. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/dogfood.py +0 -0
  305. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/evaluation.py +0 -0
  306. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/evaluation_fixtures.py +0 -0
  307. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/experiment.py +0 -0
  308. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/health.py +0 -0
  309. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/ingestion.py +0 -0
  310. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/memory_utility.py +0 -0
  311. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/registry.py +0 -0
  312. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/runtime_hooks.py +0 -0
  313. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/scoped_feedback.py +0 -0
  314. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/semantic_preference/README.md +0 -0
  315. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/semantic_preference/__init__.py +0 -0
  316. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/semantic_preference/catalog_entry.py +0 -0
  317. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/semantic_preference/cli.py +0 -0
  318. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/semantic_preference/contract.py +0 -0
  319. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/semantic_preference/docs/openviking-project-peer.md +0 -0
  320. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/semantic_preference/reward_memory.py +0 -0
  321. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/value_connectors/README.md +0 -0
  322. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/value_connectors/__init__.py +0 -0
  323. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/value_connectors/catalog_entry.py +0 -0
  324. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/value_connectors/cli.py +0 -0
  325. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/value_connectors/docs/agent-reach-ops-source-map.md +0 -0
  326. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/value_connectors/docs/finance-market-snapshot-probe.md +0 -0
  327. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/value_connectors/finance_extension_migration.py +0 -0
  328. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/value_connectors/install_check.py +0 -0
  329. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/value_connectors/planner.py +0 -0
  330. {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/value_connectors/source_map.py +0 -0
  331. {loopx-0.5.0 → loopx-0.5.1}/loopx/chat.py +0 -0
  332. {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_acp.py +0 -0
  333. {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_action_store.py +0 -0
  334. {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_attachments.py +0 -0
  335. {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_endpoints.py +0 -0
  336. {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_goal_lifecycle_actions.py +0 -0
  337. {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_monitor_actions.py +0 -0
  338. {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_providers.py +0 -0
  339. {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_server.py +0 -0
  340. {loopx-0.5.0 → loopx-0.5.1}/loopx/claude_goal_mode/README.md +0 -0
  341. {loopx-0.5.0 → loopx-0.5.1}/loopx/claude_goal_mode/__init__.py +0 -0
  342. {loopx-0.5.0 → loopx-0.5.1}/loopx/claude_goal_mode/hooks/goal_policy.py +0 -0
  343. {loopx-0.5.0 → loopx-0.5.1}/loopx/claude_goal_mode/hooks/goal_state.py +0 -0
  344. {loopx-0.5.0 → loopx-0.5.1}/loopx/claude_goal_mode/mcp/loopx_mcp.py +0 -0
  345. {loopx-0.5.0 → loopx-0.5.1}/loopx/claude_goal_mode/scripts/connect.py +0 -0
  346. {loopx-0.5.0 → loopx-0.5.1}/loopx/claude_goal_mode/scripts/goalmode_cmd.py +0 -0
  347. {loopx-0.5.0 → loopx-0.5.1}/loopx/claude_goal_mode/scripts/install.py +0 -0
  348. {loopx-0.5.0 → loopx-0.5.1}/loopx/claude_goal_mode/statusline/goal_status.py +0 -0
  349. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli.py +0 -0
  350. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/__init__.py +0 -0
  351. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/_host_thread.py +0 -0
  352. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/benchmark_dispatch.py +0 -0
  353. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/benchmark_experiment_board.py +0 -0
  354. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/bootstrap_connect.py +0 -0
  355. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/canary.py +0 -0
  356. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/canary_release_qualification.py +0 -0
  357. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/capability.py +0 -0
  358. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/dash.py +0 -0
  359. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/doctor.py +0 -0
  360. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/dreaming.py +0 -0
  361. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/evidence_log.py +0 -0
  362. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/explore.py +0 -0
  363. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/explore_feishu_commands.py +0 -0
  364. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/explore_planning_commands.py +0 -0
  365. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/extension.py +0 -0
  366. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/first_run_report.py +0 -0
  367. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/goal_lifecycle.py +0 -0
  368. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/handoff_mode.py +0 -0
  369. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/history.py +0 -0
  370. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/host_mode_plan.py +0 -0
  371. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/lark_kanban.py +0 -0
  372. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/ml_experiment.py +0 -0
  373. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/multi_agent.py +0 -0
  374. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/opencode2_goal_worker.py +0 -0
  375. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/pr_review.py +0 -0
  376. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/presentation.py +0 -0
  377. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/preset.py +0 -0
  378. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/project.py +0 -0
  379. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/project_lifecycle.py +0 -0
  380. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/quota.py +0 -0
  381. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/quota_host_poll.py +0 -0
  382. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/quota_monitor_poll.py +0 -0
  383. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/quota_registration.py +0 -0
  384. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/quota_request.py +0 -0
  385. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/ready_score.py +0 -0
  386. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/registry_admin_peer.py +0 -0
  387. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/registry_authority.py +0 -0
  388. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/review_batch.py +0 -0
  389. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/slash_commands.py +0 -0
  390. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/start_goal.py +0 -0
  391. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/starter.py +0 -0
  392. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/starter_bootstrap.py +0 -0
  393. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/starter_bootstrap_registration.py +0 -0
  394. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/starter_runtime_idle.py +0 -0
  395. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/starter_scheduler.py +0 -0
  396. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/starter_session_runtime.py +0 -0
  397. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/starter_visible_common.py +0 -0
  398. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/starter_visible_driver.py +0 -0
  399. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/starter_visible_pilot.py +0 -0
  400. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/status.py +0 -0
  401. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/status_registration.py +0 -0
  402. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/summary_all.py +0 -0
  403. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/support_control.py +0 -0
  404. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/support_control_backup.py +0 -0
  405. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/support_control_chat_endpoint.py +0 -0
  406. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/support_control_registry.py +0 -0
  407. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/support_control_supervisor.py +0 -0
  408. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/task_lease.py +0 -0
  409. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/todo.py +0 -0
  410. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/todo_argument_validation.py +0 -0
  411. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/todo_event.py +0 -0
  412. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/turn.py +0 -0
  413. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/version.py +0 -0
  414. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/worker_bridge.py +0 -0
  415. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/workflow_skills.py +0 -0
  416. {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_rollout.py +0 -0
  417. {loopx-0.5.0 → loopx-0.5.1}/loopx/codex_cli_probe.py +0 -0
  418. {loopx-0.5.0 → loopx-0.5.1}/loopx/codex_cli_probe_markdown.py +0 -0
  419. {loopx-0.5.0 → loopx-0.5.1}/loopx/codex_cli_runtime_probe.py +0 -0
  420. {loopx-0.5.0 → loopx-0.5.1}/loopx/codex_cli_scheduler.py +0 -0
  421. {loopx-0.5.0 → loopx-0.5.1}/loopx/command_invocation.py +0 -0
  422. {loopx-0.5.0 → loopx-0.5.1}/loopx/configuration_catalog.py +0 -0
  423. {loopx-0.5.0 → loopx-0.5.1}/loopx/contract.py +0 -0
  424. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/__init__.py +0 -0
  425. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/__init__.py +0 -0
  426. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/agent_lane_recommendation.py +0 -0
  427. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/agent_scope.py +0 -0
  428. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/agent_scope_frontier.py +0 -0
  429. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/capability_gate.py +0 -0
  430. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/identity.py +0 -0
  431. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/legacy_migration.py +0 -0
  432. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/management_projection.py +0 -0
  433. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/material_frontier.py +0 -0
  434. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/material_handoff.py +0 -0
  435. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/multi_agent/__init__.py +0 -0
  436. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/multi_agent/codex_executable.py +0 -0
  437. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/multi_agent/collective_round_ledger.py +0 -0
  438. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/multi_agent/contract.py +0 -0
  439. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/multi_agent/recipe.py +0 -0
  440. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/multi_agent/role_successor.py +0 -0
  441. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/multi_agent/runtime_scripts.py +0 -0
  442. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/multi_agent/visible_launch_policy.py +0 -0
  443. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/multi_agent/visible_wake_scheduler.py +0 -0
  444. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/profile.py +0 -0
  445. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/runtime_model.py +0 -0
  446. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/subagent_activity.py +0 -0
  447. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/supervisor.py +0 -0
  448. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/supervisor_events.py +0 -0
  449. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/supervisor_inject.py +0 -0
  450. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/work_mode.py +0 -0
  451. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/workspace_guard.py +0 -0
  452. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/effect_program.py +0 -0
  453. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/__init__.py +0 -0
  454. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/activation.py +0 -0
  455. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/active_state_event_projection.py +0 -0
  456. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/active_state_metadata.py +0 -0
  457. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/active_state_sections.py +0 -0
  458. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/configure_goal_service.py +0 -0
  459. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/contract_health.py +0 -0
  460. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/dreaming.py +0 -0
  461. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/global_registry_health.py +0 -0
  462. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/global_registry_shadow.py +0 -0
  463. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_channel.py +0 -0
  464. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_channel_projection.py +0 -0
  465. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_frontier/__init__.py +0 -0
  466. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_frontier/ack_policy.py +0 -0
  467. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_frontier/outcome_continuity.py +0 -0
  468. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_frontier/replan_rules.py +0 -0
  469. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_frontier/semantic_history.py +0 -0
  470. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_frontier/terminal.py +0 -0
  471. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_vision.py +0 -0
  472. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_vision_policy.py +0 -0
  473. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_vision_state.py +0 -0
  474. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_vision_wait.py +0 -0
  475. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/path_resolution.py +0 -0
  476. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/start_contract.py +0 -0
  477. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/vision_checkpoint.py +0 -0
  478. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/handoff/__init__.py +0 -0
  479. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/handoff/cross_runtime_impl_review.py +0 -0
  480. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/handoff/delivery_contract.py +0 -0
  481. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/handoff/handoff_runs.py +0 -0
  482. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/handoff/project_handoff.py +0 -0
  483. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/handoff/review_batch.py +0 -0
  484. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/handoff/review_packet_context.py +0 -0
  485. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/heartbeat/agent.py +0 -0
  486. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/heartbeat/budget.py +0 -0
  487. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/heartbeat/builder.py +0 -0
  488. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/heartbeat/host.py +0 -0
  489. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/heartbeat/rules.py +0 -0
  490. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/heartbeat/task_body.py +0 -0
  491. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/heartbeat/visible_goal.py +0 -0
  492. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/projects/__init__.py +0 -0
  493. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/projects/contract.py +0 -0
  494. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/projects/registry.py +0 -0
  495. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/__init__.py +0 -0
  496. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/cli_projection.py +0 -0
  497. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/decision_summary.py +0 -0
  498. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/effect_program.py +0 -0
  499. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/error_codes.py +0 -0
  500. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/heartbeat_receipt.py +0 -0
  501. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/heartbeat_recommendation.py +0 -0
  502. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/host_poll_receipts.py +0 -0
  503. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/live_decision.py +0 -0
  504. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/monitor_poll.py +0 -0
  505. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/policy_constants.py +0 -0
  506. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/projection_repair.py +0 -0
  507. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/recent_runs.py +0 -0
  508. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/scheduler_ack.py +0 -0
  509. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/selected_todo_projection.py +0 -0
  510. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/settlement_cli.py +0 -0
  511. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/settlement_validation.py +0 -0
  512. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/settlement_workspace_causality.py +0 -0
  513. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/should_run.py +0 -0
  514. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/should_run_packet.py +0 -0
  515. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/should_run_prepare.py +0 -0
  516. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/slot_accounting.py +0 -0
  517. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/spend_sources.py +0 -0
  518. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/stall_repair.py +0 -0
  519. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/states.py +0 -0
  520. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/task_orchestration.py +0 -0
  521. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/task_orchestration_admission.py +0 -0
  522. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/turn_envelope.py +0 -0
  523. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/usage_collector.py +0 -0
  524. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/usage_summary.py +0 -0
  525. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/reward_memory.py +0 -0
  526. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/__init__.py +0 -0
  527. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/agent_scoped_evidence_log.py +0 -0
  528. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/decision_freshness.py +0 -0
  529. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/event_ledger.py +0 -0
  530. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/event_store_migration_bridge.py +0 -0
  531. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/goal_project_route.py +0 -0
  532. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/local_state_write_correctness.py +0 -0
  533. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/promotion_readiness.py +0 -0
  534. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/public_safety.py +0 -0
  535. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/run_artifacts.py +0 -0
  536. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/run_compaction.py +0 -0
  537. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/run_context_retention.py +0 -0
  538. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/run_history.py +0 -0
  539. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/run_index_duplicates.py +0 -0
  540. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/run_index_rebuild.py +0 -0
  541. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/runtime_projection_route.py +0 -0
  542. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/runtime_projection_writer.py +0 -0
  543. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/session_runtime.py +0 -0
  544. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/shared_runtime_material_projection.py +0 -0
  545. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/shared_runtime_refresh_projection.py +0 -0
  546. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/stale_latest_run.py +0 -0
  547. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/status_classifications.py +0 -0
  548. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/status_projection_cache.py +0 -0
  549. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/stride_observation.py +0 -0
  550. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/time.py +0 -0
  551. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/trajectory_hygiene.py +0 -0
  552. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/validation_command.py +0 -0
  553. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/__init__.py +0 -0
  554. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/ack.py +0 -0
  555. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/arbitration.py +0 -0
  556. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/automation_liveness.py +0 -0
  557. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/execution_context.py +0 -0
  558. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/external_evidence_observation.py +0 -0
  559. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/monitor_display.py +0 -0
  560. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/monitor_poll_policy.py +0 -0
  561. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/monitor_poll_writeback.py +0 -0
  562. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/monitor_target.py +0 -0
  563. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/monitor_todo.py +0 -0
  564. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/monitor_wait.py +0 -0
  565. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/scheduler_hint.py +0 -0
  566. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/state.py +0 -0
  567. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/state_transition_rules.py +0 -0
  568. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/time.py +0 -0
  569. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/settlement_driver.py +0 -0
  570. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/__init__.py +0 -0
  571. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/active_state_projection.py +0 -0
  572. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/agent_lane_projection.py +0 -0
  573. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/attention_projection.py +0 -0
  574. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/autonomous_replan_projection.py +0 -0
  575. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/collection.py +0 -0
  576. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/contract_projection.py +0 -0
  577. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/dreaming_projection.py +0 -0
  578. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/goal_attention_projection.py +0 -0
  579. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/lifecycle_projection.py +0 -0
  580. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/monitor_display_projection.py +0 -0
  581. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/registry_health_projection.py +0 -0
  582. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/run_projection.py +0 -0
  583. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/runtime_summaries.py +0 -0
  584. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/__init__.py +0 -0
  585. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/actual_default_model_behavior_portfolio.py +0 -0
  586. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/canary_harness.py +0 -0
  587. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/capability_monitor_repair_tool_behavior.py +0 -0
  588. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/cli_output_budget.py +0 -0
  589. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/cli_output_differential.py +0 -0
  590. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/cli_output_semantics.py +0 -0
  591. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/control_plane_composition_scenarios.py +0 -0
  592. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/decision_replay.py +0 -0
  593. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/doubao_model_behavior_actor.py +0 -0
  594. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/model_behavior_corpus.py +0 -0
  595. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/model_behavior_qualification.py +0 -0
  596. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/model_behavior_retained_cases.py +0 -0
  597. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/model_tool_behavior.py +0 -0
  598. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/onboarding_model_behavior_qualification.py +0 -0
  599. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/quota_fixtures.py +0 -0
  600. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/quota_should_run_parity.py +0 -0
  601. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/release_commit_qualification.py +0 -0
  602. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/replan_semantic_action_behavior.py +0 -0
  603. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/scoped_gate_successor_tool_behavior.py +0 -0
  604. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/selected_todo_tool_behavior.py +0 -0
  605. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/terminal_settlement_tool_behavior.py +0 -0
  606. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/__init__.py +0 -0
  607. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/active_state_editing.py +0 -0
  608. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/active_state_todo_parser.py +0 -0
  609. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/active_state_todos.py +0 -0
  610. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/addition.py +0 -0
  611. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/claim_visibility.py +0 -0
  612. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/completed_archive.py +0 -0
  613. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/completion_fence.py +0 -0
  614. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/completion_policy.py +0 -0
  615. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/completion_state.py +0 -0
  616. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/completion_validation.py +0 -0
  617. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/completion_validation_accountability.py +0 -0
  618. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/completion_validation_projection.py +0 -0
  619. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/contract.py +0 -0
  620. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/decision_scope.py +0 -0
  621. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/deferred_resume.py +0 -0
  622. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/durable_completion.py +0 -0
  623. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/event_writeback.py +0 -0
  624. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/frontier_deadline.py +0 -0
  625. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/handoff_gate.py +0 -0
  626. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/handoff_mode.py +0 -0
  627. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/handoff_note.py +0 -0
  628. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/line_update.py +0 -0
  629. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/list_projection.py +0 -0
  630. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/markdown.py +0 -0
  631. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/monitor_metadata.py +0 -0
  632. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/mutation_authority.py +0 -0
  633. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/projection.py +0 -0
  634. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/quota_summary.py +0 -0
  635. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/route_continuation.py +0 -0
  636. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/succession_warning.py +0 -0
  637. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/summary_item.py +0 -0
  638. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/text.py +0 -0
  639. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/todo_index.py +0 -0
  640. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/todo_summary.py +0 -0
  641. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/unblock_resume.py +0 -0
  642. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/user_gate.py +0 -0
  643. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/write_hint.py +0 -0
  644. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/write_policy.py +0 -0
  645. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/turn_driver/__init__.py +0 -0
  646. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/turn_driver/codex_cli.py +0 -0
  647. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/turn_driver/driver.py +0 -0
  648. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/turn_driver/executor.py +0 -0
  649. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/turn_driver/loop_controller.py +0 -0
  650. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/turn_driver/session_recovery.py +0 -0
  651. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/turn_driver/settlement.py +0 -0
  652. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/turn_driver/transaction.py +0 -0
  653. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/__init__.py +0 -0
  654. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/attention_fields.py +0 -0
  655. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/attention_item.py +0 -0
  656. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/attention_queue.py +0 -0
  657. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/attention_routing.py +0 -0
  658. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/autonomous_candidates.py +0 -0
  659. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/autonomous_replan_ack.py +0 -0
  660. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/autonomous_replan_obligation.py +0 -0
  661. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/backlog_hygiene.py +0 -0
  662. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/capability_monitor_fallback.py +0 -0
  663. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/delivery_batch_scale.py +0 -0
  664. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/delivery_outcome.py +0 -0
  665. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/delivery_signals.py +0 -0
  666. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/execution_obligation.py +0 -0
  667. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/goal_route_hint.py +0 -0
  668. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/interaction_contract.py +0 -0
  669. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/issue_meta_surface.py +0 -0
  670. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/lifecycle.py +0 -0
  671. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/operator_inbox.py +0 -0
  672. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/outcome_followthrough.py +0 -0
  673. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/primary_action.py +0 -0
  674. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/progress_observation.py +0 -0
  675. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/project_asset.py +0 -0
  676. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/repair_delta.py +0 -0
  677. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/runtime_capability_reentry.py +0 -0
  678. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/status_contract.py +0 -0
  679. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/task_graph.py +0 -0
  680. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/task_lease.py +0 -0
  681. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/task_lease_settlement.py +0 -0
  682. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/work_lane.py +0 -0
  683. {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/work_lane_context.py +0 -0
  684. {loopx-0.5.0 → loopx-0.5.1}/loopx/dash_server.py +0 -0
  685. {loopx-0.5.0 → loopx-0.5.1}/loopx/demo.py +0 -0
  686. {loopx-0.5.0 → loopx-0.5.1}/loopx/diagnose.py +0 -0
  687. {loopx-0.5.0 → loopx-0.5.1}/loopx/doctor.py +0 -0
  688. {loopx-0.5.0 → loopx-0.5.1}/loopx/domain_packs/__init__.py +0 -0
  689. {loopx-0.5.0 → loopx-0.5.1}/loopx/domain_packs/issue_fix.py +0 -0
  690. {loopx-0.5.0 → loopx-0.5.1}/loopx/domain_packs/ml_experiment.py +0 -0
  691. {loopx-0.5.0 → loopx-0.5.1}/loopx/domain_state.py +0 -0
  692. {loopx-0.5.0 → loopx-0.5.1}/loopx/dreaming.py +0 -0
  693. {loopx-0.5.0 → loopx-0.5.1}/loopx/entrypoint.py +0 -0
  694. {loopx-0.5.0 → loopx-0.5.1}/loopx/execution_profile.py +0 -0
  695. {loopx-0.5.0 → loopx-0.5.1}/loopx/experiments/README.md +0 -0
  696. {loopx-0.5.0 → loopx-0.5.1}/loopx/experiments/__init__.py +0 -0
  697. {loopx-0.5.0 → loopx-0.5.1}/loopx/experiments/planner_worker/__init__.py +0 -0
  698. {loopx-0.5.0 → loopx-0.5.1}/loopx/experiments/planner_worker/contract.py +0 -0
  699. {loopx-0.5.0 → loopx-0.5.1}/loopx/experiments/planner_worker/runtime.py +0 -0
  700. {loopx-0.5.0 → loopx-0.5.1}/loopx/experiments/planner_worker/traex.py +0 -0
  701. {loopx-0.5.0 → loopx-0.5.1}/loopx/explore_graph.py +0 -0
  702. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/__init__.py +0 -0
  703. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/bundled.py +0 -0
  704. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/capability_admission.py +0 -0
  705. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/execution_envelope.py +0 -0
  706. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/README.md +0 -0
  707. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/__init__.py +0 -0
  708. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/app_setup.py +0 -0
  709. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/cli_resolution.py +0 -0
  710. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/event_collector.py +0 -0
  711. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/event_collector_runtime.py +0 -0
  712. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/event_inbox.py +0 -0
  713. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/extension.toml +0 -0
  714. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/goal_channel.py +0 -0
  715. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/goal_channel_contracts.py +0 -0
  716. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/goal_channel_lifecycle.py +0 -0
  717. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/goal_channel_notification.py +0 -0
  718. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/goal_channel_runtime.py +0 -0
  719. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/goal_channel_setup.py +0 -0
  720. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/goal_channel_targets.py +0 -0
  721. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/goal_channel_transport.py +0 -0
  722. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/inbox_reactions.py +0 -0
  723. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/__init__.py +0 -0
  724. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/explore_results.py +0 -0
  725. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/explore_singleflight.py +0 -0
  726. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/explore_source_guard.py +0 -0
  727. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/explore_stage_document.py +0 -0
  728. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/explore_visual_integrity.py +0 -0
  729. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/explore_visual_readback.py +0 -0
  730. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/explore_visual_styles.py +0 -0
  731. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/issue_fix_surface.py +0 -0
  732. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/kanban.py +0 -0
  733. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/message_card.py +0 -0
  734. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/periodic_report.py +0 -0
  735. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/projection_rows.py +0 -0
  736. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/record_io.py +0 -0
  737. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/sync_receipt.py +0 -0
  738. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/private_json.py +0 -0
  739. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/provider.py +0 -0
  740. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/reviewer_notification.py +0 -0
  741. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/manifest.py +0 -0
  742. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/openviking_periodic_report/__init__.py +0 -0
  743. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/openviking_periodic_report/activation.py +0 -0
  744. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/openviking_periodic_report/extension.toml +0 -0
  745. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/openviking_periodic_report/provider.py +0 -0
  746. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/openviking_periodic_report/sink.py +0 -0
  747. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/openviking_semantic_preference/__init__.py +0 -0
  748. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/openviking_semantic_preference/extension.toml +0 -0
  749. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/openviking_semantic_preference/history_export.py +0 -0
  750. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/openviking_semantic_preference/project_peer.py +0 -0
  751. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/openviking_semantic_preference/provider.py +0 -0
  752. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/presentation.py +0 -0
  753. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/process_runtime.py +0 -0
  754. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/readiness.py +0 -0
  755. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/runtime.py +0 -0
  756. {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/scaffold.py +0 -0
  757. {loopx-0.5.0 → loopx-0.5.1}/loopx/feedback.py +0 -0
  758. {loopx-0.5.0 → loopx-0.5.1}/loopx/file_lock.py +0 -0
  759. {loopx-0.5.0 → loopx-0.5.1}/loopx/global_registry.py +0 -0
  760. {loopx-0.5.0 → loopx-0.5.1}/loopx/global_risks.py +0 -0
  761. {loopx-0.5.0 → loopx-0.5.1}/loopx/global_todos.py +0 -0
  762. {loopx-0.5.0 → loopx-0.5.1}/loopx/goal_mode_context.py +0 -0
  763. {loopx-0.5.0 → loopx-0.5.1}/loopx/goal_mode_mcp.py +0 -0
  764. {loopx-0.5.0 → loopx-0.5.1}/loopx/handoff_budget.py +0 -0
  765. {loopx-0.5.0 → loopx-0.5.1}/loopx/heartbeat_prequota.py +0 -0
  766. {loopx-0.5.0 → loopx-0.5.1}/loopx/heartbeat_prompt.py +0 -0
  767. {loopx-0.5.0 → loopx-0.5.1}/loopx/help_surface.py +0 -0
  768. {loopx-0.5.0 → loopx-0.5.1}/loopx/history.py +0 -0
  769. {loopx-0.5.0 → loopx-0.5.1}/loopx/host_mode_planner.py +0 -0
  770. {loopx-0.5.0 → loopx-0.5.1}/loopx/install_contract.py +0 -0
  771. {loopx-0.5.0 → loopx-0.5.1}/loopx/interface_budget.py +0 -0
  772. {loopx-0.5.0 → loopx-0.5.1}/loopx/kunluncode_goal_mode/README.md +0 -0
  773. {loopx-0.5.0 → loopx-0.5.1}/loopx/kunluncode_goal_mode/__init__.py +0 -0
  774. {loopx-0.5.0 → loopx-0.5.1}/loopx/kunluncode_goal_mode/app_server.py +0 -0
  775. {loopx-0.5.0 → loopx-0.5.1}/loopx/kunluncode_goal_mode/cli.py +0 -0
  776. {loopx-0.5.0 → loopx-0.5.1}/loopx/kunluncode_goal_mode/context.py +0 -0
  777. {loopx-0.5.0 → loopx-0.5.1}/loopx/kunluncode_goal_mode/control_plane.py +0 -0
  778. {loopx-0.5.0 → loopx-0.5.1}/loopx/kunluncode_goal_mode/guards.py +0 -0
  779. {loopx-0.5.0 → loopx-0.5.1}/loopx/kunluncode_goal_mode/runtime.py +0 -0
  780. {loopx-0.5.0 → loopx-0.5.1}/loopx/kunluncode_goal_mode/server.py +0 -0
  781. {loopx-0.5.0 → loopx-0.5.1}/loopx/long_task_cadence.py +0 -0
  782. {loopx-0.5.0 → loopx-0.5.1}/loopx/materials.py +0 -0
  783. {loopx-0.5.0 → loopx-0.5.1}/loopx/ml_experiment.py +0 -0
  784. {loopx-0.5.0 → loopx-0.5.1}/loopx/onboarding.py +0 -0
  785. {loopx-0.5.0 → loopx-0.5.1}/loopx/opencode2_goal_mode/README.md +0 -0
  786. {loopx-0.5.0 → loopx-0.5.1}/loopx/opencode2_goal_mode/__init__.py +0 -0
  787. {loopx-0.5.0 → loopx-0.5.1}/loopx/opencode2_goal_mode/opencode2-goal-worker.mjs +0 -0
  788. {loopx-0.5.0 → loopx-0.5.1}/loopx/opencode_goal_mode/README.md +0 -0
  789. {loopx-0.5.0 → loopx-0.5.1}/loopx/opencode_goal_mode/__init__.py +0 -0
  790. {loopx-0.5.0 → loopx-0.5.1}/loopx/opencode_goal_mode/goal-bridge-runtime.mjs +0 -0
  791. {loopx-0.5.0 → loopx-0.5.1}/loopx/opencode_goal_mode/loopx-goal.js +0 -0
  792. {loopx-0.5.0 → loopx-0.5.1}/loopx/operator_gate.py +0 -0
  793. {loopx-0.5.0 → loopx-0.5.1}/loopx/orchestration.py +0 -0
  794. {loopx-0.5.0 → loopx-0.5.1}/loopx/paths.py +0 -0
  795. {loopx-0.5.0 → loopx-0.5.1}/loopx/pi_goal_mode/__init__.py +0 -0
  796. {loopx-0.5.0 → loopx-0.5.1}/loopx/pr_review.py +0 -0
  797. {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/README.md +0 -0
  798. {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/__init__.py +0 -0
  799. {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/explore_views.py +0 -0
  800. {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/markdown.py +0 -0
  801. {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/projection_source_reconcile.py +0 -0
  802. {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/projections/__init__.py +0 -0
  803. {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/projections/session_dash.py +0 -0
  804. {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/public_safety.py +0 -0
  805. {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/renderers/__init__.py +0 -0
  806. {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/renderers/goal_channel_html.py +0 -0
  807. {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/renderers/periodic_report_html.py +0 -0
  808. {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/renderers/periodic_report_markdown.py +0 -0
  809. {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/renderers/quota_event_markdown.py +0 -0
  810. {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/renderers/quota_markdown.py +0 -0
  811. {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/renderers/session_dash_html.py +0 -0
  812. {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/renderers/status_markdown.py +0 -0
  813. {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/renderers/trajectory_hygiene_markdown.py +0 -0
  814. {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/renderers/turn_envelope_markdown.py +0 -0
  815. {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/sinks/__init__.py +0 -0
  816. {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/sinks/openviking_periodic_report.py +0 -0
  817. {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/static_site.py +0 -0
  818. {loopx-0.5.0 → loopx-0.5.1}/loopx/presets.py +0 -0
  819. {loopx-0.5.0 → loopx-0.5.1}/loopx/project_alias.py +0 -0
  820. {loopx-0.5.0 → loopx-0.5.1}/loopx/project_map.py +0 -0
  821. {loopx-0.5.0 → loopx-0.5.1}/loopx/project_prompt.py +0 -0
  822. {loopx-0.5.0 → loopx-0.5.1}/loopx/project_uninstall.py +0 -0
  823. {loopx-0.5.0 → loopx-0.5.1}/loopx/promotion_gate.py +0 -0
  824. {loopx-0.5.0 → loopx-0.5.1}/loopx/quota.py +0 -0
  825. {loopx-0.5.0 → loopx-0.5.1}/loopx/ready_score.py +0 -0
  826. {loopx-0.5.0 → loopx-0.5.1}/loopx/registry.py +0 -0
  827. {loopx-0.5.0 → loopx-0.5.1}/loopx/registry_writability.py +0 -0
  828. {loopx-0.5.0 → loopx-0.5.1}/loopx/release_candidate.py +0 -0
  829. {loopx-0.5.0 → loopx-0.5.1}/loopx/release_manifest.py +0 -0
  830. {loopx-0.5.0 → loopx-0.5.1}/loopx/repository_identity.py +0 -0
  831. {loopx-0.5.0 → loopx-0.5.1}/loopx/review_packet.py +0 -0
  832. {loopx-0.5.0 → loopx-0.5.1}/loopx/rollout_event_log.py +0 -0
  833. {loopx-0.5.0 → loopx-0.5.1}/loopx/runtime.py +0 -0
  834. {loopx-0.5.0 → loopx-0.5.1}/loopx/self_update.py +0 -0
  835. {loopx-0.5.0 → loopx-0.5.1}/loopx/session_runtime.py +0 -0
  836. {loopx-0.5.0 → loopx-0.5.1}/loopx/skill_install_readback.py +0 -0
  837. {loopx-0.5.0 → loopx-0.5.1}/loopx/slash_command_install.py +0 -0
  838. {loopx-0.5.0 → loopx-0.5.1}/loopx/slash_commands.py +0 -0
  839. {loopx-0.5.0 → loopx-0.5.1}/loopx/state_backup.py +0 -0
  840. {loopx-0.5.0 → loopx-0.5.1}/loopx/state_migration.py +0 -0
  841. {loopx-0.5.0 → loopx-0.5.1}/loopx/state_projection.py +0 -0
  842. {loopx-0.5.0 → loopx-0.5.1}/loopx/status.py +0 -0
  843. {loopx-0.5.0 → loopx-0.5.1}/loopx/status_server.py +0 -0
  844. {loopx-0.5.0 → loopx-0.5.1}/loopx/summary_all.py +0 -0
  845. {loopx-0.5.0 → loopx-0.5.1}/loopx/thread_agent_binding.py +0 -0
  846. {loopx-0.5.0 → loopx-0.5.1}/loopx/todo_followups.py +0 -0
  847. {loopx-0.5.0 → loopx-0.5.1}/loopx/todo_suggestion_prompt.py +0 -0
  848. {loopx-0.5.0 → loopx-0.5.1}/loopx/todos.py +0 -0
  849. {loopx-0.5.0 → loopx-0.5.1}/loopx/turn_identity.py +0 -0
  850. {loopx-0.5.0 → loopx-0.5.1}/loopx/upgrade.py +0 -0
  851. {loopx-0.5.0 → loopx-0.5.1}/loopx/visible_governance.py +0 -0
  852. {loopx-0.5.0 → loopx-0.5.1}/loopx/visible_multi_agent_launcher.py +0 -0
  853. {loopx-0.5.0 → loopx-0.5.1}/loopx/visible_multi_agent_tmux.py +0 -0
  854. {loopx-0.5.0 → loopx-0.5.1}/loopx/web/chat/manifest.webmanifest +0 -0
  855. {loopx-0.5.0 → loopx-0.5.1}/loopx/web/chat/pwa/icon-192.png +0 -0
  856. {loopx-0.5.0 → loopx-0.5.1}/loopx/web/chat/pwa/icon-512.png +0 -0
  857. {loopx-0.5.0 → loopx-0.5.1}/loopx/windows_install.py +0 -0
  858. {loopx-0.5.0 → loopx-0.5.1}/loopx/worker_bridge.py +0 -0
  859. {loopx-0.5.0 → loopx-0.5.1}/loopx/workflow_skill_install.py +0 -0
  860. {loopx-0.5.0 → loopx-0.5.1}/loopx.egg-info/dependency_links.txt +0 -0
  861. {loopx-0.5.0 → loopx-0.5.1}/loopx.egg-info/entry_points.txt +0 -0
  862. {loopx-0.5.0 → loopx-0.5.1}/loopx.egg-info/requires.txt +0 -0
  863. {loopx-0.5.0 → loopx-0.5.1}/loopx.egg-info/top_level.txt +0 -0
  864. {loopx-0.5.0 → loopx-0.5.1}/setup.cfg +0 -0
  865. {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-doc-registry/SKILL.md +0 -0
  866. {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-doc-registry/agents/openai.yaml +0 -0
  867. {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-pr-program/SKILL.md +0 -0
  868. {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-pr-program/agents/openai.yaml +0 -0
  869. {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-pr-program/references/snapshot-contract.md +0 -0
  870. {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-pr-program/scripts/diff_snapshot.py +0 -0
  871. {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-pr-review/SKILL.md +0 -0
  872. {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-pr-review/agents/openai.yaml +0 -0
  873. {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-project/SKILL.md +0 -0
  874. {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-project/agents/openai.yaml +0 -0
  875. {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-self-repair/SKILL.md +0 -0
  876. {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-self-repair/agents/openai.yaml +0 -0
  877. {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-self-repair/references/upstream-issue-escalation.md +0 -0
  878. {loopx-0.5.0 → loopx-0.5.1}/tests/test_agent_onboarding_pi_host.py +0 -0
  879. {loopx-0.5.0 → loopx-0.5.1}/tests/test_agent_onboarding_unconnected_project.py +0 -0
  880. {loopx-0.5.0 → loopx-0.5.1}/tests/test_ark_managed_agent_host.py +0 -0
  881. {loopx-0.5.0 → loopx-0.5.1}/tests/test_ark_managed_agent_issue_fix_matrix.py +0 -0
  882. {loopx-0.5.0 → loopx-0.5.1}/tests/test_auto_research_control.py +0 -0
  883. {loopx-0.5.0 → loopx-0.5.1}/tests/test_chat_image_attachments.py +0 -0
  884. {loopx-0.5.0 → loopx-0.5.1}/tests/test_chat_server_cors.py +0 -0
  885. {loopx-0.5.0 → loopx-0.5.1}/tests/test_cli_argument_diagnostics.py +0 -0
  886. {loopx-0.5.0 → loopx-0.5.1}/tests/test_cli_entrypoint.py +0 -0
  887. {loopx-0.5.0 → loopx-0.5.1}/tests/test_codex_app_apply_rrule.py +0 -0
  888. {loopx-0.5.0 → loopx-0.5.1}/tests/test_command_invocation.py +0 -0
  889. {loopx-0.5.0 → loopx-0.5.1}/tests/test_content_ops_item_lifecycle.py +0 -0
  890. {loopx-0.5.0 → loopx-0.5.1}/tests/test_content_ops_lifecycle.py +0 -0
  891. {loopx-0.5.0 → loopx-0.5.1}/tests/test_content_ops_queue_status.py +0 -0
  892. {loopx-0.5.0 → loopx-0.5.1}/tests/test_contract_credential_pattern_precision.py +0 -0
  893. {loopx-0.5.0 → loopx-0.5.1}/tests/test_contract_scan_unreadable_files.py +0 -0
  894. {loopx-0.5.0 → loopx-0.5.1}/tests/test_decision_context_material.py +0 -0
  895. {loopx-0.5.0 → loopx-0.5.1}/tests/test_dependency_security_boundaries.py +0 -0
  896. {loopx-0.5.0 → loopx-0.5.1}/tests/test_doctor_install_freshness.py +0 -0
  897. {loopx-0.5.0 → loopx-0.5.1}/tests/test_explore_counterfactual_runtime.py +0 -0
  898. {loopx-0.5.0 → loopx-0.5.1}/tests/test_explore_episode_runtime.py +0 -0
  899. {loopx-0.5.0 → loopx-0.5.1}/tests/test_explore_monitor_lane_budget.py +0 -0
  900. {loopx-0.5.0 → loopx-0.5.1}/tests/test_explore_owner_board_views.py +0 -0
  901. {loopx-0.5.0 → loopx-0.5.1}/tests/test_explore_presentation_views.py +0 -0
  902. {loopx-0.5.0 → loopx-0.5.1}/tests/test_explore_replay_compatibility.py +0 -0
  903. {loopx-0.5.0 → loopx-0.5.1}/tests/test_explore_replay_runtime.py +0 -0
  904. {loopx-0.5.0 → loopx-0.5.1}/tests/test_explore_resource_portfolio.py +0 -0
  905. {loopx-0.5.0 → loopx-0.5.1}/tests/test_explore_router_acceptance.py +0 -0
  906. {loopx-0.5.0 → loopx-0.5.1}/tests/test_explore_source_history_reconcile.py +0 -0
  907. {loopx-0.5.0 → loopx-0.5.1}/tests/test_explore_worker_topic_affinity.py +0 -0
  908. {loopx-0.5.0 → loopx-0.5.1}/tests/test_external_scheduler_worker.py +0 -0
  909. {loopx-0.5.0 → loopx-0.5.1}/tests/test_feedback_goal_id_validation.py +0 -0
  910. {loopx-0.5.0 → loopx-0.5.1}/tests/test_file_lock.py +0 -0
  911. {loopx-0.5.0 → loopx-0.5.1}/tests/test_file_lock_cross_process.py +0 -0
  912. {loopx-0.5.0 → loopx-0.5.1}/tests/test_gemini_cursor_host_surfaces.py +0 -0
  913. {loopx-0.5.0 → loopx-0.5.1}/tests/test_global_registry_write_serialization.py +0 -0
  914. {loopx-0.5.0 → loopx-0.5.1}/tests/test_global_risks.py +0 -0
  915. {loopx-0.5.0 → loopx-0.5.1}/tests/test_global_todos.py +0 -0
  916. {loopx-0.5.0 → loopx-0.5.1}/tests/test_history_chronology.py +0 -0
  917. {loopx-0.5.0 → loopx-0.5.1}/tests/test_host_mode_planner.py +0 -0
  918. {loopx-0.5.0 → loopx-0.5.1}/tests/test_host_parity_smoke.py +0 -0
  919. {loopx-0.5.0 → loopx-0.5.1}/tests/test_host_poll_receipts.py +0 -0
  920. {loopx-0.5.0 → loopx-0.5.1}/tests/test_kunluncode_goal_mode.py +0 -0
  921. {loopx-0.5.0 → loopx-0.5.1}/tests/test_loop_turn_loop_controller.py +0 -0
  922. {loopx-0.5.0 → loopx-0.5.1}/tests/test_loopx_turn_codex_cli.py +0 -0
  923. {loopx-0.5.0 → loopx-0.5.1}/tests/test_loopx_turn_driver.py +0 -0
  924. {loopx-0.5.0 → loopx-0.5.1}/tests/test_loopx_turn_executor.py +0 -0
  925. {loopx-0.5.0 → loopx-0.5.1}/tests/test_loopx_turn_journal_inspection.py +0 -0
  926. {loopx-0.5.0 → loopx-0.5.1}/tests/test_loopx_turn_settlement_parity.py +0 -0
  927. {loopx-0.5.0 → loopx-0.5.1}/tests/test_loopx_turn_transaction.py +0 -0
  928. {loopx-0.5.0 → loopx-0.5.1}/tests/test_ml_experiment_volc_packet.py +0 -0
  929. {loopx-0.5.0 → loopx-0.5.1}/tests/test_nokv_shadow_provider_probes.py +0 -0
  930. {loopx-0.5.0 → loopx-0.5.1}/tests/test_opencode2_goal_worker.py +0 -0
  931. {loopx-0.5.0 → loopx-0.5.1}/tests/test_opencode2_goal_worker_cli.py +0 -0
  932. {loopx-0.5.0 → loopx-0.5.1}/tests/test_opencode_goal_bridge.py +0 -0
  933. {loopx-0.5.0 → loopx-0.5.1}/tests/test_operator_markdown_renderers.py +0 -0
  934. {loopx-0.5.0 → loopx-0.5.1}/tests/test_packaged_skill_metadata.py +0 -0
  935. {loopx-0.5.0 → loopx-0.5.1}/tests/test_pr_program_snapshot.py +0 -0
  936. {loopx-0.5.0 → loopx-0.5.1}/tests/test_pr_program_snapshot_diff.py +0 -0
  937. {loopx-0.5.0 → loopx-0.5.1}/tests/test_pr_review_github_scan.py +0 -0
  938. {loopx-0.5.0 → loopx-0.5.1}/tests/test_project_skill_cli.py +0 -0
  939. {loopx-0.5.0 → loopx-0.5.1}/tests/test_register_agent_fresh_identity.py +0 -0
  940. {loopx-0.5.0 → loopx-0.5.1}/tests/test_release_smoke_archive_helpers.py +0 -0
  941. {loopx-0.5.0 → loopx-0.5.1}/tests/test_reward_memory_pipeline.py +0 -0
  942. {loopx-0.5.0 → loopx-0.5.1}/tests/test_self_update_runtime_activation.py +0 -0
  943. {loopx-0.5.0 → loopx-0.5.1}/tests/test_skill_delivery_parity.py +0 -0
  944. {loopx-0.5.0 → loopx-0.5.1}/tests/test_smoke_suite.py +0 -0
  945. {loopx-0.5.0 → loopx-0.5.1}/tests/test_state_file_containment.py +0 -0
  946. {loopx-0.5.0 → loopx-0.5.1}/tests/test_state_refresh_projections.py +0 -0
  947. {loopx-0.5.0 → loopx-0.5.1}/tests/test_static_site_presentation.py +0 -0
  948. {loopx-0.5.0 → loopx-0.5.1}/tests/test_status_server_cors.py +0 -0
  949. {loopx-0.5.0 → loopx-0.5.1}/tests/test_status_server_extension_projection.py +0 -0
  950. {loopx-0.5.0 → loopx-0.5.1}/tests/test_status_server_fast_path.py +0 -0
  951. {loopx-0.5.0 → loopx-0.5.1}/tests/test_summary_all.py +0 -0
  952. {loopx-0.5.0 → loopx-0.5.1}/tests/test_thread_agent_binding.py +0 -0
  953. {loopx-0.5.0 → loopx-0.5.1}/tests/test_trajectory_hygiene.py +0 -0
  954. {loopx-0.5.0 → loopx-0.5.1}/tests/test_turn_envelope.py +0 -0
  955. {loopx-0.5.0 → loopx-0.5.1}/tests/test_turn_loop_disposition.py +0 -0
  956. {loopx-0.5.0 → loopx-0.5.1}/tests/test_visible_goal_terminal_settlement.py +0 -0
  957. {loopx-0.5.0 → loopx-0.5.1}/tests/test_windows_install.py +0 -0
  958. {loopx-0.5.0 → loopx-0.5.1}/tests/test_worker_command_validation.py +0 -0
  959. {loopx-0.5.0 → loopx-0.5.1}/tests/test_workflow_skill_install.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: loopx
3
- Version: 0.5.0
3
+ Version: 0.5.1
4
4
  Summary: A lightweight Loop Engineering control plane for long-running agent goals.
5
5
  Author: LoopX contributors
6
6
  License-Expression: Apache-2.0
@@ -68,8 +68,10 @@ to hand off across turns, tools, and agents.
68
68
 
69
69
  ## Meet the Personal Agent Workspace
70
70
 
71
- Turn scattered agent sessions into one local-first workspace for Goals,
72
- attention, conversations, tasks, files, schedules, and recovery.
71
+ Keep long-horizon goals in one local-first workspace. Goals, attention,
72
+ conversations, tasks, files, schedules, and recovery stay durable across days,
73
+ restarts, and harnesses, so work that began last week resumes exactly where
74
+ the last bounded turn stopped instead of living in chat memory.
73
75
 
74
76
  <a href="docs/assets/personal-workspace/loopx-dashboard-launch.mp4">
75
77
  <img src="docs/assets/personal-workspace/loopx-dashboard-tour.webp" alt="Animated tour of the LoopX personal Agent workspace, from one-command launch to Manager overview, Goal task board, protected action preview, and Goal details" width="960">
@@ -100,7 +102,10 @@ npm run dev
100
102
 
101
103
  [Read the desktop shell guide](apps/desktop/loopx-control-plane/README.md).
102
104
  Closing the window stops only the service processes that the shell started;
103
- existing LoopX services and durable Goal state remain intact.
105
+ existing LoopX services and durable Goal state remain intact. Both entry
106
+ points share the same loopback services and can be started in either order:
107
+ `loopx dashboard` reuses an already-running LoopX Chat service instead of
108
+ starting a second one.
104
109
 
105
110
  [Watch the full 32-second walkthrough](docs/assets/personal-workspace/loopx-dashboard-launch.mp4)
106
111
  · [Read the workspace guide](docs/guides/personal-workspace-user-guide.md)
@@ -314,14 +319,16 @@ LoopX should reuse existing state rather than overwrite it. Keep `.loopx/`,
314
319
  | KunlunCode | Run `loopx-kunluncode connect --project . --goal-id <goal-id> --agent-id <registered-agent-id>`, add a bounded todo, then run `loopx-kunluncode run --project .`. | Native Goal Pro through app-server; LoopX writes completion and quota only after strict verification |
315
320
  | OpenCode | Install the static command facade; opt in to `--with-goal-bridge` for recurring goals. | OpenCode command facade and explicit goal bridge |
316
321
  | Pi | Install the opt-in goal extension with `loopx slash-commands --install --surface pi`, then use `/loopx <task>` from a trusted Pi session. | Visible Pi goal extension gated by LoopX quota (`loopx_goal_activate` + `agent_settled` continuation) |
322
+ | DeepSeek Harness (dsh) | Install `loopx[deepseek-harness]`, prepare a dsh `cordis.yml`, then use the [dsh goal-mode adapter](loopx/dsh_goal_mode/README.md) with `loopx turn run-once`. | Headless dsh segments through LoopX Turn, each tick gated by `quota should-run` |
317
323
  | Cursor, shell, or custom runner | Use the installer and `loopx doctor`; connect manually or call LoopX from your runner. | Your shell, scheduler, or runner |
318
324
 
319
325
  The exact, copy-ready setup messages and host recovery paths live in
320
326
  [Getting Started](docs/guides/getting-started.md). Host integrations can inspect
321
327
  the [Codex App host command registry contract](docs/reference/protocols/codex-app-host-command-registry-v0.md),
322
328
  the [Codex CLI packaged install path](docs/product/runtimes/codex-cli/codex-cli-packaged-install.md),
323
- the [Claude Code adapter](loopx/claude_goal_mode/README.md), or the
324
- [KunlunCode native Goal adapter](loopx/kunluncode_goal_mode/README.md).
329
+ the [Claude Code adapter](loopx/claude_goal_mode/README.md), the
330
+ [KunlunCode native Goal adapter](loopx/kunluncode_goal_mode/README.md), or the
331
+ [DeepSeek Harness turn adapter](loopx/dsh_goal_mode/README.md).
325
332
 
326
333
  For custom runners, start with the
327
334
  [minimal custom runtime example](docs/guides/minimal-custom-runtime-example.md)
@@ -39,8 +39,10 @@ to hand off across turns, tools, and agents.
39
39
 
40
40
  ## Meet the Personal Agent Workspace
41
41
 
42
- Turn scattered agent sessions into one local-first workspace for Goals,
43
- attention, conversations, tasks, files, schedules, and recovery.
42
+ Keep long-horizon goals in one local-first workspace. Goals, attention,
43
+ conversations, tasks, files, schedules, and recovery stay durable across days,
44
+ restarts, and harnesses, so work that began last week resumes exactly where
45
+ the last bounded turn stopped instead of living in chat memory.
44
46
 
45
47
  <a href="docs/assets/personal-workspace/loopx-dashboard-launch.mp4">
46
48
  <img src="docs/assets/personal-workspace/loopx-dashboard-tour.webp" alt="Animated tour of the LoopX personal Agent workspace, from one-command launch to Manager overview, Goal task board, protected action preview, and Goal details" width="960">
@@ -71,7 +73,10 @@ npm run dev
71
73
 
72
74
  [Read the desktop shell guide](apps/desktop/loopx-control-plane/README.md).
73
75
  Closing the window stops only the service processes that the shell started;
74
- existing LoopX services and durable Goal state remain intact.
76
+ existing LoopX services and durable Goal state remain intact. Both entry
77
+ points share the same loopback services and can be started in either order:
78
+ `loopx dashboard` reuses an already-running LoopX Chat service instead of
79
+ starting a second one.
75
80
 
76
81
  [Watch the full 32-second walkthrough](docs/assets/personal-workspace/loopx-dashboard-launch.mp4)
77
82
  · [Read the workspace guide](docs/guides/personal-workspace-user-guide.md)
@@ -285,14 +290,16 @@ LoopX should reuse existing state rather than overwrite it. Keep `.loopx/`,
285
290
  | KunlunCode | Run `loopx-kunluncode connect --project . --goal-id <goal-id> --agent-id <registered-agent-id>`, add a bounded todo, then run `loopx-kunluncode run --project .`. | Native Goal Pro through app-server; LoopX writes completion and quota only after strict verification |
286
291
  | OpenCode | Install the static command facade; opt in to `--with-goal-bridge` for recurring goals. | OpenCode command facade and explicit goal bridge |
287
292
  | Pi | Install the opt-in goal extension with `loopx slash-commands --install --surface pi`, then use `/loopx <task>` from a trusted Pi session. | Visible Pi goal extension gated by LoopX quota (`loopx_goal_activate` + `agent_settled` continuation) |
293
+ | DeepSeek Harness (dsh) | Install `loopx[deepseek-harness]`, prepare a dsh `cordis.yml`, then use the [dsh goal-mode adapter](loopx/dsh_goal_mode/README.md) with `loopx turn run-once`. | Headless dsh segments through LoopX Turn, each tick gated by `quota should-run` |
288
294
  | Cursor, shell, or custom runner | Use the installer and `loopx doctor`; connect manually or call LoopX from your runner. | Your shell, scheduler, or runner |
289
295
 
290
296
  The exact, copy-ready setup messages and host recovery paths live in
291
297
  [Getting Started](docs/guides/getting-started.md). Host integrations can inspect
292
298
  the [Codex App host command registry contract](docs/reference/protocols/codex-app-host-command-registry-v0.md),
293
299
  the [Codex CLI packaged install path](docs/product/runtimes/codex-cli/codex-cli-packaged-install.md),
294
- the [Claude Code adapter](loopx/claude_goal_mode/README.md), or the
295
- [KunlunCode native Goal adapter](loopx/kunluncode_goal_mode/README.md).
300
+ the [Claude Code adapter](loopx/claude_goal_mode/README.md), the
301
+ [KunlunCode native Goal adapter](loopx/kunluncode_goal_mode/README.md), or the
302
+ [DeepSeek Harness turn adapter](loopx/dsh_goal_mode/README.md).
296
303
 
297
304
  For custom runners, start with the
298
305
  [minimal custom runtime example](docs/guides/minimal-custom-runtime-example.md)
@@ -2,4 +2,4 @@
2
2
 
3
3
  __all__ = ["__version__"]
4
4
 
5
- __version__ = "0.5.0"
5
+ __version__ = "0.5.1"
@@ -314,7 +314,9 @@ def _start_instruction(agent_type: str) -> str:
314
314
  if agent_type == "deepseek-harness":
315
315
  return (
316
316
  "Install `loopx[deepseek-harness]`, prepare a dsh cordis.yml, and run "
317
- "`loopx turn run-once` with `scripts/dsh_turn_host_adapter.py` as the "
317
+ "`loopx turn run-once` with the `loopx.dsh_goal_mode` adapter "
318
+ "(`python -m loopx.dsh_goal_mode`; the legacy "
319
+ "`scripts/dsh_turn_host_adapter.py` launcher still works) as the "
318
320
  "generic-cli host adapter; every tick starts from `quota should-run`."
319
321
  )
320
322
  if agent_type == "ark-managed-agent":
@@ -323,7 +323,7 @@ def build_start_goal_host_surface_selection_packet(
323
323
  "pi": "Pi LoopX goal extension",
324
324
  "gemini-cli": "Gemini CLI driving its own loop through the LoopX skill facade",
325
325
  "cursor-agent": "cursor-agent driving its own loop through the LoopX skill facade and MCP server",
326
- "deepseek-harness": "DeepSeek Harness automation loop through scripts/dsh_turn_host_adapter.py",
326
+ "deepseek-harness": "DeepSeek Harness automation loop through loopx.dsh_goal_mode (compat: scripts/dsh_turn_host_adapter.py)",
327
327
  "ark-managed-agent": "Ark Managed Agent with one-shot Goal submission",
328
328
  "shell": "manual shell or an explicitly configured external scheduler",
329
329
  "other-agent": "custom agent host using the returned activation contract",
@@ -5,6 +5,35 @@ artifact, integrity, and reusable agent-runtime boundaries around benchmark
5
5
  experiments. It does not own benchmark-family runners, result ledgers, or scoring
6
6
  adapters.
7
7
 
8
+ ## Source revision admission
9
+
10
+ A long-running campaign can keep launching from an old installed checkout after
11
+ the tracked branch advances. Pinning the source once at controller startup does
12
+ not prevent that drift. Immediately before each new benchmark admission, obtain
13
+ the current reference head through the runner's provider or network boundary,
14
+ then compare it with the clean local checkout and intended pin:
15
+
16
+ ```bash
17
+ loopx benchmark source-revision-fence \
18
+ --source-checkout /path/to/pinned-source \
19
+ --expected-revision "$PINNED_REVISION" \
20
+ --observed-reference-revision "$OBSERVED_REFERENCE_REVISION" \
21
+ --require-admitted \
22
+ --format json
23
+ ```
24
+
25
+ The command succeeds only when all three identities match and the source root has
26
+ no tracked or untracked changes. Its compact receipt records equality, cleanliness,
27
+ and a stable reason code without recording the checkout path or any revision value.
28
+ Invalid input is also reduced to a path-free fail-closed receipt.
29
+
30
+ The fence is an admission boundary, not a live-run mutation mechanism. A run that
31
+ already passed the fence keeps its immutable revision even if the reference moves
32
+ later; the new head blocks only subsequent admissions until the runner installs and
33
+ pins an updated source. The caller owns the freshness and authority of the observed
34
+ reference value. This capability performs no fetch, provider API call, checkout,
35
+ install, process launch, score write, or submission.
36
+
8
37
  ## Native Codex Goal runtime
9
38
 
10
39
  Benchmark adapters that use the Codex app-server Goal API should import
@@ -95,6 +95,13 @@ from .run_permissions import (
95
95
  compact_run_permission_policy_for_quota,
96
96
  validate_run_permission_policy,
97
97
  )
98
+ from .source_revision_fence import (
99
+ BENCHMARK_SOURCE_REVISION_FENCE_SCHEMA_VERSION,
100
+ BenchmarkSourceRevisionFence,
101
+ BenchmarkSourceRevisionFenceError,
102
+ compact_benchmark_source_revision_fence_receipt,
103
+ inspect_benchmark_source_revision_fence,
104
+ )
98
105
 
99
106
  __all__ = [
100
107
  "BENCHMARK_CANDIDATE_SOURCE_BOUNDARY_SCHEMA_VERSION",
@@ -105,16 +112,20 @@ __all__ = [
105
112
  "BENCHMARK_INTEGRITY_POLICY_SCHEMA_VERSION",
106
113
  "BENCHMARK_INTEGRITY_QUALIFICATION_SCHEMA_VERSION",
107
114
  "BENCHMARK_RUNTIME_INTEGRITY_ATTESTATION_SCHEMA_VERSION",
115
+ "BENCHMARK_SOURCE_REVISION_FENCE_SCHEMA_VERSION",
108
116
  "DEFAULT_RUN_PERMISSION_ALLOWED_ACTIONS",
109
117
  "DEFAULT_RUN_PERMISSION_FORBIDDEN_ACTIONS",
110
118
  "INTEGRITY_EVIDENCE_CATEGORIES",
111
119
  "NATIVE_CODEX_GOAL_PROMPT_SCHEMA_VERSION",
112
- "NATIVE_GOAL_LIFECYCLE_SCHEMA_VERSION",
113
120
  "NATIVE_CODEX_PROFILE_REQUIRED_SKILL_IDS",
114
121
  "NATIVE_CODEX_PROFILE_SCHEMA_VERSION",
122
+ "NATIVE_GOAL_LIFECYCLE_SCHEMA_VERSION",
123
+ "PUBLIC_TRAJECTORY_SUMMARY_SCHEMA_VERSION",
115
124
  "REQUIRED_RUNTIME_ATTESTATIONS",
116
125
  "RUN_PERMISSION_POLICY_SCHEMA_VERSION",
117
126
  "RUN_PERMISSION_QUOTA_PROJECTION_SCHEMA_VERSION",
127
+ "BenchmarkSourceRevisionFence",
128
+ "BenchmarkSourceRevisionFenceError",
118
129
  "DockerContainerBinding",
119
130
  "DockerContainerBindingError",
120
131
  "NativeCodexGoalPrompt",
@@ -124,15 +135,14 @@ __all__ = [
124
135
  "NativeCodexProfile",
125
136
  "NativeCodexProfileError",
126
137
  "NativeGoalConfig",
127
- "NativeGoalLifecycleFacts",
128
138
  "NativeGoalEventTransport",
139
+ "NativeGoalLifecycleFacts",
129
140
  "NativeGoalProtocolError",
130
141
  "NativeGoalTransport",
131
142
  "NativeGoalTurn",
132
- "RunPermissionAction",
133
- "PUBLIC_TRAJECTORY_SUMMARY_SCHEMA_VERSION",
134
143
  "PublicTrajectoryLifecycleState",
135
144
  "PublicTrajectorySummaryError",
145
+ "RunPermissionAction",
136
146
  "StdioNativeGoalTransport",
137
147
  "attach_native_goal",
138
148
  "benchmark_experiment_board_row_key",
@@ -144,6 +154,7 @@ __all__ = [
144
154
  "build_run_permission_policy",
145
155
  "classify_benchmark_artifact_path",
146
156
  "classify_benchmark_candidate_source_path",
157
+ "compact_benchmark_source_revision_fence_receipt",
147
158
  "compact_docker_container_binding_receipt",
148
159
  "compact_native_codex_goal_prompt_receipt",
149
160
  "compact_native_codex_profile_receipt",
@@ -151,6 +162,7 @@ __all__ = [
151
162
  "compact_run_permission_policy_for_quota",
152
163
  "default_benchmark_experiment_board_path",
153
164
  "filter_public_benchmark_artifact_paths",
165
+ "inspect_benchmark_source_revision_fence",
154
166
  "inspect_native_codex_profile",
155
167
  "install_native_codex_profile",
156
168
  "materialize_public_benchmark_artifacts",
@@ -24,6 +24,23 @@ BENCHMARK_TOOLKIT_CATALOG_ENTRY: dict[str, Any] = {
24
24
  ),
25
25
  "entry_command": "loopx benchmark --help",
26
26
  "commands": [
27
+ {
28
+ "command": (
29
+ "loopx benchmark source-revision-fence "
30
+ "--source-checkout <clean-source> "
31
+ "--expected-revision <pin> "
32
+ "--observed-reference-revision <observed-head> "
33
+ "--require-admitted --format json"
34
+ ),
35
+ "purpose": (
36
+ "Fail closed before a new run when the installed source no "
37
+ "longer matches the caller-observed reference head."
38
+ ),
39
+ "write_boundary": (
40
+ "local Git readback only; caller owns reference observation, "
41
+ "fetch, installation, and launch"
42
+ ),
43
+ },
27
44
  {
28
45
  "command": (
29
46
  "loopx benchmark experiment-board-show --goal-id <goal-id> "
@@ -90,6 +107,7 @@ BENCHMARK_TOOLKIT_CATALOG_ENTRY: dict[str, Any] = {
90
107
  ),
91
108
  "required_sequence": [
92
109
  "read_experiment_board_before_launch_or_case_selection",
110
+ "qualify_source_revision_before_each_new_run_admission",
93
111
  "upsert_preregistered_or_running_row_when_a_run_starts",
94
112
  "upsert_terminal_score_countability_effort_and_insight_status",
95
113
  "read_matched_comparisons_before_selecting_the_next_arm",
@@ -181,6 +199,11 @@ BENCHMARK_TOOLKIT_CATALOG_ENTRY: dict[str, Any] = {
181
199
  },
182
200
  },
183
201
  "implemented_protocols": [
202
+ {
203
+ "schema_version": "benchmark_source_revision_fence_v0",
204
+ "module": "loopx.capabilities.benchmark_toolkit.source_revision_fence",
205
+ "doc": "loopx/capabilities/benchmark_toolkit/README.md",
206
+ },
184
207
  {
185
208
  "schema_version": "benchmark_experiment_board_row_v0",
186
209
  "module": "loopx.capabilities.benchmark_toolkit.experiment_board",
@@ -220,12 +243,14 @@ BENCHMARK_TOOLKIT_CATALOG_ENTRY: dict[str, Any] = {
220
243
  "smokes": [
221
244
  (
222
245
  "python -m pytest tests/capabilities/test_benchmark_toolkit.py "
223
- "tests/capabilities/test_benchmark_experiment_board.py -q"
246
+ "tests/capabilities/test_benchmark_experiment_board.py "
247
+ "tests/capabilities/test_benchmark_source_revision_fence.py -q"
224
248
  )
225
249
  ],
226
250
  "docs": ["loopx/capabilities/benchmark_toolkit/README.md"],
227
251
  "boundaries": [
228
252
  "The toolkit never grants runner, Docker, model, upload, submission, or publication authority; each effect remains separately gated.",
253
+ "Source revision qualification is read-only and caller-observed: it does not fetch, install, update a checkout, or rewrite an already admitted run.",
229
254
  "Raw trajectories are private local inputs to integrity qualification and are never copied into receipts, ledgers, docs, or PR artifacts.",
230
255
  "A clean trajectory scan is not isolation proof: runner-owned permission and verifier-order attestations are mandatory and fail closed when absent.",
231
256
  "Concurrent Docker runs must bind runtime evidence to one exact job-owned container; image-only discovery is not sufficient.",
@@ -0,0 +1,154 @@
1
+ """Fail-closed source revision admission for benchmark runs."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import re
6
+ import subprocess
7
+ from dataclasses import dataclass
8
+ from pathlib import Path
9
+ from typing import Any
10
+
11
+ BENCHMARK_SOURCE_REVISION_FENCE_SCHEMA_VERSION = "benchmark_source_revision_fence_v0"
12
+ _FULL_GIT_OBJECT_ID = re.compile(r"(?:[0-9a-f]{40}|[0-9a-f]{64})\Z")
13
+
14
+
15
+ class BenchmarkSourceRevisionFenceError(ValueError):
16
+ """The source checkout or revision observation cannot be trusted."""
17
+
18
+
19
+ @dataclass(frozen=True)
20
+ class BenchmarkSourceRevisionFence:
21
+ """Private exact evidence behind one source admission decision."""
22
+
23
+ source_checkout: Path
24
+ expected_revision: str
25
+ local_revision: str
26
+ observed_reference_revision: str
27
+ source_clean: bool
28
+ admitted: bool
29
+ reason_code: str
30
+
31
+ @property
32
+ def local_matches_expected(self) -> bool:
33
+ return self.local_revision == self.expected_revision
34
+
35
+ @property
36
+ def observed_reference_matches_expected(self) -> bool:
37
+ return self.observed_reference_revision == self.expected_revision
38
+
39
+
40
+ def _normalize_revision(value: str, *, field: str) -> str:
41
+ revision = str(value).strip().lower()
42
+ if not _FULL_GIT_OBJECT_ID.fullmatch(revision):
43
+ raise BenchmarkSourceRevisionFenceError(f"{field}_invalid")
44
+ return revision
45
+
46
+
47
+ def _git_text(source: Path, *args: str) -> str:
48
+ try:
49
+ completed = subprocess.run(
50
+ ["git", "--no-optional-locks", "-C", str(source), *args],
51
+ check=False,
52
+ capture_output=True,
53
+ text=True,
54
+ )
55
+ except OSError as exc:
56
+ raise BenchmarkSourceRevisionFenceError(
57
+ "source_revision_git_readback_failed"
58
+ ) from exc
59
+ if completed.returncode:
60
+ raise BenchmarkSourceRevisionFenceError("source_revision_git_readback_failed")
61
+ return completed.stdout.strip()
62
+
63
+
64
+ def inspect_benchmark_source_revision_fence(
65
+ source_checkout: str | Path,
66
+ *,
67
+ expected_revision: str,
68
+ observed_reference_revision: str,
69
+ ) -> BenchmarkSourceRevisionFence:
70
+ """Compare a clean local checkout with a pin and caller-observed ref head.
71
+
72
+ The caller owns any network fetch or provider API read used to obtain
73
+ ``observed_reference_revision``. This helper performs only local readback;
74
+ it never fetches, checks out, installs, or launches a benchmark run.
75
+ """
76
+
77
+ requested = Path(source_checkout).expanduser()
78
+ if requested.is_symlink():
79
+ raise BenchmarkSourceRevisionFenceError("source_checkout_symlink_denied")
80
+ try:
81
+ source = requested.resolve(strict=True)
82
+ except OSError as exc:
83
+ raise BenchmarkSourceRevisionFenceError("source_checkout_missing") from exc
84
+ if not source.is_dir():
85
+ raise BenchmarkSourceRevisionFenceError("source_checkout_not_directory")
86
+
87
+ expected = _normalize_revision(expected_revision, field="expected_revision")
88
+ observed = _normalize_revision(
89
+ observed_reference_revision,
90
+ field="observed_reference_revision",
91
+ )
92
+ try:
93
+ repository_root = Path(
94
+ _git_text(source, "rev-parse", "--show-toplevel")
95
+ ).resolve(strict=True)
96
+ except OSError as exc:
97
+ raise BenchmarkSourceRevisionFenceError(
98
+ "source_checkout_root_unreadable"
99
+ ) from exc
100
+ if repository_root != source:
101
+ raise BenchmarkSourceRevisionFenceError(
102
+ "source_checkout_must_be_repository_root"
103
+ )
104
+
105
+ local = _normalize_revision(
106
+ _git_text(source, "rev-parse", "HEAD"),
107
+ field="local_revision",
108
+ )
109
+ source_clean = not bool(
110
+ _git_text(source, "status", "--porcelain", "--untracked-files=all")
111
+ )
112
+ if not source_clean:
113
+ admitted = False
114
+ reason_code = "source_checkout_dirty"
115
+ elif local != expected:
116
+ admitted = False
117
+ reason_code = "local_revision_mismatch"
118
+ elif observed != expected:
119
+ admitted = False
120
+ reason_code = "observed_reference_revision_mismatch"
121
+ else:
122
+ admitted = True
123
+ reason_code = "revision_fence_satisfied"
124
+
125
+ return BenchmarkSourceRevisionFence(
126
+ source_checkout=source,
127
+ expected_revision=expected,
128
+ local_revision=local,
129
+ observed_reference_revision=observed,
130
+ source_clean=source_clean,
131
+ admitted=admitted,
132
+ reason_code=reason_code,
133
+ )
134
+
135
+
136
+ def compact_benchmark_source_revision_fence_receipt(
137
+ fence: BenchmarkSourceRevisionFence,
138
+ ) -> dict[str, Any]:
139
+ """Return a public-safe decision receipt without paths or revisions."""
140
+
141
+ return {
142
+ "schema_version": BENCHMARK_SOURCE_REVISION_FENCE_SCHEMA_VERSION,
143
+ "admitted": fence.admitted,
144
+ "reason_code": fence.reason_code,
145
+ "source_clean": fence.source_clean,
146
+ "local_matches_expected": fence.local_matches_expected,
147
+ "observed_reference_matches_expected": (
148
+ fence.observed_reference_matches_expected
149
+ ),
150
+ "source_path_recorded": False,
151
+ "revision_values_recorded": False,
152
+ "network_access_performed": False,
153
+ "write_performed": False,
154
+ }
@@ -15,14 +15,16 @@ from .chat_action_store import ActionConflictError, ChatActionStore
15
15
  from .chat_goal_lifecycle_actions import ChatGoalLifecycleActionMixin
16
16
  from .chat_monitor_actions import ChatMonitorActionMixin
17
17
  from .chat_store import ChatSessionStore
18
+ from .chat_todo_actions import ChatTodoActionMixin
18
19
  from .configure_goal import configure_goal
19
20
  from .control_plane.runtime.time import now_utc, parse_timestamp, utc_isoformat
20
21
  from .control_plane.scheduler.monitor_todo import monitor_next_due_at
22
+ from .control_plane.todos.contract import require_supported_todo_resume_when
21
23
  from .history import load_registry
22
24
  from .host_loop_activation import build_host_loop_activation_packet
23
25
  from .quota import build_quota_should_run
24
26
  from .registry import registry_goals
25
- from .todos import add_goal_todo, complete_goal_todo, update_goal_todo
27
+ from .todos import add_goal_todo, update_goal_todo
26
28
 
27
29
 
28
30
  CHAT_ACTION_RESPONSE_SCHEMA_VERSION = "loopx_chat_action_response_v1"
@@ -138,7 +140,9 @@ def _monitor_text(parameters: Mapping[str, Any]) -> str | None:
138
140
  return None
139
141
 
140
142
 
141
- class ChatActionService(ChatGoalLifecycleActionMixin, ChatMonitorActionMixin):
143
+ class ChatActionService(
144
+ ChatGoalLifecycleActionMixin, ChatMonitorActionMixin, ChatTodoActionMixin
145
+ ):
142
146
  """Validate previews and route applies through canonical LoopX services."""
143
147
 
144
148
  def __init__(
@@ -381,9 +385,9 @@ class ChatActionService(ChatGoalLifecycleActionMixin, ChatMonitorActionMixin):
381
385
  elif values.get("agent_id"):
382
386
  result["agent_id"] = _opaque(values["agent_id"], field="agent_id")
383
387
  if values.get("resume_when"):
384
- result["resume_when"] = _text(
385
- values["resume_when"], field="resume_when", limit=240
386
- ).lower()
388
+ result["resume_when"] = require_supported_todo_resume_when(
389
+ _text(values["resume_when"], field="resume_when", limit=240)
390
+ )
387
391
  if values.get("successor_todo_ids") is not None:
388
392
  if not isinstance(values["successor_todo_ids"], list):
389
393
  raise ValueError("successor_todo_ids must be a list")
@@ -1183,65 +1187,6 @@ class ChatActionService(ChatGoalLifecycleActionMixin, ChatMonitorActionMixin):
1183
1187
  )
1184
1188
  return {"proposal": stored, "turn": None}
1185
1189
 
1186
- def _apply_todo_update(
1187
- self, proposal_id: str, proposal: dict[str, Any], parameters: dict[str, Any]
1188
- ) -> dict[str, Any]:
1189
- goal_id = str(parameters["goal_id"])
1190
- current_fingerprint = self._goal_state_fingerprint(goal_id)
1191
- if current_fingerprint != proposal.get("expected_state_fingerprint"):
1192
- stale = self.store.apply(
1193
- proposal_id, current_state_fingerprint=current_fingerprint, receipt={}
1194
- )
1195
- return {"proposal": stale, "turn": None}
1196
- operation = str(parameters.get("operation") or "edit")
1197
- if operation == "complete":
1198
- result = complete_goal_todo(
1199
- registry_path=self.registry_path,
1200
- goal_id=goal_id,
1201
- todo_id=str(parameters["todo_id"]),
1202
- note=parameters.get("note"),
1203
- no_followup=bool(parameters.get("no_followup", True)),
1204
- successor_todo_ids=parameters.get("successor_todo_ids"),
1205
- agent_id=parameters.get("agent_id"),
1206
- authority_reason="owner-confirmed typed Chat action",
1207
- dry_run=False,
1208
- )
1209
- else:
1210
- status = parameters.get("status")
1211
- if operation == "block":
1212
- status = "blocked"
1213
- elif operation == "defer":
1214
- status = "deferred"
1215
- result = update_goal_todo(
1216
- registry_path=self.registry_path,
1217
- goal_id=goal_id,
1218
- todo_id=str(parameters["todo_id"]),
1219
- text=parameters.get("text"),
1220
- status=status,
1221
- note=parameters.get("note"),
1222
- claimed_by=parameters.get("agent_id") if operation == "reassign" else None,
1223
- resume_when=parameters.get("resume_when"),
1224
- successor_todo_ids=parameters.get("successor_todo_ids"),
1225
- agent_id=parameters.get("agent_id"),
1226
- authority_reason="owner-confirmed typed Chat action",
1227
- dry_run=False,
1228
- )
1229
- todo_id = _opaque(result.get("todo_id"), field="todo_id")
1230
- receipt = {
1231
- "receipt_id": _digest({"proposal_id": proposal_id, "todo_id": todo_id})[:32],
1232
- "outcome": (
1233
- "todo_completed"
1234
- if operation == "complete"
1235
- else "todo_updated" if result.get("changed") else "todo_unchanged"
1236
- ),
1237
- "projection_verified": True,
1238
- "resource_ids": {"goal_id": goal_id, "todo_id": todo_id},
1239
- }
1240
- stored = self.store.apply(
1241
- proposal_id, current_state_fingerprint=current_fingerprint, receipt=receipt
1242
- )
1243
- return {"proposal": stored, "turn": None}
1244
-
1245
1190
  def preview(self, request: Mapping[str, Any]) -> dict[str, Any]:
1246
1191
  unknown = set(request) - {
1247
1192
  "action_kind",
@@ -1287,6 +1232,12 @@ class ChatActionService(ChatGoalLifecycleActionMixin, ChatMonitorActionMixin):
1287
1232
  evidence = ["The recoverable Goal and Agent Chat Session is available."]
1288
1233
  permission = "scoped_correction"
1289
1234
  elif action_kind in {"todo.update", "monitor.update"}:
1235
+ if action_kind == "todo.update":
1236
+ canonical_preview = self._run_todo_update(normalized, dry_run=True)
1237
+ if canonical_preview.get("ok") is not True:
1238
+ raise ValueError(
1239
+ str(canonical_preview.get("error") or "Todo transition failed canonical dry-run validation")
1240
+ )
1290
1241
  goal_fingerprint = self._goal_state_fingerprint(normalized["goal_id"])
1291
1242
  if action_kind == "monitor.update" and normalized.get("operation") == "run_now":
1292
1243
  session_id = normalized.get("session_id")
@@ -1304,7 +1255,11 @@ class ChatActionService(ChatGoalLifecycleActionMixin, ChatMonitorActionMixin):
1304
1255
  )
1305
1256
  else:
1306
1257
  fingerprint = goal_fingerprint
1307
- evidence = ["Canonical LoopX Todo state validated the requested transition."]
1258
+ evidence = [
1259
+ "Canonical LoopX Todo dry-run validated the requested transition."
1260
+ if action_kind == "todo.update"
1261
+ else "Canonical LoopX Todo state validated the requested transition."
1262
+ ]
1308
1263
  permission = "durable_write"
1309
1264
  else:
1310
1265
  fingerprint = self._registry_fingerprint()