loopx 0.4.8__py3-none-any.whl

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 (811) hide show
  1. loopx/__init__.py +5 -0
  2. loopx/agent_onboarding.py +654 -0
  3. loopx/agent_registry.py +112 -0
  4. loopx/ark_managed_agent_host.py +59 -0
  5. loopx/authority.py +805 -0
  6. loopx/benchmark.py +2875 -0
  7. loopx/benchmark_adapters/__init__.py +1 -0
  8. loopx/benchmark_adapters/agentissue.py +2644 -0
  9. loopx/benchmark_adapters/agents_last_exam.py +3998 -0
  10. loopx/benchmark_adapters/edgebench.py +322 -0
  11. loopx/benchmark_adapters/skillsbench.py +5978 -0
  12. loopx/benchmark_adapters/skillsbench_acp_failure_policy.py +143 -0
  13. loopx/benchmark_adapters/skillsbench_acp_process.py +31 -0
  14. loopx/benchmark_adapters/skillsbench_acp_relay.py +4832 -0
  15. loopx/benchmark_adapters/skillsbench_batch.py +124 -0
  16. loopx/benchmark_adapters/skillsbench_bridge_guard.py +209 -0
  17. loopx/benchmark_adapters/skillsbench_bridge_summary.py +203 -0
  18. loopx/benchmark_adapters/skillsbench_codex_goal_recovery.py +271 -0
  19. loopx/benchmark_adapters/skillsbench_codex_goal_trace.py +81 -0
  20. loopx/benchmark_adapters/skillsbench_codex_runtime.py +339 -0
  21. loopx/benchmark_adapters/skillsbench_dockerfile_runtime.py +467 -0
  22. loopx/benchmark_adapters/skillsbench_failure_signals.py +652 -0
  23. loopx/benchmark_adapters/skillsbench_proxy_runtime.py +327 -0
  24. loopx/benchmark_adapters/skillsbench_remote_bridge.py +402 -0
  25. loopx/benchmark_adapters/skillsbench_result_discovery.py +143 -0
  26. loopx/benchmark_adapters/skillsbench_runner_profile.py +436 -0
  27. loopx/benchmark_adapters/skillsbench_runner_source.py +99 -0
  28. loopx/benchmark_adapters/skillsbench_setup_preflight.py +771 -0
  29. loopx/benchmark_adapters/skillsbench_signals.py +15 -0
  30. loopx/benchmark_adapters/skillsbench_task_source.py +141 -0
  31. loopx/benchmark_adapters/skillsbench_turn_route.py +723 -0
  32. loopx/benchmark_adapters/skillsbench_turn_runtime.py +1069 -0
  33. loopx/benchmark_adapters/skillsbench_typed_repair.py +689 -0
  34. loopx/benchmark_adapters/skillsbench_uv_cache.py +111 -0
  35. loopx/benchmark_adapters/skillsbench_verifier_bootstrap.py +227 -0
  36. loopx/benchmark_adapters/skillsbench_verifier_cache.py +138 -0
  37. loopx/benchmark_adapters/terminal_bench.py +10078 -0
  38. loopx/benchmark_case_analysis.py +1276 -0
  39. loopx/benchmark_case_state.py +1079 -0
  40. loopx/benchmark_core/__init__.py +239 -0
  41. loopx/benchmark_core/adapter.py +84 -0
  42. loopx/benchmark_core/artifacts.py +517 -0
  43. loopx/benchmark_core/attempts.py +199 -0
  44. loopx/benchmark_core/container_exec.py +216 -0
  45. loopx/benchmark_core/io.py +68 -0
  46. loopx/benchmark_core/lifecycle.py +211 -0
  47. loopx/benchmark_core/loop_protocol.py +689 -0
  48. loopx/benchmark_core/observable_handles.py +348 -0
  49. loopx/benchmark_core/parity.py +256 -0
  50. loopx/benchmark_core/remote_closeout.py +482 -0
  51. loopx/benchmark_core/rounds.py +215 -0
  52. loopx/benchmark_core/route_profile.py +509 -0
  53. loopx/benchmark_core/run_permissions.py +206 -0
  54. loopx/benchmark_core/split_control.py +925 -0
  55. loopx/benchmark_core/turn_fidelity.py +326 -0
  56. loopx/benchmark_ledger.py +3793 -0
  57. loopx/benchmark_ledger_countability.py +372 -0
  58. loopx/benchmark_ledger_current.py +724 -0
  59. loopx/benchmark_trajectory.py +405 -0
  60. loopx/benchmarks/__init__.py +1 -0
  61. loopx/benchmarks/qualification/__init__.py +1 -0
  62. loopx/benchmarks/qualification/release_outcome_baseline.py +360 -0
  63. loopx/benchmarks/read_models/__init__.py +1 -0
  64. loopx/benchmarks/read_models/benchmark_attempt_accounting.py +53 -0
  65. loopx/benchmarks/read_models/benchmark_comparison.py +414 -0
  66. loopx/benchmarks/read_models/benchmark_event_timeline.py +113 -0
  67. loopx/benchmarks/read_models/benchmark_experiment_report.py +475 -0
  68. loopx/benchmarks/read_models/benchmark_learning_ledger.py +137 -0
  69. loopx/benchmarks/read_models/benchmark_lifecycle_contracts.py +228 -0
  70. loopx/benchmarks/read_models/benchmark_projection.py +723 -0
  71. loopx/benchmarks/read_models/benchmark_result.py +146 -0
  72. loopx/benchmarks/read_models/benchmark_run_execution_contract.py +116 -0
  73. loopx/benchmarks/read_models/benchmark_run_failure.py +157 -0
  74. loopx/benchmarks/read_models/benchmark_run_metrics.py +213 -0
  75. loopx/benchmarks/read_models/benchmark_run_post_execution.py +635 -0
  76. loopx/benchmarks/read_models/benchmark_run_pre_execution.py +541 -0
  77. loopx/benchmarks/read_models/benchmark_status_compaction.py +1255 -0
  78. loopx/benchmarks/read_models/benchmark_status_runner.py +780 -0
  79. loopx/benchmarks/read_models/goal_start_control_score.py +857 -0
  80. loopx/benchmarks/read_models/skillsbench_post_run_debug.py +746 -0
  81. loopx/benchmarks/read_models/skillsbench_verifier_attribution.py +269 -0
  82. loopx/bootstrap.py +1116 -0
  83. loopx/bootstrap_command_pack.py +2167 -0
  84. loopx/boundary_authority.py +199 -0
  85. loopx/canary/__init__.py +1 -0
  86. loopx/canary/maintainability_ratchet.py +800 -0
  87. loopx/canary/planner.py +1984 -0
  88. loopx/canary/premerge.py +1130 -0
  89. loopx/canary/qualification_profiles.py +309 -0
  90. loopx/canary/quality_surface_catalog.py +838 -0
  91. loopx/canary/release_profiles.py +51 -0
  92. loopx/canary/runner.py +1107 -0
  93. loopx/canary/smoke_health.py +581 -0
  94. loopx/canary/smoke_profiles.py +212 -0
  95. loopx/capabilities/__init__.py +0 -0
  96. loopx/capabilities/agent_turn_recall/__init__.py +17 -0
  97. loopx/capabilities/agent_turn_recall/cli.py +369 -0
  98. loopx/capabilities/agent_turn_recall/core.py +296 -0
  99. loopx/capabilities/auto_research/__init__.py +16 -0
  100. loopx/capabilities/auto_research/bootstrap_contract.py +157 -0
  101. loopx/capabilities/auto_research/cli.py +1468 -0
  102. loopx/capabilities/auto_research/core.py +11 -0
  103. loopx/capabilities/auto_research/defaults.py +79 -0
  104. loopx/capabilities/auto_research/demo_e2e.py +1848 -0
  105. loopx/capabilities/auto_research/demo_supervisor.py +186 -0
  106. loopx/capabilities/auto_research/evidence_packet.py +767 -0
  107. loopx/capabilities/auto_research/human_view.py +794 -0
  108. loopx/capabilities/auto_research/kernel.py +191 -0
  109. loopx/capabilities/auto_research/knn_demo_workspace.py +322 -0
  110. loopx/capabilities/auto_research/live_evidence.py +248 -0
  111. loopx/capabilities/auto_research/preset.py +176 -0
  112. loopx/capabilities/auto_research/research_state.py +1085 -0
  113. loopx/capabilities/auto_research/role_profiles.py +394 -0
  114. loopx/capabilities/auto_research/rollout_append.py +97 -0
  115. loopx/capabilities/auto_research/terminal_result_contract.py +422 -0
  116. loopx/capabilities/auto_research/terminal_result_projection.py +171 -0
  117. loopx/capabilities/auto_research/terminal_result_query.py +233 -0
  118. loopx/capabilities/auto_research/terminal_results.py +349 -0
  119. loopx/capabilities/auto_research/user_contract.py +190 -0
  120. loopx/capabilities/auto_research/worker_loop.py +163 -0
  121. loopx/capabilities/auto_research/worker_runtime.py +777 -0
  122. loopx/capabilities/auto_research/worker_skill/SKILL.md +343 -0
  123. loopx/capabilities/benchmark_toolkit/__init__.py +19 -0
  124. loopx/capabilities/benchmark_toolkit/integrity.py +387 -0
  125. loopx/capabilities/catalog.py +1875 -0
  126. loopx/capabilities/change_quality/__init__.py +19 -0
  127. loopx/capabilities/change_quality/cli.py +171 -0
  128. loopx/capabilities/change_quality/context.py +156 -0
  129. loopx/capabilities/change_quality/oracles.py +269 -0
  130. loopx/capabilities/change_quality/policy.py +34 -0
  131. loopx/capabilities/change_quality/receipt.py +482 -0
  132. loopx/capabilities/change_quality/result.py +493 -0
  133. loopx/capabilities/change_quality/scope.py +171 -0
  134. loopx/capabilities/change_quality/shadow.py +680 -0
  135. loopx/capabilities/content_ops/__init__.py +0 -0
  136. loopx/capabilities/content_ops/cli.py +649 -0
  137. loopx/capabilities/content_ops/connector_packets.py +164 -0
  138. loopx/capabilities/content_ops/item_lifecycle.py +1000 -0
  139. loopx/capabilities/content_ops/layout.py +451 -0
  140. loopx/capabilities/content_ops/markdown.py +456 -0
  141. loopx/capabilities/content_ops/schemas.py +51 -0
  142. loopx/capabilities/content_ops/social_browser_x.py +107 -0
  143. loopx/capabilities/content_ops/surface.py +1956 -0
  144. loopx/capabilities/content_ops/templates/layout-catalog-v0.json +72 -0
  145. loopx/capabilities/context_providers/__init__.py +36 -0
  146. loopx/capabilities/context_providers/base.py +189 -0
  147. loopx/capabilities/context_providers/factory.py +32 -0
  148. loopx/capabilities/context_providers/openviking.py +702 -0
  149. loopx/capabilities/context_providers/service_ownership.py +185 -0
  150. loopx/capabilities/decision_context/__init__.py +129 -0
  151. loopx/capabilities/decision_context/architecture.py +83 -0
  152. loopx/capabilities/decision_context/assembler.py +849 -0
  153. loopx/capabilities/decision_context/catalog_entry.py +195 -0
  154. loopx/capabilities/decision_context/cli.py +310 -0
  155. loopx/capabilities/decision_context/cursor_commit.py +535 -0
  156. loopx/capabilities/decision_context/outcome_feedback.py +352 -0
  157. loopx/capabilities/decision_context/packets.py +654 -0
  158. loopx/capabilities/decision_context/private_state.py +189 -0
  159. loopx/capabilities/decision_context/profile.py +453 -0
  160. loopx/capabilities/decision_context/providers.py +228 -0
  161. loopx/capabilities/decision_context/review_settlement.py +136 -0
  162. loopx/capabilities/decision_context/runtime.py +273 -0
  163. loopx/capabilities/decision_context/sources.py +415 -0
  164. loopx/capabilities/explore/__init__.py +1 -0
  165. loopx/capabilities/explore/activation.py +198 -0
  166. loopx/capabilities/explore/adaptive_replay_planner.py +221 -0
  167. loopx/capabilities/explore/child_replay_runtime.py +463 -0
  168. loopx/capabilities/explore/composition_frontier.py +291 -0
  169. loopx/capabilities/explore/counterfactual_runtime.py +578 -0
  170. loopx/capabilities/explore/episode_runtime.py +647 -0
  171. loopx/capabilities/explore/harness_checkpoint.py +171 -0
  172. loopx/capabilities/explore/harness_gate.py +115 -0
  173. loopx/capabilities/explore/harness_runtime.py +1124 -0
  174. loopx/capabilities/explore/replay_metrics.py +206 -0
  175. loopx/capabilities/explore/replay_runtime.py +1271 -0
  176. loopx/capabilities/explore/resource_portfolio.py +173 -0
  177. loopx/capabilities/explore/result_log.py +974 -0
  178. loopx/capabilities/explore/router_state.py +432 -0
  179. loopx/capabilities/explore/source_history_reconcile.py +255 -0
  180. loopx/capabilities/explore/speculative_scheduler.py +498 -0
  181. loopx/capabilities/explore/todo_branch_plan.py +650 -0
  182. loopx/capabilities/explore/todo_evidence.py +141 -0
  183. loopx/capabilities/explore/trace_runtime.py +284 -0
  184. loopx/capabilities/explore/worker_branch_plan.py +1257 -0
  185. loopx/capabilities/integration_branch/__init__.py +13 -0
  186. loopx/capabilities/integration_branch/cli.py +148 -0
  187. loopx/capabilities/integration_branch/core.py +916 -0
  188. loopx/capabilities/issue_fix/__init__.py +19 -0
  189. loopx/capabilities/issue_fix/acceptance_loop.py +1050 -0
  190. loopx/capabilities/issue_fix/candidate_evidence.py +503 -0
  191. loopx/capabilities/issue_fix/candidate_preflight.py +676 -0
  192. loopx/capabilities/issue_fix/cli.py +1822 -0
  193. loopx/capabilities/issue_fix/cli_input.py +87 -0
  194. loopx/capabilities/issue_fix/content_ops_cli.py +148 -0
  195. loopx/capabilities/issue_fix/discovered_issue_promotion.py +947 -0
  196. loopx/capabilities/issue_fix/explore_projection.py +710 -0
  197. loopx/capabilities/issue_fix/feasibility.py +542 -0
  198. loopx/capabilities/issue_fix/github_public.py +661 -0
  199. loopx/capabilities/issue_fix/intake_surface.py +832 -0
  200. loopx/capabilities/issue_fix/metadata_preview.py +218 -0
  201. loopx/capabilities/issue_fix/metrics_projection.py +1340 -0
  202. loopx/capabilities/issue_fix/metrics_supplement.py +634 -0
  203. loopx/capabilities/issue_fix/metrics_supplement_cli.py +127 -0
  204. loopx/capabilities/issue_fix/outcome_projection.py +1235 -0
  205. loopx/capabilities/issue_fix/periodic_report.py +189 -0
  206. loopx/capabilities/issue_fix/pr_description.py +418 -0
  207. loopx/capabilities/issue_fix/pr_gate_reconcile.py +496 -0
  208. loopx/capabilities/issue_fix/pr_gate_reconcile_cli.py +464 -0
  209. loopx/capabilities/issue_fix/pr_lifecycle.py +1327 -0
  210. loopx/capabilities/issue_fix/pr_lifecycle_rollout.py +85 -0
  211. loopx/capabilities/issue_fix/pr_monitor_materialization.py +257 -0
  212. loopx/capabilities/issue_fix/pr_review_ack.py +439 -0
  213. loopx/capabilities/issue_fix/provider_hooks.py +24 -0
  214. loopx/capabilities/issue_fix/repository_commit_evidence.py +186 -0
  215. loopx/capabilities/issue_fix/repository_context.py +457 -0
  216. loopx/capabilities/issue_fix/repository_memory.py +459 -0
  217. loopx/capabilities/issue_fix/repository_memory_provider.py +1454 -0
  218. loopx/capabilities/issue_fix/repository_snapshot.py +454 -0
  219. loopx/capabilities/issue_fix/reviewer_cli.py +917 -0
  220. loopx/capabilities/issue_fix/reviewer_notification.py +882 -0
  221. loopx/capabilities/issue_fix/reviewer_notification_drain.py +942 -0
  222. loopx/capabilities/issue_fix/reviewer_recommendation.py +1057 -0
  223. loopx/capabilities/issue_fix/reviewer_request.py +1282 -0
  224. loopx/capabilities/issue_fix/reward_memory.py +879 -0
  225. loopx/capabilities/issue_fix/workflow_plan.py +1286 -0
  226. loopx/capabilities/material_lifecycle/__init__.py +161 -0
  227. loopx/capabilities/material_lifecycle/_validation.py +183 -0
  228. loopx/capabilities/material_lifecycle/apply.py +672 -0
  229. loopx/capabilities/material_lifecycle/architecture.py +122 -0
  230. loopx/capabilities/material_lifecycle/cli.py +161 -0
  231. loopx/capabilities/material_lifecycle/decision_planning.py +470 -0
  232. loopx/capabilities/material_lifecycle/explore_execution.py +306 -0
  233. loopx/capabilities/material_lifecycle/intake.py +869 -0
  234. loopx/capabilities/material_lifecycle/inventory.py +147 -0
  235. loopx/capabilities/material_lifecycle/lifecycle.py +98 -0
  236. loopx/capabilities/material_lifecycle/preparation.py +147 -0
  237. loopx/capabilities/material_lifecycle/project_skill.py +83 -0
  238. loopx/capabilities/material_lifecycle/ranking.py +267 -0
  239. loopx/capabilities/material_lifecycle/readable_projection.py +500 -0
  240. loopx/capabilities/material_lifecycle/rebuild.py +480 -0
  241. loopx/capabilities/material_lifecycle/settlement.py +238 -0
  242. loopx/capabilities/periodic_report/__init__.py +71 -0
  243. loopx/capabilities/periodic_report/adapters.py +939 -0
  244. loopx/capabilities/periodic_report/archive.py +422 -0
  245. loopx/capabilities/periodic_report/bindings.py +705 -0
  246. loopx/capabilities/periodic_report/cli.py +277 -0
  247. loopx/capabilities/periodic_report/core.py +691 -0
  248. loopx/capabilities/periodic_report/extension_envelope.py +66 -0
  249. loopx/capabilities/periodic_report/presets.py +103 -0
  250. loopx/capabilities/periodic_report/profile.py +235 -0
  251. loopx/capabilities/periodic_report/project_progress.py +179 -0
  252. loopx/capabilities/periodic_report/triggers.py +452 -0
  253. loopx/capabilities/pr_review_queue/__init__.py +17 -0
  254. loopx/capabilities/pr_review_queue/core.py +506 -0
  255. loopx/capabilities/pr_review_queue/review_contract.py +506 -0
  256. loopx/capabilities/registry.py +192 -0
  257. loopx/capabilities/reward_memory/__init__.py +75 -0
  258. loopx/capabilities/reward_memory/application.py +819 -0
  259. loopx/capabilities/reward_memory/architecture.py +572 -0
  260. loopx/capabilities/reward_memory/candidate_review.py +511 -0
  261. loopx/capabilities/reward_memory/cli.py +469 -0
  262. loopx/capabilities/reward_memory/dogfood.py +574 -0
  263. loopx/capabilities/reward_memory/evaluation.py +296 -0
  264. loopx/capabilities/reward_memory/evaluation_fixtures.py +362 -0
  265. loopx/capabilities/reward_memory/experiment.py +567 -0
  266. loopx/capabilities/reward_memory/health.py +222 -0
  267. loopx/capabilities/reward_memory/ingestion.py +519 -0
  268. loopx/capabilities/reward_memory/registry.py +600 -0
  269. loopx/capabilities/reward_memory/runtime_hooks.py +312 -0
  270. loopx/capabilities/reward_memory/scoped_feedback.py +173 -0
  271. loopx/capabilities/semantic_preference/__init__.py +12 -0
  272. loopx/capabilities/semantic_preference/cli.py +189 -0
  273. loopx/capabilities/semantic_preference/contract.py +592 -0
  274. loopx/capabilities/semantic_preference/reward_memory.py +62 -0
  275. loopx/capabilities/value_connectors/__init__.py +1 -0
  276. loopx/capabilities/value_connectors/cli.py +401 -0
  277. loopx/capabilities/value_connectors/finance_extension_migration.py +108 -0
  278. loopx/capabilities/value_connectors/install_check.py +147 -0
  279. loopx/capabilities/value_connectors/planner.py +733 -0
  280. loopx/capabilities/value_connectors/source_map.py +446 -0
  281. loopx/claude_goal_baseline.py +138 -0
  282. loopx/claude_goal_mode/__init__.py +23 -0
  283. loopx/claude_goal_mode/hooks/goal_policy.py +212 -0
  284. loopx/claude_goal_mode/hooks/goal_state.py +139 -0
  285. loopx/claude_goal_mode/mcp/loopx_mcp.py +167 -0
  286. loopx/claude_goal_mode/scripts/connect.py +103 -0
  287. loopx/claude_goal_mode/scripts/goalmode_cmd.py +241 -0
  288. loopx/claude_goal_mode/scripts/install.py +328 -0
  289. loopx/claude_goal_mode/statusline/goal_status.py +97 -0
  290. loopx/cli.py +836 -0
  291. loopx/cli_commands/__init__.py +334 -0
  292. loopx/cli_commands/_host_thread.py +13 -0
  293. loopx/cli_commands/agentissue_runner_flow.py +447 -0
  294. loopx/cli_commands/agents_last_exam.py +160 -0
  295. loopx/cli_commands/agents_last_exam_baked_input.py +302 -0
  296. loopx/cli_commands/agents_last_exam_host_codex.py +374 -0
  297. loopx/cli_commands/agents_last_exam_launch_dry_run.py +372 -0
  298. loopx/cli_commands/agents_last_exam_local_plan.py +322 -0
  299. loopx/cli_commands/agents_last_exam_runner_source.py +352 -0
  300. loopx/cli_commands/agents_last_exam_task_material.py +335 -0
  301. loopx/cli_commands/agents_last_exam_validation_gate.py +236 -0
  302. loopx/cli_commands/benchmark_boundary.py +499 -0
  303. loopx/cli_commands/benchmark_dispatch.py +161 -0
  304. loopx/cli_commands/benchmark_release_outcome.py +123 -0
  305. loopx/cli_commands/benchmark_review_lifecycle.py +1275 -0
  306. loopx/cli_commands/benchmark_run_ledger.py +763 -0
  307. loopx/cli_commands/benchmark_run_ledger_case_analysis.py +249 -0
  308. loopx/cli_commands/benchmark_run_ledger_classification.py +45 -0
  309. loopx/cli_commands/benchmark_run_ledger_maintenance.py +486 -0
  310. loopx/cli_commands/benchmark_run_ledger_maintenance_registration.py +342 -0
  311. loopx/cli_commands/benchmark_run_ledger_maintenance_rendering.py +233 -0
  312. loopx/cli_commands/benchmark_run_ledger_parity.py +92 -0
  313. loopx/cli_commands/bootstrap_connect.py +238 -0
  314. loopx/cli_commands/canary.py +707 -0
  315. loopx/cli_commands/canary_release_qualification.py +79 -0
  316. loopx/cli_commands/capability.py +96 -0
  317. loopx/cli_commands/doctor.py +43 -0
  318. loopx/cli_commands/dreaming.py +143 -0
  319. loopx/cli_commands/edgebench.py +205 -0
  320. loopx/cli_commands/evidence_log.py +275 -0
  321. loopx/cli_commands/explore.py +989 -0
  322. loopx/cli_commands/explore_planning_commands.py +157 -0
  323. loopx/cli_commands/extension.py +271 -0
  324. loopx/cli_commands/first_run_report.py +73 -0
  325. loopx/cli_commands/goal_channel.py +656 -0
  326. loopx/cli_commands/handoff_mode.py +158 -0
  327. loopx/cli_commands/history.py +622 -0
  328. loopx/cli_commands/host_mode_plan.py +113 -0
  329. loopx/cli_commands/lark_inbox.py +431 -0
  330. loopx/cli_commands/lark_kanban.py +629 -0
  331. loopx/cli_commands/ml_experiment.py +321 -0
  332. loopx/cli_commands/multi_agent.py +211 -0
  333. loopx/cli_commands/opencode2_goal_worker.py +217 -0
  334. loopx/cli_commands/pr_review.py +167 -0
  335. loopx/cli_commands/presentation.py +218 -0
  336. loopx/cli_commands/preset.py +96 -0
  337. loopx/cli_commands/project.py +150 -0
  338. loopx/cli_commands/project_lifecycle.py +915 -0
  339. loopx/cli_commands/quota.py +859 -0
  340. loopx/cli_commands/quota_registration.py +241 -0
  341. loopx/cli_commands/quota_request.py +113 -0
  342. loopx/cli_commands/ready_score.py +110 -0
  343. loopx/cli_commands/registry_admin.py +975 -0
  344. loopx/cli_commands/registry_admin_configure.py +344 -0
  345. loopx/cli_commands/registry_admin_peer.py +84 -0
  346. loopx/cli_commands/registry_authority.py +218 -0
  347. loopx/cli_commands/review_batch.py +146 -0
  348. loopx/cli_commands/slash_commands.py +145 -0
  349. loopx/cli_commands/start_goal.py +251 -0
  350. loopx/cli_commands/starter.py +175 -0
  351. loopx/cli_commands/starter_bootstrap.py +179 -0
  352. loopx/cli_commands/starter_bootstrap_registration.py +198 -0
  353. loopx/cli_commands/starter_runtime_idle.py +107 -0
  354. loopx/cli_commands/starter_scheduler.py +207 -0
  355. loopx/cli_commands/starter_session_runtime.py +152 -0
  356. loopx/cli_commands/starter_visible_common.py +54 -0
  357. loopx/cli_commands/starter_visible_driver.py +161 -0
  358. loopx/cli_commands/starter_visible_pilot.py +278 -0
  359. loopx/cli_commands/status.py +867 -0
  360. loopx/cli_commands/status_registration.py +239 -0
  361. loopx/cli_commands/summary_all.py +222 -0
  362. loopx/cli_commands/support_control.py +809 -0
  363. loopx/cli_commands/support_control_registry.py +68 -0
  364. loopx/cli_commands/support_control_supervisor.py +289 -0
  365. loopx/cli_commands/task_lease.py +306 -0
  366. loopx/cli_commands/terminal_bench_adapter.py +717 -0
  367. loopx/cli_commands/terminal_bench_environment_result.py +1246 -0
  368. loopx/cli_commands/todo.py +940 -0
  369. loopx/cli_commands/todo_argument_validation.py +572 -0
  370. loopx/cli_commands/todo_event.py +114 -0
  371. loopx/cli_commands/turn.py +804 -0
  372. loopx/cli_commands/version.py +46 -0
  373. loopx/cli_commands/worker_bridge.py +659 -0
  374. loopx/cli_rollout.py +314 -0
  375. loopx/codex_cli_goal_tui.py +672 -0
  376. loopx/codex_cli_probe.py +1530 -0
  377. loopx/codex_cli_probe_markdown.py +935 -0
  378. loopx/codex_cli_runtime_probe.py +733 -0
  379. loopx/codex_cli_scheduler.py +564 -0
  380. loopx/codex_goal_baseline.py +620 -0
  381. loopx/configuration_catalog.py +617 -0
  382. loopx/configure_goal.py +1375 -0
  383. loopx/contract.py +996 -0
  384. loopx/control_plane/__init__.py +71 -0
  385. loopx/control_plane/agents/__init__.py +1 -0
  386. loopx/control_plane/agents/agent_lane_recommendation.py +516 -0
  387. loopx/control_plane/agents/agent_scope.py +1578 -0
  388. loopx/control_plane/agents/agent_scope_frontier.py +60 -0
  389. loopx/control_plane/agents/capability_gate.py +531 -0
  390. loopx/control_plane/agents/identity.py +140 -0
  391. loopx/control_plane/agents/legacy_migration.py +169 -0
  392. loopx/control_plane/agents/management_projection.py +658 -0
  393. loopx/control_plane/agents/material_frontier.py +608 -0
  394. loopx/control_plane/agents/material_handoff.py +156 -0
  395. loopx/control_plane/agents/multi_agent/__init__.py +1 -0
  396. loopx/control_plane/agents/multi_agent/codex_executable.py +207 -0
  397. loopx/control_plane/agents/multi_agent/collective_round_ledger.py +387 -0
  398. loopx/control_plane/agents/multi_agent/contract.py +474 -0
  399. loopx/control_plane/agents/multi_agent/recipe.py +110 -0
  400. loopx/control_plane/agents/multi_agent/role_successor.py +297 -0
  401. loopx/control_plane/agents/multi_agent/runtime_scripts.py +426 -0
  402. loopx/control_plane/agents/multi_agent/visible_launch_policy.py +149 -0
  403. loopx/control_plane/agents/multi_agent/visible_wake_scheduler.py +392 -0
  404. loopx/control_plane/agents/profile.py +216 -0
  405. loopx/control_plane/agents/runtime_model.py +73 -0
  406. loopx/control_plane/agents/subagent_activity.py +164 -0
  407. loopx/control_plane/agents/supervisor.py +544 -0
  408. loopx/control_plane/agents/supervisor_events.py +462 -0
  409. loopx/control_plane/agents/supervisor_inject.py +204 -0
  410. loopx/control_plane/agents/work_mode.py +56 -0
  411. loopx/control_plane/agents/workspace_guard.py +364 -0
  412. loopx/control_plane/effect_program.py +644 -0
  413. loopx/control_plane/goals/__init__.py +1 -0
  414. loopx/control_plane/goals/active_state_event_projection.py +103 -0
  415. loopx/control_plane/goals/active_state_metadata.py +47 -0
  416. loopx/control_plane/goals/active_state_sections.py +58 -0
  417. loopx/control_plane/goals/configure_goal_service.py +354 -0
  418. loopx/control_plane/goals/contract_health.py +132 -0
  419. loopx/control_plane/goals/dreaming.py +152 -0
  420. loopx/control_plane/goals/global_registry_health.py +199 -0
  421. loopx/control_plane/goals/global_registry_shadow.py +33 -0
  422. loopx/control_plane/goals/goal_channel.py +34 -0
  423. loopx/control_plane/goals/goal_channel_projection.py +560 -0
  424. loopx/control_plane/goals/goal_frontier/__init__.py +1917 -0
  425. loopx/control_plane/goals/goal_frontier/ack_policy.py +149 -0
  426. loopx/control_plane/goals/goal_frontier/outcome_continuity.py +437 -0
  427. loopx/control_plane/goals/goal_frontier/replan_rules.py +210 -0
  428. loopx/control_plane/goals/goal_frontier/semantic_history.py +314 -0
  429. loopx/control_plane/goals/goal_frontier/terminal.py +180 -0
  430. loopx/control_plane/goals/goal_vision.py +443 -0
  431. loopx/control_plane/goals/goal_vision_policy.py +36 -0
  432. loopx/control_plane/goals/goal_vision_state.py +62 -0
  433. loopx/control_plane/goals/goal_vision_wait.py +290 -0
  434. loopx/control_plane/goals/path_resolution.py +20 -0
  435. loopx/control_plane/goals/start_contract.py +206 -0
  436. loopx/control_plane/goals/vision_checkpoint.py +92 -0
  437. loopx/control_plane/handoff/__init__.py +1 -0
  438. loopx/control_plane/handoff/cross_runtime_impl_review.py +311 -0
  439. loopx/control_plane/handoff/delivery_contract.py +161 -0
  440. loopx/control_plane/handoff/handoff_runs.py +71 -0
  441. loopx/control_plane/handoff/project_handoff.py +155 -0
  442. loopx/control_plane/handoff/review_batch.py +463 -0
  443. loopx/control_plane/handoff/review_packet_context.py +216 -0
  444. loopx/control_plane/heartbeat/agent.py +173 -0
  445. loopx/control_plane/heartbeat/budget.py +66 -0
  446. loopx/control_plane/heartbeat/builder.py +501 -0
  447. loopx/control_plane/heartbeat/host.py +64 -0
  448. loopx/control_plane/heartbeat/rules.py +68 -0
  449. loopx/control_plane/heartbeat/task_body.py +759 -0
  450. loopx/control_plane/heartbeat/visible_goal.py +86 -0
  451. loopx/control_plane/projects/__init__.py +1 -0
  452. loopx/control_plane/projects/contract.py +25 -0
  453. loopx/control_plane/projects/registry.py +663 -0
  454. loopx/control_plane/quota/__init__.py +1 -0
  455. loopx/control_plane/quota/cli_projection.py +704 -0
  456. loopx/control_plane/quota/decision_summary.py +431 -0
  457. loopx/control_plane/quota/effect_program.py +152 -0
  458. loopx/control_plane/quota/error_codes.py +19 -0
  459. loopx/control_plane/quota/goal_boundary.py +464 -0
  460. loopx/control_plane/quota/heartbeat_receipt.py +277 -0
  461. loopx/control_plane/quota/heartbeat_recommendation.py +718 -0
  462. loopx/control_plane/quota/host_poll_receipts.py +162 -0
  463. loopx/control_plane/quota/live_decision.py +142 -0
  464. loopx/control_plane/quota/monitor_poll.py +786 -0
  465. loopx/control_plane/quota/policy_constants.py +40 -0
  466. loopx/control_plane/quota/projection_repair.py +262 -0
  467. loopx/control_plane/quota/recent_runs.py +210 -0
  468. loopx/control_plane/quota/scheduler_ack.py +490 -0
  469. loopx/control_plane/quota/selected_todo_projection.py +139 -0
  470. loopx/control_plane/quota/settlement.py +437 -0
  471. loopx/control_plane/quota/settlement_cli.py +246 -0
  472. loopx/control_plane/quota/settlement_validation.py +64 -0
  473. loopx/control_plane/quota/settlement_workspace_causality.py +180 -0
  474. loopx/control_plane/quota/should_run.py +249 -0
  475. loopx/control_plane/quota/should_run_packet.py +1165 -0
  476. loopx/control_plane/quota/should_run_prepare.py +675 -0
  477. loopx/control_plane/quota/slot_accounting.py +1123 -0
  478. loopx/control_plane/quota/spend_sources.py +11 -0
  479. loopx/control_plane/quota/stall_repair.py +397 -0
  480. loopx/control_plane/quota/states.py +29 -0
  481. loopx/control_plane/quota/task_orchestration.py +448 -0
  482. loopx/control_plane/quota/task_orchestration_admission.py +497 -0
  483. loopx/control_plane/quota/turn_envelope.py +889 -0
  484. loopx/control_plane/quota/usage_summary.py +140 -0
  485. loopx/control_plane/reward_memory.py +43 -0
  486. loopx/control_plane/runtime/__init__.py +2 -0
  487. loopx/control_plane/runtime/active_user_assisted_pilot.py +275 -0
  488. loopx/control_plane/runtime/agent_scoped_evidence_log.py +435 -0
  489. loopx/control_plane/runtime/decision_freshness.py +203 -0
  490. loopx/control_plane/runtime/event_ledger.py +197 -0
  491. loopx/control_plane/runtime/event_store_migration_bridge.py +196 -0
  492. loopx/control_plane/runtime/goal_project_route.py +70 -0
  493. loopx/control_plane/runtime/local_state_write_correctness.py +242 -0
  494. loopx/control_plane/runtime/promotion_readiness.py +152 -0
  495. loopx/control_plane/runtime/public_safety.py +120 -0
  496. loopx/control_plane/runtime/run_artifacts.py +78 -0
  497. loopx/control_plane/runtime/run_compaction.py +397 -0
  498. loopx/control_plane/runtime/run_context_retention.py +241 -0
  499. loopx/control_plane/runtime/run_history.py +132 -0
  500. loopx/control_plane/runtime/run_index_duplicates.py +205 -0
  501. loopx/control_plane/runtime/run_index_rebuild.py +263 -0
  502. loopx/control_plane/runtime/run_ingest_health.py +336 -0
  503. loopx/control_plane/runtime/runtime_projection_route.py +624 -0
  504. loopx/control_plane/runtime/runtime_projection_writer.py +98 -0
  505. loopx/control_plane/runtime/session_runtime.py +339 -0
  506. loopx/control_plane/runtime/shared_runtime_material_projection.py +332 -0
  507. loopx/control_plane/runtime/shared_runtime_refresh_projection.py +183 -0
  508. loopx/control_plane/runtime/stale_latest_run.py +90 -0
  509. loopx/control_plane/runtime/status_classifications.py +49 -0
  510. loopx/control_plane/runtime/status_projection_cache.py +235 -0
  511. loopx/control_plane/runtime/stride_observation.py +144 -0
  512. loopx/control_plane/runtime/time.py +39 -0
  513. loopx/control_plane/runtime/trajectory_hygiene.py +149 -0
  514. loopx/control_plane/runtime/validation_command.py +69 -0
  515. loopx/control_plane/scheduler/__init__.py +1 -0
  516. loopx/control_plane/scheduler/ack.py +329 -0
  517. loopx/control_plane/scheduler/arbitration.py +188 -0
  518. loopx/control_plane/scheduler/automation_liveness.py +183 -0
  519. loopx/control_plane/scheduler/execution_context.py +555 -0
  520. loopx/control_plane/scheduler/external_evidence_observation.py +428 -0
  521. loopx/control_plane/scheduler/monitor_display.py +143 -0
  522. loopx/control_plane/scheduler/monitor_poll_policy.py +161 -0
  523. loopx/control_plane/scheduler/monitor_poll_writeback.py +351 -0
  524. loopx/control_plane/scheduler/monitor_target.py +64 -0
  525. loopx/control_plane/scheduler/monitor_todo.py +146 -0
  526. loopx/control_plane/scheduler/monitor_wait.py +237 -0
  527. loopx/control_plane/scheduler/scheduler_hint.py +1284 -0
  528. loopx/control_plane/scheduler/state.py +354 -0
  529. loopx/control_plane/scheduler/state_transition_rules.py +179 -0
  530. loopx/control_plane/scheduler/time.py +10 -0
  531. loopx/control_plane/settlement_driver.py +293 -0
  532. loopx/control_plane/status/__init__.py +6 -0
  533. loopx/control_plane/status/active_state_projection.py +105 -0
  534. loopx/control_plane/status/agent_lane_projection.py +375 -0
  535. loopx/control_plane/status/attention_projection.py +74 -0
  536. loopx/control_plane/status/autonomous_replan_projection.py +103 -0
  537. loopx/control_plane/status/collection.py +140 -0
  538. loopx/control_plane/status/contract_projection.py +31 -0
  539. loopx/control_plane/status/dreaming_projection.py +52 -0
  540. loopx/control_plane/status/goal_attention_projection.py +157 -0
  541. loopx/control_plane/status/lifecycle_projection.py +110 -0
  542. loopx/control_plane/status/monitor_display_projection.py +69 -0
  543. loopx/control_plane/status/registry_health_projection.py +75 -0
  544. loopx/control_plane/status/run_projection.py +70 -0
  545. loopx/control_plane/status/runtime_summaries.py +161 -0
  546. loopx/control_plane/testing/__init__.py +1 -0
  547. loopx/control_plane/testing/actual_default_model_behavior_portfolio.py +1371 -0
  548. loopx/control_plane/testing/canary_harness.py +182 -0
  549. loopx/control_plane/testing/capability_monitor_repair_tool_behavior.py +674 -0
  550. loopx/control_plane/testing/cli_output_budget.py +807 -0
  551. loopx/control_plane/testing/cli_output_differential.py +250 -0
  552. loopx/control_plane/testing/cli_output_semantics.py +87 -0
  553. loopx/control_plane/testing/control_plane_composition_scenarios.py +225 -0
  554. loopx/control_plane/testing/decision_replay.py +268 -0
  555. loopx/control_plane/testing/doubao_model_behavior_actor.py +559 -0
  556. loopx/control_plane/testing/model_behavior_corpus.py +344 -0
  557. loopx/control_plane/testing/model_behavior_qualification.py +769 -0
  558. loopx/control_plane/testing/model_behavior_retained_cases.py +235 -0
  559. loopx/control_plane/testing/model_tool_behavior.py +536 -0
  560. loopx/control_plane/testing/onboarding_model_behavior_qualification.py +642 -0
  561. loopx/control_plane/testing/quota_fixtures.py +208 -0
  562. loopx/control_plane/testing/quota_should_run_parity.py +57 -0
  563. loopx/control_plane/testing/release_commit_qualification.py +671 -0
  564. loopx/control_plane/testing/replan_semantic_action_behavior.py +1302 -0
  565. loopx/control_plane/testing/scoped_gate_successor_tool_behavior.py +527 -0
  566. loopx/control_plane/testing/selected_todo_tool_behavior.py +1002 -0
  567. loopx/control_plane/testing/terminal_settlement_tool_behavior.py +656 -0
  568. loopx/control_plane/todos/__init__.py +1 -0
  569. loopx/control_plane/todos/active_state_editing.py +296 -0
  570. loopx/control_plane/todos/active_state_todo_parser.py +138 -0
  571. loopx/control_plane/todos/active_state_todos.py +175 -0
  572. loopx/control_plane/todos/addition.py +103 -0
  573. loopx/control_plane/todos/claim_visibility.py +253 -0
  574. loopx/control_plane/todos/completed_archive.py +139 -0
  575. loopx/control_plane/todos/completion_fence.py +49 -0
  576. loopx/control_plane/todos/completion_policy.py +153 -0
  577. loopx/control_plane/todos/completion_validation.py +248 -0
  578. loopx/control_plane/todos/completion_validation_accountability.py +27 -0
  579. loopx/control_plane/todos/completion_validation_projection.py +57 -0
  580. loopx/control_plane/todos/contract.py +1476 -0
  581. loopx/control_plane/todos/decision_scope.py +554 -0
  582. loopx/control_plane/todos/deferred_resume.py +546 -0
  583. loopx/control_plane/todos/durable_completion.py +201 -0
  584. loopx/control_plane/todos/event_writeback.py +484 -0
  585. loopx/control_plane/todos/frontier_deadline.py +132 -0
  586. loopx/control_plane/todos/handoff_gate.py +283 -0
  587. loopx/control_plane/todos/handoff_mode.py +444 -0
  588. loopx/control_plane/todos/handoff_note.py +202 -0
  589. loopx/control_plane/todos/line_update.py +361 -0
  590. loopx/control_plane/todos/list_projection.py +205 -0
  591. loopx/control_plane/todos/markdown.py +199 -0
  592. loopx/control_plane/todos/monitor_metadata.py +88 -0
  593. loopx/control_plane/todos/mutation_authority.py +299 -0
  594. loopx/control_plane/todos/projection.py +655 -0
  595. loopx/control_plane/todos/quota_summary.py +1138 -0
  596. loopx/control_plane/todos/route_continuation.py +267 -0
  597. loopx/control_plane/todos/succession_warning.py +174 -0
  598. loopx/control_plane/todos/summary_item.py +223 -0
  599. loopx/control_plane/todos/text.py +30 -0
  600. loopx/control_plane/todos/todo_index.py +226 -0
  601. loopx/control_plane/todos/todo_summary.py +1458 -0
  602. loopx/control_plane/todos/unblock_resume.py +326 -0
  603. loopx/control_plane/todos/user_gate.py +263 -0
  604. loopx/control_plane/todos/write_hint.py +63 -0
  605. loopx/control_plane/todos/write_policy.py +135 -0
  606. loopx/control_plane/turn_driver/__init__.py +85 -0
  607. loopx/control_plane/turn_driver/codex_cli.py +502 -0
  608. loopx/control_plane/turn_driver/driver.py +355 -0
  609. loopx/control_plane/turn_driver/executor.py +1468 -0
  610. loopx/control_plane/turn_driver/loop_controller.py +669 -0
  611. loopx/control_plane/turn_driver/settlement.py +318 -0
  612. loopx/control_plane/turn_driver/transaction.py +375 -0
  613. loopx/control_plane/work_items/__init__.py +1 -0
  614. loopx/control_plane/work_items/attention_fields.py +56 -0
  615. loopx/control_plane/work_items/attention_item.py +77 -0
  616. loopx/control_plane/work_items/attention_queue.py +322 -0
  617. loopx/control_plane/work_items/attention_routing.py +213 -0
  618. loopx/control_plane/work_items/autonomous_candidates.py +135 -0
  619. loopx/control_plane/work_items/autonomous_replan_ack.py +276 -0
  620. loopx/control_plane/work_items/autonomous_replan_obligation.py +786 -0
  621. loopx/control_plane/work_items/backlog_hygiene.py +59 -0
  622. loopx/control_plane/work_items/capability_monitor_fallback.py +221 -0
  623. loopx/control_plane/work_items/delivery_batch_scale.py +66 -0
  624. loopx/control_plane/work_items/delivery_outcome.py +152 -0
  625. loopx/control_plane/work_items/delivery_signals.py +113 -0
  626. loopx/control_plane/work_items/execution_obligation.py +235 -0
  627. loopx/control_plane/work_items/goal_route_hint.py +320 -0
  628. loopx/control_plane/work_items/interaction_contract.py +1540 -0
  629. loopx/control_plane/work_items/issue_meta_surface.py +159 -0
  630. loopx/control_plane/work_items/lifecycle.py +139 -0
  631. loopx/control_plane/work_items/operator_inbox.py +266 -0
  632. loopx/control_plane/work_items/outcome_followthrough.py +69 -0
  633. loopx/control_plane/work_items/primary_action.py +326 -0
  634. loopx/control_plane/work_items/progress_observation.py +630 -0
  635. loopx/control_plane/work_items/project_asset.py +675 -0
  636. loopx/control_plane/work_items/repair_delta.py +693 -0
  637. loopx/control_plane/work_items/runtime_capability_reentry.py +168 -0
  638. loopx/control_plane/work_items/semantic_replan_writeback.py +177 -0
  639. loopx/control_plane/work_items/status_contract.py +49 -0
  640. loopx/control_plane/work_items/task_graph.py +1046 -0
  641. loopx/control_plane/work_items/task_lease.py +1254 -0
  642. loopx/control_plane/work_items/task_lease_settlement.py +422 -0
  643. loopx/control_plane/work_items/work_lane.py +510 -0
  644. loopx/control_plane/work_items/work_lane_context.py +161 -0
  645. loopx/demo.py +247 -0
  646. loopx/diagnose.py +633 -0
  647. loopx/doctor.py +1251 -0
  648. loopx/domain_packs/__init__.py +1 -0
  649. loopx/domain_packs/issue_fix.py +571 -0
  650. loopx/domain_packs/ml_experiment.py +854 -0
  651. loopx/domain_state.py +137 -0
  652. loopx/dreaming.py +706 -0
  653. loopx/entrypoint.py +16 -0
  654. loopx/event_sourced_state.py +981 -0
  655. loopx/execution_profile.py +286 -0
  656. loopx/experiments/__init__.py +1 -0
  657. loopx/experiments/planner_worker/__init__.py +1 -0
  658. loopx/experiments/planner_worker/contract.py +523 -0
  659. loopx/experiments/planner_worker/runtime.py +391 -0
  660. loopx/experiments/planner_worker/traex.py +461 -0
  661. loopx/explore_graph.py +11 -0
  662. loopx/extensions/__init__.py +1 -0
  663. loopx/extensions/bundled.py +28 -0
  664. loopx/extensions/execution_envelope.py +126 -0
  665. loopx/extensions/lark/__init__.py +11 -0
  666. loopx/extensions/lark/event_collector.py +478 -0
  667. loopx/extensions/lark/event_collector_runtime.py +506 -0
  668. loopx/extensions/lark/event_inbox.py +454 -0
  669. loopx/extensions/lark/extension.toml +88 -0
  670. loopx/extensions/lark/goal_channel.py +44 -0
  671. loopx/extensions/lark/goal_channel_contracts.py +388 -0
  672. loopx/extensions/lark/goal_channel_lifecycle.py +218 -0
  673. loopx/extensions/lark/goal_channel_runtime.py +792 -0
  674. loopx/extensions/lark/goal_channel_setup.py +805 -0
  675. loopx/extensions/lark/goal_channel_targets.py +215 -0
  676. loopx/extensions/lark/goal_channel_transport.py +281 -0
  677. loopx/extensions/lark/inbox_reactions.py +650 -0
  678. loopx/extensions/lark/inbox_reply.py +430 -0
  679. loopx/extensions/lark/presentation/__init__.py +11 -0
  680. loopx/extensions/lark/presentation/explore_results.py +2276 -0
  681. loopx/extensions/lark/presentation/explore_singleflight.py +127 -0
  682. loopx/extensions/lark/presentation/explore_source_guard.py +121 -0
  683. loopx/extensions/lark/presentation/explore_stage_document.py +703 -0
  684. loopx/extensions/lark/presentation/explore_visual_integrity.py +122 -0
  685. loopx/extensions/lark/presentation/explore_visual_readback.py +452 -0
  686. loopx/extensions/lark/presentation/explore_visual_styles.py +156 -0
  687. loopx/extensions/lark/presentation/issue_fix_surface.py +612 -0
  688. loopx/extensions/lark/presentation/kanban.py +2791 -0
  689. loopx/extensions/lark/presentation/message_card.py +112 -0
  690. loopx/extensions/lark/presentation/periodic_report.py +261 -0
  691. loopx/extensions/lark/presentation/projection_rows.py +600 -0
  692. loopx/extensions/lark/presentation/record_io.py +95 -0
  693. loopx/extensions/lark/presentation/sync_receipt.py +145 -0
  694. loopx/extensions/lark/private_json.py +40 -0
  695. loopx/extensions/lark/provider.py +86 -0
  696. loopx/extensions/lark/reviewer_notification.py +604 -0
  697. loopx/extensions/manifest.py +385 -0
  698. loopx/extensions/openviking_periodic_report/__init__.py +17 -0
  699. loopx/extensions/openviking_periodic_report/activation.py +173 -0
  700. loopx/extensions/openviking_periodic_report/extension.toml +17 -0
  701. loopx/extensions/openviking_periodic_report/provider.py +355 -0
  702. loopx/extensions/openviking_periodic_report/sink.py +117 -0
  703. loopx/extensions/openviking_semantic_preference/__init__.py +5 -0
  704. loopx/extensions/openviking_semantic_preference/extension.toml +16 -0
  705. loopx/extensions/openviking_semantic_preference/history_export.py +484 -0
  706. loopx/extensions/openviking_semantic_preference/project_peer.py +68 -0
  707. loopx/extensions/openviking_semantic_preference/provider.py +312 -0
  708. loopx/extensions/presentation.py +979 -0
  709. loopx/extensions/process_runtime.py +204 -0
  710. loopx/extensions/readiness.py +168 -0
  711. loopx/extensions/runtime.py +931 -0
  712. loopx/extensions/scaffold.py +335 -0
  713. loopx/feedback.py +581 -0
  714. loopx/file_lock.py +382 -0
  715. loopx/global_registry.py +842 -0
  716. loopx/global_risks.py +970 -0
  717. loopx/global_todos.py +568 -0
  718. loopx/handoff_budget.py +28 -0
  719. loopx/heartbeat_prequota.py +80 -0
  720. loopx/heartbeat_prompt.py +159 -0
  721. loopx/help_surface.py +516 -0
  722. loopx/history.py +1507 -0
  723. loopx/host_loop_activation.py +1311 -0
  724. loopx/host_mode_planner.py +991 -0
  725. loopx/install_contract.py +1 -0
  726. loopx/interface_budget.py +196 -0
  727. loopx/long_task_cadence.py +208 -0
  728. loopx/materials.py +185 -0
  729. loopx/ml_experiment.py +3 -0
  730. loopx/onboarding.py +214 -0
  731. loopx/opencode2_goal_mode/README.md +81 -0
  732. loopx/opencode2_goal_mode/__init__.py +9 -0
  733. loopx/opencode2_goal_mode/opencode2-goal-worker.mjs +1018 -0
  734. loopx/opencode_goal_mode/README.md +99 -0
  735. loopx/opencode_goal_mode/__init__.py +13 -0
  736. loopx/opencode_goal_mode/goal-bridge-runtime.mjs +858 -0
  737. loopx/opencode_goal_mode/loopx-goal.js +8 -0
  738. loopx/operator_gate.py +420 -0
  739. loopx/orchestration.py +127 -0
  740. loopx/paths.py +59 -0
  741. loopx/pi_goal_mode/README.md +67 -0
  742. loopx/pi_goal_mode/__init__.py +13 -0
  743. loopx/pi_goal_mode/loopx-goal.ts +254 -0
  744. loopx/pi_goal_mode/pi-goal-loop-runtime.mjs +574 -0
  745. loopx/pr_review.py +1206 -0
  746. loopx/presentation/__init__.py +1 -0
  747. loopx/presentation/explore_views.py +1334 -0
  748. loopx/presentation/markdown.py +61 -0
  749. loopx/presentation/projection_source_reconcile.py +140 -0
  750. loopx/presentation/public_safety.py +42 -0
  751. loopx/presentation/renderers/__init__.py +17 -0
  752. loopx/presentation/renderers/goal_channel_html.py +269 -0
  753. loopx/presentation/renderers/periodic_report_html.py +786 -0
  754. loopx/presentation/renderers/periodic_report_markdown.py +184 -0
  755. loopx/presentation/renderers/quota_event_markdown.py +116 -0
  756. loopx/presentation/renderers/quota_markdown.py +1112 -0
  757. loopx/presentation/renderers/status_markdown.py +1570 -0
  758. loopx/presentation/renderers/trajectory_hygiene_markdown.py +39 -0
  759. loopx/presentation/renderers/turn_envelope_markdown.py +33 -0
  760. loopx/presentation/sinks/__init__.py +5 -0
  761. loopx/presentation/sinks/openviking_periodic_report.py +7 -0
  762. loopx/presentation/static_site.py +691 -0
  763. loopx/presets.py +369 -0
  764. loopx/project_alias.py +217 -0
  765. loopx/project_map.py +589 -0
  766. loopx/project_prompt.py +1153 -0
  767. loopx/project_skill_cli.py +125 -0
  768. loopx/project_skill_delivery.py +470 -0
  769. loopx/project_uninstall.py +462 -0
  770. loopx/promotion_gate.py +197 -0
  771. loopx/quota.py +1197 -0
  772. loopx/ready_score.py +413 -0
  773. loopx/registry.py +621 -0
  774. loopx/registry_writability.py +64 -0
  775. loopx/release_candidate.py +148 -0
  776. loopx/release_manifest.py +316 -0
  777. loopx/repository_identity.py +100 -0
  778. loopx/review_packet.py +1024 -0
  779. loopx/rollout_event_log.py +505 -0
  780. loopx/runtime.py +112 -0
  781. loopx/self_update.py +750 -0
  782. loopx/session_runtime.py +418 -0
  783. loopx/skill_install_readback.py +500 -0
  784. loopx/slash_command_install.py +1393 -0
  785. loopx/slash_commands.py +264 -0
  786. loopx/state_backup.py +573 -0
  787. loopx/state_migration.py +350 -0
  788. loopx/state_projection.py +809 -0
  789. loopx/state_refresh.py +1416 -0
  790. loopx/status.py +1383 -0
  791. loopx/status_server.py +935 -0
  792. loopx/summary_all.py +725 -0
  793. loopx/terminal_bench_agent.py +2056 -0
  794. loopx/thread_agent_binding.py +408 -0
  795. loopx/todo_followups.py +168 -0
  796. loopx/todo_suggestion_prompt.py +204 -0
  797. loopx/todos.py +2229 -0
  798. loopx/turn_identity.py +17 -0
  799. loopx/upgrade.py +1083 -0
  800. loopx/visible_governance.py +667 -0
  801. loopx/visible_multi_agent_launcher.py +1253 -0
  802. loopx/visible_multi_agent_tmux.py +429 -0
  803. loopx/worker_bridge.py +1574 -0
  804. loopx-0.4.8.dist-info/METADATA +708 -0
  805. loopx-0.4.8.dist-info/RECORD +811 -0
  806. loopx-0.4.8.dist-info/WHEEL +5 -0
  807. loopx-0.4.8.dist-info/entry_points.txt +5 -0
  808. loopx-0.4.8.dist-info/licenses/LICENSE +202 -0
  809. loopx-0.4.8.dist-info/licenses/LICENSE-MIT +21 -0
  810. loopx-0.4.8.dist-info/licenses/NOTICE +6 -0
  811. loopx-0.4.8.dist-info/top_level.txt +1 -0
