feat(agent): expose local console phases in work order
Some checks failed
CD Pipeline / workflow-shape (push) Successful in 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Successful in 37s
CD Pipeline / build-and-deploy (push) Has started running
CD Pipeline / post-deploy-checks (push) Has been cancelled

This commit is contained in:
Your Name
2026-06-30 22:56:14 +08:00
parent 152482c4f4
commit 1c8c522818
3 changed files with 85 additions and 3 deletions

View File

@@ -521,6 +521,19 @@ def apply_ai_loop_current_blocker_execution_queue(
post_apply_verifier = str(first_item.get("post_apply_verifier") or "")
learning_targets = _strings(first_item.get("learning_writeback_targets"))
target_batches = _strings(first_item.get("target_batches"))
local_console_plan = [
_dict(item)
for item in _list(first_item.get("controlled_local_console_execution_plan"))
]
local_console_phase_ids = [
str(item.get("phase_id") or "")
for item in local_console_plan
if item.get("phase_id")
]
post_recovery_readback_commands = _strings(
first_item.get("post_recovery_readback_commands")
)
forbidden_runtime_actions = _strings(first_item.get("forbidden_runtime_actions"))
external_blocker = str(first_item.get("external_control_path_blocker") or "")
runtime_write_gate = str(first_item.get("runtime_write_gate") or "")
@@ -573,6 +586,21 @@ def apply_ai_loop_current_blocker_execution_queue(
learning_targets
)
evidence["ai_loop_current_blocker_target_batches"] = target_batches
evidence["ai_loop_current_blocker_local_console_phase_count"] = len(
local_console_plan
)
evidence["ai_loop_current_blocker_local_console_phase_ids"] = (
local_console_phase_ids
)
evidence["ai_loop_current_blocker_local_console_execution_plan"] = (
local_console_plan
)
evidence["ai_loop_current_blocker_post_recovery_readback_commands"] = (
post_recovery_readback_commands
)
evidence["ai_loop_current_blocker_forbidden_runtime_actions"] = (
forbidden_runtime_actions
)
evidence["ai_loop_current_blocker_metadata_only_writeback_ready"] = bool(
first_item.get("metadata_only_writeback_ready") is True
)
@@ -590,7 +618,7 @@ def apply_ai_loop_current_blocker_execution_queue(
"queue item with metadata-only KM/RAG/MCP/PlayBook/AI Agent "
"writeback targets. The next action is not generic manual triage; "
"it is 110 control-path readback plus the bounded local recovery "
"package and post-apply verifier."
"package, ordered local-console phases, and post-apply verifier."
)
professional_fix = _dict(workplan.setdefault("professional_fix", {}))
professional_fix["action"] = (
@@ -611,8 +639,8 @@ def apply_ai_loop_current_blocker_execution_queue(
(
"P0-006-AI-LOOP-CURRENT-BLOCKER-EXECUTION-QUEUE: execute the "
f"{blocker_id} queue item through 110 control-path readback, "
"bounded recovery package check-mode, post-apply verifier, and "
"metadata-only KM/RAG/MCP/PlayBook writeback."
"ordered local-console phases, bounded recovery package check-mode, "
"post-apply verifier, and metadata-only KM/RAG/MCP/PlayBook writeback."
),
(
"P0-006-HARBOR-REGISTRY-CONTROLLED-RECOVERY-PREFLIGHT: after the "
@@ -636,6 +664,18 @@ def apply_ai_loop_current_blocker_execution_queue(
)
summary["ai_loop_current_blocker_post_apply_verifier"] = post_apply_verifier
summary["ai_loop_current_blocker_learning_target_count"] = len(learning_targets)
summary["ai_loop_current_blocker_local_console_phase_count"] = len(
local_console_plan
)
summary["ai_loop_current_blocker_local_console_phase_ids"] = (
local_console_phase_ids
)
summary["ai_loop_current_blocker_post_recovery_readback_command_count"] = len(
post_recovery_readback_commands
)
summary["ai_loop_current_blocker_forbidden_runtime_action_count"] = len(
forbidden_runtime_actions
)
def _harbor_registry_next_state(*, status: str, candidate_packaged: bool) -> str:

View File

@@ -241,6 +241,26 @@ def test_awoooi_priority_work_order_readback_overlays_ai_loop_current_blocker_qu
"ai_agent",
}
assert len(evidence["ai_loop_current_blocker_target_batches"]) == 6
assert evidence["ai_loop_current_blocker_local_console_phase_count"] == 5
assert evidence["ai_loop_current_blocker_local_console_phase_ids"] == [
"diagnose_ssh_publickey",
"preflight_control_path_and_harbor",
"repair_ssh_metadata_if_check_confirms_metadata_drift",
"repair_harbor_once_if_v2_still_502",
"verify_controlled_cd_lane",
]
assert evidence["ai_loop_current_blocker_local_console_execution_plan"][0][
"mode"
] == "read_only"
assert evidence["ai_loop_current_blocker_local_console_execution_plan"][3][
"command"
] == "recover-110-control-path-and-harbor-local.sh --repair-harbor-once"
assert "read-public-gitea-actions-queue.py --json" in evidence[
"ai_loop_current_blocker_post_recovery_readback_commands"
]
assert "restart_docker_daemon" in evidence[
"ai_loop_current_blocker_forbidden_runtime_actions"
]
assert evidence["ai_loop_current_blocker_metadata_only_writeback_ready"] is True
assert evidence["ai_loop_current_blocker_runtime_dispatch_performed"] is False
assert evidence["ai_loop_current_blocker_raw_payload_required"] is False
@@ -250,6 +270,13 @@ def test_awoooi_priority_work_order_readback_overlays_ai_loop_current_blocker_qu
assert payload["summary"]["ai_loop_current_blocker_id"] == (
"harbor_110_repair_no_matching_runner"
)
assert payload["summary"]["ai_loop_current_blocker_local_console_phase_count"] == 5
assert payload["summary"][
"ai_loop_current_blocker_post_recovery_readback_command_count"
] == 3
assert payload["summary"][
"ai_loop_current_blocker_forbidden_runtime_action_count"
] >= 5
assert payload["next_execution_order"][0].startswith(
"P0-006-AI-LOOP-CURRENT-BLOCKER-EXECUTION-QUEUE"
)

View File

@@ -50830,3 +50830,18 @@ production browser smoke:
**下一步**
- commit / push 後等待 CD若仍卡 Harbor / 110主線下一步不變恢復 110 `awoooi-host` controlled lane 或在 110 local console / root shell 執行 recovery package check-mode再重讀 Harbor queue、registry `/v2/`、deploy marker並把 post-apply verifier receipt 回寫到 AI Loop。
## 2026-06-30 — 22:52 AI Loop local-console phase 投影到 P0 work-order
**完成內容**
- 最新 AI Loop executor 已有 `controlled_local_console_execution_plan`;本輪把這 5 個 local-console phase 投影到 `awoooi-priority-work-order-readback` 的 P0 evidence / summary。
- P0 work-order 現在可直接看到 phase ids`diagnose_ssh_publickey``preflight_control_path_and_harbor``repair_ssh_metadata_if_check_confirms_metadata_drift``repair_harbor_once_if_v2_still_502``verify_controlled_cd_lane`
- 同步投影 `post_recovery_readback_commands``forbidden_runtime_actions`,讓工作順序頁不只知道 package/verifier也知道可執行節點、回讀命令與禁止動作。
**本地驗證結果**
- `DATABASE_URL=postgresql+asyncpg://test:test@localhost:5432/test PYTHONPATH=apps/api python3.11 -m pytest apps/api/tests/test_awoooi_priority_work_order_readback_api.py apps/api/tests/test_ai_agent_log_controlled_writeback_executor_readback_api.py -q``11 passed`
- `ruff check``py_compile``git diff --check`:通過。
- 本地 payload 摘要:`status=p0_006_blocked_ai_loop_current_blocker_execution_queue``phase_count=5``readback_command_count=3``forbidden_action_count=6`
**下一步**
- commit / push 後讀回 Gitea CD若仍卡 Harbor / 110P0 runtime 下一步仍是 110 local console / root shell 按 phase 執行 check-mode / bounded repair並把 verifier receipt 回寫 AI Loop。