fix(awooop): complete inserted requirement 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 49s
CD Pipeline / post-deploy-checks (push) Has been cancelled
CD Pipeline / build-and-deploy (push) Has been cancelled

This commit is contained in:
Your Name
2026-07-02 14:58:06 +08:00
parent 7c980eae9c
commit 0cfb6b65bd
5 changed files with 273 additions and 21 deletions

View File

@@ -243,6 +243,104 @@ _COMMANDER_INSERTED_REQUIREMENT_WORK_ITEMS: list[dict[str, Any]] = [
"next_action": "把此 readback 作為 work-items 前台的主線優先序來源。",
"mapped_workplan_id": "P0-010",
},
{
"id": "CIR-P0-AILOOP-001",
"priority": "P0",
"order": 16,
"status": "in_progress",
"lane": "ai_loop_agent_mainline",
"request": "你現在有在往 AI Loop Agent 這個方向目標前進嗎?",
"normalized_work_item": (
"AI Loop Agent 北極星必須成為所有告警、工作項、Run、LOG 與前台的主線:"
"Sensor -> Normalizer -> AI Lane -> Candidate -> Gate -> Execution Boundary -> Verifier -> Learning/Writeback。"
),
"current_state": "MASTER §1.4 已定義產品契約;本 work-order 將其升為 P0 可見工作項。",
"acceptance": (
"Work Items API/UI 可讀回 AI Loop Agent 主線,且每個後續 P0 都能映射到閉環節點。"
),
"next_action": "把 Telegram、LOG、KM/RAG/MCP/PlayBook 與 UI 工作項都掛到 AI Loop Agent 節點。",
"mapped_workplan_id": "P0-006",
},
{
"id": "CIR-P0-AILOOP-002",
"priority": "P0",
"order": 17,
"status": "in_progress",
"lane": "ai_automation_trace_nodes",
"request": "所有 AI 自動化完整流程、節點必須完整且詳盡紀錄,作為持續學習與提升依據。",
"normalized_work_item": (
"每次 AI 自動化事件必須記錄 trace_id、run_id、work_item_id、節點狀態、timestamp、"
"evidence refs、verifier result、rollback result 與 KM/PlayBook trust writeback refs。"
),
"current_state": "現有 Run/Work Item/receipt 有部分證據;完整節點契約仍需補齊。",
"acceptance": "API readback 能逐筆顯示 AI automation node coverage 與 missing node blockers。",
"next_action": "建立 AI automation node receipt schema先套用 Telegram alert 與 P0 runtime lanes。",
"mapped_workplan_id": "P1-006",
},
{
"id": "CIR-P0-LOG-001",
"priority": "P0",
"order": 18,
"status": "in_progress",
"lane": "global_log_ingestion",
"request": "把所有專案、產品、網站、服務、套件、工具等等的所有 LOG 都收進去。",
"normalized_work_item": (
"建立全域 LOG source registry 與 ingestion adapters涵蓋 project/product/site/service/package/tool"
"並帶 redaction、retention、freshness、last_success 與 owner lane。"
),
"current_state": "目前 observability/log/backup coverage 分散;尚未成為單一 AI Agent 可用資料層。",
"acceptance": "source registry 顯示每類 LOG 的 adapter、freshness、缺口與安全邊界。",
"next_action": "先做 metadata-only LOG source registry不讀 secret/raw payload再接 AI automation trace。",
"mapped_workplan_id": "P1-006",
},
{
"id": "CIR-P0-LOG-002",
"priority": "P0",
"order": 19,
"status": "pending",
"lane": "log_tagging_classification_clustering",
"request": "LOG 要依據專案、產品、網站、服務、套件、工具貼標,完整分類、分群,讓 AI Agent 可處理。",
"normalized_work_item": (
"LOG 必須自動貼上 product/project/site/service/package/tool、severity、lane、evidence confidence、"
"AI route、cluster_id 與 dedup/fingerprint。"
),
"current_state": "分類規則與群聚資料尚未統一;不能只靠 raw log 或 Telegram 文字。",
"acceptance": "AI Agent 可按 tag/cluster 查詢相關 evidence並產生候選修復與 verifier。",
"next_action": "定義 tag taxonomy 與 clustering readback先覆蓋 Telegram alert、CPU pressure、backup、freshness。",
"mapped_workplan_id": "P1-006",
},
{
"id": "CIR-P0-TG-001",
"priority": "P0",
"order": 20,
"status": "in_progress",
"lane": "telegram_alert_ai_automation",
"request": "所有發送到 Telegram 的監控告警是否全面清查、完整寫入 DB 或日誌、符合 AI Agent AI 自動化?不要一堆告警都要人工作業。",
"normalized_work_item": (
"每個 Telegram 告警都要映射到 DB/log receipt、AI route、controlled queue、work item、"
"post verifier 與 learning writebackdirect send 或 manual default 都列缺口。"
),
"current_state": "本輪已把 workflow direct send 收斂到 0 並暴露 API direct gap仍需全面 alert matrix。",
"acceptance": "Telegram alert matrix 顯示 total、DB receipt、AI route、controlled queue、manual/default gap 與 direct send gap。",
"next_action": "擴充 Telegram alert inventory/readback讓人工預設只允許 critical/break-glass 或歷史證據。",
"mapped_workplan_id": "P0-006",
},
{
"id": "CIR-P0-IA-001",
"priority": "P0",
"order": 21,
"status": "pending",
"lane": "navigation_ia_recovery",
"request": "AWOOOI 裡面的 IwoooS 被移除、導航列菜單被移除,且沒有把被移除頁面整合到相關頁面。",
"normalized_work_item": (
"建立 IA/nav removal recovery ledger每個被移除 menu/route/page 必須有保留、合併、替代目的地、"
"redirect、權限邊界與 desktop/mobile navigation smoke。"
),
"current_state": "目前只在對話中被追問,尚未完整盤點成 route/menu/readback 表。",
"acceptance": "IA recovery readback 顯示 IwoooS、AwoooP、OpenClaw、governance route 是否仍可被導覽或已合併。",
"next_action": "盤點 navigation config、route list 與 removed-page destination補 Work Items UI readback。",
"mapped_workplan_id": "P0-010",
},
{
"id": "CIR-P1-001",
"priority": "P1",
@@ -334,6 +432,54 @@ _COMMANDER_INSERTED_REQUIREMENT_WORK_ITEMS: list[dict[str, Any]] = [
"next_action": "下個 P0 仍照排序推進。",
"mapped_workplan_id": "P0-004",
},
{
"id": "CIR-P1-AUTO-001",
"priority": "P1",
"order": 23,
"status": "in_progress",
"lane": "parallel_mainline_scheduling",
"request": "不能偏離不代表一定要每一個工作完成,才能進行下一個。",
"normalized_work_item": (
"建立主線並行推進規則:不離開 P0/P1 主線,但可在依賴允許時同時推進 API/UI、LOG、Telegram、"
"KM/RAG/MCP/PlayBook 與 verifier。"
),
"current_state": "目前 work-order 已按 priority 排序;仍需在回報和 UI 顯示 WIP lane。",
"acceptance": "Work Items 顯示 next item、active lanes 與 blocked/deferred不把單一 blocker 當全局停工。",
"next_action": "讓後續回報以 active lane + evidence 更新,而不是等待單一項完全結束。",
"mapped_workplan_id": "P0-010",
},
{
"id": "CIR-P1-UI-001",
"priority": "P1",
"order": 24,
"status": "in_progress",
"lane": "professional_product_ui_ux_mainline",
"request": "UI/UX 工作項目不見了;整個前端頁面一大堆文字,要趕快優化成主流、專業網站、產品做法。",
"normalized_work_item": (
"UI/UX 成為主線工作項first-viewport cockpit、可掃描 cards/flow rows、少文字牆、"
"route/nav 一致、desktop/mobile visual smoke。"
),
"current_state": "AwoooP Work Items 有初版面板;全站仍需系統性文字牆收斂與 IA 修復。",
"acceptance": "AwoooP/Approvals/Runs/Work Items/Alerts/AI Loop 重要頁面都有專業 cockpit 與截圖 smoke。",
"next_action": "先把新增 AI Loop/LOG/Telegram/IA 工作項顯示在 Work Items spotlight再排 UI smoke。",
"mapped_workplan_id": "P2-UX",
},
{
"id": "CIR-P1-KM-002",
"priority": "P1",
"order": 25,
"status": "pending",
"lane": "log_km_mcp_rag_playbook_integration",
"request": "所有服務日誌、LOG 要完整跟 KM、MCP、RAG、PLAYBOOK 整合,讓 AI Agent 利用起來。",
"normalized_work_item": (
"LOG ingestion 的每個 tag/cluster 必須能產生 RAG chunk、KM entry、MCP evidence pointer、"
"PlayBook candidate、trust update 與 verifier/rollback learning。"
),
"current_state": "writeback targets 分散存在;尚未形成 LOG -> AI Agent -> controlled action 的統一管線。",
"acceptance": "readback 顯示 KM/RAG/MCP/PlayBook writeback target count、missing target 與 last_success。",
"next_action": "把 LOG source registry 接到 KM/RAG/MCP/PlayBook writeback readback。",
"mapped_workplan_id": "P1-006",
},
{
"id": "CIR-P2-001",
"priority": "P2",
@@ -633,6 +779,19 @@ _COMMANDER_INSERTED_REQUIREMENT_WORK_ITEMS: list[dict[str, Any]] = [
"next_action": "維持 stopped / do_not_use。",
"mapped_workplan_id": "P0-003A",
},
{
"id": "CIR-P3-NON-001",
"priority": "P3",
"order": 45,
"status": "deferred",
"lane": "non_awoooi_personal_note",
"request": "隱形鐵窗 + 防霾捲紗(陽台最推薦)。",
"normalized_work_item": "此插入內容已記錄為非 AWOOOI 產品/AI 自動化主線事項,不拿來改變 P0/P1 排序。",
"current_state": "已歸檔為非產品主線 note避免被誤當 AWOOOI 實作項。",
"acceptance": "work-order 可見但 deferred不阻擋 AWOOOI AI Loop Agent 主線。",
"next_action": "不執行,除非使用者明確切換到家裝/陽台需求。",
"mapped_workplan_id": "NON-AWOOOI",
},
]

View File

@@ -186,19 +186,54 @@ def test_awoooi_priority_work_order_readback_loader_returns_mainline_order():
assert payload["operation_boundaries"]["workflow_dispatch_performed"] is False
assert payload["operation_boundaries"]["host_write_performed"] is False
inserted_items = payload["commander_inserted_requirement_work_items"]
assert len(inserted_items) == 45
assert len(inserted_items) == 55
assert inserted_items[0]["id"] == "CIR-P0-001"
assert inserted_items[-1]["id"] == "CIR-P3-001"
assert [item["order"] for item in inserted_items] == list(range(1, 46))
assert inserted_items[-1]["id"] == "CIR-P3-NON-001"
assert [item["order"] for item in inserted_items] == list(range(1, 56))
assert all(item["acceptance"] for item in inserted_items)
assert payload["summary"]["commander_inserted_requirement_work_item_count"] == 45
assert payload["summary"]["commander_inserted_requirement_p0_count"] == 28
assert payload["summary"]["commander_inserted_requirement_p1_count"] == 11
assert payload["summary"]["commander_inserted_requirement_work_item_count"] == 55
assert payload["summary"]["commander_inserted_requirement_p0_count"] == 34
assert payload["summary"]["commander_inserted_requirement_p1_count"] == 14
assert payload["summary"]["commander_inserted_requirement_p2_count"] == 5
assert payload["summary"]["commander_inserted_requirement_p3_count"] == 1
assert payload["summary"]["commander_inserted_requirement_p3_count"] == 2
assert payload["summary"]["commander_inserted_requirement_next_id"] == "CIR-P0-001"
assert payload["rollups"]["commander_inserted_requirement_blocked_count"] == 1
inserted_by_id = {item["id"]: item for item in inserted_items}
assert inserted_by_id["CIR-P0-AILOOP-001"]["lane"] == (
"ai_loop_agent_mainline"
)
assert "AI Loop Agent" in inserted_by_id["CIR-P0-AILOOP-001"]["request"]
assert "Sensor -> Normalizer" in inserted_by_id[
"CIR-P0-AILOOP-001"
]["normalized_work_item"]
assert inserted_by_id["CIR-P0-AILOOP-002"]["lane"] == (
"ai_automation_trace_nodes"
)
assert "trace_id" in inserted_by_id["CIR-P0-AILOOP-002"][
"normalized_work_item"
]
assert inserted_by_id["CIR-P0-LOG-001"]["lane"] == "global_log_ingestion"
assert "專案、產品、網站、服務、套件、工具" in inserted_by_id[
"CIR-P0-LOG-001"
]["request"]
assert inserted_by_id["CIR-P0-LOG-002"]["lane"] == (
"log_tagging_classification_clustering"
)
assert inserted_by_id["CIR-P0-TG-001"]["lane"] == (
"telegram_alert_ai_automation"
)
assert "manual/default" in inserted_by_id["CIR-P0-TG-001"]["acceptance"]
assert inserted_by_id["CIR-P0-IA-001"]["lane"] == "navigation_ia_recovery"
assert "IwoooS" in inserted_by_id["CIR-P0-IA-001"]["request"]
assert inserted_by_id["CIR-P1-AUTO-001"]["lane"] == (
"parallel_mainline_scheduling"
)
assert inserted_by_id["CIR-P1-UI-001"]["lane"] == (
"professional_product_ui_ux_mainline"
)
assert inserted_by_id["CIR-P1-KM-002"]["lane"] == (
"log_km_mcp_rag_playbook_integration"
)
assert inserted_by_id["CIR-P1-OPENCLAW-001"]["lane"] == (
"openclaw_live_ops_space"
)
@@ -207,6 +242,8 @@ def test_awoooi_priority_work_order_readback_loader_returns_mainline_order():
"ai_professional_workbench_ux"
)
assert "文字牆" in inserted_by_id["CIR-P2-UX-002"]["request"]
assert inserted_by_id["CIR-P3-NON-001"]["status"] == "deferred"
assert inserted_by_id["CIR-P3-NON-001"]["lane"] == "non_awoooi_personal_note"
def test_awoooi_priority_work_order_readback_endpoint_returns_snapshot(
@@ -279,7 +316,7 @@ def test_awoooi_priority_work_order_readback_endpoint_returns_snapshot(
"P0-006-AI-LOOP-CURRENT-BLOCKER-EXECUTION-QUEUE"
)
assert "do not reopen Harbor 502" in data["next_execution_order"][0]
assert data["summary"]["commander_inserted_requirement_work_item_count"] == 45
assert data["summary"]["commander_inserted_requirement_work_item_count"] == 55
assert data["summary"]["commander_inserted_requirement_next_id"] == "CIR-P0-001"
assert data["commander_inserted_requirement_work_items"][1]["id"] == (
"CIR-P0-002"