@@ -0,0 +1,759 @@
1
+ """Heartbeat task body renderers inside the heartbeat bounded context."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ from .rules import (
8
+ CODEX_NATIVE_GOAL_UNCHANGED_WAIT_RULE,
9
+ DEFAULT_MATERIAL_QUEUE_RULE,
10
+ DEFAULT_PERMISSION_RULE,
11
+ HEARTBEAT_NOTIFICATION_RULE_SHORT,
12
+ HEARTBEAT_NOTIFICATION_RULE_THIN,
13
+ HEARTBEAT_VISION_WRITEBACK_RULE_SHORT,
14
+ HOST_LOOP_QUOTA_DISPATCH_RULE,
15
+ HOST_LOOP_TODO_CLOSEOUT_COMPACT_RULE,
16
+ HOST_LOOP_TODO_CLOSEOUT_RULE,
17
+ RUNTIME_CAPABILITY_PROJECTION_THIN_RULE,
18
+ RUNTIME_EXECUTION_ROUTING_RULE,
19
+ SCHEDULER_HINT_APPLICATION_RULE,
20
+ SCHEDULER_HINT_COMPACT_RULE,
21
+ SCHEDULER_HINT_THIN_RULE,
22
+ USER_TODO_FINAL_MESSAGE_RULE,
23
+ )
24
+
25
+
26
+ def _render_compact_policy_tail(
27
+ *,
28
+ material_queue_rule: str,
29
+ permission_rule: str,
30
+ include_default_permission: bool = False,
31
+ ) -> str:
32
+ parts = [
33
+ "No learning queue unless asked."
34
+ if material_queue_rule == DEFAULT_MATERIAL_QUEUE_RULE
35
+ else material_queue_rule
36
+ ]
37
+ if permission_rule != DEFAULT_PERMISSION_RULE:
38
+ parts.append(permission_rule)
39
+ elif include_default_permission:
40
+ parts.append("No permission asks in a trusted session.")
41
+ return " ".join(parts)
42
+
43
+
44
+ def render_heartbeat_task_body(
45
+ *,
46
+ goal_id: str,
47
+ active_state: str,
48
+ cli_preflight: str,
49
+ pr_review_pre_quota_command: str,
50
+ quota_guard_command: str,
51
+ quota_spend_command: str,
52
+ refresh_state_command: str,
53
+ progress_refresh_state_command: str,
54
+ material_queue_rule: str,
55
+ permission_rule: str,
56
+ cli_bin: str,
57
+ agent_scope_instruction: str,
58
+ expanded_prompt_command: str,
59
+ compact_prompt_command: str,
60
+ brief_prompt_command: str,
61
+ thin_prompt_command: str,
62
+ ) -> str:
63
+ scope_block = f"\n{agent_scope_instruction}\n" if agent_scope_instruction else ""
64
+ pr_review_pre_quota_block = (
65
+ f"{pr_review_pre_quota_command}\n" if pr_review_pre_quota_command else ""
66
+ )
67
+ return f"""Advance `{goal_id}` using `{active_state}`.
68
+
69
+ Generic LoopX lifecycle. Keep project-specific branching out of the
70
+ automation prompt. Put local policy in registry, active-state sections, adapter
71
+ output, `quota should-run.goal_boundary`, or boundary rules; if a lifecycle
72
+ rule is needed, update `{cli_bin} heartbeat-prompt` so all projects inherit it.
73
+ {scope_block}
74
+
75
+ Before spending delivery compute, make the CLI reachable; set
76
+ `LOOPX_TURN=<current_time_iso>` per trigger, reuse it on retries, and run guard:
77
+
78
+ ```bash
79
+ {cli_preflight}
80
+ {pr_review_pre_quota_block}{quota_guard_command}
81
+ ```
82
+
83
+ If that preflight still fails: no work/spend; quiet `DONT_NOTIFY`.
84
+
85
+ `lark_event_inbox`: `reply_due`: drain -> effect/reply/readback/ACK.
86
+
87
+ {USER_TODO_FINAL_MESSAGE_RULE}
88
+ {HEARTBEAT_VISION_WRITEBACK_RULE_SHORT}
89
+
90
+ If the result says `should_run=false`:
91
+
92
+ - Only if `user_channel.notify=NOTIFY`, interpret `state=operator_gate` or
93
+ `notify_user_on_open_todo=true` as a user prompt. Read `gate_prompt`,
94
+ `operator_question`, `user_todo_summary`, and `open_todo_notify_reason`;
95
+ ask one concise Chinese action/question with reply format. If
96
+ `user_todo_summary.open_count > 0`, include up to three `first_open_items`;
97
+ never say "no new user action". Honor
98
+ `open_todo_notification_policy=repeat_until_resolved`; when
99
+ `user_gate_notification_cooldown.notification_suppressed=true`, keep the gate
100
+ pending and quiet until its reminder window/change. No gated delivery/spend.
101
+ No delivery/spend on the gated path.
102
+ - If the payload also says `safe_bypass_allowed=true` and the same gate has
103
+ already been surfaced, the gate blocks only the gated delivery path. You may
104
+ do exactly one bounded safe-bypass step from the Priority Stack that does not
105
+ depend on that gate; validate, write back, refresh accountable progress, spend
106
+ once. Only if `user_channel.notify=NOTIFY`: report the result compactly; if
107
+ `user_todo_summary.open_count > 0`, include those todos; if none exists, report
108
+ the gate. Under `DONT_NOTIFY`, stay quiet after the safe-bypass work.
109
+ - If `effective_action=monitor_quiet_skip`, receipt/stall is written; quiet
110
+ unless replan. On receipt write failure, retry same id. No edits/spend;
111
+ receipts do not self-stop.
112
+ - If `waiting_on=external_evidence` or `state=waiting`, and this automation is
113
+ explicitly a monitor, run at most one bounded read-only observation poll using
114
+ project-approved status/log/metric/marker surfaces named in active state,
115
+ `recommended_action`, or `goal_boundary.next_probe`. Unchanged evidence:
116
+ quiet `DONT_NOTIFY`, no edits, no spend. New eval/fail/complete/blocker/
117
+ approval/CI/deploy/data evidence: write back only allowed canonical
118
+ state/board/ledger, add todos if needed, then spend once after validation.
119
+ Only if `user_channel.notify=NOTIFY`: report the new evidence. Under
120
+ `DONT_NOTIFY`, stay quiet.
121
+ Still do not launch/stop/restart/sync/design code or mutate production unless
122
+ `should_run=true` or the user explicitly authorizes it.
123
+ - Otherwise, do not do implementation work, adapter work, file edits, research,
124
+ or project exploration in this turn. Return a quiet heartbeat `DONT_NOTIFY`
125
+ response with the skip reason.
126
+ {SCHEDULER_HINT_APPLICATION_RULE} Codex App cadence changes are host
127
+ scheduling updates only; they never consume quota or authorize delivery work.
128
+
129
+ If the result says `should_run=true`:
130
+
131
+ 1. Read the active state, Priority Stack, recent progress, and critic.
132
+ When you inspect current LoopX routing, use the current status queue:
133
+ `attention_queue.items` and each item's `project_asset` are authoritative
134
+ for owner, gate, waiting party, and next action. If `project_asset` is absent
135
+ or legacy/raw fallback, raw queue fields are not owner/gate/stop authority. Treat
136
+ `run_history.latest_runs` as evidence and drill-down only; it may be limited
137
+ by status command limits or filters, so do not decide whether a gate is
138
+ pending or approved from latest runs alone. Also inspect `goal_boundary` and
139
+ guard `user_todo_summary`. Stop for an open user/owner todo only when it
140
+ belongs to this goal's guard payload or current project asset and blocks the
141
+ selected path; then use the blocker-push pattern above. Dependency or
142
+ sibling-goal todos found in `attention_queue.items` should be recorded as
143
+ dependency blockers; they must not consume the whole eligible turn. Choose a
144
+ gate-independent P0/P1/P2 candidate for this goal when one exists.
145
+ If `effective_action=outcome_floor_recovery` or
146
+ `recovery_delivery_allowed=true` or
147
+ `safe_bypass_kind=outcome_floor_recovery`, produce the required
148
+ ranker/cross-domain evidence artifact named by `must_advance`, or write back
149
+ the concrete blocker. Do not fall through to ordinary delivery,
150
+ surface propagation, or synthetic-only chains.
151
+ Read `execution_obligation`: `notify` is not an execution gate;
152
+ `must_attempt_work=true` means one bounded segment even with
153
+ `notify=DONT_NOTIFY`; quiet no-op needs `must_attempt_work=false` and
154
+ `user_channel.notify=DONT_NOTIFY`. Use
155
+ `scheduler_hint` for wakeup and unchanged-loop limits. For Codex App:
156
+ `apply_needed=true` -> update `recommended_rrule` once; on success run
157
+ `ack_hint.cli_args`; on failure/timeout do not retry or ack, run
158
+ `failure_hint.cli_args` once. LoopX suppresses that target/host pair until
159
+ either changes; continue under the observed host cadence. Else
160
+ `ack_needed=true` -> run that bound ack directly; else skip.
161
+ LoopX owns reset/progression state. It is scheduling only, not delivery
162
+ permission. Then use
163
+ `heartbeat_recommendation`: `recommended_mode=run_first_read_only_map` means
164
+ run its `command` as a real read-only map, then
165
+ validate/save the `read_only_project_map` result, refresh accountable
166
+ progress, append exactly one heartbeat spend, sync state if needed; notify
167
+ only under `NOTIFY`. If it says
168
+ `recommended_mode=mapped_noop_if_unchanged` with `stop_if_unchanged=true`,
169
+ and you find no new user instruction, owner evidence, agent todo, stale
170
+ source, or safe handoff, return quiet `DONT_NOTIFY`: do not run, edit, or
171
+ spend.
172
+ Check `delivery_batch_scale`, `delivery_outcome`,
173
+ `post_handoff_outcome_gap_streak`, and `handoff_delivery_contract`; for
174
+ repeated-small or surface-only loops, obey the contract.
175
+ 2. Run a short steering audit before choosing work: list at least three
176
+ plausible next-action candidates across different P0/P1/P2 lanes when
177
+ useful; if the same topic has consumed several recent delivery slices, apply
178
+ a continuation check and state why continuing still wins; keep compute quota
179
+ separate from focus quota; record any losing high-value candidate that should
180
+ not be forgotten. Include a product bottleneck lens: ask whether the core
181
+ goal is currently bottlenecked by user experience, agent capability,
182
+ evidence quality, adapter readiness, or priority-rule gaps, and promote one
183
+ concrete bottleneck candidate when it should outrank the nearest local TODO.
184
+ Plan/top todo/route changes need todo/Next Action writeback or no-writeback rationale.
185
+ 3. Run the no-progress self-repair check before choosing delivery work. Obey
186
+ any machine-readable `autonomous_replan_obligation` or
187
+ `execution_obligation.must_attempt_work=true` from `quota should-run`; that
188
+ hard contract overrides a quiet no-op. Count a turn as no-progress only when
189
+ it produced no substantive artifact, adapter/implementation progress,
190
+ gate/user decision, or validation signal. If 2 consecutive eligible
191
+ heartbeats are no-progress loops, run one bounded self-repair/replan segment
192
+ before another quiet no-op. Delete/pause only when that repair path is stuck
193
+ for 2 more eligible turns; no spend for the self-cancel turn.
194
+ 4. Choose one bounded, verifiable progress segment from that audit. It may be a
195
+ coherent batch across related implementation, test, doc, and state-writeback
196
+ files when the write scope is clear and validation is explicit; it should not
197
+ be forced into a tiny single-file step.
198
+ 5. Do that segment only. Stay inside `goal_boundary` when present and keep
199
+ public/private boundaries intact. Public-safe repo publication is not an
200
+ operator gate by itself: for routine public project work, commit, push, and
201
+ PR creation may proceed autonomously after validation and a clean
202
+ public/private boundary scan. Stop and surface a user/controller gate only
203
+ for private or company-internal material, credentials, destructive git
204
+ operations, production actions, or repository rules that explicitly require
205
+ review.
206
+ 6. Run the smallest useful validation.
207
+ 7. Write back changed files, validation, critic, and next action to the active
208
+ state. If a user/owner todo appears, do not hide it in prose: use
209
+ `{cli_bin} todo add --goal-id {goal_id} --role user --task-class user_gate --blocks-agent <agent-id>`
210
+ or `{cli_bin} todo add --goal-id {goal_id} --role user --task-class user_action`.
211
+ Use `--role agent` for project-agent follow-up work.
212
+ {HOST_LOOP_TODO_CLOSEOUT_RULE}
213
+ For the full field contract, see `docs/project-agent-todo-contract.md` in
214
+ the LoopX checkout.
215
+ 8. After validation/writeback, use actual class/scale/outcome; never default or
216
+ upgrade to `multi_surface` / `outcome_progress`. Record accountable delivery:
217
+
218
+ ```bash
219
+ {progress_refresh_state_command}
220
+ ```
221
+
222
+ Spend consumes this causal record; plain state-only refresh cannot replace
223
+ it. Then spend once:
224
+
225
+ ```bash
226
+ {quota_spend_command}
227
+ ```
228
+
229
+ Do not append spend for quiet `should_run=false` skips, preflight failures,
230
+ pure dry-run previews, or duplicate accounting attempts. If
231
+ `should_run=false` but `safe_bypass_allowed=true` and you actually completed
232
+ a bounded safe-bypass step, append this same spend event once after
233
+ validation/writeback.
234
+
235
+ 9. After spend, optionally refresh state-only:
236
+
237
+ ```bash
238
+ {refresh_state_command}
239
+ ```
240
+
241
+ Never emit accountable progress after spend; it creates an unspent record.
242
+
243
+ 10. Return compactly under `interaction_contract.user_channel.notify`:
244
+ `NOTIFY` only for concrete artifact/gate/blocker/self-stop when the
245
+ authority is `NOTIFY`; otherwise stay quiet `DONT_NOTIFY`.
246
+
247
+ {material_queue_rule}
248
+ {permission_rule}"""
249
+ def render_brief_heartbeat_task_body(
250
+ *,
251
+ goal_id: str,
252
+ active_state: str,
253
+ cli_preflight: str,
254
+ pr_review_pre_quota_command: str,
255
+ quota_guard_command: str,
256
+ quota_spend_command: str,
257
+ refresh_state_command: str,
258
+ progress_refresh_state_command: str,
259
+ material_queue_rule: str,
260
+ permission_rule: str,
261
+ cli_bin: str,
262
+ agent_scope_instruction: str,
263
+ expanded_prompt_command: str,
264
+ compact_prompt_command: str,
265
+ brief_prompt_command: str,
266
+ thin_prompt_command: str,
267
+ ) -> str:
268
+ scope_block = f"\n{agent_scope_instruction}\n" if agent_scope_instruction else ""
269
+ pr_review_pre_quota_block = (
270
+ f"{pr_review_pre_quota_command}\n" if pr_review_pre_quota_command else ""
271
+ )
272
+ return f"""Advance `{goal_id}` using `{active_state}`.
273
+
274
+ Brief installed LoopX heartbeat. Thin dispatcher; detail:
275
+ `{compact_prompt_command}`.
276
+ {scope_block}
277
+
278
+ Guard/retry; `LOOPX_TURN=<current_time_iso>`:
279
+
280
+ ```bash
281
+ {cli_preflight}
282
+ {pr_review_pre_quota_block}{quota_guard_command}
283
+ ```
284
+
285
+ Fail:quiet.
286
+
287
+ {HEARTBEAT_NOTIFICATION_RULE_THIN}
288
+ {HEARTBEAT_VISION_WRITEBACK_RULE_SHORT}
289
+
290
+ If `should_run=false`: follow user channel. `monitor_quiet_skip`: receipt/stall
291
+ done; quiet unless replan; write failure: retry same id. External/wait monitor:
292
+ one read-only poll; new evidence -> writeback/spend. Safe bypass if allowed.
293
+ {SCHEDULER_HINT_THIN_RULE}
294
+ `lark_event_inbox`: reply_due: drain_command -> effect/reply/readback/ACK.
295
+
296
+ If `should_run=true`: fetch compact; use `status --limit 3` and
297
+ `review-packet --handoff-only`. Obey
298
+ `execution_obligation`, `effective_action`, `recovery_delivery_allowed`,
299
+ `heartbeat_recommendation`, `safe_bypass_kind=outcome_floor_recovery`,
300
+ `goal_boundary`, `delivery_batch_scale`, `delivery_outcome`, outcome streaks,
301
+ `handoff_delivery_contract`; do 1 bounded segment/batch when
302
+ `execution_obligation.must_attempt_work=true`; if recovery, run
303
+ ranker/cross-domain evidence recovery or blocker writeback;
304
+ validate/writeback/todos; {HOST_LOOP_TODO_CLOSEOUT_COMPACT_RULE} Progress(actual,no upgrade):
305
+ `{progress_refresh_state_command}`
306
+ Spend:
307
+ `{quota_spend_command}`
308
+ Post-spend state:
309
+ `{refresh_state_command}`
310
+
311
+ No spend for quiet skips, preflight failures, blocker-push asks, dry-runs, or
312
+ duplicate accounting. Return only under `user_channel.notify=NOTIFY`; else quiet.
313
+
314
+ {material_queue_rule}
315
+ {permission_rule}"""
316
+ def render_compact_heartbeat_task_body(
317
+ *,
318
+ goal_id: str,
319
+ active_state: str,
320
+ cli_preflight: str,
321
+ pr_review_pre_quota_command: str,
322
+ quota_guard_command: str,
323
+ quota_spend_command: str,
324
+ refresh_state_command: str,
325
+ progress_refresh_state_command: str,
326
+ material_queue_rule: str,
327
+ permission_rule: str,
328
+ cli_bin: str,
329
+ agent_scope_instruction: str,
330
+ expanded_prompt_command: str,
331
+ compact_prompt_command: str,
332
+ brief_prompt_command: str,
333
+ thin_prompt_command: str,
334
+ ) -> str:
335
+ scope_block = f"\n{agent_scope_instruction}\n" if agent_scope_instruction else ""
336
+ pr_review_pre_quota_block = (
337
+ f"{pr_review_pre_quota_command}\n" if pr_review_pre_quota_command else ""
338
+ )
339
+ return f"""Advance `{goal_id}` using `{active_state}`.
340
+
341
+ This compact LoopX heartbeat body; policy:
342
+ registry/state/adapter/`goal_boundary`.
343
+ Expanded lifecycle contract: `{expanded_prompt_command}`.
344
+ {scope_block}
345
+
346
+ Preflight/guard; `LOOPX_TURN=<current_time_iso>`; reuse:
347
+
348
+ ```bash
349
+ {cli_preflight}
350
+ {pr_review_pre_quota_block}{quota_guard_command}
351
+ ```
352
+
353
+ Preflight fail: quiet; no work/spend.
354
+
355
+ {SCHEDULER_HINT_COMPACT_RULE}
356
+ {HEARTBEAT_VISION_WRITEBACK_RULE_SHORT}
357
+
358
+ `lark_event_inbox`: reply_due: drain_command -> effect/reply/readback/ACK.
359
+
360
+ Output policy: authority=`interaction_contract.user_channel.notify`;
361
+ external=`NOTIFY`; quiet=`DONT_NOTIFY`; quiet_missing_action=`internal_repair`.
362
+
363
+ If `should_run=false`: `monitor_quiet_skip` -> receipt/stall; quiet unless
364
+ replan; failed write -> retry id; no edits/spend; receipts do not self-stop.
365
+ Only under `NOTIFY`, `state=operator_gate`/`notify_user_on_open_todo=true`
366
+ permit concrete blocker-push; else quiet.
367
+ Honor repeat/cooldown. `safe_bypass_allowed=true`: one validated step. Wait
368
+ monitor: one read-only poll; unchanged quiet, new evidence writeback/spend.
369
+
370
+ If `should_run=true`:
371
+ 1. Read active state, Priority Stack, progress/critic, `goal_boundary`,
372
+ `attention_queue.items` / `project_asset`, and guard `user_todo_summary`.
373
+ Legacy/raw fallback is not owner/gate/stop authority. Treat
374
+ `run_history.latest_runs` as drill-down only.
375
+ 2. Goal-owned blocker: stop its path. Under `NOTIFY`, send a concrete Chinese
376
+ blocker-push; under `DONT_NOTIFY`, repair internally and stay quiet.
377
+ Dependency/sibling todos: record; continue audit.
378
+ 3. If `effective_action=outcome_floor_recovery` or
379
+ `recovery_delivery_allowed=true` or
380
+ `safe_bypass_kind=outcome_floor_recovery`, run only ranker/cross-domain
381
+ evidence artifact or blocker recovery; no ordinary delivery or
382
+ surface/synthetic-only work.
383
+ 4. Follow `execution_obligation`: `notify` is not an execution gate.
384
+ `must_attempt_work=true` means one bounded segment even with
385
+ `notify=DONT_NOTIFY`; quiet no-op needs `must_attempt_work=false` and
386
+ `user_channel.notify=DONT_NOTIFY`.
387
+ Then follow `heartbeat_recommendation`:
388
+ `run_first_read_only_map`: exact real-map, validate/save/refresh/spend;
389
+ notify only under `NOTIFY`;
390
+ `mapped_noop_if_unchanged` plus
391
+ `stop_if_unchanged=true` means quiet no-op if no new instruction/evidence/
392
+ todo/stale source/safe handoff.
393
+ `task_orchestration_contract`: spawn admitted child lanes or resume peers;
394
+ the coordinator alone accepts evidence and writes/spends once.
395
+ Check `delivery_batch_scale`, `delivery_outcome`,
396
+ `post_handoff_outcome_gap_streak`, `handoff_delivery_contract`; obey
397
+ repeated-small/surface-loop contracts.
398
+ 5. Run steering audit: compare P0/P1/P2, continuation checks,
399
+ compute/focus quota, bottleneck lens.
400
+ 6. no-progress self-repair: obey `autonomous_replan_obligation` or
401
+ `execution_obligation.must_attempt_work=true`; after 2 eligible stall
402
+ heartbeats with only status/brief checks, replan before quiet no-op.
403
+ Pause/delete only if repair stays stuck 2 more turns.
404
+ 7. Choose one bounded segment; coherent batch is OK with clear validation.
405
+ Public-safe commit/push/PR may proceed after validation/clean scan. Stop for
406
+ private/company material, credentials, destructive git, production, or review rules.
407
+ 8. Validate; write files/validation/critic/next action to active state;
408
+ use `{cli_bin} todo add --goal-id {goal_id} --role user --task-class user_gate|user_action`
409
+ for owner todos and `--role agent` for agent todos, not prose.
410
+ {HOST_LOOP_TODO_CLOSEOUT_COMPACT_RULE}
411
+ 9. Account actual validated class/scale/outcome; never default/upgrade. Then
412
+ refresh and spend:
413
+
414
+ ```bash
415
+ {progress_refresh_state_command}
416
+ {quota_spend_command}
417
+ ```
418
+
419
+ 10. Optional state-only post-spend: `{refresh_state_command}`; never accountable.
420
+
421
+ No spend for quiet skips, preflight failures, blocker-push asks, dry-runs,
422
+ self-cancel turns, or duplicate accounting.
423
+
424
+ Return only under `user_channel.notify=NOTIFY`; otherwise stay quiet.
425
+
426
+ {material_queue_rule}
427
+ {permission_rule}"""
428
+ def render_visible_goal_task_body(
429
+ *,
430
+ goal_id: str,
431
+ active_state: str,
432
+ cli_preflight: str,
433
+ pr_review_pre_quota_command: str,
434
+ quota_guard_command: str,
435
+ quota_spend_command: str,
436
+ refresh_state_command: str,
437
+ progress_refresh_state_command: str,
438
+ material_queue_rule: str,
439
+ permission_rule: str,
440
+ cli_bin: str,
441
+ agent_scope_instruction: str,
442
+ expanded_prompt_command: str,
443
+ compact_prompt_command: str,
444
+ brief_prompt_command: str,
445
+ thin_prompt_command: str,
446
+ ) -> str:
447
+ del (
448
+ cli_preflight,
449
+ expanded_prompt_command,
450
+ compact_prompt_command,
451
+ brief_prompt_command,
452
+ thin_prompt_command,
453
+ )
454
+ return _render_goal_task_body(
455
+ goal_id=goal_id,
456
+ active_state=active_state,
457
+ host_preamble=(
458
+ "in this visible Codex `/goal`. It is interactive, not a heartbeat "
459
+ "automation: no automation/RRULE/`LOOPX_TURN`."
460
+ ),
461
+ completion_subject="visible Goal",
462
+ pr_review_pre_quota_command=pr_review_pre_quota_command,
463
+ quota_guard_command=quota_guard_command,
464
+ quota_spend_command=quota_spend_command,
465
+ progress_refresh_state_command=progress_refresh_state_command,
466
+ material_queue_rule=material_queue_rule,
467
+ permission_rule=permission_rule,
468
+ agent_scope_instruction=agent_scope_instruction,
469
+ host_wait_rule=CODEX_NATIVE_GOAL_UNCHANGED_WAIT_RULE,
470
+ )
471
+ def render_traex_visible_goal_task_body(
472
+ *,
473
+ goal_id: str,
474
+ active_state: str,
475
+ cli_preflight: str,
476
+ pr_review_pre_quota_command: str,
477
+ quota_guard_command: str,
478
+ quota_spend_command: str,
479
+ refresh_state_command: str,
480
+ progress_refresh_state_command: str,
481
+ material_queue_rule: str,
482
+ permission_rule: str,
483
+ cli_bin: str,
484
+ agent_scope_instruction: str,
485
+ expanded_prompt_command: str,
486
+ compact_prompt_command: str,
487
+ brief_prompt_command: str,
488
+ thin_prompt_command: str,
489
+ ) -> str:
490
+ del (
491
+ cli_preflight,
492
+ refresh_state_command,
493
+ cli_bin,
494
+ expanded_prompt_command,
495
+ compact_prompt_command,
496
+ brief_prompt_command,
497
+ thin_prompt_command,
498
+ )
499
+ return _render_goal_task_body(
500
+ goal_id=goal_id,
501
+ active_state=active_state,
502
+ host_preamble=(
503
+ "in this visible\nTraeX `/goal` task; its Goal owns interactive "
504
+ "continuation."
505
+ ),
506
+ completion_subject="visible Goal",
507
+ pr_review_pre_quota_command=pr_review_pre_quota_command,
508
+ quota_guard_command=quota_guard_command,
509
+ quota_spend_command=quota_spend_command,
510
+ progress_refresh_state_command=progress_refresh_state_command,
511
+ material_queue_rule=material_queue_rule,
512
+ permission_rule=permission_rule,
513
+ agent_scope_instruction=agent_scope_instruction,
514
+ host_wait_rule="",
515
+ )
516
+ def _render_goal_task_body(
517
+ *,
518
+ goal_id: str,
519
+ active_state: str,
520
+ host_preamble: str,
521
+ completion_subject: str,
522
+ pr_review_pre_quota_command: str,
523
+ quota_guard_command: str,
524
+ quota_spend_command: str,
525
+ progress_refresh_state_command: str,
526
+ material_queue_rule: str,
527
+ permission_rule: str,
528
+ agent_scope_instruction: str,
529
+ host_wait_rule: str,
530
+ ) -> str:
531
+ scope_block = f"\n{agent_scope_instruction}\n" if agent_scope_instruction else ""
532
+ prequota_block = (
533
+ f"Run `{pr_review_pre_quota_command}` first.\n"
534
+ if pr_review_pre_quota_command
535
+ else ""
536
+ )
537
+ policy_tail = _render_compact_policy_tail(
538
+ material_queue_rule=material_queue_rule,
539
+ permission_rule=permission_rule,
540
+ include_default_permission=True,
541
+ )
542
+ return f"""Advance LoopX goal `{goal_id}` from `{active_state}` {host_preamble}
543
+ {scope_block}
544
+
545
+ {RUNTIME_EXECUTION_ROUTING_RULE}
546
+
547
+ At each continuation inspect LoopX state/status/repo. {prequota_block}{HOST_LOOP_QUOTA_DISPATCH_RULE}
548
+ Guard: `{quota_guard_command}`.
549
+
550
+ `should_run=false`: no delivery/spend; surface a concrete Chinese action/gate only
551
+ for `user_channel.notify=NOTIFY`, otherwise wait.{host_wait_rule}
552
+
553
+ `should_run=true`: take the highest-priority in-scope unblocked agent todo; honor
554
+ claims/leases and blocker-push/recovery obligations. Before dependencies, persist changed
555
+ scope/acceptance/non-goal evidence and next todo. One bounded segment stays in this
556
+ same Goal: a segment is progress, not a new Goal boundary. Reuse this activation
557
+ across phases/revisions until terminal; do not create a successor host Goal merely to
558
+ continue. Validate/write public-safe evidence, critic, and next action.
559
+ {HOST_LOOP_TODO_CLOSEOUT_RULE}
560
+
561
+ Use actual classification/scale/outcome only; never default or upgrade them to
562
+ `multi_surface` / `outcome_progress`; refresh the accountable progress record before
563
+ spending:
564
+ `{progress_refresh_state_command}`. Then spend exactly once against that refresh:
565
+ `{quota_spend_command}`.
566
+
567
+ No spend: gate/wait/dry-run/preflight failure/no-op/duplicate. Stop: private/company
568
+ material, credentials, destructive git, unauthorized production, or repo rules.
569
+ Complete this {completion_subject} only on LoopX terminal success with no follow-up; else
570
+ keep the gate or next action explicit.
571
+
572
+ {policy_tail}"""
573
+ def render_ark_managed_agent_goal_task_body(
574
+ *,
575
+ goal_id: str,
576
+ active_state: str,
577
+ cli_preflight: str,
578
+ pr_review_pre_quota_command: str,
579
+ quota_guard_command: str,
580
+ quota_spend_command: str,
581
+ refresh_state_command: str,
582
+ progress_refresh_state_command: str,
583
+ material_queue_rule: str,
584
+ permission_rule: str,
585
+ cli_bin: str,
586
+ agent_scope_instruction: str,
587
+ expanded_prompt_command: str,
588
+ compact_prompt_command: str,
589
+ brief_prompt_command: str,
590
+ thin_prompt_command: str,
591
+ ) -> str:
592
+ del (
593
+ cli_preflight,
594
+ refresh_state_command,
595
+ cli_bin,
596
+ expanded_prompt_command,
597
+ compact_prompt_command,
598
+ brief_prompt_command,
599
+ thin_prompt_command,
600
+ )
601
+ return _render_goal_task_body(
602
+ goal_id=goal_id,
603
+ active_state=active_state,
604
+ host_preamble=(
605
+ "in one Goal activation. The Goal runtime owns continuation and inner "
606
+ "iterations. This is a goal loop, not automation; do not invoke LoopX Turn."
607
+ ),
608
+ completion_subject="Goal",
609
+ pr_review_pre_quota_command=pr_review_pre_quota_command,
610
+ quota_guard_command=quota_guard_command,
611
+ quota_spend_command=quota_spend_command,
612
+ progress_refresh_state_command=progress_refresh_state_command,
613
+ material_queue_rule=material_queue_rule,
614
+ permission_rule=permission_rule,
615
+ agent_scope_instruction=agent_scope_instruction,
616
+ host_wait_rule="",
617
+ )
618
+ def render_thin_heartbeat_task_body(
619
+ *,
620
+ goal_id: str,
621
+ active_state: str,
622
+ cli_preflight: str,
623
+ pr_review_pre_quota_command: str,
624
+ quota_guard_command: str,
625
+ quota_spend_command: str,
626
+ refresh_state_command: str,
627
+ progress_refresh_state_command: str,
628
+ material_queue_rule: str,
629
+ permission_rule: str,
630
+ cli_bin: str,
631
+ agent_scope_instruction: str,
632
+ expanded_prompt_command: str,
633
+ compact_prompt_command: str,
634
+ brief_prompt_command: str,
635
+ thin_prompt_command: str,
636
+ ) -> str:
637
+ policy_tail = _render_compact_policy_tail(
638
+ material_queue_rule=material_queue_rule,
639
+ permission_rule=permission_rule,
640
+ )
641
+ scope_sentence = f"\n{agent_scope_instruction}" if agent_scope_instruction else ""
642
+ quota_guard_instruction = (
643
+ f"`{quota_guard_command}`"
644
+ if any(
645
+ marker in quota_guard_command
646
+ for marker in (
647
+ "--available-capability",
648
+ "--runtime-profile",
649
+ "--codex-app",
650
+ "--host-surface",
651
+ " -H ",
652
+ )
653
+ )
654
+ else "`quota should-run`"
655
+ )
656
+ pr_review_pre_quota_instruction = (
657
+ f"`{pr_review_pre_quota_command}`\n"
658
+ if pr_review_pre_quota_command
659
+ else ""
660
+ )
661
+ return f"""Advance `{goal_id}` from {active_state}.
662
+
663
+ {RUNTIME_EXECUTION_ROUTING_RULE}
664
+ {scope_sentence}
665
+
666
+ {HOST_LOOP_QUOTA_DISPATCH_RULE}
667
+ `LOOPX_TURN=<current_time_iso>`; reuse.
668
+ {pr_review_pre_quota_instruction}{quota_guard_instruction}.
669
+ {HEARTBEAT_NOTIFICATION_RULE_SHORT}
670
+ {RUNTIME_CAPABILITY_PROJECTION_THIN_RULE}
671
+ {SCHEDULER_HINT_THIN_RULE}
672
+ {HEARTBEAT_VISION_WRITEBACK_RULE_SHORT}
673
+ Done->todo/rationale; guard receipt; 2 stalls->replan.
674
+ `lark_event_inbox`: reply_due; drain_command/reply-readback/ACK.
675
+
676
+ P0 blocked: safe P1/P2; monitor quiet/no-spend.
677
+
678
+ No project branches; {policy_tail} Stop: private material, credentials,
679
+ destructive git, unauthorized prod."""
680
+ def render_heartbeat_generator_inputs_markdown(payload: dict[str, Any]) -> str:
681
+ interface_budget = payload.get("interface_budget") if isinstance(payload.get("interface_budget"), dict) else {}
682
+ lines = [
683
+ "## Generator Inputs",
684
+ "",
685
+ f"- goal_id: `{payload.get('goal_id')}`",
686
+ f"- active_state: `{payload.get('active_state')}`",
687
+ f"- active_state_source: `{payload.get('active_state_source')}`",
688
+ f"- resolved_active_state: `{payload.get('resolved_active_state')}`",
689
+ f"- compact: `{payload.get('compact')}`",
690
+ f"- brief: `{payload.get('brief')}`",
691
+ f"- thin: `{payload.get('thin')}`",
692
+ f"- cli_bin: `{payload.get('cli_bin')}`",
693
+ f"- agent_id: `{payload.get('agent_id')}`",
694
+ f"- agent_model: `{payload.get('agent_model')}`",
695
+ f"- agent_role: `{payload.get('agent_role')}`",
696
+ ]
697
+ lines.extend(
698
+ [
699
+ f"- agent_scopes: `{payload.get('agent_scopes')}`",
700
+ f"- expanded_prompt_command: `{payload.get('expanded_prompt_command')}`",
701
+ f"- compact_prompt_command: `{payload.get('compact_prompt_command')}`",
702
+ f"- brief_prompt_command: `{payload.get('brief_prompt_command')}`",
703
+ f"- thin_prompt_command: `{payload.get('thin_prompt_command')}`",
704
+ "- pr_review_pre_quota_command: "
705
+ f"`{payload.get('pr_review_pre_quota_command')}`",
706
+ f"- quota_guard_command: `{payload.get('quota_guard_command')}`",
707
+ f"- quota_spend_command: `{payload.get('quota_spend_command')}`",
708
+ f"- cli_preflight: `{payload.get('cli_preflight')}`",
709
+ "- interface_budget: "
710
+ f"mode=`{interface_budget.get('mode')}` "
711
+ f"budget_chars=`{interface_budget.get('budget_char_count')}` "
712
+ f"max_chars=`{interface_budget.get('max_chars')}` "
713
+ f"within_budget=`{interface_budget.get('within_budget')}`",
714
+ "",
715
+ ]
716
+ )
717
+ return "\n".join(lines)
718
+ def render_heartbeat_prompt_error_markdown(payload: dict[str, Any]) -> str:
719
+ return f"""# Heartbeat Automation Prompt Error
720
+
721
+ No heartbeat task body was generated.
722
+
723
+ ## Error
724
+
725
+ ```text
726
+ {payload.get("error") or "unknown heartbeat-prompt generation error"}
727
+ ```
728
+
729
+ {render_heartbeat_generator_inputs_markdown(payload)}"""
730
+ def render_heartbeat_prompt_markdown(payload: dict[str, Any]) -> str:
731
+ if payload.get("ok") is False:
732
+ return render_heartbeat_prompt_error_markdown(payload)
733
+ if payload.get("visible_goal_host") == "traex-cli":
734
+ return f"""# Visible TraeX Goal Prompt
735
+
736
+ Paste this task body into the visible TraeX `/goal` task.
737
+
738
+ ````text
739
+ {payload.get("task_body", "")}
740
+ ````
741
+
742
+ {render_heartbeat_generator_inputs_markdown(payload)}"""
743
+ if payload.get("thin"):
744
+ style = "thin "
745
+ elif payload.get("brief"):
746
+ style = "brief "
747
+ elif payload.get("compact"):
748
+ style = "compact "
749
+ else:
750
+ style = ""
751
+ return f"""# Heartbeat Automation Prompt
752
+
753
+ Copy this {style}task body into a Codex App heartbeat automation.
754
+
755
+ ````text
756
+ {payload.get("task_body", "")}
757
+ ````
758
+
759
+ {render_heartbeat_generator_inputs_markdown(payload)}"""