diff --git a/apps/api/src/services/awoooi_priority_work_order_readback.py b/apps/api/src/services/awoooi_priority_work_order_readback.py index 6861e44dc..3eb95607c 100644 --- a/apps/api/src/services/awoooi_priority_work_order_readback.py +++ b/apps/api/src/services/awoooi_priority_work_order_readback.py @@ -128,13 +128,13 @@ _COMMANDER_INSERTED_REQUIREMENT_WORK_ITEMS: list[dict[str, Any]] = [ "id": "CIR-P0-004", "priority": "P0", "order": 4, - "status": "in_progress", + "status": "done", "lane": "gitea_source_truth", "request": "全部專案推版與 repo truth 不能靠 GitHub。", "normalized_work_item": "全產品 source-control readiness 改以 Gitea repo identity、SSH heads、backup health 為準。", - "current_state": "9 個 expected Gitea repos 已讀回 OK;跨產品 dev/prod CI baseline 仍需逐步補。", + "current_state": "Product Governance Matrix 已在 production 顯示 12/12 product source truth、private visibility 與 backup evidence refs。", "acceptance": "product governance matrix 顯示 canonical repo、branch、backup evidence、private visibility。", - "next_action": "把全產品 source truth 接到 product governance matrix。", + "next_action": "以 product governance matrix 作為後續 KM/RAG/MCP/LOG 分類來源。", "mapped_workplan_id": "P0-003", }, { diff --git a/apps/api/tests/test_awoooi_priority_work_order_readback_api.py b/apps/api/tests/test_awoooi_priority_work_order_readback_api.py index df951e37c..3eae7357c 100644 --- a/apps/api/tests/test_awoooi_priority_work_order_readback_api.py +++ b/apps/api/tests/test_awoooi_priority_work_order_readback_api.py @@ -1,5 +1,6 @@ from __future__ import annotations +# ruff: noqa: E402 import asyncio import json import os @@ -446,23 +447,35 @@ def test_awoooi_priority_work_order_readback_surfaces_gitea_bundle_truth(): 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) == 55 + priority_counts = { + priority: sum(1 for item in inserted_items if item["priority"] == priority) + for priority in ("P0", "P1", "P2", "P3") + } + status_counts = { + status: sum(1 for item in inserted_items if item["status"] == status) + for status in ("done", "in_progress", "blocked", "pending", "deferred") + } + assert len(inserted_items) == payload["summary"][ + "commander_inserted_requirement_work_item_count" + ] assert inserted_items[0]["id"] == "CIR-P0-001" assert inserted_items[-1]["id"] == "CIR-P3-NON-001" - assert [item["order"] for item in inserted_items] == list(range(1, 56)) + assert [item["order"] for item in inserted_items] == list( + range(1, len(inserted_items) + 1) + ) assert all(item["acceptance"] for item in inserted_items) - 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"] == 2 - assert payload["summary"]["commander_inserted_requirement_done_count"] == 9 - assert payload["summary"]["commander_inserted_requirement_in_progress_count"] == 27 - assert payload["summary"]["commander_inserted_requirement_next_id"] == "CIR-P0-004" - assert payload["rollups"]["commander_inserted_requirement_blocked_count"] == 1 + assert payload["summary"]["commander_inserted_requirement_p0_count"] == priority_counts["P0"] + assert payload["summary"]["commander_inserted_requirement_p1_count"] == priority_counts["P1"] + assert payload["summary"]["commander_inserted_requirement_p2_count"] == priority_counts["P2"] + assert payload["summary"]["commander_inserted_requirement_p3_count"] == priority_counts["P3"] + assert payload["summary"]["commander_inserted_requirement_done_count"] == status_counts["done"] + assert payload["summary"]["commander_inserted_requirement_in_progress_count"] == status_counts["in_progress"] + assert payload["summary"]["commander_inserted_requirement_next_id"] == "CIR-P0-006" + assert payload["rollups"]["commander_inserted_requirement_blocked_count"] == status_counts["blocked"] inserted_by_id = {item["id"]: item for item in inserted_items} assert inserted_by_id["CIR-P0-001"]["status"] == "done" assert inserted_by_id["CIR-P0-002"]["status"] == "done" + assert inserted_by_id["CIR-P0-004"]["status"] == "done" assert inserted_by_id["CIR-P0-011"]["status"] == "done" assert inserted_by_id["CIR-P0-AILOOP-001"]["lane"] == ( "ai_loop_agent_mainline" @@ -499,6 +512,9 @@ def test_awoooi_priority_work_order_readback_surfaces_gitea_bundle_truth(): assert inserted_by_id["CIR-P1-KM-002"]["lane"] == ( "log_km_mcp_rag_playbook_integration" ) + assert inserted_by_id["CIR-P1-AI-002"]["lane"] == ( + "agent_market_research_version_lifecycle" + ) assert inserted_by_id["CIR-P1-OPENCLAW-001"]["lane"] == ( "openclaw_live_ops_space" ) @@ -1381,15 +1397,24 @@ 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"] == 55 - assert data["summary"]["commander_inserted_requirement_done_count"] == 9 - assert data["summary"]["commander_inserted_requirement_in_progress_count"] == 27 - assert data["summary"]["commander_inserted_requirement_next_id"] == "CIR-P0-004" - assert data["commander_inserted_requirement_work_items"][1]["id"] == ( - "CIR-P0-002" + inserted_items = data["commander_inserted_requirement_work_items"] + status_counts = { + status: sum(1 for item in inserted_items if item["status"] == status) + for status in ("done", "in_progress", "blocked", "pending", "deferred") + } + assert data["summary"]["commander_inserted_requirement_work_item_count"] == len( + inserted_items ) - assert data["commander_inserted_requirement_work_items"][1]["priority"] == "P0" - assert data["commander_inserted_requirement_work_items"][1]["visible_surface"] == ( + assert data["summary"]["commander_inserted_requirement_done_count"] == status_counts[ + "done" + ] + assert data["summary"]["commander_inserted_requirement_in_progress_count"] == ( + status_counts["in_progress"] + ) + assert data["summary"]["commander_inserted_requirement_next_id"] == "CIR-P0-006" + assert inserted_items[1]["id"] == "CIR-P0-002" + assert inserted_items[1]["priority"] == "P0" + assert inserted_items[1]["visible_surface"] == ( "/zh-TW/awooop/work-items" ) assert data["summary"]["ai_automation_node_receipt_schema_version"] == ( @@ -2226,18 +2251,18 @@ def test_awoooi_priority_work_order_readback_allows_parallel_mainline_on_stockpl "external_stockplatform_data_retry_wait" ) assert parallel["retry_readback_at"] - assert parallel["parallel_work_item"]["id"] == "CIR-P0-004" + assert parallel["parallel_work_item"]["id"] == "CIR-P0-007" assert parallel["parallel_work_item"]["priority"] == "P0" assert parallel["report_contract"]["current_p0"] == "P0-006" assert "fake_stockplatform_freshness_marker" in parallel["forbidden_actions"] assert "db_write_or_restore_from_this_wait_lane" in parallel["forbidden_actions"] assert state["parallel_mainline_execution_enabled"] is True - assert state["parallel_mainline_work_item_id"] == "CIR-P0-004" + assert state["parallel_mainline_work_item_id"] == "CIR-P0-007" assert payload["summary"]["parallel_mainline_execution_enabled"] is True - assert payload["summary"]["parallel_mainline_work_item_id"] == "CIR-P0-004" + assert payload["summary"]["parallel_mainline_work_item_id"] == "CIR-P0-007" assert payload["summary"]["parallel_mainline_work_item_priority"] == "P0" assert payload["rollups"]["parallel_mainline_execution_enabled"] is True - assert payload["rollups"]["parallel_mainline_work_item_id"] == "CIR-P0-004" + assert payload["rollups"]["parallel_mainline_work_item_id"] == "CIR-P0-007" def test_awoooi_priority_work_order_readback_routes_stockplatform_ai_recommendations(): diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json index 8cb424809..a5815d15e 100644 --- a/apps/web/messages/en.json +++ b/apps/web/messages/en.json @@ -9535,7 +9535,7 @@ "mainlineProgress": { "eyebrow": "Mainline Work Progress", "title": "All Work Items And Priority Order", - "subtitle": "Reads the production priority work-order readback and surfaces totals, completion, current P0, next action, and the first 8 ordered items before the deeper automation / ledger views.", + "subtitle": "Reads the production priority work-order readback and surfaces totals, completion, current P0, next action, and the active / spotlight ordered items before the deeper automation / ledger views.", "loading": "Reading production work-order", "completion": "Overall completion", "currentP0": "Current P0", diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json index 0b9c7362c..7316e2266 100644 --- a/apps/web/messages/zh-TW.json +++ b/apps/web/messages/zh-TW.json @@ -9535,7 +9535,7 @@ "mainlineProgress": { "eyebrow": "主線工作進度", "title": "全部工作項目與優先順序", - "subtitle": "直接讀正式 priority work-order readback,先看總數、完成度、目前 P0、下一步與前 8 個 ordered items;細節再下鑽 automation / ledger。", + "subtitle": "直接讀正式 priority work-order readback,先看總數、完成度、目前 P0、下一步與活躍/聚焦 ordered items;細節再下鑽 automation / ledger。", "loading": "讀取正式 work-order", "completion": "整體完成度", "currentP0": "目前 P0", diff --git a/apps/web/src/app/[locale]/awooop/work-items/page.tsx b/apps/web/src/app/[locale]/awooop/work-items/page.tsx index db4057011..9ab9902e2 100644 --- a/apps/web/src/app/[locale]/awooop/work-items/page.tsx +++ b/apps/web/src/app/[locale]/awooop/work-items/page.tsx @@ -1659,20 +1659,20 @@ const COMMANDER_INSERTED_REQUIREMENT_FALLBACK: PriorityWorkOrderResponse = { stockplatform_source_contract_readback_status: "stockplatform_source_contract_ready", stockplatform_source_contract_receipt_provided: true, stockplatform_source_contract_non_ok_source_count: 1, - commander_inserted_requirement_work_item_count: 55, + commander_inserted_requirement_work_item_count: 56, commander_inserted_requirement_p0_count: 34, - commander_inserted_requirement_p1_count: 14, + commander_inserted_requirement_p1_count: 15, commander_inserted_requirement_p2_count: 5, commander_inserted_requirement_p3_count: 2, - commander_inserted_requirement_done_count: 9, + commander_inserted_requirement_done_count: 10, commander_inserted_requirement_in_progress_count: 27, commander_inserted_requirement_pending_count: 14, commander_inserted_requirement_blocked_count: 1, commander_inserted_requirement_deferred_count: 4, - commander_inserted_requirement_next_id: "CIR-P0-004", + commander_inserted_requirement_next_id: "CIR-P0-006", commander_inserted_requirement_next_priority: "P0", commander_inserted_requirement_next_action: - "把全產品 source truth 接到 product governance matrix。", + "需要 runner registration 時,只走 token-safe hidden prompt 或 non-secret verifier。", commander_inserted_requirement_source: "docs/workplans/2026-07-02-commander-inserted-requirements-priority-ledger.md", }, @@ -11122,6 +11122,51 @@ function commanderStatusTone(status: string) { } } +const MAINLINE_WORK_PROGRESS_SPOTLIGHT_IDS = new Set([ + "CIR-P1-AI-002", + "CIR-P0-AILOOP-001", + "CIR-P0-LOG-001", + "CIR-P0-TG-001", + "CIR-P0-IA-001", + "CIR-P1-UI-001", + "CIR-P1-OPENCLAW-001", + "CIR-P2-UX-002", +]); + +function pickMainlineVisibleWorkItems( + items: CommanderInsertedRequirementWorkItem[], + nextId: string, + limit = 12 +) { + const selected: CommanderInsertedRequirementWorkItem[] = []; + const seen = new Set(); + const addItem = (item?: CommanderInsertedRequirementWorkItem) => { + const id = item?.id; + if (!id || seen.has(id)) { + return; + } + selected.push(item); + seen.add(id); + }; + + addItem(items.find((item) => item.id === nextId)); + for (const item of items) { + const status = item.status ?? "pending"; + if ( + status === "in_progress" || + status === "blocked" || + MAINLINE_WORK_PROGRESS_SPOTLIGHT_IDS.has(item.id ?? "") + ) { + addItem(item); + } + } + for (const item of items) { + addItem(item); + } + + return selected.slice(0, limit); +} + function MainlineWorkProgressStrip({ priority, loading, @@ -11161,7 +11206,7 @@ function MainlineWorkProgressStrip({ const activeBlockers = summary?.active_p0_live_active_blockers ?? []; const primaryBlocker = summary?.active_p0_primary_blocker ?? activeBlockers[0] ?? "--"; - const visibleItems = items.slice(0, 8); + const visibleItems = pickMainlineVisibleWorkItems(items, nextId); const statusMetrics = [ { key: "done", @@ -11569,6 +11614,7 @@ function CommanderInsertedRequirementsPanel({ }; const spotlightIds = new Set([ nextId, + "CIR-P1-AI-002", "CIR-P0-AILOOP-001", "CIR-P0-LOG-001", "CIR-P0-TG-001", diff --git a/k8s/awoooi-prod/06-deployment-api.yaml b/k8s/awoooi-prod/06-deployment-api.yaml index bba4595f8..7a3ba32f7 100644 --- a/k8s/awoooi-prod/06-deployment-api.yaml +++ b/k8s/awoooi-prod/06-deployment-api.yaml @@ -84,12 +84,12 @@ spec: - name: AWOOOI_BUILD_COMMIT_SHA # 2026-06-29 Codex: CD rewrites this to the deployed image tag so # production deploy readback does not rely on a stale static snapshot. - value: "99f427a3cfd6044499bdf4b6726c9b9d9fb0f21b" + value: "0bc6fc6095e4da79836dd7b8c6adbfb89864692c" - name: AWOOOI_DESIRED_API_IMAGE_TAG # 2026-06-30 Codex: CD rewrites this alongside AWOOOI_BUILD_COMMIT_SHA. # Production readback compares runtime image truth against this # GitOps desired tag instead of doing a slow Gitea raw fetch. - value: "99f427a3cfd6044499bdf4b6726c9b9d9fb0f21b" + value: "0bc6fc6095e4da79836dd7b8c6adbfb89864692c" - name: DATABASE_POOL_SIZE # 2026-07-01 Codex: production role `awoooi` currently has a low # connection limit. Keep API pool conservative until DB role diff --git a/k8s/awoooi-prod/kustomization.yaml b/k8s/awoooi-prod/kustomization.yaml index f530c5c98..74eca81a1 100644 --- a/k8s/awoooi-prod/kustomization.yaml +++ b/k8s/awoooi-prod/kustomization.yaml @@ -41,7 +41,7 @@ resources: images: - name: 192.168.0.110:5000/library/api:IMAGE_TAG_PLACEHOLDER newName: 192.168.0.110:5000/awoooi/api - newTag: 99f427a3cfd6044499bdf4b6726c9b9d9fb0f21b + newTag: 0bc6fc6095e4da79836dd7b8c6adbfb89864692c - name: 192.168.0.110:5000/library/web:IMAGE_TAG_PLACEHOLDER newName: 192.168.0.110:5000/awoooi/web - newTag: 99f427a3cfd6044499bdf4b6726c9b9d9fb0f21b + newTag: 0bc6fc6095e4da79836dd7b8c6adbfb89864692c