feat(web): show GitHub readiness in IwoooS

This commit is contained in:
Your Name
2026-05-20 20:54:44 +08:00
parent a26ed24a62
commit a8a8e9d022
11 changed files with 506 additions and 3 deletions

View File

@@ -275,6 +275,7 @@ def validate(root: Path) -> None:
"s2_60_security_control_pages_iwooos_reverse_bridge",
"s2_61_audit_engineering_pages_iwooos_reverse_bridge",
"s2_62_iwooos_frontend_surface_connection_board",
"s2_63_iwooos_github_primary_readiness_board",
]
assert_equal(
"progress_delta_ledger.delta_ids",
@@ -354,6 +355,11 @@ def validate(root: Path) -> None:
[item["action_id"] for item in rollup["next_safe_actions"] if isinstance(item, dict)],
"show_iwooos_frontend_surface_connection_board",
)
assert_contains(
"rollup.next_safe_actions.action_ids",
[item["action_id"] for item in rollup["next_safe_actions"] if isinstance(item, dict)],
"show_iwooos_github_primary_readiness_board",
)
assert_equal("rollout_policy.schema_version", rollout_policy["schema_version"], "security_rollout_policy_v1")
assert_equal("rollout_policy.default_mode", rollout_policy["default_mode"], "observe")
@@ -445,6 +451,19 @@ def validate(root: Path) -> None:
iwooos_projection["summary"]["github_primary_ready_count"],
rollup_summary["github_primary_ready_count"],
)
expected_iwooos_source_control_primary_readiness_item_ids = [
"candidate_repo_inventory",
"primary_ready_counter_locked",
"owner_response_validation_waiting",
"refs_truth_waiting_owner",
"workflow_secret_name_inventory_missing",
"rollback_adr_waiting_owner_approval",
]
assert_equal(
"iwooos_projection.summary.source_control_primary_readiness_item_count",
iwooos_projection["summary"]["source_control_primary_readiness_item_count"],
len(expected_iwooos_source_control_primary_readiness_item_ids),
)
assert_false("iwooos_projection.summary.action_buttons_allowed", iwooos_projection["summary"]["action_buttons_allowed"])
expected_iwooos_surface_ids = [
"security_compliance",
@@ -1461,6 +1480,59 @@ def validate(root: Path) -> None:
f"iwooos_projection.owner_response_next_action_focus_items.{item['focus_id']}.not_authorization",
item["not_authorization"],
)
source_control_readiness_items = iwooos_projection["source_control_primary_readiness_items"]
assert_equal(
"iwooos_projection.source_control_primary_readiness_items.ids",
[item["item_id"] for item in source_control_readiness_items],
expected_iwooos_source_control_primary_readiness_item_ids,
)
assert_equal(
"iwooos_projection.source_control_primary_readiness_items.display_order",
[item["display_order"] for item in source_control_readiness_items],
list(range(1, len(expected_iwooos_source_control_primary_readiness_item_ids) + 1)),
)
assert_equal(
"iwooos_projection.source_control_primary_readiness_items.gate_ids",
[item["gate_id"] for item in source_control_readiness_items],
["S4.0", "S4.0", "S4.13", "S4.11", "S4.12", "S4.4"],
)
for item in source_control_readiness_items:
assert_equal(
f"iwooos_projection.source_control_primary_readiness_items.{item['item_id']}.display_mode",
item["display_mode"],
"github_primary_readiness_only",
)
assert_equal(
f"iwooos_projection.source_control_primary_readiness_items.{item['item_id']}.primary_ready_count",
item["primary_ready_count"],
0,
)
assert_equal(
f"iwooos_projection.source_control_primary_readiness_items.{item['item_id']}.owner_response_received_count",
item["owner_response_received_count"],
0,
)
assert_equal(
f"iwooos_projection.source_control_primary_readiness_items.{item['item_id']}.owner_response_accepted_count",
item["owner_response_accepted_count"],
0,
)
assert_false(
f"iwooos_projection.source_control_primary_readiness_items.{item['item_id']}.github_primary_switch_authorized",
item["github_primary_switch_authorized"],
)
assert_false(
f"iwooos_projection.source_control_primary_readiness_items.{item['item_id']}.runtime_execution_authorized",
item["runtime_execution_authorized"],
)
assert_false(
f"iwooos_projection.source_control_primary_readiness_items.{item['item_id']}.action_buttons_allowed",
item["action_buttons_allowed"],
)
assert_true(
f"iwooos_projection.source_control_primary_readiness_items.{item['item_id']}.not_authorization",
item["not_authorization"],
)
expected_s4_9_owner_response_request_template_ids = [
"response-public-only-vs-local-gitea-gap",
"response-org-user-endpoint-identity",
@@ -4720,6 +4792,7 @@ def validate(root: Path) -> None:
"display_host_owner_decision_record_human_record_owner_review_preparation_checklist",
"display_evidence_refs",
"display_forbidden_actions",
"display_source_control_primary_readiness_board",
]:
assert_contains("iwooos_projection.allowed_frontend_outputs", iwooos_projection["allowed_frontend_outputs"], output)
for output in [
@@ -4930,6 +5003,14 @@ def validate(root: Path) -> None:
"sync_refs_from_s4_9_template",
"switch_primary_from_s4_9_template",
"collect_token_from_s4_9_template",
"create_github_repo_from_primary_readiness_board",
"change_repo_visibility_from_primary_readiness_board",
"sync_refs_from_primary_readiness_board",
"delete_refs_from_primary_readiness_board",
"force_push_from_primary_readiness_board",
"switch_github_primary_from_primary_readiness_board",
"collect_secret_value_from_primary_readiness_board",
"disable_gitea_from_primary_readiness_board",
"apply_runtime_blocking_control",
"switch_github_primary",
"production_deploy",
@@ -5199,6 +5280,13 @@ def validate(root: Path) -> None:
assert_text_contains("iwooos_page.surface_connection_embedded", iwooos_projection_page, "embeddedBridge")
assert_text_contains("iwooos_page.surface_connection_direct", iwooos_projection_page, "directBridge")
assert_text_contains("iwooos_page.surface_connection_awooop", iwooos_projection_page, "awooopCandidate")
assert_text_contains("iwooos_page.source_control_readiness_board", iwooos_projection_page, "sourceControlReadinessItems")
assert_text_contains(
"iwooos_page.source_control_readiness_testid",
iwooos_projection_page,
'data-testid="iwooos-source-control-readiness-board"',
)
assert_text_contains("iwooos_page.source_control_readiness_component", iwooos_projection_page, "SourceControlReadinessCard")
for key in [
"title",
"subtitle",
@@ -5275,6 +5363,35 @@ def validate(root: Path) -> None:
list(web_messages_en["iwooos"]["surfaceConnections"]["items"].keys()),
key,
)
for key in ["title", "subtitle", "gateLabel", "guardLabel", "items"]:
assert_contains(
"web_messages.zh-TW.iwooos.sourceControlReadiness",
list(web_messages_zh["iwooos"]["sourceControlReadiness"].keys()),
key,
)
assert_contains(
"web_messages.en.iwooos.sourceControlReadiness",
list(web_messages_en["iwooos"]["sourceControlReadiness"].keys()),
key,
)
for key in [
"candidateRepos",
"primaryReady",
"ownerResponses",
"refsTruth",
"workflowSecrets",
"rollbackAdr",
]:
assert_contains(
"web_messages.zh-TW.iwooos.sourceControlReadiness.items",
list(web_messages_zh["iwooos"]["sourceControlReadiness"]["items"].keys()),
key,
)
assert_contains(
"web_messages.en.iwooos.sourceControlReadiness.items",
list(web_messages_en["iwooos"]["sourceControlReadiness"]["items"].keys()),
key,
)
owner_summary = owner_rollup["summary"]
assert_equal("owner_rollup.total_received_response_count", owner_summary["total_received_response_count"], 0)
@@ -5403,7 +5520,11 @@ def validate(root: Path) -> None:
assert_true("owner_rollup.latest_local_validation.not_authorization", owner_local_validation["not_authorization"])
primary_summary = primary_gate["summary"]
assert_equal("primary_gate.candidate_repo_count", primary_summary["candidate_repo_count"], 8)
assert_equal("primary_gate.in_scope_repo_count", primary_summary["in_scope_repo_count"], 7)
assert_equal("primary_gate.primary_ready_count", primary_summary["primary_ready_count"], 0)
assert_equal("primary_gate.blocked_in_scope_count", primary_summary["blocked_in_scope_count"], 7)
assert_equal("owner_rollup.total_response_template_count", owner_summary["total_response_template_count"], 22)
assert_false("primary_gate.runtime_actions_authorized", primary_summary["runtime_actions_authorized"])
assert_false("primary_gate.github_primary_switch_authorized", primary_summary["github_primary_switch_authorized"])
assert_false("primary_gate.action_buttons_allowed", primary_summary["action_buttons_allowed"])