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
loopx/history.py ADDED
@@ -0,0 +1,1507 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ from pathlib import Path
5
+ from typing import Any, Callable
6
+
7
+ from .authority import goal_authority_registry_summary
8
+ from .control_plane import compact_control_plane_policy
9
+ from .control_plane.runtime.run_context_retention import goal_semantic_history_from_runs, latest_runs_with_agent_context
10
+ from .control_plane.runtime.run_index_duplicates import (
11
+ classify_index_duplicate_records,
12
+ duplicate_repair_decision,
13
+ index_identity,
14
+ )
15
+ from .control_plane.runtime.run_index_rebuild import (
16
+ apply_reviewed_collision_rebuild,
17
+ build_collision_rebuild_plan,
18
+ collision_review_groups,
19
+ validate_reviewed_collision_plan,
20
+ )
21
+ from .control_plane.runtime.run_artifacts import (
22
+ next_run_artifact_paths,
23
+ reserve_run_artifact_paths,
24
+ run_file_stem,
25
+ )
26
+ from .control_plane.runtime.time import now_local_iso
27
+ from .control_plane.work_items.delivery_batch_scale import require_delivery_batch_scale
28
+ from .control_plane.work_items.delivery_outcome import require_delivery_outcome
29
+ from .doctor import PROMOTION_READINESS_CLASSIFICATIONS
30
+ from .execution_profile import compact_execution_profile
31
+ from .explore_graph import compact_explore_graph_policy
32
+ from .paths import registry_project_root, resolve_runtime_root
33
+ from .presentation.markdown import (
34
+ markdown_code,
35
+ markdown_table_row,
36
+ markdown_table_separator,
37
+ )
38
+ from .control_plane.quota.monitor_poll import QUOTA_MONITOR_POLL_CLASSIFICATION
39
+ from .control_plane.quota.slot_accounting import (
40
+ QUOTA_SLOT_SPENT_CLASSIFICATION,
41
+ QUOTA_SLOT_VOIDED_CLASSIFICATION,
42
+ )
43
+ from .quota import goal_quota_with_spend_ledger
44
+ from .registry import read_json, registry_goals
45
+
46
+
47
+ STATUS_NEUTRAL_CLASSIFICATIONS = {
48
+ QUOTA_SLOT_SPENT_CLASSIFICATION,
49
+ QUOTA_SLOT_VOIDED_CLASSIFICATION,
50
+ QUOTA_MONITOR_POLL_CLASSIFICATION,
51
+ *PROMOTION_READINESS_CLASSIFICATIONS,
52
+ }
53
+ AGENT_LANE_PROGRESS_SCOPE = "agent_lane"
54
+ REGISTRY_ATTENTION_FIELDS = (
55
+ "waiting_on",
56
+ "attention_status",
57
+ "operator_question",
58
+ "recommended_action",
59
+ "next_handoff_condition",
60
+ )
61
+
62
+
63
+ def now_local() -> str:
64
+ return now_local_iso()
65
+
66
+
67
+ def _normalize_optional_delivery_outcome(value: str | None) -> str | None:
68
+ return require_delivery_outcome(value).value if value else None
69
+
70
+
71
+ def _normalize_optional_delivery_batch_scale(value: str | None) -> str | None:
72
+ return require_delivery_batch_scale(value).value if value else None
73
+
74
+
75
+ def unique_run_paths(runs_dir: Path, generated_at: str) -> tuple[Path, Path]:
76
+ return next_run_artifact_paths(runs_dir, run_file_stem(generated_at))
77
+
78
+
79
+ def reserve_unique_run_paths(runs_dir: Path, generated_at: str) -> tuple[Path, Path]:
80
+ """Atomically reserve a run JSON path for concurrent append writers."""
81
+ return reserve_run_artifact_paths(runs_dir, run_file_stem(generated_at))
82
+
83
+
84
+ def write_reserved_run_artifacts(
85
+ *,
86
+ runs_dir: Path,
87
+ generated_at: str,
88
+ record: dict[str, Any],
89
+ index_record: dict[str, Any],
90
+ payload: dict[str, Any],
91
+ render_markdown: Callable[[dict[str, Any]], str],
92
+ ) -> None:
93
+ json_path, markdown_path = reserve_unique_run_paths(runs_dir, generated_at)
94
+ index_path = runs_dir / "index.jsonl"
95
+ index_record["json_path"] = str(json_path)
96
+ index_record["markdown_path"] = str(markdown_path)
97
+ payload["json_path"] = str(json_path)
98
+ payload["markdown_path"] = str(markdown_path)
99
+ payload["index_path"] = str(index_path)
100
+ json_path.write_text(json.dumps(record, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
101
+ markdown_path.write_text(render_markdown(payload) + "\n", encoding="utf-8")
102
+ with index_path.open("a", encoding="utf-8") as f:
103
+ f.write(json.dumps(index_record, ensure_ascii=False) + "\n")
104
+
105
+
106
+ def validate_goal_id_path_segment(goal_id: str) -> str:
107
+ value = str(goal_id or "").strip()
108
+ if not value:
109
+ raise ValueError("goal id is required")
110
+ if value in {".", ".."} or "/" in value or "\\" in value:
111
+ raise ValueError("goal id must be a single path segment")
112
+ if Path(value).name != value:
113
+ raise ValueError("goal id must not include path traversal")
114
+ return value
115
+
116
+
117
+ def load_registry(path: Path) -> dict[str, Any]:
118
+ if not path.exists():
119
+ return {}
120
+ return read_json(path)
121
+
122
+
123
+ def discover_goal_ids(
124
+ runtime_root: Path,
125
+ registry: dict[str, Any],
126
+ requested_goal: str | None,
127
+ *,
128
+ include_runtime_goals: bool = True,
129
+ ) -> list[str]:
130
+ if requested_goal:
131
+ return [requested_goal]
132
+
133
+ ids = {str(goal.get("id")) for goal in registry_goals(registry)}
134
+ goals_dir = runtime_root / "goals"
135
+ if include_runtime_goals and goals_dir.exists():
136
+ ids.update(path.name for path in goals_dir.iterdir() if path.is_dir())
137
+ return sorted(ids)
138
+
139
+
140
+ def _indexed_artifact_exists(value: Any, *, artifact_root: Path | None) -> bool:
141
+ text = str(value or "").strip()
142
+ if not text:
143
+ return False
144
+ path = Path(text).expanduser()
145
+ if not path.is_absolute() and artifact_root is not None:
146
+ path = artifact_root / path
147
+ return path.exists()
148
+
149
+
150
+ def load_index(
151
+ path: Path,
152
+ *,
153
+ artifact_root: Path | None = None,
154
+ ) -> tuple[list[dict[str, Any]], int]:
155
+ if not path.exists():
156
+ return [], 0
157
+
158
+ records: list[dict[str, Any]] = []
159
+ positions: dict[tuple[str, str, str], int] = {}
160
+ raw_count = 0
161
+ with path.open(encoding="utf-8") as f:
162
+ for line in f:
163
+ if not line.strip():
164
+ continue
165
+ raw_count += 1
166
+ try:
167
+ item = json.loads(line)
168
+ except json.JSONDecodeError:
169
+ continue
170
+ if not isinstance(item, dict):
171
+ continue
172
+
173
+ key = (
174
+ str(item.get("generated_at") or ""),
175
+ str(item.get("json_path") or ""),
176
+ str(item.get("markdown_path") or ""),
177
+ )
178
+ item = dict(item)
179
+ item["json_exists"] = _indexed_artifact_exists(
180
+ item.get("json_path"),
181
+ artifact_root=artifact_root,
182
+ )
183
+ item["markdown_exists"] = _indexed_artifact_exists(
184
+ item.get("markdown_path"),
185
+ artifact_root=artifact_root,
186
+ )
187
+ if key in positions:
188
+ records[positions[key]].update(item)
189
+ else:
190
+ positions[key] = len(records)
191
+ records.append(item)
192
+ return records, raw_count
193
+
194
+
195
+ def append_benchmark_run(
196
+ *,
197
+ registry_path: Path,
198
+ runtime_root_override: str | None,
199
+ goal_id: str,
200
+ benchmark_run: dict[str, Any],
201
+ classification: str = "benchmark_run_v0",
202
+ recommended_action: str | None = None,
203
+ delivery_batch_scale: str | None = None,
204
+ delivery_outcome: str | None = None,
205
+ dry_run: bool = True,
206
+ ) -> dict[str, Any]:
207
+ safe_goal_id = validate_goal_id_path_segment(goal_id)
208
+ if benchmark_run.get("schema_version") != "benchmark_run_v0":
209
+ raise ValueError("benchmark run must have schema_version=benchmark_run_v0")
210
+ delivery_batch_scale = _normalize_optional_delivery_batch_scale(delivery_batch_scale)
211
+ delivery_outcome = _normalize_optional_delivery_outcome(delivery_outcome)
212
+
213
+ registry = load_registry(registry_path)
214
+ runtime_root = resolve_runtime_root(
215
+ registry,
216
+ runtime_root_override,
217
+ registry_path=registry_path,
218
+ )
219
+ generated_at = now_local()
220
+ action = recommended_action or "inspect benchmark_run_v0 summary and continue passive benchmark work"
221
+ health_check = "benchmark_run_v0 compact event public-safe"
222
+
223
+ runs_dir = runtime_root / "goals" / safe_goal_id / "runs"
224
+ json_path, markdown_path = unique_run_paths(runs_dir, generated_at)
225
+ index_path = runs_dir / "index.jsonl"
226
+ record: dict[str, Any] = {
227
+ "generated_at": generated_at,
228
+ "goal_id": safe_goal_id,
229
+ "classification": classification,
230
+ "recommended_action": action,
231
+ "health_check": health_check,
232
+ "benchmark_run": benchmark_run,
233
+ }
234
+ if delivery_batch_scale:
235
+ record["delivery_batch_scale"] = delivery_batch_scale
236
+ if delivery_outcome:
237
+ record["delivery_outcome"] = delivery_outcome
238
+
239
+ index_record = {
240
+ **record,
241
+ "json_path": str(json_path),
242
+ "markdown_path": str(markdown_path),
243
+ }
244
+ payload = {
245
+ "ok": True,
246
+ "dry_run": dry_run,
247
+ "appended": not dry_run,
248
+ "registry": str(registry_path),
249
+ "runtime_root": str(runtime_root),
250
+ "goal_id": safe_goal_id,
251
+ "classification": classification,
252
+ "recommended_action": action,
253
+ "generated_at": generated_at,
254
+ "health_check": health_check,
255
+ "json_path": str(json_path),
256
+ "markdown_path": str(markdown_path),
257
+ "index_path": str(index_path),
258
+ "benchmark_run": benchmark_run,
259
+ }
260
+ if delivery_batch_scale:
261
+ payload["delivery_batch_scale"] = delivery_batch_scale
262
+ if delivery_outcome:
263
+ payload["delivery_outcome"] = delivery_outcome
264
+
265
+ if not dry_run:
266
+ write_reserved_run_artifacts(
267
+ runs_dir=runs_dir,
268
+ generated_at=generated_at,
269
+ record=record,
270
+ index_record=index_record,
271
+ payload=payload,
272
+ render_markdown=render_benchmark_run_append_markdown,
273
+ )
274
+ return payload
275
+
276
+
277
+ def append_benchmark_result(
278
+ *,
279
+ registry_path: Path,
280
+ runtime_root_override: str | None,
281
+ goal_id: str,
282
+ benchmark_result: dict[str, Any],
283
+ classification: str = "benchmark_result_v0",
284
+ recommended_action: str | None = None,
285
+ delivery_batch_scale: str | None = None,
286
+ delivery_outcome: str | None = None,
287
+ dry_run: bool = True,
288
+ ) -> dict[str, Any]:
289
+ safe_goal_id = validate_goal_id_path_segment(goal_id)
290
+ if benchmark_result.get("schema_version") != "benchmark_result_v0":
291
+ raise ValueError("benchmark result must have schema_version=benchmark_result_v0")
292
+ delivery_batch_scale = _normalize_optional_delivery_batch_scale(delivery_batch_scale)
293
+ delivery_outcome = _normalize_optional_delivery_outcome(delivery_outcome)
294
+
295
+ registry = load_registry(registry_path)
296
+ runtime_root = resolve_runtime_root(
297
+ registry,
298
+ runtime_root_override,
299
+ registry_path=registry_path,
300
+ )
301
+ generated_at = now_local()
302
+ action = recommended_action or "inspect benchmark_result_v0 summary and continue benchmark comparison work"
303
+ health_check = "benchmark_result_v0 compact event public-safe"
304
+
305
+ runs_dir = runtime_root / "goals" / safe_goal_id / "runs"
306
+ json_path, markdown_path = unique_run_paths(runs_dir, generated_at)
307
+ index_path = runs_dir / "index.jsonl"
308
+ record: dict[str, Any] = {
309
+ "generated_at": generated_at,
310
+ "goal_id": safe_goal_id,
311
+ "classification": classification,
312
+ "recommended_action": action,
313
+ "health_check": health_check,
314
+ "benchmark_result": benchmark_result,
315
+ }
316
+ if delivery_batch_scale:
317
+ record["delivery_batch_scale"] = delivery_batch_scale
318
+ if delivery_outcome:
319
+ record["delivery_outcome"] = delivery_outcome
320
+
321
+ index_record = {
322
+ **record,
323
+ "json_path": str(json_path),
324
+ "markdown_path": str(markdown_path),
325
+ }
326
+ payload = {
327
+ "ok": True,
328
+ "dry_run": dry_run,
329
+ "appended": not dry_run,
330
+ "registry": str(registry_path),
331
+ "runtime_root": str(runtime_root),
332
+ "goal_id": safe_goal_id,
333
+ "classification": classification,
334
+ "recommended_action": action,
335
+ "generated_at": generated_at,
336
+ "health_check": health_check,
337
+ "json_path": str(json_path),
338
+ "markdown_path": str(markdown_path),
339
+ "index_path": str(index_path),
340
+ "benchmark_result": benchmark_result,
341
+ }
342
+ if delivery_batch_scale:
343
+ payload["delivery_batch_scale"] = delivery_batch_scale
344
+ if delivery_outcome:
345
+ payload["delivery_outcome"] = delivery_outcome
346
+
347
+ if not dry_run:
348
+ write_reserved_run_artifacts(
349
+ runs_dir=runs_dir,
350
+ generated_at=generated_at,
351
+ record=record,
352
+ index_record=index_record,
353
+ payload=payload,
354
+ render_markdown=render_benchmark_result_append_markdown,
355
+ )
356
+ return payload
357
+
358
+
359
+ def append_benchmark_comparison(
360
+ *,
361
+ registry_path: Path,
362
+ runtime_root_override: str | None,
363
+ goal_id: str,
364
+ benchmark_comparison: dict[str, Any],
365
+ classification: str = "benchmark_comparison_v0",
366
+ recommended_action: str | None = None,
367
+ delivery_batch_scale: str | None = None,
368
+ delivery_outcome: str | None = None,
369
+ dry_run: bool = True,
370
+ ) -> dict[str, Any]:
371
+ safe_goal_id = validate_goal_id_path_segment(goal_id)
372
+ if benchmark_comparison.get("schema_version") != "benchmark_comparison_v0":
373
+ raise ValueError("benchmark comparison must have schema_version=benchmark_comparison_v0")
374
+ delivery_batch_scale = _normalize_optional_delivery_batch_scale(delivery_batch_scale)
375
+ delivery_outcome = _normalize_optional_delivery_outcome(delivery_outcome)
376
+
377
+ registry = load_registry(registry_path)
378
+ runtime_root = resolve_runtime_root(
379
+ registry,
380
+ runtime_root_override,
381
+ registry_path=registry_path,
382
+ )
383
+ generated_at = now_local()
384
+ action = recommended_action or "inspect benchmark_comparison_v0 deltas and continue benchmark analysis"
385
+ health_check = "benchmark_comparison_v0 compact event public-safe"
386
+
387
+ runs_dir = runtime_root / "goals" / safe_goal_id / "runs"
388
+ json_path, markdown_path = unique_run_paths(runs_dir, generated_at)
389
+ index_path = runs_dir / "index.jsonl"
390
+ record: dict[str, Any] = {
391
+ "generated_at": generated_at,
392
+ "goal_id": safe_goal_id,
393
+ "classification": classification,
394
+ "recommended_action": action,
395
+ "health_check": health_check,
396
+ "benchmark_comparison": benchmark_comparison,
397
+ }
398
+ if delivery_batch_scale:
399
+ record["delivery_batch_scale"] = delivery_batch_scale
400
+ if delivery_outcome:
401
+ record["delivery_outcome"] = delivery_outcome
402
+
403
+ index_record = {
404
+ **record,
405
+ "json_path": str(json_path),
406
+ "markdown_path": str(markdown_path),
407
+ }
408
+ payload = {
409
+ "ok": True,
410
+ "dry_run": dry_run,
411
+ "appended": not dry_run,
412
+ "registry": str(registry_path),
413
+ "runtime_root": str(runtime_root),
414
+ "goal_id": safe_goal_id,
415
+ "classification": classification,
416
+ "recommended_action": action,
417
+ "generated_at": generated_at,
418
+ "health_check": health_check,
419
+ "json_path": str(json_path),
420
+ "markdown_path": str(markdown_path),
421
+ "index_path": str(index_path),
422
+ "benchmark_comparison": benchmark_comparison,
423
+ }
424
+ if delivery_batch_scale:
425
+ payload["delivery_batch_scale"] = delivery_batch_scale
426
+ if delivery_outcome:
427
+ payload["delivery_outcome"] = delivery_outcome
428
+
429
+ if not dry_run:
430
+ write_reserved_run_artifacts(
431
+ runs_dir=runs_dir,
432
+ generated_at=generated_at,
433
+ record=record,
434
+ index_record=index_record,
435
+ payload=payload,
436
+ render_markdown=render_benchmark_comparison_append_markdown,
437
+ )
438
+ return payload
439
+
440
+
441
+ def append_benchmark_learning_ledger(
442
+ *,
443
+ registry_path: Path,
444
+ runtime_root_override: str | None,
445
+ goal_id: str,
446
+ benchmark_learning_ledger: dict[str, Any],
447
+ classification: str = "benchmark_learning_ledger_v0",
448
+ recommended_action: str | None = None,
449
+ delivery_batch_scale: str | None = None,
450
+ delivery_outcome: str | None = None,
451
+ dry_run: bool = True,
452
+ ) -> dict[str, Any]:
453
+ safe_goal_id = validate_goal_id_path_segment(goal_id)
454
+ if benchmark_learning_ledger.get("schema_version") != "benchmark_learning_ledger_v0":
455
+ raise ValueError("benchmark learning ledger must have schema_version=benchmark_learning_ledger_v0")
456
+ delivery_batch_scale = _normalize_optional_delivery_batch_scale(delivery_batch_scale)
457
+ delivery_outcome = _normalize_optional_delivery_outcome(delivery_outcome)
458
+
459
+ registry = load_registry(registry_path)
460
+ runtime_root = resolve_runtime_root(
461
+ registry,
462
+ runtime_root_override,
463
+ registry_path=registry_path,
464
+ )
465
+ generated_at = now_local()
466
+ action = recommended_action or "route benchmark follow-up from benchmark_learning_ledger_v0"
467
+ health_check = "benchmark_learning_ledger_v0 compact event public-safe"
468
+
469
+ runs_dir = runtime_root / "goals" / safe_goal_id / "runs"
470
+ json_path, markdown_path = unique_run_paths(runs_dir, generated_at)
471
+ index_path = runs_dir / "index.jsonl"
472
+ record: dict[str, Any] = {
473
+ "generated_at": generated_at,
474
+ "goal_id": safe_goal_id,
475
+ "classification": classification,
476
+ "recommended_action": action,
477
+ "health_check": health_check,
478
+ "benchmark_learning_ledger": benchmark_learning_ledger,
479
+ }
480
+ if delivery_batch_scale:
481
+ record["delivery_batch_scale"] = delivery_batch_scale
482
+ if delivery_outcome:
483
+ record["delivery_outcome"] = delivery_outcome
484
+
485
+ index_record = {
486
+ **record,
487
+ "json_path": str(json_path),
488
+ "markdown_path": str(markdown_path),
489
+ }
490
+ payload = {
491
+ "ok": True,
492
+ "dry_run": dry_run,
493
+ "appended": not dry_run,
494
+ "registry": str(registry_path),
495
+ "runtime_root": str(runtime_root),
496
+ "goal_id": safe_goal_id,
497
+ "classification": classification,
498
+ "recommended_action": action,
499
+ "generated_at": generated_at,
500
+ "health_check": health_check,
501
+ "json_path": str(json_path),
502
+ "markdown_path": str(markdown_path),
503
+ "index_path": str(index_path),
504
+ "benchmark_learning_ledger": benchmark_learning_ledger,
505
+ }
506
+ if delivery_batch_scale:
507
+ payload["delivery_batch_scale"] = delivery_batch_scale
508
+ if delivery_outcome:
509
+ payload["delivery_outcome"] = delivery_outcome
510
+
511
+ if not dry_run:
512
+ write_reserved_run_artifacts(
513
+ runs_dir=runs_dir,
514
+ generated_at=generated_at,
515
+ record=record,
516
+ index_record=index_record,
517
+ payload=payload,
518
+ render_markdown=render_benchmark_learning_ledger_append_markdown,
519
+ )
520
+ return payload
521
+
522
+
523
+ def append_benchmark_experiment_report(
524
+ *,
525
+ registry_path: Path,
526
+ runtime_root_override: str | None,
527
+ goal_id: str,
528
+ benchmark_experiment_report: dict[str, Any],
529
+ classification: str = "benchmark_experiment_report_v0",
530
+ recommended_action: str | None = None,
531
+ delivery_batch_scale: str | None = None,
532
+ delivery_outcome: str | None = None,
533
+ dry_run: bool = True,
534
+ ) -> dict[str, Any]:
535
+ safe_goal_id = validate_goal_id_path_segment(goal_id)
536
+ if benchmark_experiment_report.get("schema_version") != "benchmark_experiment_report_v0":
537
+ raise ValueError("benchmark experiment report must have schema_version=benchmark_experiment_report_v0")
538
+ delivery_batch_scale = _normalize_optional_delivery_batch_scale(delivery_batch_scale)
539
+ delivery_outcome = _normalize_optional_delivery_outcome(delivery_outcome)
540
+
541
+ registry = load_registry(registry_path)
542
+ runtime_root = resolve_runtime_root(
543
+ registry,
544
+ runtime_root_override,
545
+ registry_path=registry_path,
546
+ )
547
+ generated_at = now_local()
548
+ action = recommended_action or "inspect benchmark_experiment_report_v0 summary and continue report consumer work"
549
+ health_check = "benchmark_experiment_report_v0 compact event public-safe"
550
+
551
+ runs_dir = runtime_root / "goals" / safe_goal_id / "runs"
552
+ json_path, markdown_path = unique_run_paths(runs_dir, generated_at)
553
+ index_path = runs_dir / "index.jsonl"
554
+ record: dict[str, Any] = {
555
+ "generated_at": generated_at,
556
+ "goal_id": safe_goal_id,
557
+ "classification": classification,
558
+ "recommended_action": action,
559
+ "health_check": health_check,
560
+ "benchmark_experiment_report": benchmark_experiment_report,
561
+ }
562
+ if delivery_batch_scale:
563
+ record["delivery_batch_scale"] = delivery_batch_scale
564
+ if delivery_outcome:
565
+ record["delivery_outcome"] = delivery_outcome
566
+
567
+ index_record = {
568
+ **record,
569
+ "json_path": str(json_path),
570
+ "markdown_path": str(markdown_path),
571
+ }
572
+ payload = {
573
+ "ok": True,
574
+ "dry_run": dry_run,
575
+ "appended": not dry_run,
576
+ "registry": str(registry_path),
577
+ "runtime_root": str(runtime_root),
578
+ "goal_id": safe_goal_id,
579
+ "classification": classification,
580
+ "recommended_action": action,
581
+ "generated_at": generated_at,
582
+ "health_check": health_check,
583
+ "json_path": str(json_path),
584
+ "markdown_path": str(markdown_path),
585
+ "index_path": str(index_path),
586
+ "benchmark_experiment_report": benchmark_experiment_report,
587
+ }
588
+ if delivery_batch_scale:
589
+ payload["delivery_batch_scale"] = delivery_batch_scale
590
+ if delivery_outcome:
591
+ payload["delivery_outcome"] = delivery_outcome
592
+
593
+ if not dry_run:
594
+ write_reserved_run_artifacts(
595
+ runs_dir=runs_dir,
596
+ generated_at=generated_at,
597
+ record=record,
598
+ index_record=index_record,
599
+ payload=payload,
600
+ render_markdown=render_benchmark_experiment_report_append_markdown,
601
+ )
602
+ return payload
603
+
604
+
605
+ def append_active_user_assisted_pilot(
606
+ *,
607
+ registry_path: Path,
608
+ runtime_root_override: str | None,
609
+ goal_id: str,
610
+ active_user_assisted_pilot: dict[str, Any],
611
+ classification: str = "active_user_assisted_pilot_v0",
612
+ recommended_action: str | None = None,
613
+ delivery_batch_scale: str | None = None,
614
+ delivery_outcome: str | None = None,
615
+ dry_run: bool = True,
616
+ ) -> dict[str, Any]:
617
+ safe_goal_id = validate_goal_id_path_segment(goal_id)
618
+ if active_user_assisted_pilot.get("schema_version") != "active_user_assisted_pilot_v0":
619
+ raise ValueError("active user assisted pilot must have schema_version=active_user_assisted_pilot_v0")
620
+ delivery_batch_scale = _normalize_optional_delivery_batch_scale(delivery_batch_scale)
621
+ delivery_outcome = _normalize_optional_delivery_outcome(delivery_outcome)
622
+
623
+ registry = load_registry(registry_path)
624
+ runtime_root = resolve_runtime_root(
625
+ registry,
626
+ runtime_root_override,
627
+ registry_path=registry_path,
628
+ )
629
+ generated_at = now_local()
630
+ action = recommended_action or "inspect active_user_assisted_pilot_v0 summary and decide assisted treatment next step"
631
+ health_check = "active_user_assisted_pilot_v0 compact event public-safe"
632
+
633
+ runs_dir = runtime_root / "goals" / safe_goal_id / "runs"
634
+ json_path, markdown_path = unique_run_paths(runs_dir, generated_at)
635
+ index_path = runs_dir / "index.jsonl"
636
+ record: dict[str, Any] = {
637
+ "generated_at": generated_at,
638
+ "goal_id": safe_goal_id,
639
+ "classification": classification,
640
+ "recommended_action": action,
641
+ "health_check": health_check,
642
+ "active_user_assisted_pilot": active_user_assisted_pilot,
643
+ }
644
+ if delivery_batch_scale:
645
+ record["delivery_batch_scale"] = delivery_batch_scale
646
+ if delivery_outcome:
647
+ record["delivery_outcome"] = delivery_outcome
648
+
649
+ index_record = {
650
+ **record,
651
+ "json_path": str(json_path),
652
+ "markdown_path": str(markdown_path),
653
+ }
654
+ payload = {
655
+ "ok": True,
656
+ "dry_run": dry_run,
657
+ "appended": not dry_run,
658
+ "registry": str(registry_path),
659
+ "runtime_root": str(runtime_root),
660
+ "goal_id": safe_goal_id,
661
+ "classification": classification,
662
+ "recommended_action": action,
663
+ "generated_at": generated_at,
664
+ "health_check": health_check,
665
+ "json_path": str(json_path),
666
+ "markdown_path": str(markdown_path),
667
+ "index_path": str(index_path),
668
+ "active_user_assisted_pilot": active_user_assisted_pilot,
669
+ }
670
+ if delivery_batch_scale:
671
+ payload["delivery_batch_scale"] = delivery_batch_scale
672
+ if delivery_outcome:
673
+ payload["delivery_outcome"] = delivery_outcome
674
+
675
+ if not dry_run:
676
+ write_reserved_run_artifacts(
677
+ runs_dir=runs_dir,
678
+ generated_at=generated_at,
679
+ record=record,
680
+ index_record=index_record,
681
+ payload=payload,
682
+ render_markdown=render_active_user_assisted_pilot_append_markdown,
683
+ )
684
+ return payload
685
+
686
+
687
+ def latest_status_run(runs: list[dict[str, Any]]) -> dict[str, Any] | None:
688
+ for run in runs:
689
+ if str(run.get("classification") or "") in STATUS_NEUTRAL_CLASSIFICATIONS:
690
+ continue
691
+ if str(run.get("progress_scope") or "") == AGENT_LANE_PROGRESS_SCOPE:
692
+ continue
693
+ return run
694
+ return None
695
+
696
+
697
+ def collect_history(
698
+ *,
699
+ registry_path: Path,
700
+ runtime_root: Path,
701
+ goal_id: str | None,
702
+ limit: int,
703
+ include_runtime_goals: bool = True,
704
+ ) -> dict[str, Any]:
705
+ registry = load_registry(registry_path)
706
+ goal_meta = {str(goal.get("id")): goal for goal in registry_goals(registry)}
707
+ goals: list[dict[str, Any]] = []
708
+ all_runs: list[dict[str, Any]] = []
709
+
710
+ for current_goal_id in discover_goal_ids(
711
+ runtime_root,
712
+ registry,
713
+ goal_id,
714
+ include_runtime_goals=include_runtime_goals,
715
+ ):
716
+ index_path = runtime_root / "goals" / current_goal_id / "runs" / "index.jsonl"
717
+ runs, raw_count = load_index(
718
+ index_path,
719
+ artifact_root=registry_project_root(registry_path),
720
+ )
721
+ runs = [
722
+ run
723
+ for _, run in sorted(
724
+ enumerate(runs),
725
+ key=lambda item: (str(item[1].get("generated_at") or ""), item[0]),
726
+ reverse=True,
727
+ )
728
+ ]
729
+ for run in runs:
730
+ run["goal_id"] = str(run.get("goal_id") or current_goal_id)
731
+ all_runs.extend(runs)
732
+
733
+ registry_member = current_goal_id in goal_meta
734
+ meta = goal_meta.get(current_goal_id) or {}
735
+ adapter = meta.get("adapter") if isinstance(meta.get("adapter"), dict) else {}
736
+ quota = goal_quota_with_spend_ledger(meta, runs) if registry_member else None
737
+ goal_record = {
738
+ "id": current_goal_id,
739
+ "domain": meta.get("domain"),
740
+ "status": meta.get("status") if registry_member else "legacy-runtime",
741
+ "repo": meta.get("repo") if registry_member else None,
742
+ "state_file": meta.get("state_file") if registry_member else None,
743
+ "registry_member": registry_member,
744
+ "legacy_runtime_goal": not registry_member,
745
+ "adapter_kind": adapter.get("kind"),
746
+ "adapter_status": adapter.get("status"),
747
+ "coordination": meta.get("coordination") if isinstance(meta.get("coordination"), dict) else None,
748
+ "explore_graph": compact_explore_graph_policy(meta.get("explore_graph"))
749
+ if isinstance(meta.get("explore_graph"), dict)
750
+ else None,
751
+ "spawn_policy": meta.get("spawn_policy") if isinstance(meta.get("spawn_policy"), dict) else None,
752
+ "execution_profile": compact_execution_profile(meta.get("execution_profile")) if registry_member else None,
753
+ "control_plane": compact_control_plane_policy(meta.get("control_plane")) if registry_member else None,
754
+ "guards": meta.get("guards") if isinstance(meta.get("guards"), list) else [],
755
+ "next_probe": meta.get("next_probe") if registry_member else None,
756
+ "authority_registry": goal_authority_registry_summary(meta) if registry_member else None,
757
+ "quota": quota,
758
+ "index_path": str(index_path),
759
+ "index_exists": index_path.exists(),
760
+ "raw_index_records": raw_count,
761
+ "unique_runs": len(runs),
762
+ "latest_status_run": latest_status_run(runs),
763
+ "latest_runs": latest_runs_with_agent_context(runs, limit=limit),
764
+ "semantic_history": goal_semantic_history_from_runs(runs),
765
+ }
766
+ if registry_member:
767
+ for field in REGISTRY_ATTENTION_FIELDS:
768
+ if meta.get(field):
769
+ goal_record[field] = meta.get(field)
770
+ goals.append(goal_record)
771
+
772
+ all_runs.sort(key=lambda item: str(item.get("generated_at") or ""), reverse=True)
773
+ return {
774
+ "ok": True,
775
+ "registry": str(registry_path),
776
+ "runtime_root": str(runtime_root),
777
+ "goal_filter": goal_id,
778
+ "goal_count": len(goals),
779
+ "run_count": len(all_runs),
780
+ "goals": goals,
781
+ "runs": all_runs[:limit],
782
+ }
783
+
784
+
785
+ def inspect_index_duplicates(
786
+ *,
787
+ registry_path: Path,
788
+ runtime_root_override: str | None,
789
+ goal_id: str | None,
790
+ limit: int,
791
+ ) -> dict[str, Any]:
792
+ registry = load_registry(registry_path)
793
+ runtime_root = resolve_runtime_root(
794
+ registry,
795
+ runtime_root_override,
796
+ registry_path=registry_path,
797
+ )
798
+ groups: list[dict[str, Any]] = []
799
+ checked_goal_count = 0
800
+ raw_index_records = 0
801
+ duplicate_row_count = 0
802
+
803
+ for current_goal_id in discover_goal_ids(runtime_root, registry, goal_id):
804
+ checked_goal_count += 1
805
+ index_path = runtime_root / "goals" / current_goal_id / "runs" / "index.jsonl"
806
+ if not index_path.exists():
807
+ continue
808
+
809
+ grouped: dict[tuple[str, str, str], list[tuple[int, dict[str, Any]]]] = {}
810
+ with index_path.open(encoding="utf-8") as f:
811
+ for line_number, line in enumerate(f, start=1):
812
+ if not line.strip():
813
+ continue
814
+ raw_index_records += 1
815
+ try:
816
+ item = json.loads(line)
817
+ except json.JSONDecodeError:
818
+ continue
819
+ if not isinstance(item, dict):
820
+ continue
821
+ key = (
822
+ str(item.get("generated_at") or ""),
823
+ str(item.get("json_path") or ""),
824
+ str(item.get("markdown_path") or ""),
825
+ )
826
+ grouped.setdefault(key, []).append((line_number, item))
827
+
828
+ for key, records in grouped.items():
829
+ if len(records) <= 1:
830
+ continue
831
+ duplicate_row_count += len(records) - 1
832
+ generated_at, json_path, markdown_path = key
833
+ reward_records = sum(1 for _, record in records if isinstance(record.get("human_reward"), dict))
834
+ classifications = sorted({str(record.get("classification") or "") for _, record in records})
835
+ health_checks = sorted({str(record.get("health_check") or "") for _, record in records if record.get("health_check")})
836
+ duplicate_classification = classify_index_duplicate_records([record for _, record in records])
837
+ groups.append(
838
+ {
839
+ "goal_id": current_goal_id,
840
+ "index_path": str(index_path),
841
+ "generated_at": generated_at,
842
+ "json_path": json_path,
843
+ "markdown_path": markdown_path,
844
+ "json_exists": _indexed_artifact_exists(
845
+ json_path,
846
+ artifact_root=registry_project_root(registry_path),
847
+ ),
848
+ "markdown_exists": _indexed_artifact_exists(
849
+ markdown_path,
850
+ artifact_root=registry_project_root(registry_path),
851
+ ),
852
+ "line_numbers": [line_number for line_number, _ in records],
853
+ "raw_rows": len(records),
854
+ "duplicate_rows": len(records) - 1,
855
+ "duplicate_kind": duplicate_classification.get("duplicate_kind"),
856
+ "severity": duplicate_classification.get("severity"),
857
+ "classifications": classifications,
858
+ "health_checks": health_checks,
859
+ "reward_overlay_rows": reward_records,
860
+ "repair_hint": duplicate_classification.get("repair_hint"),
861
+ }
862
+ )
863
+
864
+ severity_priority = {"warning": 0, "info": 1}
865
+ groups.sort(
866
+ key=lambda item: (
867
+ severity_priority.get(str(item.get("severity")), 99),
868
+ str(item.get("goal_id")),
869
+ str(item.get("generated_at")),
870
+ )
871
+ )
872
+ limited_groups = groups[: max(0, limit)]
873
+ return {
874
+ "ok": True,
875
+ "registry": str(registry_path),
876
+ "runtime_root": str(runtime_root),
877
+ "goal_filter": goal_id,
878
+ "checked_goal_count": checked_goal_count,
879
+ "raw_index_records": raw_index_records,
880
+ "duplicate_group_count": len(groups),
881
+ "duplicate_row_count": duplicate_row_count,
882
+ "groups": limited_groups,
883
+ "truncated": len(groups) > len(limited_groups),
884
+ "limit": limit,
885
+ }
886
+
887
+
888
+ def repair_index_duplicates(
889
+ *,
890
+ registry_path: Path,
891
+ runtime_root_override: str | None,
892
+ goal_id: str | None,
893
+ limit: int,
894
+ execute: bool,
895
+ ) -> dict[str, Any]:
896
+ registry = load_registry(registry_path)
897
+ runtime_root = resolve_runtime_root(
898
+ registry,
899
+ runtime_root_override,
900
+ registry_path=registry_path,
901
+ )
902
+ checked_goal_count = 0
903
+ raw_index_records = 0
904
+ removed_row_count = 0
905
+ preserved_reward_overlay_rows = 0
906
+ preserved_structured_artifact_bundle_rows = 0
907
+ unrepaired_group_count = 0
908
+ groups: list[dict[str, Any]] = []
909
+
910
+ for current_goal_id in discover_goal_ids(runtime_root, registry, goal_id):
911
+ checked_goal_count += 1
912
+ index_path = runtime_root / "goals" / current_goal_id / "runs" / "index.jsonl"
913
+ if not index_path.exists():
914
+ continue
915
+
916
+ raw_lines = index_path.read_text(encoding="utf-8").splitlines()
917
+ grouped: dict[tuple[str, str, str], list[tuple[int, dict[str, Any]]]] = {}
918
+ for line_number, line in enumerate(raw_lines, start=1):
919
+ if not line.strip():
920
+ continue
921
+ raw_index_records += 1
922
+ try:
923
+ item = json.loads(line)
924
+ except json.JSONDecodeError:
925
+ continue
926
+ if not isinstance(item, dict):
927
+ continue
928
+ grouped.setdefault(index_identity(item), []).append((line_number, item))
929
+
930
+ remove_lines: set[int] = set()
931
+ for records in grouped.values():
932
+ if len(records) <= 1:
933
+ continue
934
+ decision = duplicate_repair_decision(records)
935
+ removed_lines = list(decision.get("removed_line_numbers") or [])
936
+ if decision.get("action") == "preserve_reward_overlay":
937
+ preserved_reward_overlay_rows += len(records) - 1
938
+ elif decision.get("action") == "preserve_structured_artifact_bundle":
939
+ preserved_structured_artifact_bundle_rows += len(records) - 1
940
+ elif decision.get("repairable"):
941
+ remove_lines.update(int(line_number) for line_number in removed_lines)
942
+ removed_row_count += len(removed_lines)
943
+ else:
944
+ unrepaired_group_count += 1
945
+
946
+ first_record = records[0][1]
947
+ groups.append(
948
+ {
949
+ "goal_id": current_goal_id,
950
+ "index_path": str(index_path),
951
+ "generated_at": first_record.get("generated_at"),
952
+ "json_path": first_record.get("json_path"),
953
+ "markdown_path": first_record.get("markdown_path"),
954
+ "action": decision.get("action"),
955
+ "repairable": decision.get("repairable"),
956
+ "line_numbers": decision.get("line_numbers"),
957
+ "kept_line_numbers": decision.get("kept_line_numbers"),
958
+ "removed_line_numbers": removed_lines,
959
+ "reason": decision.get("reason"),
960
+ }
961
+ )
962
+
963
+ if execute and remove_lines:
964
+ rewritten = [
965
+ line
966
+ for line_number, line in enumerate(raw_lines, start=1)
967
+ if line_number not in remove_lines
968
+ ]
969
+ tmp_path = index_path.with_suffix(index_path.suffix + ".tmp")
970
+ tmp_path.write_text("".join(line + "\n" for line in rewritten), encoding="utf-8")
971
+ tmp_path.replace(index_path)
972
+
973
+ limited_groups = groups[: max(0, limit)]
974
+ return {
975
+ "ok": True,
976
+ "dry_run": not execute,
977
+ "repaired": bool(execute and removed_row_count),
978
+ "registry": str(registry_path),
979
+ "runtime_root": str(runtime_root),
980
+ "goal_filter": goal_id,
981
+ "checked_goal_count": checked_goal_count,
982
+ "raw_index_records": raw_index_records,
983
+ "removed_row_count": removed_row_count,
984
+ "preserved_reward_overlay_rows": preserved_reward_overlay_rows,
985
+ "preserved_structured_artifact_bundle_rows": preserved_structured_artifact_bundle_rows,
986
+ "unrepaired_group_count": unrepaired_group_count,
987
+ "groups": limited_groups,
988
+ "truncated": len(groups) > len(limited_groups),
989
+ "limit": limit,
990
+ }
991
+
992
+
993
+ def rebuild_index_artifact_collisions(
994
+ *,
995
+ registry_path: Path,
996
+ runtime_root_override: str | None,
997
+ goal_id: str | None,
998
+ limit: int,
999
+ reviewed_plan: dict[str, Any] | None,
1000
+ execute: bool,
1001
+ ) -> dict[str, Any]:
1002
+ registry = load_registry(registry_path)
1003
+ runtime_root = resolve_runtime_root(
1004
+ registry,
1005
+ runtime_root_override,
1006
+ registry_path=registry_path,
1007
+ )
1008
+ all_groups: list[dict[str, Any]] = []
1009
+ checked_goal_count = 0
1010
+ for current_goal_id in discover_goal_ids(runtime_root, registry, goal_id):
1011
+ checked_goal_count += 1
1012
+ index_path = runtime_root / "goals" / current_goal_id / "runs" / "index.jsonl"
1013
+ if index_path.exists():
1014
+ all_groups.extend(collision_review_groups(index_path, current_goal_id))
1015
+
1016
+ groups = all_groups[: max(0, limit)]
1017
+ truncated = len(groups) < len(all_groups)
1018
+ current_plan = build_collision_rebuild_plan(
1019
+ groups,
1020
+ goal_filter=goal_id,
1021
+ total_collision_group_count=len(all_groups),
1022
+ truncated=truncated,
1023
+ )
1024
+ if execute:
1025
+ if reviewed_plan is None:
1026
+ raise ValueError(
1027
+ "rebuild-index-collisions --execute requires --review-plan-json from a reviewed dry-run"
1028
+ )
1029
+ plan_sha256 = validate_reviewed_collision_plan(reviewed_plan, current_plan)
1030
+ rebuilt_indexes = apply_reviewed_collision_rebuild(
1031
+ current_plan,
1032
+ plan_sha256=plan_sha256,
1033
+ )
1034
+ else:
1035
+ rebuilt_indexes = []
1036
+
1037
+ return {
1038
+ "ok": True,
1039
+ "dry_run": not execute,
1040
+ "rebuilt": bool(execute and rebuilt_indexes),
1041
+ "registry": str(registry_path),
1042
+ "runtime_root": str(runtime_root),
1043
+ "goal_filter": goal_id,
1044
+ "checked_goal_count": checked_goal_count,
1045
+ "collision_group_count": len(groups),
1046
+ "total_collision_group_count": len(all_groups),
1047
+ "truncated": truncated,
1048
+ "review_required": not execute and bool(groups),
1049
+ "review_plan": current_plan,
1050
+ "rebuilt_indexes": rebuilt_indexes,
1051
+ "destructive_row_deletion": False,
1052
+ }
1053
+
1054
+
1055
+ def render_index_collision_rebuild_markdown(payload: dict[str, Any]) -> str:
1056
+ if not payload.get("ok"):
1057
+ return "# LoopX Artifact Collision Rebuild\n\n- ok: `False`\n- error: " + str(payload.get("error"))
1058
+ plan = payload.get("review_plan") or {}
1059
+ return "\n".join(
1060
+ [
1061
+ "# LoopX Artifact Collision Rebuild",
1062
+ "",
1063
+ f"- dry_run: `{payload.get('dry_run')}`",
1064
+ f"- rebuilt: `{payload.get('rebuilt')}`",
1065
+ f"- collision_groups: `{payload.get('collision_group_count')}`",
1066
+ f"- total_collision_groups: `{payload.get('total_collision_group_count')}`",
1067
+ f"- truncated: `{payload.get('truncated')}`",
1068
+ f"- review_required: `{payload.get('review_required')}`",
1069
+ f"- plan_sha256: `{plan.get('plan_sha256')}`",
1070
+ "- destructive_row_deletion: `False`",
1071
+ "- contract: `review the exact plan, then execute with --review-plan-json`",
1072
+ ]
1073
+ )
1074
+
1075
+
1076
+ def render_index_duplicate_repair_markdown(payload: dict[str, Any]) -> str:
1077
+ if not payload.get("ok"):
1078
+ return "# LoopX Index Duplicate Repair\n\n- ok: `False`\n- error: " + str(payload.get("error"))
1079
+
1080
+ lines = [
1081
+ "# LoopX Index Duplicate Repair",
1082
+ "",
1083
+ f"- dry_run: `{payload.get('dry_run')}`",
1084
+ f"- repaired: `{payload.get('repaired')}`",
1085
+ f"- runtime_root: `{payload.get('runtime_root')}`",
1086
+ f"- registry: `{payload.get('registry')}`",
1087
+ f"- goal_filter: `{payload.get('goal_filter')}`",
1088
+ f"- checked_goals: `{payload.get('checked_goal_count')}`",
1089
+ f"- raw_index_records: `{payload.get('raw_index_records')}`",
1090
+ f"- removed_rows: `{payload.get('removed_row_count')}`",
1091
+ f"- preserved_reward_overlay_rows: `{payload.get('preserved_reward_overlay_rows')}`",
1092
+ f"- preserved_structured_artifact_bundle_rows: `{payload.get('preserved_structured_artifact_bundle_rows')}`",
1093
+ f"- unrepaired_groups: `{payload.get('unrepaired_group_count')}`",
1094
+ f"- truncated: `{payload.get('truncated')}`",
1095
+ "",
1096
+ markdown_table_row(
1097
+ ["goal", "generated_at", "action", "repairable", "kept", "removed", "reason"]
1098
+ ),
1099
+ markdown_table_separator(7),
1100
+ ]
1101
+ for group in payload.get("groups") or []:
1102
+ lines.append(
1103
+ markdown_table_row(
1104
+ [
1105
+ markdown_code(group.get("goal_id")),
1106
+ markdown_code(group.get("generated_at")),
1107
+ markdown_code(group.get("action")),
1108
+ markdown_code(group.get("repairable")),
1109
+ markdown_code(group.get("kept_line_numbers")),
1110
+ markdown_code(group.get("removed_line_numbers")),
1111
+ group.get("reason"),
1112
+ ]
1113
+ )
1114
+ )
1115
+ return "\n".join(lines)
1116
+
1117
+
1118
+ def render_history_markdown(payload: dict[str, Any]) -> str:
1119
+ if not payload.get("ok"):
1120
+ return "# LoopX Run History\n\n- ok: `False`\n- error: " + str(payload.get("error"))
1121
+
1122
+ lines = [
1123
+ "# LoopX Run History",
1124
+ "",
1125
+ f"- runtime_root: `{payload.get('runtime_root')}`",
1126
+ f"- registry: `{payload.get('registry')}`",
1127
+ f"- goal_filter: `{payload.get('goal_filter')}`",
1128
+ f"- goals: `{payload.get('goal_count')}`",
1129
+ f"- unique_runs: `{payload.get('run_count')}`",
1130
+ "",
1131
+ markdown_table_row(["generated_at", "goal", "classification", "files", "action"]),
1132
+ markdown_table_separator(5),
1133
+ ]
1134
+ for run in payload.get("runs") or []:
1135
+ lines.append(
1136
+ markdown_table_row(
1137
+ [
1138
+ markdown_code(run.get("generated_at")),
1139
+ markdown_code(run.get("goal_id")),
1140
+ markdown_code(run.get("classification")),
1141
+ f"{run.get('json_exists')}/{run.get('markdown_exists')}",
1142
+ run.get("recommended_action"),
1143
+ ]
1144
+ )
1145
+ )
1146
+
1147
+ lines.extend(["", "## Goals"])
1148
+ for goal in payload.get("goals") or []:
1149
+ lines.append(
1150
+ "- "
1151
+ f"`{goal.get('id')}`: status=`{goal.get('status')}`, "
1152
+ f"registry_member=`{goal.get('registry_member')}`, "
1153
+ f"adapter=`{goal.get('adapter_kind')}:{goal.get('adapter_status')}`, "
1154
+ f"index_exists=`{goal.get('index_exists')}`, "
1155
+ f"records=`{goal.get('raw_index_records')}`, "
1156
+ f"unique_runs=`{goal.get('unique_runs')}`"
1157
+ )
1158
+ return "\n".join(lines)
1159
+
1160
+
1161
+ def render_index_duplicate_inspection_markdown(payload: dict[str, Any]) -> str:
1162
+ if not payload.get("ok"):
1163
+ return "# LoopX Index Duplicate Inspection\n\n- ok: `False`\n- error: " + str(payload.get("error"))
1164
+
1165
+ lines = [
1166
+ "# LoopX Index Duplicate Inspection",
1167
+ "",
1168
+ f"- runtime_root: `{payload.get('runtime_root')}`",
1169
+ f"- registry: `{payload.get('registry')}`",
1170
+ f"- goal_filter: `{payload.get('goal_filter')}`",
1171
+ f"- checked_goals: `{payload.get('checked_goal_count')}`",
1172
+ f"- raw_index_records: `{payload.get('raw_index_records')}`",
1173
+ f"- duplicate_groups: `{payload.get('duplicate_group_count')}`",
1174
+ f"- duplicate_rows: `{payload.get('duplicate_row_count')}`",
1175
+ f"- truncated: `{payload.get('truncated')}`",
1176
+ "",
1177
+ markdown_table_row(
1178
+ ["goal", "generated_at", "kind", "severity", "rows", "classifications", "repair_hint"]
1179
+ ),
1180
+ markdown_table_separator(7),
1181
+ ]
1182
+ for group in payload.get("groups") or []:
1183
+ classifications = ", ".join(str(item) for item in group.get("classifications") or [])
1184
+ lines.append(
1185
+ markdown_table_row(
1186
+ [
1187
+ markdown_code(group.get("goal_id")),
1188
+ markdown_code(group.get("generated_at")),
1189
+ markdown_code(group.get("duplicate_kind")),
1190
+ markdown_code(group.get("severity")),
1191
+ markdown_code(group.get("line_numbers")),
1192
+ markdown_code(classifications),
1193
+ group.get("repair_hint"),
1194
+ ]
1195
+ )
1196
+ )
1197
+ return "\n".join(lines)
1198
+
1199
+
1200
+ def render_benchmark_run_append_markdown(payload: dict[str, Any]) -> str:
1201
+ lines = [
1202
+ "# LoopX Benchmark Run Append",
1203
+ "",
1204
+ f"- ok: `{payload.get('ok')}`",
1205
+ f"- dry_run: `{payload.get('dry_run')}`",
1206
+ f"- appended: `{payload.get('appended')}`",
1207
+ f"- goal_id: `{payload.get('goal_id')}`",
1208
+ f"- classification: `{payload.get('classification')}`",
1209
+ f"- generated_at: `{payload.get('generated_at')}`",
1210
+ ]
1211
+ if payload.get("json_path"):
1212
+ lines.append(f"- json_path: `{payload.get('json_path')}`")
1213
+ if payload.get("index_path"):
1214
+ lines.append(f"- index_path: `{payload.get('index_path')}`")
1215
+ if payload.get("recommended_action"):
1216
+ lines.append(f"- recommended_action: {payload.get('recommended_action')}")
1217
+ benchmark_run = payload.get("benchmark_run") if isinstance(payload.get("benchmark_run"), dict) else {}
1218
+ if benchmark_run:
1219
+ progress = benchmark_run.get("progress") if isinstance(benchmark_run.get("progress"), dict) else {}
1220
+ metrics = benchmark_run.get("metrics") if isinstance(benchmark_run.get("metrics"), dict) else {}
1221
+ lines.extend(
1222
+ [
1223
+ "",
1224
+ "## Benchmark Run",
1225
+ "",
1226
+ f"- schema_version: `{benchmark_run.get('schema_version')}`",
1227
+ f"- benchmark_id: `{benchmark_run.get('benchmark_id')}`",
1228
+ f"- source_runner: `{benchmark_run.get('source_runner')}`",
1229
+ f"- mode: `{benchmark_run.get('mode')}`",
1230
+ f"- progress: completed={progress.get('n_completed_trials')} total={progress.get('n_total_trials')}",
1231
+ f"- metrics: input_tokens={metrics.get('input_tokens')} output_tokens={metrics.get('output_tokens')} cost_usd={metrics.get('cost_usd')}",
1232
+ ]
1233
+ )
1234
+ if payload.get("error"):
1235
+ lines.append(f"- error: {payload.get('error')}")
1236
+ return "\n".join(lines)
1237
+
1238
+
1239
+ def render_benchmark_result_append_markdown(payload: dict[str, Any]) -> str:
1240
+ lines = [
1241
+ "# LoopX Benchmark Result Append",
1242
+ "",
1243
+ f"- ok: `{payload.get('ok')}`",
1244
+ f"- dry_run: `{payload.get('dry_run')}`",
1245
+ f"- appended: `{payload.get('appended')}`",
1246
+ f"- goal_id: `{payload.get('goal_id')}`",
1247
+ f"- classification: `{payload.get('classification')}`",
1248
+ f"- generated_at: `{payload.get('generated_at')}`",
1249
+ ]
1250
+ if payload.get("json_path"):
1251
+ lines.append(f"- json_path: `{payload.get('json_path')}`")
1252
+ if payload.get("index_path"):
1253
+ lines.append(f"- index_path: `{payload.get('index_path')}`")
1254
+ if payload.get("recommended_action"):
1255
+ lines.append(f"- recommended_action: {payload.get('recommended_action')}")
1256
+ benchmark_result = (
1257
+ payload.get("benchmark_result")
1258
+ if isinstance(payload.get("benchmark_result"), dict)
1259
+ else {}
1260
+ )
1261
+ if benchmark_result:
1262
+ official = (
1263
+ benchmark_result.get("official_task_score")
1264
+ if isinstance(benchmark_result.get("official_task_score"), dict)
1265
+ else {}
1266
+ )
1267
+ control = (
1268
+ benchmark_result.get("control_plane_score")
1269
+ if isinstance(benchmark_result.get("control_plane_score"), dict)
1270
+ else {}
1271
+ )
1272
+ lines.extend(
1273
+ [
1274
+ "",
1275
+ "## Benchmark Result",
1276
+ "",
1277
+ f"- schema_version: `{benchmark_result.get('schema_version')}`",
1278
+ f"- task_id: `{benchmark_result.get('task_id')}`",
1279
+ f"- scenario_id: `{benchmark_result.get('scenario_id')}`",
1280
+ f"- terminal_state: `{benchmark_result.get('terminal_state')}`",
1281
+ f"- official_task_score: kind={official.get('kind')} value={official.get('value')} passed={official.get('passed')}",
1282
+ f"- control_plane_score: schema={control.get('schema_version')} kind={control.get('kind')} value={control.get('value')} aggregation={control.get('aggregation')}",
1283
+ ]
1284
+ )
1285
+ if payload.get("error"):
1286
+ lines.append(f"- error: {payload.get('error')}")
1287
+ return "\n".join(lines)
1288
+
1289
+
1290
+ def render_benchmark_comparison_append_markdown(payload: dict[str, Any]) -> str:
1291
+ lines = [
1292
+ "# LoopX Benchmark Comparison Append",
1293
+ "",
1294
+ f"- ok: `{payload.get('ok')}`",
1295
+ f"- dry_run: `{payload.get('dry_run')}`",
1296
+ f"- appended: `{payload.get('appended')}`",
1297
+ f"- goal_id: `{payload.get('goal_id')}`",
1298
+ f"- classification: `{payload.get('classification')}`",
1299
+ f"- generated_at: `{payload.get('generated_at')}`",
1300
+ ]
1301
+ if payload.get("json_path"):
1302
+ lines.append(f"- json_path: `{payload.get('json_path')}`")
1303
+ if payload.get("index_path"):
1304
+ lines.append(f"- index_path: `{payload.get('index_path')}`")
1305
+ if payload.get("recommended_action"):
1306
+ lines.append(f"- recommended_action: {payload.get('recommended_action')}")
1307
+ benchmark_comparison = (
1308
+ payload.get("benchmark_comparison")
1309
+ if isinstance(payload.get("benchmark_comparison"), dict)
1310
+ else {}
1311
+ )
1312
+ if benchmark_comparison:
1313
+ lines.extend(
1314
+ [
1315
+ "",
1316
+ "## Benchmark Comparison",
1317
+ "",
1318
+ f"- schema_version: `{benchmark_comparison.get('schema_version')}`",
1319
+ f"- task_id: `{benchmark_comparison.get('task_id')}`",
1320
+ f"- comparison_id: `{benchmark_comparison.get('comparison_id')}`",
1321
+ f"- official_task_score_delta: `{benchmark_comparison.get('official_task_score_delta')}`",
1322
+ f"- control_plane_score_delta: `{benchmark_comparison.get('control_plane_score_delta')}`",
1323
+ f"- both_success: `{benchmark_comparison.get('both_success')}`",
1324
+ ]
1325
+ )
1326
+ if payload.get("error"):
1327
+ lines.append(f"- error: {payload.get('error')}")
1328
+ return "\n".join(lines)
1329
+
1330
+
1331
+ def render_benchmark_learning_ledger_append_markdown(payload: dict[str, Any]) -> str:
1332
+ lines = [
1333
+ "# LoopX Benchmark Learning Ledger Append",
1334
+ "",
1335
+ f"- ok: `{payload.get('ok')}`",
1336
+ f"- dry_run: `{payload.get('dry_run')}`",
1337
+ f"- appended: `{payload.get('appended')}`",
1338
+ f"- goal_id: `{payload.get('goal_id')}`",
1339
+ f"- classification: `{payload.get('classification')}`",
1340
+ f"- generated_at: `{payload.get('generated_at')}`",
1341
+ ]
1342
+ if payload.get("json_path"):
1343
+ lines.append(f"- json_path: `{payload.get('json_path')}`")
1344
+ if payload.get("index_path"):
1345
+ lines.append(f"- index_path: `{payload.get('index_path')}`")
1346
+ if payload.get("recommended_action"):
1347
+ lines.append(f"- recommended_action: {payload.get('recommended_action')}")
1348
+ ledger = (
1349
+ payload.get("benchmark_learning_ledger")
1350
+ if isinstance(payload.get("benchmark_learning_ledger"), dict)
1351
+ else {}
1352
+ )
1353
+ if ledger:
1354
+ routing = ledger.get("routing") if isinstance(ledger.get("routing"), dict) else {}
1355
+ learning_gate = (
1356
+ ledger.get("learning_quota_gate")
1357
+ if isinstance(ledger.get("learning_quota_gate"), dict)
1358
+ else {}
1359
+ )
1360
+ overhead = ledger.get("overhead") if isinstance(ledger.get("overhead"), dict) else {}
1361
+ lines.extend(
1362
+ [
1363
+ "",
1364
+ "## Benchmark Learning Ledger",
1365
+ "",
1366
+ f"- schema_version: `{ledger.get('schema_version')}`",
1367
+ f"- task_id: `{ledger.get('task_id')}`",
1368
+ f"- comparison_id: `{ledger.get('comparison_id')}`",
1369
+ f"- learning_status: `{ledger.get('learning_status')}`",
1370
+ f"- official_task_score_delta: `{ledger.get('official_task_score_delta')}`",
1371
+ f"- control_plane_score_delta: `{ledger.get('control_plane_score_delta')}`",
1372
+ f"- repair_candidates: `{ledger.get('repair_candidates')}`",
1373
+ f"- learning_spend_allowed: `{learning_gate.get('spend_allowed')}`",
1374
+ f"- repeat_allowed: `{routing.get('repeat_allowed')}`",
1375
+ f"- new_candidate_allowed: `{routing.get('new_candidate_allowed')}`",
1376
+ f"- next_allowed_action: `{routing.get('next_allowed_action')}`",
1377
+ f"- overhead_label: `{overhead.get('label')}`",
1378
+ ]
1379
+ )
1380
+ if payload.get("error"):
1381
+ lines.append(f"- error: {payload.get('error')}")
1382
+ return "\n".join(lines)
1383
+
1384
+
1385
+ def render_benchmark_experiment_report_append_markdown(payload: dict[str, Any]) -> str:
1386
+ lines = [
1387
+ "# LoopX Benchmark Experiment Report Append",
1388
+ "",
1389
+ f"- ok: `{payload.get('ok')}`",
1390
+ f"- dry_run: `{payload.get('dry_run')}`",
1391
+ f"- appended: `{payload.get('appended')}`",
1392
+ f"- goal_id: `{payload.get('goal_id')}`",
1393
+ f"- classification: `{payload.get('classification')}`",
1394
+ f"- generated_at: `{payload.get('generated_at')}`",
1395
+ ]
1396
+ if payload.get("json_path"):
1397
+ lines.append(f"- json_path: `{payload.get('json_path')}`")
1398
+ if payload.get("index_path"):
1399
+ lines.append(f"- index_path: `{payload.get('index_path')}`")
1400
+ if payload.get("recommended_action"):
1401
+ lines.append(f"- recommended_action: {payload.get('recommended_action')}")
1402
+ benchmark_report = (
1403
+ payload.get("benchmark_experiment_report")
1404
+ if isinstance(payload.get("benchmark_experiment_report"), dict)
1405
+ else {}
1406
+ )
1407
+ if benchmark_report:
1408
+ identity = (
1409
+ benchmark_report.get("experiment_identity")
1410
+ if isinstance(benchmark_report.get("experiment_identity"), dict)
1411
+ else {}
1412
+ )
1413
+ official = (
1414
+ benchmark_report.get("official_score")
1415
+ if isinstance(benchmark_report.get("official_score"), dict)
1416
+ else {}
1417
+ )
1418
+ negative = (
1419
+ benchmark_report.get("negative_results")
1420
+ if isinstance(benchmark_report.get("negative_results"), dict)
1421
+ else {}
1422
+ )
1423
+ next_decision = (
1424
+ benchmark_report.get("next_decision")
1425
+ if isinstance(benchmark_report.get("next_decision"), dict)
1426
+ else {}
1427
+ )
1428
+ lines.extend(
1429
+ [
1430
+ "",
1431
+ "## Benchmark Experiment Report",
1432
+ "",
1433
+ f"- schema_version: `{benchmark_report.get('schema_version')}`",
1434
+ f"- report_id: `{identity.get('report_id')}`",
1435
+ f"- benchmark_id: `{identity.get('benchmark_id')}`",
1436
+ f"- official_delta: `{official.get('delta')}`",
1437
+ f"- submit_eligible: `{official.get('submit_eligible')}`",
1438
+ f"- leaderboard_evidence: `{official.get('leaderboard_evidence')}`",
1439
+ f"- null_official_delta: `{negative.get('null_official_delta')}`",
1440
+ f"- negative_evidence_layers: `{negative.get('negative_evidence_layers')}`",
1441
+ f"- next_decision: `{next_decision.get('decision')}`",
1442
+ ]
1443
+ )
1444
+ if payload.get("error"):
1445
+ lines.append(f"- error: {payload.get('error')}")
1446
+ return "\n".join(lines)
1447
+
1448
+
1449
+ def render_active_user_assisted_pilot_append_markdown(payload: dict[str, Any]) -> str:
1450
+ lines = [
1451
+ "# LoopX Active User Assisted Pilot Append",
1452
+ "",
1453
+ f"- ok: `{payload.get('ok')}`",
1454
+ f"- dry_run: `{payload.get('dry_run')}`",
1455
+ f"- appended: `{payload.get('appended')}`",
1456
+ f"- goal_id: `{payload.get('goal_id')}`",
1457
+ f"- classification: `{payload.get('classification')}`",
1458
+ f"- generated_at: `{payload.get('generated_at')}`",
1459
+ ]
1460
+ if payload.get("json_path"):
1461
+ lines.append(f"- json_path: `{payload.get('json_path')}`")
1462
+ if payload.get("index_path"):
1463
+ lines.append(f"- index_path: `{payload.get('index_path')}`")
1464
+ if payload.get("recommended_action"):
1465
+ lines.append(f"- recommended_action: {payload.get('recommended_action')}")
1466
+
1467
+ pilot = (
1468
+ payload.get("active_user_assisted_pilot")
1469
+ if isinstance(payload.get("active_user_assisted_pilot"), dict)
1470
+ else {}
1471
+ )
1472
+ if pilot:
1473
+ trigger = pilot.get("trigger") if isinstance(pilot.get("trigger"), dict) else {}
1474
+ operator_run = (
1475
+ pilot.get("operator_simulator_run")
1476
+ if isinstance(pilot.get("operator_simulator_run"), dict)
1477
+ else {}
1478
+ )
1479
+ next_decision = (
1480
+ pilot.get("next_run_decision")
1481
+ if isinstance(pilot.get("next_run_decision"), dict)
1482
+ else {}
1483
+ )
1484
+ lines.extend(
1485
+ [
1486
+ "",
1487
+ "## Active User Assisted Pilot",
1488
+ "",
1489
+ f"- schema_version: `{pilot.get('schema_version')}`",
1490
+ f"- pilot_id: `{pilot.get('pilot_id')}`",
1491
+ f"- benchmark_id: `{pilot.get('benchmark_id')}`",
1492
+ f"- task_id: `{pilot.get('task_id')}`",
1493
+ f"- trigger_kind: `{trigger.get('kind')}`",
1494
+ f"- failed_autonomous_mode_count: `{trigger.get('failed_autonomous_mode_count')}`",
1495
+ f"- assisted_score_kind: `{trigger.get('assisted_score_kind')}`",
1496
+ f"- operator_run_schema: `{operator_run.get('schema_version')}`",
1497
+ f"- proactive_intervention_count: `{operator_run.get('proactive_intervention_count')}`",
1498
+ f"- no_oracle_audit_passed: `{operator_run.get('no_oracle_audit_passed')}`",
1499
+ f"- side_effect_audit_passed: `{operator_run.get('side_effect_audit_passed')}`",
1500
+ f"- official_task_score_kind: `{operator_run.get('official_task_score_kind')}`",
1501
+ f"- next_decision: `{next_decision.get('decision')}`",
1502
+ f"- keep_official_scores_separate: `{next_decision.get('keep_official_scores_separate')}`",
1503
+ ]
1504
+ )
1505
+ if payload.get("error"):
1506
+ lines.append(f"- error: {payload.get('error')}")
1507
+ return "\n".join(lines)