From 0421b17d260192f5d3ba3e66f3549c5fa2305309 Mon Sep 17 00:00:00 2001 From: ogt Date: Wed, 15 Jul 2026 09:59:26 +0800 Subject: [PATCH] fix(mcp): refresh workflow inventory after mirror lane --- .../awoooi_priority_work_order_readback.py | 2 +- ...ions_secret_variable_name_inventory_api.py | 2 +- ...ability_ci_cd_optimization_readback_api.py | 10 ++--- docs/LOGBOOK.md | 22 ++++++++++ ...tea_workflow_runner_health_2026-06-05.json | 42 ++++++++++++++++--- .../mcp-control-plane-catalog.snapshot.json | 13 +++--- 6 files changed, 73 insertions(+), 18 deletions(-) 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 3b0232322..e85e5fded 100644 --- a/apps/api/src/services/awoooi_priority_work_order_readback.py +++ b/apps/api/src/services/awoooi_priority_work_order_readback.py @@ -798,7 +798,7 @@ _AI_AUTOMATION_PROGRAM_WORK_ITEMS: list[dict[str, Any]] = [ "problem": "Gitea runner 仍會把 actions/checkout 等 action 從 github.com 抓入執行環境,GitHub freeze 尚未覆蓋 CI action resolution。", "professional_practice": "self-hosted action registry、immutable digest pinning、SBOM/provenance、network egress verification", "asset_scope_ids": ["products", "tools", "packages", "observability_and_security"], - "observed_awoooi_gitea_workflow_file_count": 13, + "observed_awoooi_gitea_workflow_file_count": 14, "observed_awoooi_external_action_reference_count": 18, "acceptance": [ "所有產品的 Gitea workflow action 只由受控 Gitea mirror 或 repo-owned immutable action 供應", diff --git a/apps/api/tests/test_gitea_actions_secret_variable_name_inventory_api.py b/apps/api/tests/test_gitea_actions_secret_variable_name_inventory_api.py index bdaea07ac..09a5e7eab 100644 --- a/apps/api/tests/test_gitea_actions_secret_variable_name_inventory_api.py +++ b/apps/api/tests/test_gitea_actions_secret_variable_name_inventory_api.py @@ -17,7 +17,7 @@ def test_gitea_actions_secret_variable_name_inventory_loader_is_value_safe() -> ) assert payload["status"] == "gitea_actions_secret_variable_name_inventory_ready" assert payload["ready"] is True - assert payload["summary"]["workflow_file_count"] == 13 + assert payload["summary"]["workflow_file_count"] == 14 assert payload["summary"]["referenced_secret_name_count"] == 26 assert payload["summary"]["referenced_variable_name_count"] == 0 assert payload["summary"]["secret_values_collected"] is False diff --git a/apps/api/tests/test_gitea_capability_ci_cd_optimization_readback_api.py b/apps/api/tests/test_gitea_capability_ci_cd_optimization_readback_api.py index 4448216bf..c6ec21975 100644 --- a/apps/api/tests/test_gitea_capability_ci_cd_optimization_readback_api.py +++ b/apps/api/tests/test_gitea_capability_ci_cd_optimization_readback_api.py @@ -148,16 +148,16 @@ def test_gitea_capability_readback_rolls_up_complete_feature_surface() -> None: assert payload["rollups"]["expected_product_count"] == 12 assert payload["rollups"]["ssh_verified_product_repo_count"] == 12 assert payload["rollups"]["dev_prod_environment_split_ready_count"] == 12 - assert payload["workflow_source_inventory"]["workflow_file_count"] == 13 + assert payload["workflow_source_inventory"]["workflow_file_count"] == 14 professional_feature_rollups = payload["workflow_source_inventory"][ "professional_feature_rollups" ] - assert professional_feature_rollups["gitea_ignored_syntax_workflow_count"] == 10 + assert professional_feature_rollups["gitea_ignored_syntax_workflow_count"] == 11 assert professional_feature_rollups["otel_workflow_count"] == 3 assert professional_feature_rollups["argocd_gitops_workflow_count"] == 1 assert professional_feature_rollups["notification_or_webhook_workflow_count"] == 9 assert ( - professional_feature_rollups["registry_or_package_channel_workflow_count"] == 4 + professional_feature_rollups["registry_or_package_channel_workflow_count"] == 5 ) assert professional_feature_rollups["package_release_promotion_workflow_count"] == 1 assert professional_feature_rollups["sbom_or_provenance_workflow_count"] == 1 @@ -203,8 +203,8 @@ def test_gitea_capability_readback_rolls_up_complete_feature_surface() -> None: assert capability_by_id["wiki_knowledge_base"]["status"] == "source_ready" assert capability_by_id["gitea_actions_workflows"]["status"] == "verified_ready" assert capability_by_id["gitea_actions_workflows"]["metrics"] == { - "workflow_source_file_count": 13, - "workflow_contract_count": 13, + "workflow_source_file_count": 14, + "workflow_contract_count": 14, } assert capability_by_id["gitea_actions_runners"]["status"] == "verified_ready" assert ( diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md index 8f4eb97c4..bd7166202 100644 --- a/docs/LOGBOOK.md +++ b/docs/LOGBOOK.md @@ -1,3 +1,25 @@ +## 2026-07-15 — P0 MCP Playwright immutable mirror 與獨立供應鏈 verifier + +**完成內容**: +- mcp.so 僅保留 discovery URL;可執行 bytes 只從 policy allowlist 的 npm registry exact URLs 取得。`@playwright/mcp=0.0.78`、`playwright` / `playwright-core=1.62.0-alpha-1783623505000` 全部固定 version、SRI SHA-512、SHA-1、npm ECDSA signature、SLSA subject、dependency closure 與 Apache-2.0 license。 +- 新增 fail-closed artifact controller:拒絕 redirect、非 allowlist host、floating version、dependency/metadata drift、unsafe/duplicate tar entry、已知 OSV vulnerability 與未通過簽章的 artifact;產生 deterministic CycloneDX 1.5 SBOM 與 scratch OCI data bundle,不執行 package install、MCP、browser 或 container。 +- 新增完全不 import controller 的獨立 verifier:由 Harbor immutable digest 重新 pull/save image、只把 layer 當資料讀取,限制 file/byte/path/symlink/whiteout,要求 exact 8-file bundle,再次重算 manifest/SBOM/tarball hash、以 OpenSSL 重驗 npm signature 並重解 SLSA DSSE subject。 +- Gitea `mcp-external-artifact-mirror.yaml` 不使用遠端 action;push、manual 與每週三 pinned revalidation 都先跑 controller/verifier tests、host-pressure gate、Harbor password-stdin、獨立 readback與 logout。receipt 以 ephemeral askpass normal push 到專用 `mcp-artifact-receipts` audit branch,不再推 main、取消有效 CD 或保存 credential。 +- Gitea run `#5174` 成功;controlled run `dce032df-0a9a-476f-940b-e61a94865e1b` 產生 internal digest `sha256:de002c418bbb94fb4609539c4259c39ccb7f8b353f8bac8fbcba9e5742ad79ed`,獨立 verifier 為 `completed_internal_mirror_verified`,audit branch commit `9c08ada5c0f15bb6924304af29cd13c8376182ff`。 + +**source/test evidence**: +- artifact controller/verifier focused tests `24 passed`;MCP control-plane/federation/version-lifecycle `20 passed`。 +- 新增第 14 條 Gitea workflow 後,CD `#5173` 以 `2627 passed / 1 failed` 找出 workflow health contract 仍固定 13;已同步 workflow health snapshot、secret-name inventory、Gitea capability readback 與 priority work-order count,聚焦回歸 `40 passed`,secret names 維持 `26`、secret values collected=`false`。 +- Ruff、py_compile、JSON/YAML parse、freeze/floating-reference guard 與 `git diff --check` 通過。 + +**尚未完成 / 不誤報**: +- 目前只完成 immutable internal mirror 與供應鏈 verifier;`deployment_allowed=false`、`replay_allowed=false`、`shadow_allowed=false`、`canary_allowed=false`。尚未實作 registered public-origin replay adapter、compatibility replay、shadow/canary、runtime upgrade、post-verifier 或 rollback execution。 +- 外部 catalog / tarball / attestation 未寫 RAG;只保留 normalized digest、SBOM 與 supply-chain receipt。未讀 secret value、`.env`、raw session、SQLite/auth;未連線或下載 GitHub / Actions / hosted artifact,也未使用 `npx -y`、`@latest`、`:latest`、force push 或 production route mutation。 +- 本筆 inventory drift 修正與 catalog mirror state 尚待最新 main CD/deploy marker/production UI readback;不得由 `#5174` mirror success 倒推 AWOOOI production 已部署。 + +**下一步**: +- 先取得包含本修正的 Gitea CD terminal與 production MCP page readback;再以 public-only origin allowlist 建立 repo-owned replay adapter,要求 compatibility、prompt-injection、latency、accessibility、session/file/download no-write verifier與 rollback receipt 全數通過,才可進第一個 noncritical shadow/canary。 + ## 2026-07-15 — P0 MCP EwoooC/MOMO durable production federation source closure **完成內容**: diff --git a/docs/evaluations/gitea_workflow_runner_health_2026-06-05.json b/docs/evaluations/gitea_workflow_runner_health_2026-06-05.json index 694f595bd..86a4ff9b3 100644 --- a/docs/evaluations/gitea_workflow_runner_health_2026-06-05.json +++ b/docs/evaluations/gitea_workflow_runner_health_2026-06-05.json @@ -1,6 +1,6 @@ { "schema_version": "gitea_workflow_runner_health_v1", - "generated_at": "2026-07-09T23:20:00+08:00", + "generated_at": "2026-07-15T09:54:44+08:00", "program_status": { "overall_completion_percent": 100, "current_priority": "P1", @@ -21,6 +21,7 @@ ".gitea/workflows/deploy-alerts.yaml", ".gitea/workflows/e2e-health.yaml", ".gitea/workflows/harbor-110-local-repair.yaml", + ".gitea/workflows/mcp-external-artifact-mirror.yaml", ".gitea/workflows/run-migration.yml", ".gitea/workflows/type-sync-check.yaml", "docs/evaluations/ai_agent_version_lifecycle_update_proposal_2026-07-10.json", @@ -32,16 +33,16 @@ "scripts/ops/stop-stale-gitea-actions-jobs.sh" ], "rollups": { - "total_workflows": 13, + "total_workflows": 14, "by_workflow_status": { - "manifest_mapped": 13 + "manifest_mapped": 14 }, "by_runner_evidence_status": { "non110_runner_mapped": 10, - "non110_host_runner_mapped": 3 + "non110_host_runner_mapped": 4 }, - "workflows_with_schedule": 5, - "workflows_with_workflow_dispatch": 13, + "workflows_with_schedule": 6, + "workflows_with_workflow_dispatch": 14, "workflows_with_notify_bridge": 6, "workflows_with_actionable_or_failure_quiet_policy": 3, "workflow_ids_requiring_runner_attestation": [], @@ -337,6 +338,35 @@ ], "next_action": "維持 no-auto-apply repair guard;不得由 API 直接觸發 repair。" }, + { + "workflow_id": "mcp_external_artifact_mirror", + "file_ref": ".gitea/workflows/mcp-external-artifact-mirror.yaml", + "display_name": "MCP External Artifact Mirror", + "scope": "以 exact npm registry artifact、digest、簽章、SLSA subject、SBOM 與 OSV 查核建立 Harbor scratch OCI bundle;獨立 verifier 只讀回 layer data,不啟動 MCP、browser 或 container。", + "status": "manifest_mapped", + "risk_level": "high", + "triggers": [ + "workflow_dispatch", + "schedule", + "push" + ], + "schedule_cadence": "每週三 10:13 Asia/Taipei 重驗 pinned artifact;cron=13 2 * * 3 UTC", + "runner_labels": [ + "awoooi-non110-host" + ], + "runner_evidence_status": "non110_host_runner_mapped", + "job_count": 1, + "notification_policy": "durable_receipt_only_no_notify", + "notify_bridge_calls": 0, + "secrets_policy_status": "只引用既有 Harbor 與 Gitea push secret 名稱;password-stdin/ephemeral askpass 且不輸出、不保存值。", + "evidence_refs": [ + ".gitea/workflows/mcp-external-artifact-mirror.yaml", + "config/mcp/playwright-mcp-artifact-policy.json", + "scripts/security/external_mcp_artifact_controller.py", + "scripts/security/verify_external_mcp_artifact_receipt.py" + ], + "next_action": "先完成 audit branch mirror/verifier receipt;在 registered public-origin replay adapter 與 rollback receipt 完成前維持 deployment/shadow/canary=false。" + }, { "workflow_id": "run_migration", "file_ref": ".gitea/workflows/run-migration.yml", diff --git a/docs/operations/mcp-control-plane-catalog.snapshot.json b/docs/operations/mcp-control-plane-catalog.snapshot.json index 312253008..7b5d6576b 100644 --- a/docs/operations/mcp-control-plane-catalog.snapshot.json +++ b/docs/operations/mcp-control-plane-catalog.snapshot.json @@ -301,18 +301,21 @@ "data_boundary": "public_and_test_surfaces", "deployment_allowed": false, "version_state": "exact_0.0.78_check_verified", - "digest_state": "upstream_sha512_pinned_internal_mirror_pending", - "sbom_state": "cyclonedx_1.5_check_verified_internal_mirror_pending", - "signature_state": "npm_registry_ecdsa_and_slsa_subject_verified", + "digest_state": "internal_mirror_digest_verified_sha256_de002c418bbb94fb4609539c4259c39ccb7f8b353f8bac8fbcba9e5742ad79ed", + "sbom_state": "cyclonedx_1.5_mirror_readback_verified", + "signature_state": "npm_registry_ecdsa_and_slsa_subject_independently_reverified", "rag_policy": "screenshots_and_accessibility_receipts_only", "blockers": [ - "internal_mirror_and_independent_digest_readback_pending", "registered_public_origin_replay_adapter_missing", + "compatibility_replay_not_executed", "shadow_canary_verifier_and_rollback_execution_pending" ], "evidence_refs": [ "config/mcp/playwright-mcp-artifact-policy.json", - "docs/operations/external-mcp-artifacts/playwright-mcp-0.0.78-check.snapshot.json" + "docs/operations/external-mcp-artifacts/playwright-mcp-0.0.78-check.snapshot.json", + "gitea:mcp-artifact-receipts@9c08ada5c0f15bb6924304af29cd13c8376182ff:docs/operations/external-mcp-artifacts/playwright-mcp-0.0.78-controller.snapshot.json", + "gitea:mcp-artifact-receipts@9c08ada5c0f15bb6924304af29cd13c8376182ff:docs/operations/external-mcp-artifacts/playwright-mcp-0.0.78-verifier.snapshot.json", + "registry.wooo.work/awoooi/mcp-artifacts/playwright-mcp@sha256:de002c418bbb94fb4609539c4259c39ccb7f8b353f8bac8fbcba9e5742ad79ed" ] }, {