loopx 0.5.0__tar.gz → 0.5.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {loopx-0.5.0/loopx.egg-info → loopx-0.5.1}/PKG-INFO +13 -6
- {loopx-0.5.0 → loopx-0.5.1}/README.md +12 -5
- {loopx-0.5.0 → loopx-0.5.1}/loopx/__init__.py +1 -1
- {loopx-0.5.0 → loopx-0.5.1}/loopx/agent_onboarding.py +3 -1
- {loopx-0.5.0 → loopx-0.5.1}/loopx/bootstrap_command_pack.py +1 -1
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/README.md +29 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/__init__.py +16 -4
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/catalog_entry.py +26 -1
- loopx-0.5.1/loopx/capabilities/benchmark_toolkit/source_revision_fence.py +154 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_actions.py +20 -65
- {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_agent.py +99 -17
- {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_lark_api.py +36 -1
- {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_runtime.py +217 -1
- {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_store.py +215 -1
- loopx-0.5.1/loopx/chat_todo_actions.py +82 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/benchmark_boundary.py +65 -2
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/goal_channel.py +154 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/lark_inbox.py +22 -5
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/registry_admin.py +1 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/registry_admin_configure.py +7 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/configure_goal.py +55 -4
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/activation_service.py +128 -10
- loopx-0.5.1/loopx/control_plane/goals/botmux_runtime.py +1475 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/goal_boundary.py +11 -1
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/settlement.py +2 -1
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/semantic_replan_writeback.py +65 -10
- loopx-0.5.1/loopx/dashboard_launcher.py +136 -0
- loopx-0.5.1/loopx/dsh_goal_mode/README.md +65 -0
- loopx-0.5.1/loopx/dsh_goal_mode/__init__.py +55 -0
- loopx-0.5.1/loopx/dsh_goal_mode/__main__.py +8 -0
- loopx-0.5.1/loopx/dsh_goal_mode/turn_host_adapter.py +465 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/event_sourced_state.py +1 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/docs/lark-event-inbox.md +6 -5
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/goal_topic_connections.py +280 -14
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/goal_topic_runtime.py +127 -30
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/inbox_reply.py +36 -6
- {loopx-0.5.0 → loopx-0.5.1}/loopx/host_loop_activation.py +8 -4
- {loopx-0.5.0 → loopx-0.5.1}/loopx/pi_goal_mode/README.md +13 -5
- {loopx-0.5.0 → loopx-0.5.1}/loopx/pi_goal_mode/loopx-goal.ts +17 -2
- {loopx-0.5.0 → loopx-0.5.1}/loopx/pi_goal_mode/pi-goal-loop-runtime.mjs +36 -1
- {loopx-0.5.0 → loopx-0.5.1}/loopx/state_refresh.py +62 -24
- loopx-0.5.1/loopx/web/chat/assets/index-Cx2exrQv.css +1 -0
- loopx-0.5.1/loopx/web/chat/assets/index-DlTni1Yi.js +107 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/web/chat/index.html +2 -2
- {loopx-0.5.0 → loopx-0.5.1/loopx.egg-info}/PKG-INFO +13 -6
- {loopx-0.5.0 → loopx-0.5.1}/loopx.egg-info/SOURCES.txt +10 -2
- {loopx-0.5.0 → loopx-0.5.1}/pyproject.toml +2 -1
- {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-self-repair/references/repair-patterns.md +2 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_chat_lark_api_contract.py +74 -1
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_dashboard_command.py +101 -0
- loopx-0.5.1/tests/test_dsh_goal_mode.py +239 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_host_loop_activation.py +2 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_license_metadata.py +2 -2
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_pi_goal_mode.py +12 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_slash_command_install.py +2 -0
- loopx-0.5.0/loopx/dashboard_launcher.py +0 -65
- loopx-0.5.0/loopx/web/chat/assets/index-BOUhd8w2.js +0 -107
- loopx-0.5.0/loopx/web/chat/assets/index-C_e30CWC.css +0 -1
- {loopx-0.5.0 → loopx-0.5.1}/LICENSE +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/LICENSE-MIT +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/NOTICE +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/agent_registry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/ark_managed_agent_host.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/authority.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/bootstrap.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/boundary_authority.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/canary/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/canary/maintainability_ratchet.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/canary/planner.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/canary/premerge.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/canary/qualification_profiles.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/canary/quality_surface_catalog.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/canary/release_profiles.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/canary/runner.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/canary/smoke_health.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/canary/smoke_profiles.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/agent_turn_recall/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/agent_turn_recall/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/agent_turn_recall/catalog_entry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/agent_turn_recall/cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/agent_turn_recall/core.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/bootstrap_contract.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/catalog_entry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/core.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/defaults.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/demo_e2e.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/demo_supervisor.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/evidence_packet.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/human_view.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/kernel.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/knn_demo_workspace.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/live_evidence.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/preset.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/research_state.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/role_profiles.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/rollout_append.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/terminal_result_contract.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/terminal_result_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/terminal_result_query.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/terminal_results.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/user_contract.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/worker_loop.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/worker_runtime.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/auto_research/worker_skill/SKILL.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/artifacts.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/container_binding.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/environment_access.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/experiment_board.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/integrity.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/native_codex_goal.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/native_codex_isolation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/native_codex_profile.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/public_trajectory.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/benchmark_toolkit/run_permissions.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/catalog.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/change_quality/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/change_quality/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/change_quality/catalog_entry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/change_quality/cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/change_quality/context.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/change_quality/oracles.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/change_quality/policy.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/change_quality/receipt.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/change_quality/result.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/change_quality/scope.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/change_quality/shadow.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/catalog_entry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/connector_packets.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/item_lifecycle.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/layout.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/markdown.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/schemas.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/social_browser_x.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/surface.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/content_ops/templates/layout-catalog-v0.json +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/context_providers/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/context_providers/base.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/context_providers/factory.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/context_providers/openviking.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/context_providers/service_ownership.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/README.zh-CN.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/architecture.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/assembler.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/catalog_entry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/cursor_commit.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/outcome_feedback.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/packets.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/private_state.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/profile.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/providers.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/review_settlement.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/runtime.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/decision_context/sources.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/documentation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/README.zh-CN.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/activation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/adaptive_replay_planner.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/catalog_entry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/child_replay_runtime.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/composition_frontier.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/counterfactual_runtime.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/episode_runtime.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/harness_checkpoint.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/harness_gate.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/harness_runtime.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/replay_metrics.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/replay_runtime.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/resource_portfolio.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/result_log.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/router_state.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/source_history_reconcile.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/speculative_scheduler.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/todo_branch_plan.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/todo_evidence.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/trace_runtime.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/explore/worker_branch_plan.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/integration_branch/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/integration_branch/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/integration_branch/catalog_entry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/integration_branch/cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/integration_branch/core.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/README.zh-CN.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/acceptance_loop.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/candidate_evidence.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/candidate_preflight.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/catalog_entry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/cli_input.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/content_ops_cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/discovered_issue_promotion.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/docs/openviking-pilot-handoff.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/docs/protocols/issue-fix-acceptance-loop-v0.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/docs/protocols/issue-fix-discovered-issue-promotion-v0.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/docs/protocols/issue-fix-metrics-projection-v0.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/docs/protocols/issue-fix-reviewer-notification-sinks-v0.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/docs/protocols/issue-fix-reviewer-recommendation-v0.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/docs/protocols/issue-fix-reviewer-request-v0.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/docs/protocols/issue-fix-workflow-contract-v0.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/docs/state-kernel-domain-state-case-study.zh-CN.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/explore_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/feasibility.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/github_public.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/intake_surface.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/metadata_preview.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/metrics_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/metrics_supplement.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/metrics_supplement_cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/outcome_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/periodic_report.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/pr_description.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/pr_gate_reconcile.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/pr_gate_reconcile_cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/pr_lifecycle.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/pr_lifecycle_rollout.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/pr_monitor_materialization.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/pr_review_ack.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/provider_hooks.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/repository_commit_evidence.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/repository_context.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/repository_memory.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/repository_memory_provider.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/repository_snapshot.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/reviewer_cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/reviewer_notification.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/reviewer_notification_drain.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/reviewer_recommendation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/reviewer_request.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/reward_memory.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/issue_fix/workflow_plan.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/README.zh-CN.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/_validation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/apply.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/architecture.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/catalog_entry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/decision_planning.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/explore_execution.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/intake.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/inventory.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/lifecycle.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/preparation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/project_skill.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/ranking.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/readable_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/rebuild.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/material_lifecycle/settlement.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/adapters.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/archive.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/bindings.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/catalog_entry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/core.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/extension_envelope.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/presets.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/profile.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/project_progress.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/periodic_report/triggers.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/pr_review_queue/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/pr_review_queue/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/pr_review_queue/catalog_entry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/pr_review_queue/core.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/pr_review_queue/review_contract.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/project_skill_delivery/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/project_skill_delivery/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/project_skill_delivery/catalog_entry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/project_skill_delivery/cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/project_skill_delivery/core.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/registry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/repository_change_window/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/repository_change_window/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/repository_change_window/catalog_entry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/repository_change_window/cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/repository_change_window/git_hook.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/repository_change_window/ledger.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/repository_change_window/policy.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/repository_change_window/repository.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/README.zh-CN.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/application.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/architecture.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/candidate_review.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/catalog_entry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/dogfood.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/evaluation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/evaluation_fixtures.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/experiment.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/health.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/ingestion.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/memory_utility.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/registry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/runtime_hooks.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/reward_memory/scoped_feedback.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/semantic_preference/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/semantic_preference/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/semantic_preference/catalog_entry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/semantic_preference/cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/semantic_preference/contract.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/semantic_preference/docs/openviking-project-peer.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/semantic_preference/reward_memory.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/value_connectors/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/value_connectors/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/value_connectors/catalog_entry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/value_connectors/cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/value_connectors/docs/agent-reach-ops-source-map.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/value_connectors/docs/finance-market-snapshot-probe.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/value_connectors/finance_extension_migration.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/value_connectors/install_check.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/value_connectors/planner.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/capabilities/value_connectors/source_map.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/chat.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_acp.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_action_store.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_attachments.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_endpoints.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_goal_lifecycle_actions.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_monitor_actions.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_providers.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/chat_server.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/claude_goal_mode/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/claude_goal_mode/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/claude_goal_mode/hooks/goal_policy.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/claude_goal_mode/hooks/goal_state.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/claude_goal_mode/mcp/loopx_mcp.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/claude_goal_mode/scripts/connect.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/claude_goal_mode/scripts/goalmode_cmd.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/claude_goal_mode/scripts/install.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/claude_goal_mode/statusline/goal_status.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/_host_thread.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/benchmark_dispatch.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/benchmark_experiment_board.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/bootstrap_connect.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/canary.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/canary_release_qualification.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/capability.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/dash.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/doctor.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/dreaming.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/evidence_log.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/explore.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/explore_feishu_commands.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/explore_planning_commands.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/extension.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/first_run_report.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/goal_lifecycle.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/handoff_mode.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/history.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/host_mode_plan.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/lark_kanban.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/ml_experiment.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/multi_agent.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/opencode2_goal_worker.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/pr_review.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/presentation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/preset.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/project.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/project_lifecycle.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/quota.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/quota_host_poll.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/quota_monitor_poll.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/quota_registration.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/quota_request.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/ready_score.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/registry_admin_peer.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/registry_authority.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/review_batch.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/slash_commands.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/start_goal.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/starter.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/starter_bootstrap.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/starter_bootstrap_registration.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/starter_runtime_idle.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/starter_scheduler.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/starter_session_runtime.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/starter_visible_common.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/starter_visible_driver.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/starter_visible_pilot.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/status.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/status_registration.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/summary_all.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/support_control.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/support_control_backup.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/support_control_chat_endpoint.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/support_control_registry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/support_control_supervisor.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/task_lease.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/todo.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/todo_argument_validation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/todo_event.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/turn.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/version.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/worker_bridge.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_commands/workflow_skills.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/cli_rollout.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/codex_cli_probe.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/codex_cli_probe_markdown.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/codex_cli_runtime_probe.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/codex_cli_scheduler.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/command_invocation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/configuration_catalog.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/contract.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/agent_lane_recommendation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/agent_scope.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/agent_scope_frontier.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/capability_gate.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/identity.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/legacy_migration.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/management_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/material_frontier.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/material_handoff.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/multi_agent/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/multi_agent/codex_executable.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/multi_agent/collective_round_ledger.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/multi_agent/contract.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/multi_agent/recipe.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/multi_agent/role_successor.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/multi_agent/runtime_scripts.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/multi_agent/visible_launch_policy.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/multi_agent/visible_wake_scheduler.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/profile.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/runtime_model.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/subagent_activity.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/supervisor.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/supervisor_events.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/supervisor_inject.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/work_mode.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/agents/workspace_guard.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/effect_program.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/activation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/active_state_event_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/active_state_metadata.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/active_state_sections.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/configure_goal_service.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/contract_health.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/dreaming.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/global_registry_health.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/global_registry_shadow.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_channel.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_channel_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_frontier/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_frontier/ack_policy.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_frontier/outcome_continuity.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_frontier/replan_rules.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_frontier/semantic_history.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_frontier/terminal.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_vision.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_vision_policy.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_vision_state.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/goal_vision_wait.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/path_resolution.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/start_contract.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/goals/vision_checkpoint.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/handoff/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/handoff/cross_runtime_impl_review.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/handoff/delivery_contract.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/handoff/handoff_runs.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/handoff/project_handoff.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/handoff/review_batch.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/handoff/review_packet_context.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/heartbeat/agent.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/heartbeat/budget.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/heartbeat/builder.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/heartbeat/host.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/heartbeat/rules.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/heartbeat/task_body.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/heartbeat/visible_goal.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/projects/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/projects/contract.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/projects/registry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/cli_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/decision_summary.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/effect_program.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/error_codes.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/heartbeat_receipt.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/heartbeat_recommendation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/host_poll_receipts.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/live_decision.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/monitor_poll.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/policy_constants.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/projection_repair.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/recent_runs.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/scheduler_ack.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/selected_todo_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/settlement_cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/settlement_validation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/settlement_workspace_causality.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/should_run.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/should_run_packet.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/should_run_prepare.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/slot_accounting.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/spend_sources.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/stall_repair.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/states.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/task_orchestration.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/task_orchestration_admission.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/turn_envelope.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/usage_collector.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/quota/usage_summary.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/reward_memory.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/agent_scoped_evidence_log.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/decision_freshness.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/event_ledger.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/event_store_migration_bridge.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/goal_project_route.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/local_state_write_correctness.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/promotion_readiness.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/public_safety.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/run_artifacts.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/run_compaction.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/run_context_retention.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/run_history.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/run_index_duplicates.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/run_index_rebuild.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/runtime_projection_route.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/runtime_projection_writer.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/session_runtime.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/shared_runtime_material_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/shared_runtime_refresh_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/stale_latest_run.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/status_classifications.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/status_projection_cache.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/stride_observation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/time.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/trajectory_hygiene.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/runtime/validation_command.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/ack.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/arbitration.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/automation_liveness.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/execution_context.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/external_evidence_observation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/monitor_display.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/monitor_poll_policy.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/monitor_poll_writeback.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/monitor_target.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/monitor_todo.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/monitor_wait.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/scheduler_hint.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/state.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/state_transition_rules.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/scheduler/time.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/settlement_driver.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/active_state_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/agent_lane_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/attention_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/autonomous_replan_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/collection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/contract_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/dreaming_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/goal_attention_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/lifecycle_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/monitor_display_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/registry_health_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/run_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/status/runtime_summaries.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/actual_default_model_behavior_portfolio.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/canary_harness.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/capability_monitor_repair_tool_behavior.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/cli_output_budget.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/cli_output_differential.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/cli_output_semantics.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/control_plane_composition_scenarios.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/decision_replay.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/doubao_model_behavior_actor.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/model_behavior_corpus.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/model_behavior_qualification.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/model_behavior_retained_cases.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/model_tool_behavior.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/onboarding_model_behavior_qualification.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/quota_fixtures.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/quota_should_run_parity.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/release_commit_qualification.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/replan_semantic_action_behavior.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/scoped_gate_successor_tool_behavior.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/selected_todo_tool_behavior.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/testing/terminal_settlement_tool_behavior.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/active_state_editing.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/active_state_todo_parser.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/active_state_todos.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/addition.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/claim_visibility.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/completed_archive.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/completion_fence.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/completion_policy.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/completion_state.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/completion_validation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/completion_validation_accountability.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/completion_validation_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/contract.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/decision_scope.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/deferred_resume.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/durable_completion.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/event_writeback.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/frontier_deadline.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/handoff_gate.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/handoff_mode.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/handoff_note.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/line_update.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/list_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/markdown.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/monitor_metadata.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/mutation_authority.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/quota_summary.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/route_continuation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/succession_warning.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/summary_item.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/text.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/todo_index.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/todo_summary.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/unblock_resume.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/user_gate.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/write_hint.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/todos/write_policy.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/turn_driver/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/turn_driver/codex_cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/turn_driver/driver.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/turn_driver/executor.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/turn_driver/loop_controller.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/turn_driver/session_recovery.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/turn_driver/settlement.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/turn_driver/transaction.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/attention_fields.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/attention_item.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/attention_queue.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/attention_routing.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/autonomous_candidates.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/autonomous_replan_ack.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/autonomous_replan_obligation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/backlog_hygiene.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/capability_monitor_fallback.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/delivery_batch_scale.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/delivery_outcome.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/delivery_signals.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/execution_obligation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/goal_route_hint.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/interaction_contract.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/issue_meta_surface.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/lifecycle.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/operator_inbox.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/outcome_followthrough.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/primary_action.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/progress_observation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/project_asset.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/repair_delta.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/runtime_capability_reentry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/status_contract.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/task_graph.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/task_lease.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/task_lease_settlement.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/work_lane.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/control_plane/work_items/work_lane_context.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/dash_server.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/demo.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/diagnose.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/doctor.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/domain_packs/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/domain_packs/issue_fix.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/domain_packs/ml_experiment.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/domain_state.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/dreaming.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/entrypoint.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/execution_profile.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/experiments/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/experiments/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/experiments/planner_worker/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/experiments/planner_worker/contract.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/experiments/planner_worker/runtime.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/experiments/planner_worker/traex.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/explore_graph.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/bundled.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/capability_admission.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/execution_envelope.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/app_setup.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/cli_resolution.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/event_collector.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/event_collector_runtime.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/event_inbox.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/extension.toml +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/goal_channel.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/goal_channel_contracts.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/goal_channel_lifecycle.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/goal_channel_notification.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/goal_channel_runtime.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/goal_channel_setup.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/goal_channel_targets.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/goal_channel_transport.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/inbox_reactions.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/explore_results.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/explore_singleflight.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/explore_source_guard.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/explore_stage_document.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/explore_visual_integrity.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/explore_visual_readback.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/explore_visual_styles.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/issue_fix_surface.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/kanban.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/message_card.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/periodic_report.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/projection_rows.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/record_io.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/presentation/sync_receipt.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/private_json.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/provider.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/lark/reviewer_notification.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/manifest.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/openviking_periodic_report/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/openviking_periodic_report/activation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/openviking_periodic_report/extension.toml +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/openviking_periodic_report/provider.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/openviking_periodic_report/sink.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/openviking_semantic_preference/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/openviking_semantic_preference/extension.toml +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/openviking_semantic_preference/history_export.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/openviking_semantic_preference/project_peer.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/openviking_semantic_preference/provider.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/presentation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/process_runtime.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/readiness.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/runtime.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/extensions/scaffold.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/feedback.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/file_lock.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/global_registry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/global_risks.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/global_todos.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/goal_mode_context.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/goal_mode_mcp.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/handoff_budget.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/heartbeat_prequota.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/heartbeat_prompt.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/help_surface.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/history.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/host_mode_planner.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/install_contract.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/interface_budget.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/kunluncode_goal_mode/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/kunluncode_goal_mode/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/kunluncode_goal_mode/app_server.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/kunluncode_goal_mode/cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/kunluncode_goal_mode/context.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/kunluncode_goal_mode/control_plane.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/kunluncode_goal_mode/guards.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/kunluncode_goal_mode/runtime.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/kunluncode_goal_mode/server.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/long_task_cadence.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/materials.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/ml_experiment.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/onboarding.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/opencode2_goal_mode/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/opencode2_goal_mode/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/opencode2_goal_mode/opencode2-goal-worker.mjs +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/opencode_goal_mode/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/opencode_goal_mode/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/opencode_goal_mode/goal-bridge-runtime.mjs +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/opencode_goal_mode/loopx-goal.js +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/operator_gate.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/orchestration.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/paths.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/pi_goal_mode/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/pr_review.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/README.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/explore_views.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/markdown.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/projection_source_reconcile.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/projections/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/projections/session_dash.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/public_safety.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/renderers/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/renderers/goal_channel_html.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/renderers/periodic_report_html.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/renderers/periodic_report_markdown.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/renderers/quota_event_markdown.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/renderers/quota_markdown.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/renderers/session_dash_html.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/renderers/status_markdown.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/renderers/trajectory_hygiene_markdown.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/renderers/turn_envelope_markdown.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/sinks/__init__.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/sinks/openviking_periodic_report.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/presentation/static_site.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/presets.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/project_alias.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/project_map.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/project_prompt.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/project_uninstall.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/promotion_gate.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/quota.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/ready_score.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/registry.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/registry_writability.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/release_candidate.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/release_manifest.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/repository_identity.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/review_packet.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/rollout_event_log.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/runtime.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/self_update.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/session_runtime.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/skill_install_readback.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/slash_command_install.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/slash_commands.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/state_backup.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/state_migration.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/state_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/status.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/status_server.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/summary_all.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/thread_agent_binding.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/todo_followups.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/todo_suggestion_prompt.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/todos.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/turn_identity.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/upgrade.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/visible_governance.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/visible_multi_agent_launcher.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/visible_multi_agent_tmux.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/web/chat/manifest.webmanifest +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/web/chat/pwa/icon-192.png +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/web/chat/pwa/icon-512.png +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/windows_install.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/worker_bridge.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx/workflow_skill_install.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx.egg-info/dependency_links.txt +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx.egg-info/entry_points.txt +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx.egg-info/requires.txt +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/loopx.egg-info/top_level.txt +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/setup.cfg +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-doc-registry/SKILL.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-doc-registry/agents/openai.yaml +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-pr-program/SKILL.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-pr-program/agents/openai.yaml +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-pr-program/references/snapshot-contract.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-pr-program/scripts/diff_snapshot.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-pr-review/SKILL.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-pr-review/agents/openai.yaml +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-project/SKILL.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-project/agents/openai.yaml +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-self-repair/SKILL.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-self-repair/agents/openai.yaml +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/skills/loopx-self-repair/references/upstream-issue-escalation.md +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_agent_onboarding_pi_host.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_agent_onboarding_unconnected_project.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_ark_managed_agent_host.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_ark_managed_agent_issue_fix_matrix.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_auto_research_control.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_chat_image_attachments.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_chat_server_cors.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_cli_argument_diagnostics.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_cli_entrypoint.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_codex_app_apply_rrule.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_command_invocation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_content_ops_item_lifecycle.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_content_ops_lifecycle.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_content_ops_queue_status.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_contract_credential_pattern_precision.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_contract_scan_unreadable_files.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_decision_context_material.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_dependency_security_boundaries.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_doctor_install_freshness.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_explore_counterfactual_runtime.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_explore_episode_runtime.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_explore_monitor_lane_budget.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_explore_owner_board_views.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_explore_presentation_views.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_explore_replay_compatibility.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_explore_replay_runtime.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_explore_resource_portfolio.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_explore_router_acceptance.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_explore_source_history_reconcile.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_explore_worker_topic_affinity.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_external_scheduler_worker.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_feedback_goal_id_validation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_file_lock.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_file_lock_cross_process.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_gemini_cursor_host_surfaces.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_global_registry_write_serialization.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_global_risks.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_global_todos.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_history_chronology.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_host_mode_planner.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_host_parity_smoke.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_host_poll_receipts.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_kunluncode_goal_mode.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_loop_turn_loop_controller.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_loopx_turn_codex_cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_loopx_turn_driver.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_loopx_turn_executor.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_loopx_turn_journal_inspection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_loopx_turn_settlement_parity.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_loopx_turn_transaction.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_ml_experiment_volc_packet.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_nokv_shadow_provider_probes.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_opencode2_goal_worker.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_opencode2_goal_worker_cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_opencode_goal_bridge.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_operator_markdown_renderers.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_packaged_skill_metadata.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_pr_program_snapshot.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_pr_program_snapshot_diff.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_pr_review_github_scan.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_project_skill_cli.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_register_agent_fresh_identity.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_release_smoke_archive_helpers.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_reward_memory_pipeline.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_self_update_runtime_activation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_skill_delivery_parity.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_smoke_suite.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_state_file_containment.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_state_refresh_projections.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_static_site_presentation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_status_server_cors.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_status_server_extension_projection.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_status_server_fast_path.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_summary_all.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_thread_agent_binding.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_trajectory_hygiene.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_turn_envelope.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_turn_loop_disposition.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_visible_goal_terminal_settlement.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_windows_install.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_worker_command_validation.py +0 -0
- {loopx-0.5.0 → loopx-0.5.1}/tests/test_workflow_skill_install.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: loopx
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.1
|
|
4
4
|
Summary: A lightweight Loop Engineering control plane for long-running agent goals.
|
|
5
5
|
Author: LoopX contributors
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -68,8 +68,10 @@ to hand off across turns, tools, and agents.
|
|
|
68
68
|
|
|
69
69
|
## Meet the Personal Agent Workspace
|
|
70
70
|
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
Keep long-horizon goals in one local-first workspace. Goals, attention,
|
|
72
|
+
conversations, tasks, files, schedules, and recovery stay durable across days,
|
|
73
|
+
restarts, and harnesses, so work that began last week resumes exactly where
|
|
74
|
+
the last bounded turn stopped instead of living in chat memory.
|
|
73
75
|
|
|
74
76
|
<a href="docs/assets/personal-workspace/loopx-dashboard-launch.mp4">
|
|
75
77
|
<img src="docs/assets/personal-workspace/loopx-dashboard-tour.webp" alt="Animated tour of the LoopX personal Agent workspace, from one-command launch to Manager overview, Goal task board, protected action preview, and Goal details" width="960">
|
|
@@ -100,7 +102,10 @@ npm run dev
|
|
|
100
102
|
|
|
101
103
|
[Read the desktop shell guide](apps/desktop/loopx-control-plane/README.md).
|
|
102
104
|
Closing the window stops only the service processes that the shell started;
|
|
103
|
-
existing LoopX services and durable Goal state remain intact.
|
|
105
|
+
existing LoopX services and durable Goal state remain intact. Both entry
|
|
106
|
+
points share the same loopback services and can be started in either order:
|
|
107
|
+
`loopx dashboard` reuses an already-running LoopX Chat service instead of
|
|
108
|
+
starting a second one.
|
|
104
109
|
|
|
105
110
|
[Watch the full 32-second walkthrough](docs/assets/personal-workspace/loopx-dashboard-launch.mp4)
|
|
106
111
|
· [Read the workspace guide](docs/guides/personal-workspace-user-guide.md)
|
|
@@ -314,14 +319,16 @@ LoopX should reuse existing state rather than overwrite it. Keep `.loopx/`,
|
|
|
314
319
|
| KunlunCode | Run `loopx-kunluncode connect --project . --goal-id <goal-id> --agent-id <registered-agent-id>`, add a bounded todo, then run `loopx-kunluncode run --project .`. | Native Goal Pro through app-server; LoopX writes completion and quota only after strict verification |
|
|
315
320
|
| OpenCode | Install the static command facade; opt in to `--with-goal-bridge` for recurring goals. | OpenCode command facade and explicit goal bridge |
|
|
316
321
|
| Pi | Install the opt-in goal extension with `loopx slash-commands --install --surface pi`, then use `/loopx <task>` from a trusted Pi session. | Visible Pi goal extension gated by LoopX quota (`loopx_goal_activate` + `agent_settled` continuation) |
|
|
322
|
+
| DeepSeek Harness (dsh) | Install `loopx[deepseek-harness]`, prepare a dsh `cordis.yml`, then use the [dsh goal-mode adapter](loopx/dsh_goal_mode/README.md) with `loopx turn run-once`. | Headless dsh segments through LoopX Turn, each tick gated by `quota should-run` |
|
|
317
323
|
| Cursor, shell, or custom runner | Use the installer and `loopx doctor`; connect manually or call LoopX from your runner. | Your shell, scheduler, or runner |
|
|
318
324
|
|
|
319
325
|
The exact, copy-ready setup messages and host recovery paths live in
|
|
320
326
|
[Getting Started](docs/guides/getting-started.md). Host integrations can inspect
|
|
321
327
|
the [Codex App host command registry contract](docs/reference/protocols/codex-app-host-command-registry-v0.md),
|
|
322
328
|
the [Codex CLI packaged install path](docs/product/runtimes/codex-cli/codex-cli-packaged-install.md),
|
|
323
|
-
the [Claude Code adapter](loopx/claude_goal_mode/README.md),
|
|
324
|
-
[KunlunCode native Goal adapter](loopx/kunluncode_goal_mode/README.md)
|
|
329
|
+
the [Claude Code adapter](loopx/claude_goal_mode/README.md), the
|
|
330
|
+
[KunlunCode native Goal adapter](loopx/kunluncode_goal_mode/README.md), or the
|
|
331
|
+
[DeepSeek Harness turn adapter](loopx/dsh_goal_mode/README.md).
|
|
325
332
|
|
|
326
333
|
For custom runners, start with the
|
|
327
334
|
[minimal custom runtime example](docs/guides/minimal-custom-runtime-example.md)
|
|
@@ -39,8 +39,10 @@ to hand off across turns, tools, and agents.
|
|
|
39
39
|
|
|
40
40
|
## Meet the Personal Agent Workspace
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
Keep long-horizon goals in one local-first workspace. Goals, attention,
|
|
43
|
+
conversations, tasks, files, schedules, and recovery stay durable across days,
|
|
44
|
+
restarts, and harnesses, so work that began last week resumes exactly where
|
|
45
|
+
the last bounded turn stopped instead of living in chat memory.
|
|
44
46
|
|
|
45
47
|
<a href="docs/assets/personal-workspace/loopx-dashboard-launch.mp4">
|
|
46
48
|
<img src="docs/assets/personal-workspace/loopx-dashboard-tour.webp" alt="Animated tour of the LoopX personal Agent workspace, from one-command launch to Manager overview, Goal task board, protected action preview, and Goal details" width="960">
|
|
@@ -71,7 +73,10 @@ npm run dev
|
|
|
71
73
|
|
|
72
74
|
[Read the desktop shell guide](apps/desktop/loopx-control-plane/README.md).
|
|
73
75
|
Closing the window stops only the service processes that the shell started;
|
|
74
|
-
existing LoopX services and durable Goal state remain intact.
|
|
76
|
+
existing LoopX services and durable Goal state remain intact. Both entry
|
|
77
|
+
points share the same loopback services and can be started in either order:
|
|
78
|
+
`loopx dashboard` reuses an already-running LoopX Chat service instead of
|
|
79
|
+
starting a second one.
|
|
75
80
|
|
|
76
81
|
[Watch the full 32-second walkthrough](docs/assets/personal-workspace/loopx-dashboard-launch.mp4)
|
|
77
82
|
· [Read the workspace guide](docs/guides/personal-workspace-user-guide.md)
|
|
@@ -285,14 +290,16 @@ LoopX should reuse existing state rather than overwrite it. Keep `.loopx/`,
|
|
|
285
290
|
| KunlunCode | Run `loopx-kunluncode connect --project . --goal-id <goal-id> --agent-id <registered-agent-id>`, add a bounded todo, then run `loopx-kunluncode run --project .`. | Native Goal Pro through app-server; LoopX writes completion and quota only after strict verification |
|
|
286
291
|
| OpenCode | Install the static command facade; opt in to `--with-goal-bridge` for recurring goals. | OpenCode command facade and explicit goal bridge |
|
|
287
292
|
| Pi | Install the opt-in goal extension with `loopx slash-commands --install --surface pi`, then use `/loopx <task>` from a trusted Pi session. | Visible Pi goal extension gated by LoopX quota (`loopx_goal_activate` + `agent_settled` continuation) |
|
|
293
|
+
| DeepSeek Harness (dsh) | Install `loopx[deepseek-harness]`, prepare a dsh `cordis.yml`, then use the [dsh goal-mode adapter](loopx/dsh_goal_mode/README.md) with `loopx turn run-once`. | Headless dsh segments through LoopX Turn, each tick gated by `quota should-run` |
|
|
288
294
|
| Cursor, shell, or custom runner | Use the installer and `loopx doctor`; connect manually or call LoopX from your runner. | Your shell, scheduler, or runner |
|
|
289
295
|
|
|
290
296
|
The exact, copy-ready setup messages and host recovery paths live in
|
|
291
297
|
[Getting Started](docs/guides/getting-started.md). Host integrations can inspect
|
|
292
298
|
the [Codex App host command registry contract](docs/reference/protocols/codex-app-host-command-registry-v0.md),
|
|
293
299
|
the [Codex CLI packaged install path](docs/product/runtimes/codex-cli/codex-cli-packaged-install.md),
|
|
294
|
-
the [Claude Code adapter](loopx/claude_goal_mode/README.md),
|
|
295
|
-
[KunlunCode native Goal adapter](loopx/kunluncode_goal_mode/README.md)
|
|
300
|
+
the [Claude Code adapter](loopx/claude_goal_mode/README.md), the
|
|
301
|
+
[KunlunCode native Goal adapter](loopx/kunluncode_goal_mode/README.md), or the
|
|
302
|
+
[DeepSeek Harness turn adapter](loopx/dsh_goal_mode/README.md).
|
|
296
303
|
|
|
297
304
|
For custom runners, start with the
|
|
298
305
|
[minimal custom runtime example](docs/guides/minimal-custom-runtime-example.md)
|
|
@@ -314,7 +314,9 @@ def _start_instruction(agent_type: str) -> str:
|
|
|
314
314
|
if agent_type == "deepseek-harness":
|
|
315
315
|
return (
|
|
316
316
|
"Install `loopx[deepseek-harness]`, prepare a dsh cordis.yml, and run "
|
|
317
|
-
"`loopx turn run-once` with `
|
|
317
|
+
"`loopx turn run-once` with the `loopx.dsh_goal_mode` adapter "
|
|
318
|
+
"(`python -m loopx.dsh_goal_mode`; the legacy "
|
|
319
|
+
"`scripts/dsh_turn_host_adapter.py` launcher still works) as the "
|
|
318
320
|
"generic-cli host adapter; every tick starts from `quota should-run`."
|
|
319
321
|
)
|
|
320
322
|
if agent_type == "ark-managed-agent":
|
|
@@ -323,7 +323,7 @@ def build_start_goal_host_surface_selection_packet(
|
|
|
323
323
|
"pi": "Pi LoopX goal extension",
|
|
324
324
|
"gemini-cli": "Gemini CLI driving its own loop through the LoopX skill facade",
|
|
325
325
|
"cursor-agent": "cursor-agent driving its own loop through the LoopX skill facade and MCP server",
|
|
326
|
-
"deepseek-harness": "DeepSeek Harness automation loop through scripts/dsh_turn_host_adapter.py",
|
|
326
|
+
"deepseek-harness": "DeepSeek Harness automation loop through loopx.dsh_goal_mode (compat: scripts/dsh_turn_host_adapter.py)",
|
|
327
327
|
"ark-managed-agent": "Ark Managed Agent with one-shot Goal submission",
|
|
328
328
|
"shell": "manual shell or an explicitly configured external scheduler",
|
|
329
329
|
"other-agent": "custom agent host using the returned activation contract",
|
|
@@ -5,6 +5,35 @@ artifact, integrity, and reusable agent-runtime boundaries around benchmark
|
|
|
5
5
|
experiments. It does not own benchmark-family runners, result ledgers, or scoring
|
|
6
6
|
adapters.
|
|
7
7
|
|
|
8
|
+
## Source revision admission
|
|
9
|
+
|
|
10
|
+
A long-running campaign can keep launching from an old installed checkout after
|
|
11
|
+
the tracked branch advances. Pinning the source once at controller startup does
|
|
12
|
+
not prevent that drift. Immediately before each new benchmark admission, obtain
|
|
13
|
+
the current reference head through the runner's provider or network boundary,
|
|
14
|
+
then compare it with the clean local checkout and intended pin:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
loopx benchmark source-revision-fence \
|
|
18
|
+
--source-checkout /path/to/pinned-source \
|
|
19
|
+
--expected-revision "$PINNED_REVISION" \
|
|
20
|
+
--observed-reference-revision "$OBSERVED_REFERENCE_REVISION" \
|
|
21
|
+
--require-admitted \
|
|
22
|
+
--format json
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The command succeeds only when all three identities match and the source root has
|
|
26
|
+
no tracked or untracked changes. Its compact receipt records equality, cleanliness,
|
|
27
|
+
and a stable reason code without recording the checkout path or any revision value.
|
|
28
|
+
Invalid input is also reduced to a path-free fail-closed receipt.
|
|
29
|
+
|
|
30
|
+
The fence is an admission boundary, not a live-run mutation mechanism. A run that
|
|
31
|
+
already passed the fence keeps its immutable revision even if the reference moves
|
|
32
|
+
later; the new head blocks only subsequent admissions until the runner installs and
|
|
33
|
+
pins an updated source. The caller owns the freshness and authority of the observed
|
|
34
|
+
reference value. This capability performs no fetch, provider API call, checkout,
|
|
35
|
+
install, process launch, score write, or submission.
|
|
36
|
+
|
|
8
37
|
## Native Codex Goal runtime
|
|
9
38
|
|
|
10
39
|
Benchmark adapters that use the Codex app-server Goal API should import
|
|
@@ -95,6 +95,13 @@ from .run_permissions import (
|
|
|
95
95
|
compact_run_permission_policy_for_quota,
|
|
96
96
|
validate_run_permission_policy,
|
|
97
97
|
)
|
|
98
|
+
from .source_revision_fence import (
|
|
99
|
+
BENCHMARK_SOURCE_REVISION_FENCE_SCHEMA_VERSION,
|
|
100
|
+
BenchmarkSourceRevisionFence,
|
|
101
|
+
BenchmarkSourceRevisionFenceError,
|
|
102
|
+
compact_benchmark_source_revision_fence_receipt,
|
|
103
|
+
inspect_benchmark_source_revision_fence,
|
|
104
|
+
)
|
|
98
105
|
|
|
99
106
|
__all__ = [
|
|
100
107
|
"BENCHMARK_CANDIDATE_SOURCE_BOUNDARY_SCHEMA_VERSION",
|
|
@@ -105,16 +112,20 @@ __all__ = [
|
|
|
105
112
|
"BENCHMARK_INTEGRITY_POLICY_SCHEMA_VERSION",
|
|
106
113
|
"BENCHMARK_INTEGRITY_QUALIFICATION_SCHEMA_VERSION",
|
|
107
114
|
"BENCHMARK_RUNTIME_INTEGRITY_ATTESTATION_SCHEMA_VERSION",
|
|
115
|
+
"BENCHMARK_SOURCE_REVISION_FENCE_SCHEMA_VERSION",
|
|
108
116
|
"DEFAULT_RUN_PERMISSION_ALLOWED_ACTIONS",
|
|
109
117
|
"DEFAULT_RUN_PERMISSION_FORBIDDEN_ACTIONS",
|
|
110
118
|
"INTEGRITY_EVIDENCE_CATEGORIES",
|
|
111
119
|
"NATIVE_CODEX_GOAL_PROMPT_SCHEMA_VERSION",
|
|
112
|
-
"NATIVE_GOAL_LIFECYCLE_SCHEMA_VERSION",
|
|
113
120
|
"NATIVE_CODEX_PROFILE_REQUIRED_SKILL_IDS",
|
|
114
121
|
"NATIVE_CODEX_PROFILE_SCHEMA_VERSION",
|
|
122
|
+
"NATIVE_GOAL_LIFECYCLE_SCHEMA_VERSION",
|
|
123
|
+
"PUBLIC_TRAJECTORY_SUMMARY_SCHEMA_VERSION",
|
|
115
124
|
"REQUIRED_RUNTIME_ATTESTATIONS",
|
|
116
125
|
"RUN_PERMISSION_POLICY_SCHEMA_VERSION",
|
|
117
126
|
"RUN_PERMISSION_QUOTA_PROJECTION_SCHEMA_VERSION",
|
|
127
|
+
"BenchmarkSourceRevisionFence",
|
|
128
|
+
"BenchmarkSourceRevisionFenceError",
|
|
118
129
|
"DockerContainerBinding",
|
|
119
130
|
"DockerContainerBindingError",
|
|
120
131
|
"NativeCodexGoalPrompt",
|
|
@@ -124,15 +135,14 @@ __all__ = [
|
|
|
124
135
|
"NativeCodexProfile",
|
|
125
136
|
"NativeCodexProfileError",
|
|
126
137
|
"NativeGoalConfig",
|
|
127
|
-
"NativeGoalLifecycleFacts",
|
|
128
138
|
"NativeGoalEventTransport",
|
|
139
|
+
"NativeGoalLifecycleFacts",
|
|
129
140
|
"NativeGoalProtocolError",
|
|
130
141
|
"NativeGoalTransport",
|
|
131
142
|
"NativeGoalTurn",
|
|
132
|
-
"RunPermissionAction",
|
|
133
|
-
"PUBLIC_TRAJECTORY_SUMMARY_SCHEMA_VERSION",
|
|
134
143
|
"PublicTrajectoryLifecycleState",
|
|
135
144
|
"PublicTrajectorySummaryError",
|
|
145
|
+
"RunPermissionAction",
|
|
136
146
|
"StdioNativeGoalTransport",
|
|
137
147
|
"attach_native_goal",
|
|
138
148
|
"benchmark_experiment_board_row_key",
|
|
@@ -144,6 +154,7 @@ __all__ = [
|
|
|
144
154
|
"build_run_permission_policy",
|
|
145
155
|
"classify_benchmark_artifact_path",
|
|
146
156
|
"classify_benchmark_candidate_source_path",
|
|
157
|
+
"compact_benchmark_source_revision_fence_receipt",
|
|
147
158
|
"compact_docker_container_binding_receipt",
|
|
148
159
|
"compact_native_codex_goal_prompt_receipt",
|
|
149
160
|
"compact_native_codex_profile_receipt",
|
|
@@ -151,6 +162,7 @@ __all__ = [
|
|
|
151
162
|
"compact_run_permission_policy_for_quota",
|
|
152
163
|
"default_benchmark_experiment_board_path",
|
|
153
164
|
"filter_public_benchmark_artifact_paths",
|
|
165
|
+
"inspect_benchmark_source_revision_fence",
|
|
154
166
|
"inspect_native_codex_profile",
|
|
155
167
|
"install_native_codex_profile",
|
|
156
168
|
"materialize_public_benchmark_artifacts",
|
|
@@ -24,6 +24,23 @@ BENCHMARK_TOOLKIT_CATALOG_ENTRY: dict[str, Any] = {
|
|
|
24
24
|
),
|
|
25
25
|
"entry_command": "loopx benchmark --help",
|
|
26
26
|
"commands": [
|
|
27
|
+
{
|
|
28
|
+
"command": (
|
|
29
|
+
"loopx benchmark source-revision-fence "
|
|
30
|
+
"--source-checkout <clean-source> "
|
|
31
|
+
"--expected-revision <pin> "
|
|
32
|
+
"--observed-reference-revision <observed-head> "
|
|
33
|
+
"--require-admitted --format json"
|
|
34
|
+
),
|
|
35
|
+
"purpose": (
|
|
36
|
+
"Fail closed before a new run when the installed source no "
|
|
37
|
+
"longer matches the caller-observed reference head."
|
|
38
|
+
),
|
|
39
|
+
"write_boundary": (
|
|
40
|
+
"local Git readback only; caller owns reference observation, "
|
|
41
|
+
"fetch, installation, and launch"
|
|
42
|
+
),
|
|
43
|
+
},
|
|
27
44
|
{
|
|
28
45
|
"command": (
|
|
29
46
|
"loopx benchmark experiment-board-show --goal-id <goal-id> "
|
|
@@ -90,6 +107,7 @@ BENCHMARK_TOOLKIT_CATALOG_ENTRY: dict[str, Any] = {
|
|
|
90
107
|
),
|
|
91
108
|
"required_sequence": [
|
|
92
109
|
"read_experiment_board_before_launch_or_case_selection",
|
|
110
|
+
"qualify_source_revision_before_each_new_run_admission",
|
|
93
111
|
"upsert_preregistered_or_running_row_when_a_run_starts",
|
|
94
112
|
"upsert_terminal_score_countability_effort_and_insight_status",
|
|
95
113
|
"read_matched_comparisons_before_selecting_the_next_arm",
|
|
@@ -181,6 +199,11 @@ BENCHMARK_TOOLKIT_CATALOG_ENTRY: dict[str, Any] = {
|
|
|
181
199
|
},
|
|
182
200
|
},
|
|
183
201
|
"implemented_protocols": [
|
|
202
|
+
{
|
|
203
|
+
"schema_version": "benchmark_source_revision_fence_v0",
|
|
204
|
+
"module": "loopx.capabilities.benchmark_toolkit.source_revision_fence",
|
|
205
|
+
"doc": "loopx/capabilities/benchmark_toolkit/README.md",
|
|
206
|
+
},
|
|
184
207
|
{
|
|
185
208
|
"schema_version": "benchmark_experiment_board_row_v0",
|
|
186
209
|
"module": "loopx.capabilities.benchmark_toolkit.experiment_board",
|
|
@@ -220,12 +243,14 @@ BENCHMARK_TOOLKIT_CATALOG_ENTRY: dict[str, Any] = {
|
|
|
220
243
|
"smokes": [
|
|
221
244
|
(
|
|
222
245
|
"python -m pytest tests/capabilities/test_benchmark_toolkit.py "
|
|
223
|
-
"tests/capabilities/test_benchmark_experiment_board.py
|
|
246
|
+
"tests/capabilities/test_benchmark_experiment_board.py "
|
|
247
|
+
"tests/capabilities/test_benchmark_source_revision_fence.py -q"
|
|
224
248
|
)
|
|
225
249
|
],
|
|
226
250
|
"docs": ["loopx/capabilities/benchmark_toolkit/README.md"],
|
|
227
251
|
"boundaries": [
|
|
228
252
|
"The toolkit never grants runner, Docker, model, upload, submission, or publication authority; each effect remains separately gated.",
|
|
253
|
+
"Source revision qualification is read-only and caller-observed: it does not fetch, install, update a checkout, or rewrite an already admitted run.",
|
|
229
254
|
"Raw trajectories are private local inputs to integrity qualification and are never copied into receipts, ledgers, docs, or PR artifacts.",
|
|
230
255
|
"A clean trajectory scan is not isolation proof: runner-owned permission and verifier-order attestations are mandatory and fail closed when absent.",
|
|
231
256
|
"Concurrent Docker runs must bind runtime evidence to one exact job-owned container; image-only discovery is not sufficient.",
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"""Fail-closed source revision admission for benchmark runs."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import re
|
|
6
|
+
import subprocess
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
BENCHMARK_SOURCE_REVISION_FENCE_SCHEMA_VERSION = "benchmark_source_revision_fence_v0"
|
|
12
|
+
_FULL_GIT_OBJECT_ID = re.compile(r"(?:[0-9a-f]{40}|[0-9a-f]{64})\Z")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class BenchmarkSourceRevisionFenceError(ValueError):
|
|
16
|
+
"""The source checkout or revision observation cannot be trusted."""
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass(frozen=True)
|
|
20
|
+
class BenchmarkSourceRevisionFence:
|
|
21
|
+
"""Private exact evidence behind one source admission decision."""
|
|
22
|
+
|
|
23
|
+
source_checkout: Path
|
|
24
|
+
expected_revision: str
|
|
25
|
+
local_revision: str
|
|
26
|
+
observed_reference_revision: str
|
|
27
|
+
source_clean: bool
|
|
28
|
+
admitted: bool
|
|
29
|
+
reason_code: str
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def local_matches_expected(self) -> bool:
|
|
33
|
+
return self.local_revision == self.expected_revision
|
|
34
|
+
|
|
35
|
+
@property
|
|
36
|
+
def observed_reference_matches_expected(self) -> bool:
|
|
37
|
+
return self.observed_reference_revision == self.expected_revision
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _normalize_revision(value: str, *, field: str) -> str:
|
|
41
|
+
revision = str(value).strip().lower()
|
|
42
|
+
if not _FULL_GIT_OBJECT_ID.fullmatch(revision):
|
|
43
|
+
raise BenchmarkSourceRevisionFenceError(f"{field}_invalid")
|
|
44
|
+
return revision
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _git_text(source: Path, *args: str) -> str:
|
|
48
|
+
try:
|
|
49
|
+
completed = subprocess.run(
|
|
50
|
+
["git", "--no-optional-locks", "-C", str(source), *args],
|
|
51
|
+
check=False,
|
|
52
|
+
capture_output=True,
|
|
53
|
+
text=True,
|
|
54
|
+
)
|
|
55
|
+
except OSError as exc:
|
|
56
|
+
raise BenchmarkSourceRevisionFenceError(
|
|
57
|
+
"source_revision_git_readback_failed"
|
|
58
|
+
) from exc
|
|
59
|
+
if completed.returncode:
|
|
60
|
+
raise BenchmarkSourceRevisionFenceError("source_revision_git_readback_failed")
|
|
61
|
+
return completed.stdout.strip()
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def inspect_benchmark_source_revision_fence(
|
|
65
|
+
source_checkout: str | Path,
|
|
66
|
+
*,
|
|
67
|
+
expected_revision: str,
|
|
68
|
+
observed_reference_revision: str,
|
|
69
|
+
) -> BenchmarkSourceRevisionFence:
|
|
70
|
+
"""Compare a clean local checkout with a pin and caller-observed ref head.
|
|
71
|
+
|
|
72
|
+
The caller owns any network fetch or provider API read used to obtain
|
|
73
|
+
``observed_reference_revision``. This helper performs only local readback;
|
|
74
|
+
it never fetches, checks out, installs, or launches a benchmark run.
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
requested = Path(source_checkout).expanduser()
|
|
78
|
+
if requested.is_symlink():
|
|
79
|
+
raise BenchmarkSourceRevisionFenceError("source_checkout_symlink_denied")
|
|
80
|
+
try:
|
|
81
|
+
source = requested.resolve(strict=True)
|
|
82
|
+
except OSError as exc:
|
|
83
|
+
raise BenchmarkSourceRevisionFenceError("source_checkout_missing") from exc
|
|
84
|
+
if not source.is_dir():
|
|
85
|
+
raise BenchmarkSourceRevisionFenceError("source_checkout_not_directory")
|
|
86
|
+
|
|
87
|
+
expected = _normalize_revision(expected_revision, field="expected_revision")
|
|
88
|
+
observed = _normalize_revision(
|
|
89
|
+
observed_reference_revision,
|
|
90
|
+
field="observed_reference_revision",
|
|
91
|
+
)
|
|
92
|
+
try:
|
|
93
|
+
repository_root = Path(
|
|
94
|
+
_git_text(source, "rev-parse", "--show-toplevel")
|
|
95
|
+
).resolve(strict=True)
|
|
96
|
+
except OSError as exc:
|
|
97
|
+
raise BenchmarkSourceRevisionFenceError(
|
|
98
|
+
"source_checkout_root_unreadable"
|
|
99
|
+
) from exc
|
|
100
|
+
if repository_root != source:
|
|
101
|
+
raise BenchmarkSourceRevisionFenceError(
|
|
102
|
+
"source_checkout_must_be_repository_root"
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
local = _normalize_revision(
|
|
106
|
+
_git_text(source, "rev-parse", "HEAD"),
|
|
107
|
+
field="local_revision",
|
|
108
|
+
)
|
|
109
|
+
source_clean = not bool(
|
|
110
|
+
_git_text(source, "status", "--porcelain", "--untracked-files=all")
|
|
111
|
+
)
|
|
112
|
+
if not source_clean:
|
|
113
|
+
admitted = False
|
|
114
|
+
reason_code = "source_checkout_dirty"
|
|
115
|
+
elif local != expected:
|
|
116
|
+
admitted = False
|
|
117
|
+
reason_code = "local_revision_mismatch"
|
|
118
|
+
elif observed != expected:
|
|
119
|
+
admitted = False
|
|
120
|
+
reason_code = "observed_reference_revision_mismatch"
|
|
121
|
+
else:
|
|
122
|
+
admitted = True
|
|
123
|
+
reason_code = "revision_fence_satisfied"
|
|
124
|
+
|
|
125
|
+
return BenchmarkSourceRevisionFence(
|
|
126
|
+
source_checkout=source,
|
|
127
|
+
expected_revision=expected,
|
|
128
|
+
local_revision=local,
|
|
129
|
+
observed_reference_revision=observed,
|
|
130
|
+
source_clean=source_clean,
|
|
131
|
+
admitted=admitted,
|
|
132
|
+
reason_code=reason_code,
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def compact_benchmark_source_revision_fence_receipt(
|
|
137
|
+
fence: BenchmarkSourceRevisionFence,
|
|
138
|
+
) -> dict[str, Any]:
|
|
139
|
+
"""Return a public-safe decision receipt without paths or revisions."""
|
|
140
|
+
|
|
141
|
+
return {
|
|
142
|
+
"schema_version": BENCHMARK_SOURCE_REVISION_FENCE_SCHEMA_VERSION,
|
|
143
|
+
"admitted": fence.admitted,
|
|
144
|
+
"reason_code": fence.reason_code,
|
|
145
|
+
"source_clean": fence.source_clean,
|
|
146
|
+
"local_matches_expected": fence.local_matches_expected,
|
|
147
|
+
"observed_reference_matches_expected": (
|
|
148
|
+
fence.observed_reference_matches_expected
|
|
149
|
+
),
|
|
150
|
+
"source_path_recorded": False,
|
|
151
|
+
"revision_values_recorded": False,
|
|
152
|
+
"network_access_performed": False,
|
|
153
|
+
"write_performed": False,
|
|
154
|
+
}
|
|
@@ -15,14 +15,16 @@ from .chat_action_store import ActionConflictError, ChatActionStore
|
|
|
15
15
|
from .chat_goal_lifecycle_actions import ChatGoalLifecycleActionMixin
|
|
16
16
|
from .chat_monitor_actions import ChatMonitorActionMixin
|
|
17
17
|
from .chat_store import ChatSessionStore
|
|
18
|
+
from .chat_todo_actions import ChatTodoActionMixin
|
|
18
19
|
from .configure_goal import configure_goal
|
|
19
20
|
from .control_plane.runtime.time import now_utc, parse_timestamp, utc_isoformat
|
|
20
21
|
from .control_plane.scheduler.monitor_todo import monitor_next_due_at
|
|
22
|
+
from .control_plane.todos.contract import require_supported_todo_resume_when
|
|
21
23
|
from .history import load_registry
|
|
22
24
|
from .host_loop_activation import build_host_loop_activation_packet
|
|
23
25
|
from .quota import build_quota_should_run
|
|
24
26
|
from .registry import registry_goals
|
|
25
|
-
from .todos import add_goal_todo,
|
|
27
|
+
from .todos import add_goal_todo, update_goal_todo
|
|
26
28
|
|
|
27
29
|
|
|
28
30
|
CHAT_ACTION_RESPONSE_SCHEMA_VERSION = "loopx_chat_action_response_v1"
|
|
@@ -138,7 +140,9 @@ def _monitor_text(parameters: Mapping[str, Any]) -> str | None:
|
|
|
138
140
|
return None
|
|
139
141
|
|
|
140
142
|
|
|
141
|
-
class ChatActionService(
|
|
143
|
+
class ChatActionService(
|
|
144
|
+
ChatGoalLifecycleActionMixin, ChatMonitorActionMixin, ChatTodoActionMixin
|
|
145
|
+
):
|
|
142
146
|
"""Validate previews and route applies through canonical LoopX services."""
|
|
143
147
|
|
|
144
148
|
def __init__(
|
|
@@ -381,9 +385,9 @@ class ChatActionService(ChatGoalLifecycleActionMixin, ChatMonitorActionMixin):
|
|
|
381
385
|
elif values.get("agent_id"):
|
|
382
386
|
result["agent_id"] = _opaque(values["agent_id"], field="agent_id")
|
|
383
387
|
if values.get("resume_when"):
|
|
384
|
-
result["resume_when"] =
|
|
385
|
-
values["resume_when"], field="resume_when", limit=240
|
|
386
|
-
)
|
|
388
|
+
result["resume_when"] = require_supported_todo_resume_when(
|
|
389
|
+
_text(values["resume_when"], field="resume_when", limit=240)
|
|
390
|
+
)
|
|
387
391
|
if values.get("successor_todo_ids") is not None:
|
|
388
392
|
if not isinstance(values["successor_todo_ids"], list):
|
|
389
393
|
raise ValueError("successor_todo_ids must be a list")
|
|
@@ -1183,65 +1187,6 @@ class ChatActionService(ChatGoalLifecycleActionMixin, ChatMonitorActionMixin):
|
|
|
1183
1187
|
)
|
|
1184
1188
|
return {"proposal": stored, "turn": None}
|
|
1185
1189
|
|
|
1186
|
-
def _apply_todo_update(
|
|
1187
|
-
self, proposal_id: str, proposal: dict[str, Any], parameters: dict[str, Any]
|
|
1188
|
-
) -> dict[str, Any]:
|
|
1189
|
-
goal_id = str(parameters["goal_id"])
|
|
1190
|
-
current_fingerprint = self._goal_state_fingerprint(goal_id)
|
|
1191
|
-
if current_fingerprint != proposal.get("expected_state_fingerprint"):
|
|
1192
|
-
stale = self.store.apply(
|
|
1193
|
-
proposal_id, current_state_fingerprint=current_fingerprint, receipt={}
|
|
1194
|
-
)
|
|
1195
|
-
return {"proposal": stale, "turn": None}
|
|
1196
|
-
operation = str(parameters.get("operation") or "edit")
|
|
1197
|
-
if operation == "complete":
|
|
1198
|
-
result = complete_goal_todo(
|
|
1199
|
-
registry_path=self.registry_path,
|
|
1200
|
-
goal_id=goal_id,
|
|
1201
|
-
todo_id=str(parameters["todo_id"]),
|
|
1202
|
-
note=parameters.get("note"),
|
|
1203
|
-
no_followup=bool(parameters.get("no_followup", True)),
|
|
1204
|
-
successor_todo_ids=parameters.get("successor_todo_ids"),
|
|
1205
|
-
agent_id=parameters.get("agent_id"),
|
|
1206
|
-
authority_reason="owner-confirmed typed Chat action",
|
|
1207
|
-
dry_run=False,
|
|
1208
|
-
)
|
|
1209
|
-
else:
|
|
1210
|
-
status = parameters.get("status")
|
|
1211
|
-
if operation == "block":
|
|
1212
|
-
status = "blocked"
|
|
1213
|
-
elif operation == "defer":
|
|
1214
|
-
status = "deferred"
|
|
1215
|
-
result = update_goal_todo(
|
|
1216
|
-
registry_path=self.registry_path,
|
|
1217
|
-
goal_id=goal_id,
|
|
1218
|
-
todo_id=str(parameters["todo_id"]),
|
|
1219
|
-
text=parameters.get("text"),
|
|
1220
|
-
status=status,
|
|
1221
|
-
note=parameters.get("note"),
|
|
1222
|
-
claimed_by=parameters.get("agent_id") if operation == "reassign" else None,
|
|
1223
|
-
resume_when=parameters.get("resume_when"),
|
|
1224
|
-
successor_todo_ids=parameters.get("successor_todo_ids"),
|
|
1225
|
-
agent_id=parameters.get("agent_id"),
|
|
1226
|
-
authority_reason="owner-confirmed typed Chat action",
|
|
1227
|
-
dry_run=False,
|
|
1228
|
-
)
|
|
1229
|
-
todo_id = _opaque(result.get("todo_id"), field="todo_id")
|
|
1230
|
-
receipt = {
|
|
1231
|
-
"receipt_id": _digest({"proposal_id": proposal_id, "todo_id": todo_id})[:32],
|
|
1232
|
-
"outcome": (
|
|
1233
|
-
"todo_completed"
|
|
1234
|
-
if operation == "complete"
|
|
1235
|
-
else "todo_updated" if result.get("changed") else "todo_unchanged"
|
|
1236
|
-
),
|
|
1237
|
-
"projection_verified": True,
|
|
1238
|
-
"resource_ids": {"goal_id": goal_id, "todo_id": todo_id},
|
|
1239
|
-
}
|
|
1240
|
-
stored = self.store.apply(
|
|
1241
|
-
proposal_id, current_state_fingerprint=current_fingerprint, receipt=receipt
|
|
1242
|
-
)
|
|
1243
|
-
return {"proposal": stored, "turn": None}
|
|
1244
|
-
|
|
1245
1190
|
def preview(self, request: Mapping[str, Any]) -> dict[str, Any]:
|
|
1246
1191
|
unknown = set(request) - {
|
|
1247
1192
|
"action_kind",
|
|
@@ -1287,6 +1232,12 @@ class ChatActionService(ChatGoalLifecycleActionMixin, ChatMonitorActionMixin):
|
|
|
1287
1232
|
evidence = ["The recoverable Goal and Agent Chat Session is available."]
|
|
1288
1233
|
permission = "scoped_correction"
|
|
1289
1234
|
elif action_kind in {"todo.update", "monitor.update"}:
|
|
1235
|
+
if action_kind == "todo.update":
|
|
1236
|
+
canonical_preview = self._run_todo_update(normalized, dry_run=True)
|
|
1237
|
+
if canonical_preview.get("ok") is not True:
|
|
1238
|
+
raise ValueError(
|
|
1239
|
+
str(canonical_preview.get("error") or "Todo transition failed canonical dry-run validation")
|
|
1240
|
+
)
|
|
1290
1241
|
goal_fingerprint = self._goal_state_fingerprint(normalized["goal_id"])
|
|
1291
1242
|
if action_kind == "monitor.update" and normalized.get("operation") == "run_now":
|
|
1292
1243
|
session_id = normalized.get("session_id")
|
|
@@ -1304,7 +1255,11 @@ class ChatActionService(ChatGoalLifecycleActionMixin, ChatMonitorActionMixin):
|
|
|
1304
1255
|
)
|
|
1305
1256
|
else:
|
|
1306
1257
|
fingerprint = goal_fingerprint
|
|
1307
|
-
evidence = [
|
|
1258
|
+
evidence = [
|
|
1259
|
+
"Canonical LoopX Todo dry-run validated the requested transition."
|
|
1260
|
+
if action_kind == "todo.update"
|
|
1261
|
+
else "Canonical LoopX Todo state validated the requested transition."
|
|
1262
|
+
]
|
|
1308
1263
|
permission = "durable_write"
|
|
1309
1264
|
else:
|
|
1310
1265
|
fingerprint = self._registry_fingerprint()
|