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,763 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ import json
5
+ import sys
6
+ from collections.abc import Callable
7
+ from pathlib import Path
8
+
9
+ from ..benchmark_adapters.skillsbench import (
10
+ SKILLSBENCH_DEFAULT_DATASET,
11
+ SKILLSBENCH_DEFAULT_MODEL,
12
+ SKILLSBENCH_DEFAULT_ROUTE,
13
+ SKILLSBENCH_DEFAULT_TASK,
14
+ SKILLSBENCH_ROUTES,
15
+ build_skillsbench_benchmark_run,
16
+ build_skillsbench_benchflow_result_benchmark_run,
17
+ discover_skillsbench_benchflow_result_json,
18
+ skillsbench_recommended_action,
19
+ )
20
+ from ..benchmark_adapters.terminal_bench import (
21
+ TERMINAL_BENCH_CODEX_INSTALL_STRATEGIES,
22
+ TERMINAL_BENCH_CODEX_INSTALL_STRATEGY_RUNTIME_INSTALL_IF_MISSING,
23
+ TERMINAL_BENCH_DEFAULT_DATASET,
24
+ TERMINAL_BENCH_DEFAULT_MODEL,
25
+ TERMINAL_BENCH_DEFAULT_TASK,
26
+ TERMINAL_BENCH_MODES,
27
+ TERMINAL_BENCH_WORKER_CODEX_MATERIALIZATION_STRATEGIES,
28
+ build_terminal_bench_benchmark_run,
29
+ build_terminal_bench_harbor_result_benchmark_run,
30
+ collect_terminal_bench_loopx_cli_bridge_trace,
31
+ terminal_bench_recommended_action,
32
+ )
33
+ from ..benchmark_ledger import (
34
+ BENCHMARK_RUN_LEDGER_DEFAULT_PATH,
35
+ update_benchmark_run_ledger,
36
+ )
37
+ from ..control_plane.work_items.delivery_batch_scale import DELIVERY_BATCH_SCALE_CHOICES
38
+ from ..control_plane.work_items.delivery_outcome import DELIVERY_OUTCOME_CHOICES
39
+ from ..global_registry import sync_project_registry_to_global
40
+ from ..history import (
41
+ append_benchmark_run,
42
+ load_registry,
43
+ render_benchmark_run_append_markdown,
44
+ )
45
+ from ..paths import resolve_runtime_root
46
+ from ..status import (
47
+ compact_benchmark_run,
48
+ )
49
+ from .benchmark_run_ledger_case_analysis import (
50
+ BENCHMARK_RUN_LEDGER_CASE_ANALYSIS_COMMANDS,
51
+ handle_benchmark_run_ledger_case_analysis_command,
52
+ register_benchmark_run_ledger_case_analysis_commands,
53
+ )
54
+ from .benchmark_run_ledger_classification import benchmark_run_ledger_classification
55
+ from .benchmark_run_ledger_maintenance import (
56
+ BENCHMARK_RUN_LEDGER_MAINTENANCE_COMMANDS,
57
+ handle_benchmark_run_ledger_maintenance_command,
58
+ )
59
+ from .benchmark_run_ledger_maintenance_registration import (
60
+ register_benchmark_run_ledger_maintenance_commands,
61
+ )
62
+ from .benchmark_run_ledger_parity import (
63
+ BENCHMARK_RUN_LEDGER_PARITY_COMMANDS,
64
+ handle_benchmark_run_ledger_parity_command,
65
+ register_benchmark_run_ledger_parity_commands,
66
+ )
67
+
68
+
69
+ PrintPayload = Callable[
70
+ [dict[str, object], str, Callable[[dict[str, object]], str]],
71
+ None,
72
+ ]
73
+ OutputFormat = Callable[[argparse.Namespace], str]
74
+ AppendBenchmarkRunRolloutEvent = Callable[..., dict[str, object]]
75
+
76
+
77
+ def _safe_relative_path(path: Path, root: Path) -> str:
78
+ try:
79
+ return path.relative_to(root).as_posix()
80
+ except ValueError:
81
+ return path.name
82
+
83
+
84
+ BENCHMARK_RUN_LEDGER_COMMANDS = (
85
+ {
86
+ "run",
87
+ }
88
+ | BENCHMARK_RUN_LEDGER_CASE_ANALYSIS_COMMANDS
89
+ | BENCHMARK_RUN_LEDGER_MAINTENANCE_COMMANDS
90
+ | BENCHMARK_RUN_LEDGER_PARITY_COMMANDS
91
+ )
92
+
93
+
94
+ def register_benchmark_run_ledger_commands(
95
+ benchmark_subparsers: argparse._SubParsersAction,
96
+ add_subcommand_format: Callable[[argparse.ArgumentParser], None],
97
+ ) -> None:
98
+ register_benchmark_run_ledger_parity_commands(
99
+ benchmark_subparsers,
100
+ add_subcommand_format,
101
+ )
102
+
103
+ benchmark_run_parser = benchmark_subparsers.add_parser(
104
+ "run",
105
+ help="Build or append a compact benchmark_run_v0 fixture or ingest a Harbor job result.",
106
+ )
107
+ benchmark_run_parser.add_argument(
108
+ "benchmark_name",
109
+ choices=["terminal-bench", "skillsbench"],
110
+ help=(
111
+ "Benchmark family. terminal-bench supports Harbor ingest and fixtures; "
112
+ "skillsbench supports a no-run compact adapter skeleton."
113
+ ),
114
+ )
115
+ benchmark_run_parser.add_argument("--goal-id", required=True, help="Goal id for dry-run/append context.")
116
+ benchmark_run_parser.add_argument(
117
+ "--mode",
118
+ choices=TERMINAL_BENCH_MODES,
119
+ default="loopx-managed-codex",
120
+ help="Terminal-Bench worker mode. Defaults to the managed LoopX treatment.",
121
+ )
122
+ benchmark_run_parser.add_argument("--dataset", default=TERMINAL_BENCH_DEFAULT_DATASET)
123
+ benchmark_run_parser.add_argument("--include-task-name", default=TERMINAL_BENCH_DEFAULT_TASK)
124
+ benchmark_run_parser.add_argument("--runner", choices=["harbor"], default="harbor")
125
+ benchmark_run_parser.add_argument("--agent", choices=["codex"], default="codex")
126
+ benchmark_run_parser.add_argument("--model", default=TERMINAL_BENCH_DEFAULT_MODEL)
127
+ benchmark_run_parser.add_argument(
128
+ "--skillsbench-route",
129
+ choices=SKILLSBENCH_ROUTES,
130
+ default=SKILLSBENCH_DEFAULT_ROUTE,
131
+ help=(
132
+ "SkillsBench route for the no-run compact adapter skeleton. "
133
+ "Defaults to the Codex CLI /goal baseline. Use "
134
+ "loopx-goal-start-product-mode for the real LoopX treatment; "
135
+ "retired prompt-polling routes are not launchable."
136
+ ),
137
+ )
138
+ benchmark_run_parser.add_argument(
139
+ "--skillsbench-result-json",
140
+ help=(
141
+ "Ingest an official SkillsBench/BenchFlow result.json into a compact "
142
+ "benchmark_run_v0. This reducer reads only result.json and sibling "
143
+ "timing.json; it does not read prompts, trajectories, verifier logs, "
144
+ "task text, credentials, upload, or submit."
145
+ ),
146
+ )
147
+ benchmark_run_parser.add_argument(
148
+ "--skillsbench-result-root",
149
+ help=(
150
+ "Discover and ingest an official SkillsBench/BenchFlow result.json below "
151
+ "this job, case, or run-group directory. Discovery reads only compact "
152
+ "result.json metadata and supports nested paths such as "
153
+ "case_dir/case_dir/result.json."
154
+ ),
155
+ )
156
+ benchmark_run_parser.add_argument(
157
+ "--timeout-multiplier",
158
+ type=float,
159
+ help="Preview Harbor --timeout-multiplier for private long-horizon tiers.",
160
+ )
161
+ benchmark_run_parser.add_argument(
162
+ "--agent-timeout-multiplier",
163
+ type=float,
164
+ help="Preview Harbor --agent-timeout-multiplier for private long-horizon tiers.",
165
+ )
166
+ benchmark_run_parser.add_argument(
167
+ "--verifier-timeout-multiplier",
168
+ type=float,
169
+ help="Preview Harbor --verifier-timeout-multiplier for private long-horizon tiers.",
170
+ )
171
+ benchmark_run_parser.add_argument(
172
+ "--agent-setup-timeout-multiplier",
173
+ type=float,
174
+ help="Preview Harbor --agent-setup-timeout-multiplier for private long-horizon tiers.",
175
+ )
176
+ benchmark_run_parser.add_argument(
177
+ "--environment-build-timeout-multiplier",
178
+ type=float,
179
+ help="Preview Harbor --environment-build-timeout-multiplier for private long-horizon tiers.",
180
+ )
181
+ benchmark_run_parser.add_argument(
182
+ "--codex-install-strategy",
183
+ choices=TERMINAL_BENCH_CODEX_INSTALL_STRATEGIES,
184
+ default=TERMINAL_BENCH_CODEX_INSTALL_STRATEGY_RUNTIME_INSTALL_IF_MISSING,
185
+ help=(
186
+ "Preview the managed Codex setup strategy. require_existing_codex "
187
+ "disables runtime npm install and fails fast if Codex is not already "
188
+ "usable in the worker image."
189
+ ),
190
+ )
191
+ benchmark_run_parser.add_argument(
192
+ "--codex-preflight-timeout-sec",
193
+ type=int,
194
+ help=(
195
+ "Preview the per-command timeout for fail-fast Codex CLI setup probes "
196
+ "inside the worker before a benchmark task starts."
197
+ ),
198
+ )
199
+ benchmark_run_parser.add_argument(
200
+ "--worker-codex-materialization-strategy",
201
+ choices=TERMINAL_BENCH_WORKER_CODEX_MATERIALIZATION_STRATEGIES,
202
+ help=(
203
+ "Declare how Codex becomes visible inside the worker. "
204
+ "Use worker_path_preprovisioned only after a worker image or launcher "
205
+ "already proves codex is on PATH; use runtime_install_extended_setup "
206
+ "for a bounded setup probe that installs Codex during worker setup."
207
+ ),
208
+ )
209
+ benchmark_run_parser.add_argument(
210
+ "--worker-materialization-probe-only",
211
+ action="store_true",
212
+ help=(
213
+ "Preview a no-upload worker materialization probe that stops after "
214
+ "Codex install/preflight writes compact benchmark_run_v0 evidence; "
215
+ "it does not run task-solving or claim case success."
216
+ ),
217
+ )
218
+ benchmark_run_parser.add_argument(
219
+ "--setup-timeout-repair-profile",
220
+ action="store_true",
221
+ help=(
222
+ "Apply the generic pre-worker setup-timeout repair launch profile: "
223
+ "explicit 8x agent and setup timeout multipliers plus "
224
+ "a declared worker Codex materialization strategy. Without a "
225
+ "runtime materialization strategy it uses require_existing_codex "
226
+ "fail-fast probes."
227
+ ),
228
+ )
229
+ benchmark_run_parser.add_argument(
230
+ "--harbor-job-dir",
231
+ help=(
232
+ "Ingest an existing Harbor job directory into a compact benchmark_run_v0. "
233
+ "This reads runner artifacts and worker counter files only; it does not run "
234
+ "Harbor, Terminal-Bench, Codex, Docker, model APIs, or upload."
235
+ ),
236
+ )
237
+ benchmark_run_parser.add_argument(
238
+ "--fake-worker",
239
+ action="store_true",
240
+ help="Use the deterministic fake managed-worker event path. No real Codex is invoked.",
241
+ )
242
+ benchmark_run_parser.add_argument(
243
+ "--preflight-guard",
244
+ action="store_true",
245
+ help=(
246
+ "Build a managed real-run preflight guard event. This may probe local CLI surfaces "
247
+ "but does not run Harbor, Terminal-Bench, Codex workers, task containers, or uploads."
248
+ ),
249
+ )
250
+ benchmark_run_parser.add_argument(
251
+ "--require-task-material-ready",
252
+ action="store_true",
253
+ help=(
254
+ "With --preflight-guard, require locally resolved Terminal-Bench task material "
255
+ "before the private launch summary can be ready. Unknown or uncached material is "
256
+ "reported as a blocker; no task prompt text is read."
257
+ ),
258
+ )
259
+ benchmark_run_parser.add_argument(
260
+ "--cli-bridge-contract",
261
+ action="store_true",
262
+ help=(
263
+ "Execute the host-agent LoopX CLI bridge contract fixture for "
264
+ "codex-loopx. This runs LoopX CLI read commands and an "
265
+ "append-benchmark-run dry-run only; no Harbor, Terminal-Bench, Codex "
266
+ "worker, model API, or upload is invoked."
267
+ ),
268
+ )
269
+ benchmark_run_parser.add_argument(
270
+ "--worker-cli-bridge-fixture",
271
+ action="store_true",
272
+ help=(
273
+ "Build the codex-loopx worker in-case CLI bridge fixture. "
274
+ "This records worker-side LoopX call counters separately "
275
+ "from runner bridge calls and does not run Harbor, Terminal-Bench, "
276
+ "Codex workers, model APIs, or uploads."
277
+ ),
278
+ )
279
+ benchmark_run_parser.add_argument(
280
+ "--active-cli-bridge",
281
+ action="store_true",
282
+ help=(
283
+ "With codex-loopx --preflight-guard, build the private no-upload "
284
+ "repeat preflight that enables the worker LoopX CLI bridge and "
285
+ "requires worker-side CLI call counters before any in-case use claim."
286
+ ),
287
+ )
288
+ benchmark_run_parser.add_argument(
289
+ "--active-user-assisted-treatment",
290
+ action="store_true",
291
+ help=(
292
+ "With codex-loopx --preflight-guard --active-cli-bridge, build "
293
+ "the active-user assisted treatment preflight contract. This does not "
294
+ "run Harbor, Codex, a simulator, or inject user messages."
295
+ ),
296
+ )
297
+ benchmark_run_parser.add_argument(
298
+ "--active-user-observation-fixture",
299
+ action="store_true",
300
+ help=(
301
+ "With --active-user-assisted-treatment, build the deterministic worker "
302
+ "after-start active-user observation fixture. This does not run Harbor, "
303
+ "Codex, a model-backed simulator, task containers, or uploads."
304
+ ),
305
+ )
306
+ benchmark_run_parser.add_argument("--classification")
307
+ benchmark_run_parser.add_argument("--recommended-action")
308
+ benchmark_run_parser.add_argument(
309
+ "--update-run-ledger",
310
+ action="store_true",
311
+ help=(
312
+ "After building/appending the compact benchmark_run_v0, upsert a "
313
+ "public-safe benchmark_run_ledger_v0 JSON row and Markdown view."
314
+ ),
315
+ )
316
+ benchmark_run_parser.add_argument(
317
+ "--run-ledger-path",
318
+ default=str(BENCHMARK_RUN_LEDGER_DEFAULT_PATH),
319
+ help="Path to benchmark_run_ledger_v0 JSON. Markdown is rendered next to it.",
320
+ )
321
+ benchmark_run_parser.add_argument(
322
+ "--run-group-id",
323
+ help="Optional stable run group id for the ledger row.",
324
+ )
325
+ benchmark_run_parser.add_argument(
326
+ "--arm-id",
327
+ help="Optional arm id override for the ledger row.",
328
+ )
329
+ benchmark_run_parser.add_argument(
330
+ "--run-ledger-note",
331
+ help="Optional compact note for the ledger row.",
332
+ )
333
+ benchmark_run_parser.add_argument(
334
+ "--delivery-batch-scale",
335
+ choices=DELIVERY_BATCH_SCALE_CHOICES,
336
+ help="Optional delivery scale label for the run index.",
337
+ )
338
+ benchmark_run_parser.add_argument(
339
+ "--delivery-outcome",
340
+ choices=DELIVERY_OUTCOME_CHOICES,
341
+ help="Optional delivery outcome label for the run index.",
342
+ )
343
+ benchmark_run_parser.add_argument("--dry-run", action="store_true", help="Preview append without writing. This is the default.")
344
+ benchmark_run_parser.add_argument("--execute", action="store_true", help="Append the compact fixture event.")
345
+ benchmark_run_parser.add_argument("--no-global-sync", action="store_true", help="Skip global registry sync after append.")
346
+
347
+ register_benchmark_run_ledger_maintenance_commands(benchmark_subparsers)
348
+ register_benchmark_run_ledger_case_analysis_commands(benchmark_subparsers)
349
+
350
+
351
+ def handle_benchmark_run_ledger_command(
352
+ args: argparse.Namespace,
353
+ *,
354
+ registry_path: Path,
355
+ print_payload: PrintPayload,
356
+ output_format: OutputFormat,
357
+ append_benchmark_run_rollout_event: AppendBenchmarkRunRolloutEvent,
358
+ ) -> int | None:
359
+ if args.benchmark_command not in BENCHMARK_RUN_LEDGER_COMMANDS:
360
+ return None
361
+
362
+ parity_result = handle_benchmark_run_ledger_parity_command(
363
+ args,
364
+ print_payload=print_payload,
365
+ output_format=output_format,
366
+ )
367
+ if parity_result is not None:
368
+ return parity_result
369
+
370
+ ledger_maintenance_result = handle_benchmark_run_ledger_maintenance_command(
371
+ args,
372
+ registry_path=registry_path,
373
+ print_payload=print_payload,
374
+ output_format=output_format,
375
+ )
376
+ if ledger_maintenance_result is not None:
377
+ return ledger_maintenance_result
378
+
379
+ case_analysis_result = handle_benchmark_run_ledger_case_analysis_command(
380
+ args,
381
+ print_payload=print_payload,
382
+ output_format=output_format,
383
+ )
384
+ if case_analysis_result is not None:
385
+ return case_analysis_result
386
+
387
+ if args.benchmark_command == "run":
388
+ try:
389
+ if args.dry_run and args.execute:
390
+ raise ValueError("benchmark run accepts either --dry-run or --execute, not both")
391
+ skillsbench_result_path: Path | None = None
392
+ skillsbench_result_root_path: Path | None = None
393
+ skillsbench_result_discovery: dict[str, object] | None = None
394
+ classification = benchmark_run_ledger_classification(args)
395
+ terminal_bench_only_flags = (
396
+ args.harbor_job_dir
397
+ or args.fake_worker
398
+ or args.preflight_guard
399
+ or args.require_task_material_ready
400
+ or args.cli_bridge_contract
401
+ or args.worker_cli_bridge_fixture
402
+ or args.active_cli_bridge
403
+ or args.active_user_assisted_treatment
404
+ or args.active_user_observation_fixture
405
+ or args.setup_timeout_repair_profile
406
+ or args.timeout_multiplier is not None
407
+ or args.agent_timeout_multiplier is not None
408
+ or args.verifier_timeout_multiplier is not None
409
+ or args.agent_setup_timeout_multiplier is not None
410
+ or args.environment_build_timeout_multiplier is not None
411
+ or args.codex_preflight_timeout_sec is not None
412
+ or args.worker_codex_materialization_strategy is not None
413
+ or args.worker_materialization_probe_only
414
+ )
415
+ if args.benchmark_name == "skillsbench" and terminal_bench_only_flags:
416
+ raise ValueError(
417
+ "skillsbench skeleton does not accept Terminal-Bench runner, "
418
+ "Harbor ingest, preflight, timeout, fake-worker, or bridge flags"
419
+ )
420
+ if args.skillsbench_result_json and args.skillsbench_result_root:
421
+ raise ValueError(
422
+ "--skillsbench-result-json and --skillsbench-result-root are mutually exclusive"
423
+ )
424
+ if args.harbor_job_dir and (
425
+ args.fake_worker
426
+ or args.preflight_guard
427
+ or args.require_task_material_ready
428
+ or args.cli_bridge_contract
429
+ or args.worker_cli_bridge_fixture
430
+ or args.active_cli_bridge
431
+ or args.active_user_assisted_treatment
432
+ or args.active_user_observation_fixture
433
+ or args.setup_timeout_repair_profile
434
+ or args.worker_materialization_probe_only
435
+ ):
436
+ raise ValueError(
437
+ "--harbor-job-dir cannot be combined with fixture or preflight flags"
438
+ )
439
+ if args.require_task_material_ready and not args.preflight_guard:
440
+ raise ValueError("--require-task-material-ready requires --preflight-guard")
441
+ timeout_multiplier_preview_requested = any(
442
+ value is not None
443
+ for value in (
444
+ args.timeout_multiplier,
445
+ args.agent_timeout_multiplier,
446
+ args.verifier_timeout_multiplier,
447
+ args.agent_setup_timeout_multiplier,
448
+ args.environment_build_timeout_multiplier,
449
+ args.codex_preflight_timeout_sec,
450
+ args.worker_codex_materialization_strategy,
451
+ )
452
+ )
453
+ timeout_multiplier_preview_defaulted = (
454
+ args.active_cli_bridge and args.agent_timeout_multiplier is None
455
+ )
456
+ if args.harbor_job_dir and timeout_multiplier_preview_requested:
457
+ raise ValueError(
458
+ "--harbor-job-dir reads timeout policy from Harbor artifacts; "
459
+ "do not pass preview timeout multiplier flags"
460
+ )
461
+ cli_bridge_trace = None
462
+ if args.cli_bridge_contract:
463
+ runtime_root = resolve_runtime_root(
464
+ load_registry(registry_path),
465
+ args.runtime_root,
466
+ )
467
+ cli_bridge_trace = collect_terminal_bench_loopx_cli_bridge_trace(
468
+ goal_id=args.goal_id,
469
+ registry=str(registry_path),
470
+ runtime_root=str(runtime_root),
471
+ command_prefix=[sys.executable, "-m", "loopx.cli"],
472
+ scan_path="loopx/benchmark.py",
473
+ classification=classification,
474
+ )
475
+ if args.benchmark_name == "skillsbench":
476
+ skillsbench_dataset = (
477
+ SKILLSBENCH_DEFAULT_DATASET
478
+ if args.dataset == TERMINAL_BENCH_DEFAULT_DATASET
479
+ else args.dataset
480
+ )
481
+ skillsbench_task = (
482
+ SKILLSBENCH_DEFAULT_TASK
483
+ if args.include_task_name == TERMINAL_BENCH_DEFAULT_TASK
484
+ else args.include_task_name
485
+ )
486
+ skillsbench_model = (
487
+ SKILLSBENCH_DEFAULT_MODEL
488
+ if args.model == TERMINAL_BENCH_DEFAULT_MODEL
489
+ else args.model
490
+ )
491
+ if args.skillsbench_result_json:
492
+ skillsbench_result_path, skillsbench_result_discovery = (
493
+ discover_skillsbench_benchflow_result_json(
494
+ Path(args.skillsbench_result_json).expanduser(),
495
+ )
496
+ )
497
+ if skillsbench_result_path is None:
498
+ raise ValueError(
499
+ "SkillsBench --skillsbench-result-json does not exist "
500
+ "or is not a result.json file"
501
+ )
502
+ elif args.skillsbench_result_root:
503
+ skillsbench_result_root_path = Path(
504
+ args.skillsbench_result_root
505
+ ).expanduser()
506
+ skillsbench_result_path, skillsbench_result_discovery = (
507
+ discover_skillsbench_benchflow_result_json(
508
+ skillsbench_result_root_path,
509
+ task_id=skillsbench_task,
510
+ )
511
+ )
512
+ if skillsbench_result_path is None:
513
+ raise ValueError(
514
+ "SkillsBench result discovery did not find a matching "
515
+ f"result.json below --skillsbench-result-root; "
516
+ f"status={skillsbench_result_discovery.get('status')} "
517
+ f"candidate_count={skillsbench_result_discovery.get('candidate_count')}"
518
+ )
519
+ if skillsbench_result_path is not None:
520
+ benchmark_run_input = build_skillsbench_benchflow_result_benchmark_run(
521
+ skillsbench_result_path,
522
+ route=args.skillsbench_route,
523
+ dataset=skillsbench_dataset,
524
+ agent=args.agent,
525
+ model=skillsbench_model,
526
+ result_discovery=skillsbench_result_discovery,
527
+ )
528
+ else:
529
+ benchmark_run_input = build_skillsbench_benchmark_run(
530
+ route=args.skillsbench_route,
531
+ dataset=skillsbench_dataset,
532
+ task_id=skillsbench_task,
533
+ agent=args.agent,
534
+ model=skillsbench_model,
535
+ )
536
+ elif args.harbor_job_dir:
537
+ benchmark_run_input = build_terminal_bench_harbor_result_benchmark_run(
538
+ args.harbor_job_dir,
539
+ )
540
+ else:
541
+ benchmark_run_input = build_terminal_bench_benchmark_run(
542
+ mode=args.mode,
543
+ dataset=args.dataset,
544
+ task_id=args.include_task_name,
545
+ runner=args.runner,
546
+ agent=args.agent,
547
+ model=args.model,
548
+ fake_worker=bool(args.fake_worker),
549
+ preflight_guard=bool(args.preflight_guard),
550
+ cli_bridge_contract=bool(args.cli_bridge_contract),
551
+ cli_bridge_trace=cli_bridge_trace,
552
+ worker_cli_bridge_fixture=bool(args.worker_cli_bridge_fixture),
553
+ active_cli_bridge_preflight=bool(args.active_cli_bridge),
554
+ active_user_assisted_treatment_preflight=bool(
555
+ args.active_user_assisted_treatment
556
+ ),
557
+ active_user_observation_fixture=bool(
558
+ args.active_user_observation_fixture
559
+ ),
560
+ require_task_material_ready=bool(args.require_task_material_ready),
561
+ timeout_multiplier=args.timeout_multiplier,
562
+ agent_timeout_multiplier=args.agent_timeout_multiplier,
563
+ verifier_timeout_multiplier=args.verifier_timeout_multiplier,
564
+ agent_setup_timeout_multiplier=args.agent_setup_timeout_multiplier,
565
+ environment_build_timeout_multiplier=args.environment_build_timeout_multiplier,
566
+ codex_install_strategy=args.codex_install_strategy,
567
+ codex_preflight_timeout_sec=args.codex_preflight_timeout_sec,
568
+ worker_codex_materialization_strategy=(
569
+ args.worker_codex_materialization_strategy
570
+ ),
571
+ worker_materialization_probe_only=bool(
572
+ args.worker_materialization_probe_only
573
+ ),
574
+ setup_timeout_repair_profile=bool(
575
+ args.setup_timeout_repair_profile
576
+ ),
577
+ )
578
+ benchmark_run = compact_benchmark_run(benchmark_run_input)
579
+ if not benchmark_run:
580
+ raise ValueError("benchmark command did not produce a compactable benchmark_run_v0")
581
+ if args.harbor_job_dir:
582
+ benchmark_cli_mode = str(benchmark_run.get("mode") or args.mode)
583
+ elif (
584
+ args.benchmark_name == "terminal-bench"
585
+ and args.active_user_assisted_treatment
586
+ ):
587
+ benchmark_cli_mode = str(benchmark_run.get("mode") or args.mode)
588
+ elif args.benchmark_name == "skillsbench":
589
+ benchmark_cli_mode = str(args.skillsbench_route)
590
+ else:
591
+ benchmark_cli_mode = str(args.mode)
592
+ benchmark_cli_mode_source = (
593
+ "harbor_job_result"
594
+ if args.harbor_job_dir
595
+ else "skillsbench_route"
596
+ if args.benchmark_name == "skillsbench"
597
+ else "cli_arg"
598
+ )
599
+
600
+ dry_run = not bool(args.execute)
601
+ payload = append_benchmark_run(
602
+ registry_path=registry_path,
603
+ runtime_root_override=args.runtime_root,
604
+ goal_id=args.goal_id,
605
+ benchmark_run=benchmark_run,
606
+ classification=classification,
607
+ recommended_action=args.recommended_action
608
+ or (
609
+ skillsbench_recommended_action(route=args.skillsbench_route)
610
+ if args.benchmark_name == "skillsbench"
611
+ else
612
+ "inspect runner-side Terminal-Bench result and refine worker closure/writeback"
613
+ if args.harbor_job_dir
614
+ else terminal_bench_recommended_action(
615
+ mode=args.mode,
616
+ fake_worker=bool(args.fake_worker),
617
+ preflight_guard=bool(args.preflight_guard),
618
+ cli_bridge_contract=bool(args.cli_bridge_contract),
619
+ worker_cli_bridge_fixture=bool(args.worker_cli_bridge_fixture),
620
+ active_cli_bridge_preflight=bool(args.active_cli_bridge),
621
+ active_user_assisted_treatment_preflight=bool(
622
+ args.active_user_assisted_treatment
623
+ ),
624
+ )
625
+ ),
626
+ delivery_batch_scale=args.delivery_batch_scale,
627
+ delivery_outcome=args.delivery_outcome,
628
+ dry_run=dry_run,
629
+ )
630
+ payload["benchmark_cli"] = {
631
+ "benchmark": args.benchmark_name,
632
+ "mode": benchmark_cli_mode,
633
+ "requested_mode": args.mode,
634
+ "skillsbench_route": args.skillsbench_route
635
+ if args.benchmark_name == "skillsbench"
636
+ else None,
637
+ "mode_source": benchmark_cli_mode_source,
638
+ "fake_worker": bool(args.fake_worker),
639
+ "preflight_guard": bool(args.preflight_guard),
640
+ "require_task_material_ready": bool(args.require_task_material_ready),
641
+ "cli_bridge_contract": bool(args.cli_bridge_contract),
642
+ "worker_cli_bridge_fixture": bool(args.worker_cli_bridge_fixture),
643
+ "active_cli_bridge": bool(args.active_cli_bridge),
644
+ "active_user_assisted_treatment": bool(
645
+ args.active_user_assisted_treatment
646
+ ),
647
+ "harbor_job_result_ingested": bool(args.harbor_job_dir),
648
+ "skillsbench_result_ingested": skillsbench_result_path is not None,
649
+ "skillsbench_result_root_ingested": bool(args.skillsbench_result_root),
650
+ "timeout_multiplier_preview_requested": (
651
+ timeout_multiplier_preview_requested
652
+ or timeout_multiplier_preview_defaulted
653
+ ),
654
+ "timeout_multiplier_preview_defaulted": timeout_multiplier_preview_defaulted,
655
+ "cli_bridge_trace_observed": bool(
656
+ isinstance(cli_bridge_trace, dict)
657
+ and cli_bridge_trace.get("bridge_available") is True
658
+ ),
659
+ "real_runner_invoked": False,
660
+ "real_codex_invoked": False,
661
+ "auth_values_read": False,
662
+ "submit_eligible": False,
663
+ }
664
+ if skillsbench_result_discovery is not None:
665
+ payload["skillsbench_result_discovery"] = skillsbench_result_discovery
666
+ if args.update_run_ledger:
667
+ harbor_job_path = (
668
+ Path(args.harbor_job_dir).expanduser()
669
+ if args.harbor_job_dir
670
+ else None
671
+ )
672
+ inferred_run_group_id = args.run_group_id
673
+ if not inferred_run_group_id and harbor_job_path is not None:
674
+ inferred_run_group_id = (
675
+ harbor_job_path.parent.parent.name
676
+ if harbor_job_path.parent.name == "jobs"
677
+ else harbor_job_path.parent.name
678
+ )
679
+ if (
680
+ not inferred_run_group_id
681
+ and skillsbench_result_root_path is not None
682
+ ):
683
+ inferred_run_group_id = skillsbench_result_root_path.name
684
+ if (
685
+ not inferred_run_group_id
686
+ and skillsbench_result_path is not None
687
+ ):
688
+ inferred_run_group_id = (
689
+ skillsbench_result_path.parent.parent.name
690
+ )
691
+ skillsbench_artifact_ref = None
692
+ skillsbench_result_ref = None
693
+ if skillsbench_result_path is not None:
694
+ if skillsbench_result_root_path is not None:
695
+ skillsbench_artifact_ref = _safe_relative_path(
696
+ skillsbench_result_path.parent,
697
+ skillsbench_result_root_path,
698
+ )
699
+ skillsbench_result_ref = _safe_relative_path(
700
+ skillsbench_result_path,
701
+ skillsbench_result_root_path,
702
+ )
703
+ else:
704
+ skillsbench_artifact_ref = skillsbench_result_path.parent.name
705
+ skillsbench_result_ref = skillsbench_result_path.name
706
+ payload["benchmark_run_ledger"] = update_benchmark_run_ledger(
707
+ ledger_path=args.run_ledger_path,
708
+ benchmark_run=benchmark_run,
709
+ artifact_ref=(
710
+ str(harbor_job_path)
711
+ if harbor_job_path is not None
712
+ else skillsbench_artifact_ref
713
+ ),
714
+ result_ref=(
715
+ str(harbor_job_path / "result.json")
716
+ if harbor_job_path is not None
717
+ else skillsbench_result_ref
718
+ ),
719
+ compact_artifact_ref=payload.get("json_path")
720
+ if isinstance(payload.get("json_path"), str)
721
+ else None,
722
+ run_group_id=inferred_run_group_id,
723
+ arm_id=args.arm_id,
724
+ notes=args.run_ledger_note,
725
+ dry_run=dry_run,
726
+ )
727
+ if args.no_global_sync:
728
+ payload["global_sync"] = {
729
+ "ok": True,
730
+ "dry_run": dry_run,
731
+ "skipped": True,
732
+ "reason": "disabled by --no-global-sync",
733
+ }
734
+ else:
735
+ payload["global_sync"] = sync_project_registry_to_global(
736
+ registry_path=registry_path,
737
+ runtime_root_override=args.runtime_root,
738
+ goal_id=args.goal_id,
739
+ dry_run=dry_run,
740
+ )
741
+ append_benchmark_run_rollout_event(
742
+ payload,
743
+ registry_path=registry_path,
744
+ runtime_root_arg=args.runtime_root,
745
+ command="benchmark",
746
+ action=args.benchmark_name,
747
+ )
748
+ except Exception as exc:
749
+ payload = {
750
+ "ok": False,
751
+ "dry_run": not bool(args.execute),
752
+ "appended": False,
753
+ "registry": str(registry_path),
754
+ "runtime_root": args.runtime_root,
755
+ "goal_id": args.goal_id,
756
+ "classification": benchmark_run_ledger_classification(args),
757
+ "error": str(exc),
758
+ }
759
+ print_payload(payload, args.format, render_benchmark_run_append_markdown)
760
+ return 0 if payload.get("ok") else 1
761
+
762
+
763
+ return None