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,915 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ import json
5
+ from collections.abc import Callable, Mapping
6
+ from importlib import import_module
7
+ from pathlib import Path
8
+
9
+ from ..capabilities.explore.activation import (
10
+ sync_explore_graph_after_material_refresh,
11
+ )
12
+ from ..control_plane.agents.capability_gate import (
13
+ runtime_capabilities_for_cli_projection,
14
+ )
15
+ from ..control_plane.goals.goal_vision_policy import (
16
+ GOAL_VISION_ADVANCEMENT_POLICY_CHOICES,
17
+ )
18
+ from ..control_plane.quota.settlement import (
19
+ require_settlement_writeback,
20
+ resolve_heartbeat_settlement_identity,
21
+ settlement_result_payload,
22
+ )
23
+ from ..control_plane.work_items.delivery_batch_scale import (
24
+ DELIVERY_BATCH_SCALE_INPUT_CHOICES,
25
+ )
26
+ from ..control_plane.work_items.delivery_outcome import DELIVERY_OUTCOME_CHOICES
27
+ from ..control_plane.work_items.progress_observation import ProgressResultClass
28
+ from ..extensions.lark.goal_channel_lifecycle import (
29
+ goal_channel_gate_sync_failure,
30
+ sync_human_gate_after_refresh,
31
+ )
32
+ from ..extensions.runtime import (
33
+ default_extension_state_file,
34
+ resolve_extension_activation,
35
+ )
36
+ from ..feedback import (
37
+ LESSON_KINDS,
38
+ append_human_reward,
39
+ compact_reward,
40
+ render_reward_markdown,
41
+ )
42
+ from ..history import load_registry
43
+ from ..operator_gate import (
44
+ DEFAULT_OPERATOR_GATE,
45
+ OPERATOR_GATE_DECISIONS,
46
+ record_operator_gate,
47
+ render_operator_gate_markdown,
48
+ )
49
+ from ..paths import resolve_runtime_root
50
+ from ..project_map import (
51
+ DEFAULT_PROJECT_MAP_CLASSIFICATION,
52
+ read_only_project_map_run,
53
+ render_read_only_project_map_markdown,
54
+ )
55
+ from ..state_refresh import (
56
+ DEFAULT_REFRESH_ACTION,
57
+ DEFAULT_REFRESH_CLASSIFICATION,
58
+ PROGRESS_SCOPE_CHOICES,
59
+ REPAIR_DELTA_KIND_CHOICES,
60
+ refresh_state_run,
61
+ render_state_refresh_markdown,
62
+ )
63
+
64
+ PrintPayload = Callable[
65
+ [dict[str, object], str, Callable[[dict[str, object]], str]],
66
+ None,
67
+ ]
68
+ OutputFormat = Callable[[argparse.Namespace], str]
69
+ AppendCliRolloutEvent = Callable[..., dict[str, object]]
70
+
71
+ PROJECT_LIFECYCLE_COMMANDS = {
72
+ "refresh-state",
73
+ "read-only-map",
74
+ "reward",
75
+ "operator-gate",
76
+ }
77
+
78
+ INLINE_VISION_FIELDS = {
79
+ "vision_summary": "vision_summary",
80
+ "vision_role_scope": "role_scope",
81
+ "vision_acceptance": "acceptance_summary",
82
+ "vision_advancement_policy": "advancement_policy",
83
+ "vision_replan_trigger": "replan_trigger_summary",
84
+ "vision_dreaming_policy": "dreaming_policy",
85
+ "vision_last_patch": "last_patch_summary",
86
+ }
87
+
88
+
89
+ def _lark_explore_graph_syncer(
90
+ runtime_root_arg: str | None,
91
+ *,
92
+ registry_path: Path,
93
+ ) -> Callable[..., Mapping[str, object]]:
94
+ extension_runtime_root = resolve_runtime_root(
95
+ load_registry(registry_path), runtime_root_arg
96
+ )
97
+
98
+ def sync(**kwargs: object) -> Mapping[str, object]:
99
+ implementation = import_module(
100
+ "loopx.extensions.lark.presentation.explore_results"
101
+ )
102
+ preview_kwargs = dict(kwargs)
103
+ preview_kwargs["execute"] = False
104
+ preview = dict(
105
+ implementation.sync_issue_fix_explore_on_material_change(
106
+ **preview_kwargs
107
+ )
108
+ )
109
+ if preview.get("status") in {"not_applicable", "not_configured"}:
110
+ return preview
111
+
112
+ provider = import_module("loopx.extensions.lark")
113
+ activation = resolve_extension_activation(
114
+ str(provider.LARK_EXTENSION_ID),
115
+ state_file=default_extension_state_file(extension_runtime_root),
116
+ required_permissions=(str(provider.LARK_PROJECTION_SINK_PERMISSION),),
117
+ )
118
+ result = (
119
+ dict(implementation.sync_issue_fix_explore_on_material_change(**kwargs))
120
+ if kwargs.get("execute")
121
+ else preview
122
+ )
123
+ result["extension_activation"] = activation
124
+ return result
125
+
126
+ return sync
127
+
128
+
129
+ def _apply_external_sink_postcondition(
130
+ payload: dict[str, object],
131
+ *,
132
+ sink_result: Mapping[str, object],
133
+ warning: str,
134
+ error: str,
135
+ ) -> None:
136
+ postcondition = (
137
+ sink_result.get("delivery_postcondition")
138
+ if isinstance(sink_result.get("delivery_postcondition"), Mapping)
139
+ else {}
140
+ )
141
+ if not sink_result.get("enabled") or postcondition.get("satisfied"):
142
+ return
143
+ payload.setdefault("warnings", []).append(warning)
144
+ if postcondition.get("blocks_delivery"):
145
+ payload["ok"] = False
146
+ payload["error"] = error
147
+
148
+
149
+ def _inline_agent_vision_packet(args: argparse.Namespace) -> dict[str, object] | None:
150
+ patch = {
151
+ field: str(value).strip()
152
+ for attr, field in INLINE_VISION_FIELDS.items()
153
+ for value in [getattr(args, attr, None)]
154
+ if str(value or "").strip()
155
+ }
156
+ todo_delta = [
157
+ str(item or "").strip()
158
+ for item in (getattr(args, "vision_todo_delta", None) or [])
159
+ if str(item or "").strip()
160
+ ]
161
+ state = str(getattr(args, "vision_state", None) or "").strip()
162
+ if not patch and not todo_delta and not state:
163
+ return None
164
+ if not str(getattr(args, "agent_id", None) or "").strip():
165
+ raise ValueError("inline agent vision requires --agent-id")
166
+ if not patch:
167
+ raise ValueError("inline agent vision requires at least one --vision-* patch field")
168
+ packet: dict[str, object] = {
169
+ "schema_version": "goal_vision_replan_contract_v0",
170
+ "vision_patch": patch,
171
+ "todo_delta": todo_delta,
172
+ }
173
+ if state:
174
+ packet["state"] = state
175
+ return packet
176
+
177
+
178
+ def _inline_progress_observation(
179
+ args: argparse.Namespace,
180
+ ) -> dict[str, object] | None:
181
+ fields = {
182
+ "surface_id": getattr(args, "progress_surface_id", None),
183
+ "hypothesis_id": getattr(args, "progress_hypothesis_id", None),
184
+ "probe_kind": getattr(args, "progress_probe_kind", None),
185
+ "result_class": getattr(args, "progress_result_class", None),
186
+ "blocker_id": getattr(args, "progress_blocker_id", None),
187
+ "coverage_scope_id": getattr(args, "progress_coverage_scope_id", None),
188
+ "coverage_complete": getattr(args, "progress_coverage_complete", None),
189
+ }
190
+ evidence_ids = list(getattr(args, "progress_evidence_ids", None) or [])
191
+ if not any(value is not None for value in fields.values()) and not evidence_ids:
192
+ return None
193
+ if not fields["result_class"]:
194
+ raise ValueError("typed progress observation requires --progress-result-class")
195
+ if fields["result_class"] in {
196
+ ProgressResultClass.EXPLORATION_EXHAUSTED.value,
197
+ ProgressResultClass.NO_FOLLOWUP.value,
198
+ } and not fields["coverage_scope_id"]:
199
+ raise ValueError(
200
+ f"--progress-result-class {fields['result_class']} requires "
201
+ "--progress-coverage-scope-id"
202
+ )
203
+ if (
204
+ fields["result_class"] == ProgressResultClass.EXPLORATION_EXHAUSTED.value
205
+ and fields["coverage_complete"] is not True
206
+ ):
207
+ raise ValueError(
208
+ "--progress-result-class exploration_exhausted requires "
209
+ "--progress-coverage-complete"
210
+ )
211
+ return {
212
+ "schema_version": "typed_progress_observation_v0",
213
+ **{key: value for key, value in fields.items() if value is not None},
214
+ "evidence_ids": evidence_ids,
215
+ }
216
+
217
+
218
+ def register_project_lifecycle_commands(
219
+ subparsers: argparse._SubParsersAction,
220
+ add_subcommand_format: Callable[[argparse.ArgumentParser], None],
221
+ ) -> None:
222
+ refresh_state_parser = subparsers.add_parser(
223
+ "refresh-state",
224
+ help="Append a read-only run from active goal state after state-only updates.",
225
+ )
226
+ add_subcommand_format(refresh_state_parser)
227
+ refresh_state_parser.add_argument(
228
+ "--goal-id",
229
+ required=True,
230
+ help="Goal id whose active state should be refreshed.",
231
+ )
232
+ refresh_state_parser.add_argument("--project", help="Project root. Defaults to the registry goal repo.")
233
+ refresh_state_parser.add_argument(
234
+ "--state-file",
235
+ help="Active goal state path. Defaults to the registry goal state_file.",
236
+ )
237
+ refresh_state_parser.add_argument(
238
+ "--classification",
239
+ default=DEFAULT_REFRESH_CLASSIFICATION,
240
+ help=f"Refresh run classification. Defaults to {DEFAULT_REFRESH_CLASSIFICATION}.",
241
+ )
242
+ refresh_state_parser.add_argument(
243
+ "--recommended-action",
244
+ help=(
245
+ "Local-control next action. Private project refs are allowed; "
246
+ f"inline secrets are rejected. Defaults to: {DEFAULT_REFRESH_ACTION}"
247
+ ),
248
+ )
249
+ refresh_state_parser.add_argument(
250
+ "--next-action",
251
+ help=(
252
+ "Explicitly update the active state's durable ## Next Action before "
253
+ "appending the refresh run. Without this flag, --recommended-action "
254
+ "only describes the run record."
255
+ ),
256
+ )
257
+ refresh_state_parser.add_argument(
258
+ "--delivery-batch-scale",
259
+ choices=DELIVERY_BATCH_SCALE_INPUT_CHOICES,
260
+ help=(
261
+ "Optional explicit delivery scale for this refresh run, overriding "
262
+ "classification-name inference. Accepts canonical scales plus "
263
+ "single_segment/bounded_segment aliases for single_surface."
264
+ ),
265
+ )
266
+ refresh_state_parser.add_argument(
267
+ "--delivery-outcome",
268
+ choices=DELIVERY_OUTCOME_CHOICES,
269
+ help="Optional explicit outcome-floor signal for this refresh run.",
270
+ )
271
+ refresh_state_parser.add_argument(
272
+ "--delivery-workspace-path",
273
+ help=(
274
+ "Local git worktree that produced this accountable delivery. Use when "
275
+ "refresh-state must run from a separate registry checkout; the local "
276
+ "path is validated but is not persisted."
277
+ ),
278
+ )
279
+ refresh_state_parser.add_argument(
280
+ "--todo-id",
281
+ help=(
282
+ "Selected Todo from the original turn-scoped quota guard. Requires "
283
+ "--turn-instance-id and an accountable delivery outcome."
284
+ ),
285
+ )
286
+ refresh_state_parser.add_argument(
287
+ "--turn-instance-id",
288
+ help=(
289
+ "Stable quota guard turn id for settlement writeback. Reuse the same "
290
+ "value on retries."
291
+ ),
292
+ )
293
+ refresh_state_parser.add_argument(
294
+ "--autonomous-replan-recorded",
295
+ action="store_true",
296
+ help=(
297
+ "Mark this refresh as the explicit autonomous replan ACK. "
298
+ "Use only after the agent has performed and written back the bounded replan slice."
299
+ ),
300
+ )
301
+ refresh_state_parser.add_argument(
302
+ "--progress-result-class",
303
+ choices=[item.value for item in ProgressResultClass],
304
+ help=(
305
+ "Typed result for this bounded work slice. Semantics come only from "
306
+ "this enum and stable identifiers, never from classification prose."
307
+ ),
308
+ )
309
+ refresh_state_parser.add_argument("--progress-surface-id")
310
+ refresh_state_parser.add_argument("--progress-hypothesis-id")
311
+ refresh_state_parser.add_argument("--progress-probe-kind")
312
+ refresh_state_parser.add_argument("--progress-blocker-id")
313
+ refresh_state_parser.add_argument("--progress-coverage-scope-id")
314
+ refresh_state_parser.add_argument(
315
+ "--progress-evidence-id",
316
+ dest="progress_evidence_ids",
317
+ action="append",
318
+ )
319
+ refresh_state_parser.add_argument(
320
+ "--progress-coverage-complete",
321
+ action="store_true",
322
+ default=None,
323
+ )
324
+ refresh_state_parser.add_argument(
325
+ "--repair-delta-kind",
326
+ dest="repair_delta_kinds",
327
+ choices=REPAIR_DELTA_KIND_CHOICES,
328
+ action="append",
329
+ help=(
330
+ "Machine-visible frontier changed by this repair/replan ACK. Repeat for "
331
+ "multiple deltas. Without a delta, --autonomous-replan-recorded is stored "
332
+ "as replan_noop/repair_noop and does not clear the obligation."
333
+ ),
334
+ )
335
+ refresh_state_parser.add_argument(
336
+ "--agent-vision-json",
337
+ help=(
338
+ "Path to a complete generated goal_vision_replan_contract_v0 update. "
339
+ "The CLI enforces budgets; any autonomous replan that changes durable "
340
+ "mainline fields requires goal_path_delta_v0."
341
+ ),
342
+ )
343
+ refresh_state_parser.add_argument(
344
+ "--vision-state",
345
+ help=(
346
+ "Optional lower snake_case lifecycle state for an inline "
347
+ "goal_vision_replan_contract_v0 patch. Closure aliases such as "
348
+ "satisfied and vision_satisfied normalize to vision_closed; "
349
+ "custom states remain open until explicitly closed."
350
+ ),
351
+ )
352
+ refresh_state_parser.add_argument(
353
+ "--vision-summary",
354
+ help=(
355
+ "Inline bounded vision_summary for a field-level patch merged into the "
356
+ "current agent's latest active vision."
357
+ ),
358
+ )
359
+ refresh_state_parser.add_argument(
360
+ "--vision-role-scope",
361
+ help="Inline bounded role_scope for the current agent's vision patch.",
362
+ )
363
+ refresh_state_parser.add_argument(
364
+ "--vision-acceptance",
365
+ help="Inline bounded acceptance_summary for the current agent's vision patch.",
366
+ )
367
+ refresh_state_parser.add_argument(
368
+ "--vision-advancement-policy",
369
+ choices=GOAL_VISION_ADVANCEMENT_POLICY_CHOICES,
370
+ help=(
371
+ "Whether open acceptance needs advancement only as needed or must "
372
+ "keep a runnable advancement frontier until the vision closes."
373
+ ),
374
+ )
375
+ refresh_state_parser.add_argument(
376
+ "--vision-replan-trigger",
377
+ help="Inline bounded replan_trigger_summary that quota can project as an acceptance gap.",
378
+ )
379
+ refresh_state_parser.add_argument(
380
+ "--vision-dreaming-policy",
381
+ help="Inline bounded dreaming_policy for the current agent's vision patch.",
382
+ )
383
+ refresh_state_parser.add_argument(
384
+ "--vision-last-patch",
385
+ help="Inline bounded last_patch_summary for the current agent's vision patch.",
386
+ )
387
+ refresh_state_parser.add_argument(
388
+ "--vision-todo-delta",
389
+ action="append",
390
+ help="Compact todo delta for an inline vision patch. Repeat for multiple deltas.",
391
+ )
392
+ refresh_state_parser.add_argument(
393
+ "--vision-unchanged-reason",
394
+ help=(
395
+ "Compact reason why a required vision checkpoint is intentionally unchanged."
396
+ ),
397
+ )
398
+ refresh_state_parser.add_argument(
399
+ "--agent-id",
400
+ help=(
401
+ "Registered agent id for agent-lane state refreshes. When set, the "
402
+ "refresh is visible in run history but does not replace goal-level status."
403
+ ),
404
+ )
405
+ refresh_state_parser.add_argument(
406
+ "--available-capability",
407
+ dest="available_capabilities",
408
+ action="append",
409
+ help=(
410
+ "Preserve one observed public-safe runtime capability from the scoped "
411
+ "quota decision. Repeatable; this context does not grant authority or "
412
+ "change refresh-state write scope."
413
+ ),
414
+ )
415
+ refresh_state_parser.add_argument(
416
+ "--agent-lane",
417
+ help="Public-safe lane label for --agent-id scoped refreshes, such as productization_frontstage.",
418
+ )
419
+ refresh_state_parser.add_argument(
420
+ "--progress-scope",
421
+ choices=PROGRESS_SCOPE_CHOICES,
422
+ help=(
423
+ "Refresh scope. In multi-agent goals, use agent_lane for per-agent runnable "
424
+ "status, or goal with any registered peer for durable goal-level status/Next Action."
425
+ ),
426
+ )
427
+ refresh_state_parser.add_argument(
428
+ "--dry-run",
429
+ action="store_true",
430
+ help="Print the refresh payload without appending.",
431
+ )
432
+ refresh_state_parser.add_argument(
433
+ "--no-global-sync",
434
+ action="store_true",
435
+ help="Do not refresh the shared global registry after writing the state run.",
436
+ )
437
+ refresh_state_parser.add_argument(
438
+ "--suppress-external-sinks",
439
+ action="store_true",
440
+ help=(
441
+ "Keep enabled local projections active but suppress configured external "
442
+ "sink writes for this refresh. Pending sink digests remain retryable."
443
+ ),
444
+ )
445
+
446
+ read_only_map_parser = subparsers.add_parser(
447
+ "read-only-map",
448
+ help="Append a generic read-only project-map run for a connected project.",
449
+ )
450
+ add_subcommand_format(read_only_map_parser)
451
+ read_only_map_parser.add_argument(
452
+ "--goal-id",
453
+ required=True,
454
+ help="Goal id whose project should be mapped.",
455
+ )
456
+ read_only_map_parser.add_argument("--project", help="Project root. Defaults to the registry goal repo.")
457
+ read_only_map_parser.add_argument(
458
+ "--state-file",
459
+ help="Active goal state path. Defaults to the registry goal state_file.",
460
+ )
461
+ read_only_map_parser.add_argument(
462
+ "--classification",
463
+ default=DEFAULT_PROJECT_MAP_CLASSIFICATION,
464
+ help=f"Project-map run classification. Defaults to {DEFAULT_PROJECT_MAP_CLASSIFICATION}.",
465
+ )
466
+ read_only_map_parser.add_argument(
467
+ "--recommended-action",
468
+ help=(
469
+ "Local-control next action. Private project refs are allowed; "
470
+ "inline secrets are rejected. Defaults to the first item from the "
471
+ "active state's Next Action."
472
+ ),
473
+ )
474
+ read_only_map_parser.add_argument(
475
+ "--dry-run",
476
+ action="store_true",
477
+ help="Print the project-map payload without appending.",
478
+ )
479
+ read_only_map_parser.add_argument(
480
+ "--no-global-sync",
481
+ action="store_true",
482
+ help="Do not refresh the shared global registry after writing the project-map run.",
483
+ )
484
+
485
+ reward_parser = subparsers.add_parser(
486
+ "reward",
487
+ help="Append a compact human reward overlay to a goal run index.",
488
+ )
489
+ add_subcommand_format(reward_parser)
490
+ reward_parser.add_argument("--goal-id", required=True, help="Goal id whose latest run should receive feedback.")
491
+ reward_parser.add_argument(
492
+ "--run-generated-at",
493
+ help="Exact run generated_at timestamp. Defaults to the latest compact run for the goal.",
494
+ )
495
+ reward_parser.add_argument("--recorded-at", help="Reward timestamp. Defaults to current UTC time.")
496
+ reward_parser.add_argument("--decision", required=True, help="Operator decision label, such as continue_route.")
497
+ reward_parser.add_argument(
498
+ "--reward",
499
+ required=True,
500
+ choices=["positive", "negative", "mixed", "neutral"],
501
+ help="Compact reward polarity.",
502
+ )
503
+ reward_parser.add_argument(
504
+ "--reason-summary",
505
+ required=True,
506
+ help="Short public-safe reason. Do not include raw private evidence.",
507
+ )
508
+ reward_parser.add_argument("--follow-up", help="Optional next handoff or experiment condition.")
509
+ reward_parser.add_argument(
510
+ "--lesson-kind",
511
+ choices=sorted(LESSON_KINDS),
512
+ help="Optional public-safe lesson kind when this reward records an explicit user correction.",
513
+ )
514
+ reward_parser.add_argument(
515
+ "--lesson-summary",
516
+ help="Short public-safe lesson summary. Required when --lesson-kind is set.",
517
+ )
518
+ reward_parser.add_argument(
519
+ "--lesson-avoid",
520
+ action="append",
521
+ default=[],
522
+ help="Public-safe phrase/action that future recommended_action should avoid. Repeatable.",
523
+ )
524
+ reward_parser.add_argument(
525
+ "--lesson-prefer",
526
+ action="append",
527
+ default=[],
528
+ help="Public-safe phrase/action that future recommended_action should prefer. Repeatable.",
529
+ )
530
+ reward_parser.add_argument(
531
+ "--state-file",
532
+ help="Active goal state path for optional summary writeback. Defaults to the registry goal state_file.",
533
+ )
534
+ reward_parser.add_argument(
535
+ "--write-active-state-summary",
536
+ action="store_true",
537
+ help="After a real append, also add the returned active_state_summary to the active state's Progress Ledger. With --dry-run, preview only.",
538
+ )
539
+ reward_parser.add_argument("--dry-run", action="store_true", help="Print the overlay without appending it.")
540
+
541
+ gate_parser = subparsers.add_parser(
542
+ "operator-gate",
543
+ help="Record an operator gate decision such as read-only map opt-in.",
544
+ )
545
+ add_subcommand_format(gate_parser)
546
+ gate_parser.add_argument("--goal-id", required=True, help="Goal id whose operator gate is being judged.")
547
+ gate_parser.add_argument("--gate", default=DEFAULT_OPERATOR_GATE, help=f"Gate id. Defaults to {DEFAULT_OPERATOR_GATE}.")
548
+ gate_parser.add_argument(
549
+ "--decision",
550
+ required=True,
551
+ choices=sorted(OPERATOR_GATE_DECISIONS),
552
+ help="Operator decision for this gate.",
553
+ )
554
+ gate_parser.add_argument("--recorded-at", help="Decision timestamp. Defaults to current local time.")
555
+ gate_parser.add_argument(
556
+ "--operator-question",
557
+ help="Human-facing question being answered. Defaults from --gate and --goal-id.",
558
+ )
559
+ gate_parser.add_argument(
560
+ "--reason-summary",
561
+ required=True,
562
+ help="Short public-safe reason. Do not include raw private evidence.",
563
+ )
564
+ gate_parser.add_argument("--follow-up", help="Optional next handoff or evidence condition.")
565
+ gate_parser.add_argument(
566
+ "--agent-command",
567
+ help="Target-agent command that becomes valid after approval. Defaults for read_only_map_opt_in approvals.",
568
+ )
569
+ gate_parser.add_argument(
570
+ "--recommended-action",
571
+ help="Local-control next action for status/dashboard; inline secrets are rejected.",
572
+ )
573
+ gate_parser.add_argument("--dry-run", action="store_true", help="Print the decision run without appending it.")
574
+ gate_parser.add_argument(
575
+ "--no-global-sync",
576
+ action="store_true",
577
+ help="Do not refresh the shared global registry after writing the gate decision.",
578
+ )
579
+
580
+
581
+ def handle_project_lifecycle_command(
582
+ args: argparse.Namespace,
583
+ *,
584
+ registry_path: Path,
585
+ print_payload: PrintPayload,
586
+ output_format: OutputFormat,
587
+ append_cli_rollout_event: AppendCliRolloutEvent,
588
+ ) -> int | None:
589
+ if args.command not in PROJECT_LIFECYCLE_COMMANDS:
590
+ return None
591
+
592
+ fmt = output_format(args)
593
+ if args.command == "refresh-state":
594
+ agent_vision_packet: dict[str, object] | None = None
595
+ progress_observation: dict[str, object] | None = None
596
+ merge_agent_vision_patch = False
597
+ try:
598
+ inline_agent_vision_packet = _inline_agent_vision_packet(args)
599
+ if args.agent_vision_json and inline_agent_vision_packet:
600
+ raise ValueError(
601
+ "--agent-vision-json cannot be combined with inline --vision-* fields"
602
+ )
603
+ if args.agent_vision_json:
604
+ agent_vision_packet = json.loads(
605
+ Path(args.agent_vision_json).expanduser().read_text(encoding="utf-8")
606
+ )
607
+ elif inline_agent_vision_packet:
608
+ agent_vision_packet = inline_agent_vision_packet
609
+ merge_agent_vision_patch = True
610
+ progress_observation = _inline_progress_observation(args)
611
+ except Exception as exc:
612
+ payload = {
613
+ "ok": False,
614
+ "registry": str(registry_path),
615
+ "runtime_root": args.runtime_root,
616
+ "goal_id": args.goal_id,
617
+ "classification": args.classification,
618
+ "appended": False,
619
+ "dry_run": bool(args.dry_run),
620
+ "error": str(exc),
621
+ }
622
+ print_payload(payload, fmt, render_state_refresh_markdown)
623
+ return 1
624
+ try:
625
+ payload = refresh_state_run(
626
+ registry_path=registry_path,
627
+ runtime_root_override=args.runtime_root,
628
+ goal_id=args.goal_id,
629
+ project=Path(args.project).expanduser() if args.project else None,
630
+ state_file=Path(args.state_file).expanduser() if args.state_file else None,
631
+ classification=args.classification,
632
+ recommended_action=args.recommended_action,
633
+ next_action=args.next_action,
634
+ delivery_batch_scale=args.delivery_batch_scale,
635
+ delivery_outcome=args.delivery_outcome,
636
+ delivery_workspace_path=(
637
+ Path(args.delivery_workspace_path).expanduser()
638
+ if args.delivery_workspace_path
639
+ else None
640
+ ),
641
+ todo_id=getattr(args, "todo_id", None),
642
+ turn_instance_id=getattr(args, "turn_instance_id", None),
643
+ agent_id=args.agent_id,
644
+ agent_lane=args.agent_lane,
645
+ progress_scope=args.progress_scope,
646
+ autonomous_replan_recorded=bool(args.autonomous_replan_recorded),
647
+ repair_delta_kinds=args.repair_delta_kinds,
648
+ agent_vision_packet=agent_vision_packet,
649
+ merge_agent_vision_patch=merge_agent_vision_patch,
650
+ vision_unchanged_reason=args.vision_unchanged_reason,
651
+ progress_observation=progress_observation,
652
+ dry_run=bool(args.dry_run),
653
+ sync_global=not bool(args.no_global_sync),
654
+ )
655
+ except Exception as exc:
656
+ payload = {
657
+ "ok": False,
658
+ "registry": str(registry_path),
659
+ "runtime_root": args.runtime_root,
660
+ "goal_id": args.goal_id,
661
+ "classification": args.classification,
662
+ "appended": False,
663
+ "dry_run": bool(args.dry_run),
664
+ "error": str(exc),
665
+ }
666
+ projected_capabilities = runtime_capabilities_for_cli_projection(
667
+ args.available_capabilities
668
+ )
669
+ if projected_capabilities:
670
+ payload["available_capabilities"] = projected_capabilities
671
+ payload["external_sink_delivery_authorized"] = not bool(
672
+ args.suppress_external_sinks
673
+ )
674
+ material_refresh_ready = bool(
675
+ payload.get("ok")
676
+ and (
677
+ payload.get("appended")
678
+ or payload.get("idempotent_replay")
679
+ )
680
+ and not payload.get("dry_run")
681
+ )
682
+ settlement_receipt_repair = bool(
683
+ payload.get("ok")
684
+ and payload.get("receipt_repair_required")
685
+ and getattr(args, "turn_instance_id", None)
686
+ and getattr(args, "todo_id", None)
687
+ )
688
+ if material_refresh_ready or settlement_receipt_repair:
689
+ append_cli_rollout_event(
690
+ payload,
691
+ registry_path=registry_path,
692
+ runtime_root_arg=args.runtime_root,
693
+ event_kind="refresh_state",
694
+ agent_id=args.agent_id,
695
+ todo_id=getattr(args, "todo_id", None),
696
+ run_id=getattr(args, "turn_instance_id", None),
697
+ status=(
698
+ "receipt_repaired"
699
+ if settlement_receipt_repair
700
+ else "appended"
701
+ ),
702
+ summary=(
703
+ "refresh-state appended compact control-plane state with "
704
+ f"classification={payload.get('classification')}"
705
+ ),
706
+ details={
707
+ "command": "refresh-state",
708
+ "progress_scope": payload.get("progress_scope") or "",
709
+ "agent_lane": payload.get("agent_lane") or "",
710
+ "autonomous_replan_recorded": bool(
711
+ payload.get("autonomous_replan_recorded")
712
+ ),
713
+ "global_sync_wrote": bool(
714
+ isinstance(payload.get("global_sync"), dict)
715
+ and payload["global_sync"].get("wrote")
716
+ ),
717
+ "settlement_effect_id": (
718
+ payload.get("settlement_identity", {}).get("effect_id")
719
+ if isinstance(payload.get("settlement_identity"), dict)
720
+ else None
721
+ ),
722
+ },
723
+ idempotency_fields=(
724
+ ["goal_id", "event_kind", "agent_id", "todo_id", "run_id"]
725
+ if getattr(args, "turn_instance_id", None)
726
+ else None
727
+ ),
728
+ )
729
+ if getattr(args, "turn_instance_id", None) and getattr(
730
+ args,
731
+ "todo_id",
732
+ None,
733
+ ):
734
+ runtime_root = resolve_runtime_root(
735
+ load_registry(registry_path),
736
+ args.runtime_root,
737
+ )
738
+ settlement_result = resolve_heartbeat_settlement_identity(
739
+ runtime_root,
740
+ goal_id=args.goal_id,
741
+ agent_id=args.agent_id,
742
+ todo_id=getattr(args, "todo_id", None),
743
+ turn_instance_id=getattr(args, "turn_instance_id", None),
744
+ ).bind(
745
+ lambda identity: require_settlement_writeback(
746
+ runtime_root,
747
+ identity,
748
+ )
749
+ )
750
+ payload["settlement_result"] = settlement_result_payload(
751
+ settlement_result
752
+ )
753
+ if settlement_result.failure is not None:
754
+ payload["ok"] = False
755
+ payload["receipt_repair_required"] = True
756
+ payload["error"] = settlement_result.failure.reason
757
+ elif settlement_receipt_repair:
758
+ payload["receipt_repair_required"] = False
759
+ payload["receipt_repaired"] = True
760
+ if not material_refresh_ready:
761
+ print_payload(payload, fmt, render_state_refresh_markdown)
762
+ return 0 if payload.get("ok") else 1
763
+ graph_sync = sync_explore_graph_after_material_refresh(
764
+ registry_path=registry_path,
765
+ goal_id=args.goal_id,
766
+ agent_id=args.agent_id,
767
+ project=Path(args.project).expanduser() if args.project else None,
768
+ state_file=Path(args.state_file).expanduser() if args.state_file else None,
769
+ external_sink_delivery_authorized=not bool(
770
+ args.suppress_external_sinks
771
+ ),
772
+ syncer=_lark_explore_graph_syncer(
773
+ args.runtime_root,
774
+ registry_path=registry_path,
775
+ ),
776
+ )
777
+ payload["explore_graph_sync"] = graph_sync
778
+ _apply_external_sink_postcondition(
779
+ payload,
780
+ sink_result=graph_sync,
781
+ warning=(
782
+ "enabled Explore Graph delivery postcondition is unsatisfied; "
783
+ "the unchanged sink digest keeps it retryable"
784
+ ),
785
+ error=(
786
+ "enabled Explore Graph sync/readback failed after the material "
787
+ "refresh; retry it before delivery"
788
+ ),
789
+ )
790
+ try:
791
+ gate_sync = sync_human_gate_after_refresh(
792
+ registry_path=registry_path,
793
+ runtime_root_override=args.runtime_root,
794
+ goal_id=args.goal_id,
795
+ agent_id=args.agent_id,
796
+ external_sink_delivery_authorized=not bool(
797
+ args.suppress_external_sinks
798
+ ),
799
+ )
800
+ except Exception:
801
+ gate_sync = goal_channel_gate_sync_failure(
802
+ registry_path=registry_path,
803
+ goal_id=args.goal_id,
804
+ )
805
+ payload["goal_channel_gate_sync"] = gate_sync
806
+ _apply_external_sink_postcondition(
807
+ payload,
808
+ sink_result=gate_sync,
809
+ warning=(
810
+ "enabled Goal Channel human-gate delivery postcondition is "
811
+ "unsatisfied; the notification remains retryable"
812
+ ),
813
+ error=(
814
+ "enabled Goal Channel human-gate notification/readback failed "
815
+ "after the refresh; retry it before delivery"
816
+ ),
817
+ )
818
+ print_payload(payload, fmt, render_state_refresh_markdown)
819
+ return 0 if payload.get("ok") else 1
820
+
821
+ if args.command == "read-only-map":
822
+ try:
823
+ payload = read_only_project_map_run(
824
+ registry_path=registry_path,
825
+ runtime_root_override=args.runtime_root,
826
+ goal_id=args.goal_id,
827
+ project=Path(args.project).expanduser() if args.project else None,
828
+ state_file=Path(args.state_file).expanduser() if args.state_file else None,
829
+ classification=args.classification,
830
+ recommended_action=args.recommended_action,
831
+ dry_run=bool(args.dry_run),
832
+ sync_global=not bool(args.no_global_sync),
833
+ )
834
+ except Exception as exc:
835
+ payload = {
836
+ "ok": False,
837
+ "registry": str(registry_path),
838
+ "runtime_root": args.runtime_root,
839
+ "goal_id": args.goal_id,
840
+ "classification": args.classification,
841
+ "appended": False,
842
+ "dry_run": bool(args.dry_run),
843
+ "error": str(exc),
844
+ }
845
+ print_payload(payload, fmt, render_read_only_project_map_markdown)
846
+ return 0 if payload.get("ok") else 1
847
+
848
+ if args.command == "reward":
849
+ try:
850
+ reward = compact_reward(
851
+ recorded_at=args.recorded_at,
852
+ decision=args.decision,
853
+ reward=args.reward,
854
+ reason_summary=args.reason_summary,
855
+ follow_up=args.follow_up,
856
+ lesson={
857
+ "kind": args.lesson_kind,
858
+ "summary": args.lesson_summary,
859
+ "avoid": args.lesson_avoid,
860
+ "prefer": args.lesson_prefer,
861
+ }
862
+ if args.lesson_kind
863
+ else None,
864
+ )
865
+ payload = append_human_reward(
866
+ registry_path=registry_path,
867
+ runtime_root_override=args.runtime_root,
868
+ goal_id=args.goal_id,
869
+ run_generated_at=args.run_generated_at,
870
+ reward=reward,
871
+ dry_run=bool(args.dry_run),
872
+ state_file_override=Path(args.state_file).expanduser() if args.state_file else None,
873
+ write_active_state_summary=bool(args.write_active_state_summary),
874
+ )
875
+ except Exception as exc:
876
+ payload = {
877
+ "ok": False,
878
+ "registry": str(registry_path),
879
+ "runtime_root": args.runtime_root,
880
+ "goal_id": args.goal_id,
881
+ "appended": False,
882
+ "dry_run": bool(args.dry_run),
883
+ "error": str(exc),
884
+ }
885
+ print_payload(payload, fmt, render_reward_markdown)
886
+ return 0 if payload.get("ok") else 1
887
+
888
+ try:
889
+ payload = record_operator_gate(
890
+ registry_path=registry_path,
891
+ runtime_root_override=args.runtime_root,
892
+ goal_id=args.goal_id,
893
+ gate=args.gate,
894
+ decision=args.decision,
895
+ operator_question=args.operator_question,
896
+ reason_summary=args.reason_summary,
897
+ follow_up=args.follow_up,
898
+ agent_command=args.agent_command,
899
+ recommended_action=args.recommended_action,
900
+ recorded_at=args.recorded_at,
901
+ dry_run=bool(args.dry_run),
902
+ sync_global=not bool(args.no_global_sync),
903
+ )
904
+ except Exception as exc:
905
+ payload = {
906
+ "ok": False,
907
+ "registry": str(registry_path),
908
+ "runtime_root": args.runtime_root,
909
+ "goal_id": args.goal_id,
910
+ "appended": False,
911
+ "dry_run": bool(args.dry_run),
912
+ "error": str(exc),
913
+ }
914
+ print_payload(payload, fmt, render_operator_gate_markdown)
915
+ return 0 if payload.get("ok") else 1