Merge remote-tracking branch 'origin/main' into codex/playwright-mcp-supply-20260715
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 4m17s
CD Pipeline / build-and-deploy (push) Successful in 15m48s
MCP External Artifact Mirror / mirror-and-verify (push) Failing after 49s
AWOOOI Harbor 110 Local Repair / workflow-shape (push) Successful in 0s
AWOOOI Harbor 110 Local Repair / harbor-110-local-repair (push) Successful in 20s
CD Pipeline / post-deploy-checks (push) Successful in 2m1s

# Conflicts:
#	apps/api/tests/test_gitea_capability_ci_cd_optimization_readback_api.py
#	docs/evaluations/gitea_workflow_runner_health_2026-06-05.json
This commit is contained in:
ogt
2026-07-15 10:04:31 +08:00
3 changed files with 100 additions and 28 deletions

View File

@@ -139,6 +139,9 @@ def _readback_payload() -> dict:
def test_gitea_capability_readback_rolls_up_complete_feature_surface() -> None: def test_gitea_capability_readback_rolls_up_complete_feature_surface() -> None:
payload = _readback_payload() payload = _readback_payload()
workflow_inventory = payload["workflow_source_inventory"]
workflow_rows = workflow_inventory["workflow_rows"]
workflow_file_count = len(workflow_rows)
assert ( assert (
payload["schema_version"] == "gitea_capability_ci_cd_optimization_readback_v1" payload["schema_version"] == "gitea_capability_ci_cd_optimization_readback_v1"
@@ -148,20 +151,53 @@ def test_gitea_capability_readback_rolls_up_complete_feature_surface() -> None:
assert payload["rollups"]["expected_product_count"] == 12 assert payload["rollups"]["expected_product_count"] == 12
assert payload["rollups"]["ssh_verified_product_repo_count"] == 12 assert payload["rollups"]["ssh_verified_product_repo_count"] == 12
assert payload["rollups"]["dev_prod_environment_split_ready_count"] == 12 assert payload["rollups"]["dev_prod_environment_split_ready_count"] == 12
assert payload["workflow_source_inventory"]["workflow_file_count"] == 14 assert workflow_inventory["workflow_file_count"] == workflow_file_count
professional_feature_rollups = payload["workflow_source_inventory"][ professional_feature_rollups = workflow_inventory[
"professional_feature_rollups" "professional_feature_rollups"
] ]
assert professional_feature_rollups["gitea_ignored_syntax_workflow_count"] == 11 ignored_syntax_keys = {
assert professional_feature_rollups["otel_workflow_count"] == 3 "declares_concurrency",
assert professional_feature_rollups["argocd_gitops_workflow_count"] == 1 "declares_permissions",
assert professional_feature_rollups["notification_or_webhook_workflow_count"] == 9 "declares_timeout_minutes",
assert ( "declares_continue_on_error",
professional_feature_rollups["registry_or_package_channel_workflow_count"] == 5 "declares_environment",
}
assert professional_feature_rollups[
"gitea_ignored_syntax_workflow_count"
] == sum(
any(row.get(key) is True for key in ignored_syntax_keys)
for row in workflow_rows
)
assert professional_feature_rollups["otel_workflow_count"] == sum(
row.get("uses_otel") is True for row in workflow_rows
)
assert professional_feature_rollups["argocd_gitops_workflow_count"] == sum(
row.get("uses_argocd_gitops") is True for row in workflow_rows
)
assert professional_feature_rollups[
"notification_or_webhook_workflow_count"
] == sum(
row.get("uses_notification_or_webhook") is True for row in workflow_rows
)
assert (
professional_feature_rollups["registry_or_package_channel_workflow_count"]
== sum(
row.get("uses_registry_or_package_channel") is True
for row in workflow_rows
)
)
assert professional_feature_rollups[
"package_release_promotion_workflow_count"
] == sum(
row.get("uses_package_release_promotion_contract") is True
for row in workflow_rows
)
assert professional_feature_rollups["sbom_or_provenance_workflow_count"] == sum(
row.get("uses_sbom_or_provenance") is True for row in workflow_rows
)
assert professional_feature_rollups["artifact_transfer_workflow_count"] == sum(
row.get("uses_artifact_transfer") is True for row in workflow_rows
) )
assert professional_feature_rollups["package_release_promotion_workflow_count"] == 1
assert professional_feature_rollups["sbom_or_provenance_workflow_count"] == 1
assert professional_feature_rollups["artifact_transfer_workflow_count"] == 1
assert ( assert (
payload["workflow_source_inventory"]["secret_variable_rollups"][ payload["workflow_source_inventory"]["secret_variable_rollups"][
"secret_values_collected" "secret_values_collected"
@@ -203,8 +239,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["wiki_knowledge_base"]["status"] == "source_ready"
assert capability_by_id["gitea_actions_workflows"]["status"] == "verified_ready" assert capability_by_id["gitea_actions_workflows"]["status"] == "verified_ready"
assert capability_by_id["gitea_actions_workflows"]["metrics"] == { assert capability_by_id["gitea_actions_workflows"]["metrics"] == {
"workflow_source_file_count": 14, "workflow_source_file_count": workflow_file_count,
"workflow_contract_count": 14, "workflow_contract_count": workflow_file_count,
} }
assert capability_by_id["gitea_actions_runners"]["status"] == "verified_ready" assert capability_by_id["gitea_actions_runners"]["status"] == "verified_ready"
assert ( assert (

View File

@@ -20,9 +20,14 @@ def test_gitea_workflow_runner_health_endpoint_returns_committed_snapshot():
assert data["program_status"]["current_task_id"] == "P1-002" assert data["program_status"]["current_task_id"] == "P1-002"
assert data["program_status"]["next_task_id"] == "P1-003" assert data["program_status"]["next_task_id"] == "P1-003"
assert data["program_status"]["read_only_mode"] is True assert data["program_status"]["read_only_mode"] is True
assert data["rollups"]["total_workflows"] == len(data["workflow_records"]) == 13 workflow_records = data["workflow_records"]
assert data["rollups"]["workflows_with_schedule"] == 5 assert data["rollups"]["total_workflows"] == len(workflow_records)
assert data["rollups"]["workflows_with_workflow_dispatch"] == 13 assert data["rollups"]["workflows_with_schedule"] == sum(
"schedule" in row["triggers"] for row in workflow_records
)
assert data["rollups"]["workflows_with_workflow_dispatch"] == sum(
"workflow_dispatch" in row["triggers"] for row in workflow_records
)
assert data["rollups"]["workflow_ids_requiring_runner_attestation"] == [] assert data["rollups"]["workflow_ids_requiring_runner_attestation"] == []
assert data["rollups"]["runner_contracts_requiring_action"] == [] assert data["rollups"]["runner_contracts_requiring_action"] == []
assert data["rollups"]["notification_contracts_quiet_success_count"] == 3 assert data["rollups"]["notification_contracts_quiet_success_count"] == 3
@@ -64,5 +69,16 @@ def test_gitea_workflow_runner_health_endpoint_returns_committed_snapshot():
if row["workflow_id"] == "harbor_110_local_repair" if row["workflow_id"] == "harbor_110_local_repair"
) )
assert harbor_repair["runner_evidence_status"] == "non110_host_runner_mapped" assert harbor_repair["runner_evidence_status"] == "non110_host_runner_mapped"
mcp_artifact_mirror = next(
row
for row in workflow_records
if row["workflow_id"] == "mcp_external_artifact_mirror"
)
assert mcp_artifact_mirror["runner_labels"] == ["awoooi-non110-host"]
assert mcp_artifact_mirror["runner_evidence_status"] == (
"non110_host_runner_mapped"
)
assert mcp_artifact_mirror["notification_policy"] == "read_only_no_notify"
assert mcp_artifact_mirror["notify_bridge_calls"] == 0
assert "workflow 修改批准" in data["operator_contract"]["must_not_interpret_as"] assert "workflow 修改批准" in data["operator_contract"]["must_not_interpret_as"]
assert "Secret 已讀取或可輸出" in data["operator_contract"]["must_not_interpret_as"] assert "Secret 已讀取或可輸出" in data["operator_contract"]["must_not_interpret_as"]

View File

@@ -1,6 +1,6 @@
{ {
"schema_version": "gitea_workflow_runner_health_v1", "schema_version": "gitea_workflow_runner_health_v1",
"generated_at": "2026-07-15T09:54:44+08:00", "generated_at": "2026-07-15T09:57:22+08:00",
"program_status": { "program_status": {
"overall_completion_percent": 100, "overall_completion_percent": 100,
"current_priority": "P1", "current_priority": "P1",
@@ -24,6 +24,7 @@
".gitea/workflows/mcp-external-artifact-mirror.yaml", ".gitea/workflows/mcp-external-artifact-mirror.yaml",
".gitea/workflows/run-migration.yml", ".gitea/workflows/run-migration.yml",
".gitea/workflows/type-sync-check.yaml", ".gitea/workflows/type-sync-check.yaml",
"config/mcp/playwright-mcp-artifact-policy.json",
"docs/evaluations/ai_agent_version_lifecycle_update_proposal_2026-07-10.json", "docs/evaluations/ai_agent_version_lifecycle_update_proposal_2026-07-10.json",
"scripts/ci/check-gitea-step-env-secrets.js", "scripts/ci/check-gitea-step-env-secrets.js",
"scripts/ci/cleanup-host-runner-workspace.sh", "scripts/ci/cleanup-host-runner-workspace.sh",
@@ -48,7 +49,7 @@
"workflow_ids_requiring_runner_attestation": [], "workflow_ids_requiring_runner_attestation": [],
"total_runner_contracts": 5, "total_runner_contracts": 5,
"runner_contracts_requiring_action": [], "runner_contracts_requiring_action": [],
"notification_contracts_total": 7, "notification_contracts_total": 8,
"notification_contracts_quiet_success_count": 3, "notification_contracts_quiet_success_count": 3,
"notification_contracts_quiet_success_ids": [ "notification_contracts_quiet_success_ids": [
"agent_market_watch_actionable_only", "agent_market_watch_actionable_only",
@@ -342,30 +343,31 @@
"workflow_id": "mcp_external_artifact_mirror", "workflow_id": "mcp_external_artifact_mirror",
"file_ref": ".gitea/workflows/mcp-external-artifact-mirror.yaml", "file_ref": ".gitea/workflows/mcp-external-artifact-mirror.yaml",
"display_name": "MCP External Artifact Mirror", "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。", "scope": "以 exact npm registry URL、committed SHA-512 與 Harbor digest 執行受控外部 MCP artifact mirror只寫獨立 audit branch不啟動 MCP、不改 production route。",
"status": "manifest_mapped", "status": "manifest_mapped",
"risk_level": "high", "risk_level": "high",
"triggers": [ "triggers": [
"push:main",
"workflow_dispatch", "workflow_dispatch",
"schedule", "schedule"
"push"
], ],
"schedule_cadence": "每週三 10:13 Asia/Taipei 重驗 pinned artifactcron=13 2 * * 3 UTC", "schedule_cadence": "每週三 10:13 Asia/Taipeicron=13 2 * * 3 UTC",
"runner_labels": [ "runner_labels": [
"awoooi-non110-host" "awoooi-non110-host"
], ],
"runner_evidence_status": "non110_host_runner_mapped", "runner_evidence_status": "non110_host_runner_mapped",
"job_count": 1, "job_count": 1,
"notification_policy": "durable_receipt_only_no_notify", "notification_policy": "read_only_no_notify",
"notify_bridge_calls": 0, "notify_bridge_calls": 0,
"secrets_policy_status": "只引用既有 Harbor 與 Gitea push secret 名稱password-stdinephemeral askpass 且不輸出、不保存值。", "secrets_policy_status": "只使用 workflow secret references 進行 Harbor 登入與獨立 audit branch normal push本 snapshot 與 readback 不讀取、保存或顯示任何值。",
"evidence_refs": [ "evidence_refs": [
".gitea/workflows/mcp-external-artifact-mirror.yaml", ".gitea/workflows/mcp-external-artifact-mirror.yaml",
"config/mcp/playwright-mcp-artifact-policy.json", "config/mcp/playwright-mcp-artifact-policy.json",
"scripts/security/external_mcp_artifact_controller.py", "scripts/security/external_mcp_artifact_controller.py",
"scripts/security/verify_external_mcp_artifact_receipt.py" "scripts/security/verify_external_mcp_artifact_receipt.py",
"scripts/ci/wait-host-web-build-pressure.sh"
], ],
"next_action": "先完成 audit branch mirror/verifier receipt在 registered public-origin replay adapter 與 rollback receipt 完成前維持 deployment/shadow/canary=false。" "next_action": "維持 bounded capacity wait、獨立 verifier 與 mcp-artifact-receipts audit branch不得啟動 artifact、寫 RAG、切 production route 或推回 deploy main。"
}, },
{ {
"workflow_id": "run_migration", "workflow_id": "run_migration",
@@ -429,7 +431,8 @@
"used_by_workflows": [ "used_by_workflows": [
"awoooi_onboarding_warning_step", "awoooi_onboarding_warning_step",
"cd_pipeline", "cd_pipeline",
"harbor_110_local_repair" "harbor_110_local_repair",
"mcp_external_artifact_mirror"
], ],
"health_contract": "host-level controlled workflows use the explicit awoooi-non110-host label; this snapshot does not restart or mutate the runner.", "health_contract": "host-level controlled workflows use the explicit awoooi-non110-host label; this snapshot does not restart or mutate the runner.",
"guardrail_refs": [ "guardrail_refs": [
@@ -439,7 +442,8 @@
"evidence_refs": [ "evidence_refs": [
".gitea/workflows/cd.yaml", ".gitea/workflows/cd.yaml",
".gitea/workflows/harbor-110-local-repair.yaml", ".gitea/workflows/harbor-110-local-repair.yaml",
".gitea/workflows/awoooi-onboarding-warning-step.yaml" ".gitea/workflows/awoooi-onboarding-warning-step.yaml",
".gitea/workflows/mcp-external-artifact-mirror.yaml"
], ],
"next_action": "維持 explicit non110 host label任何 runner/service 變更另走維護窗口。" "next_action": "維持 explicit non110 host label任何 runner/service 變更另走維護窗口。"
}, },
@@ -643,6 +647,22 @@
], ],
"next_action": "後續補 alert/repair receipt本 snapshot 不發通知、不觸發 migration 或 repair。" "next_action": "後續補 alert/repair receipt本 snapshot 不發通知、不觸發 migration 或 repair。"
}, },
{
"contract_id": "mcp_artifact_mirror_no_notify",
"display_name": "MCP artifact mirror no-notify",
"status": "preserved",
"policy_kind": "read_only_no_notify",
"success_noise_policy": "artifact mirror 與 verifier 成功只寫獨立 audit branch不向 Telegram 或產品告警群組發送成功訊息。",
"failure_policy": "失敗留在 Gitea workflow 與脫敏 receipt不得因通知失敗而重送 artifact、切 production route 或啟動 MCP。",
"workflow_refs": [
"mcp_external_artifact_mirror"
],
"evidence_refs": [
".gitea/workflows/mcp-external-artifact-mirror.yaml",
"config/mcp/playwright-mcp-artifact-policy.json"
],
"next_action": "維持 no-notify 與獨立 audit branch只在受控營運 readback 顯示 terminal receipt。"
},
{ {
"contract_id": "lint_and_typecheck_no_notify", "contract_id": "lint_and_typecheck_no_notify",
"display_name": "Lint / typecheck no-notify", "display_name": "Lint / typecheck no-notify",