feat(web): add IwoooS decision runway
All checks were successful
CD Pipeline / tests (push) Successful in 1m20s
Code Review / ai-code-review (push) Successful in 13s
CD Pipeline / build-and-deploy (push) Successful in 3m48s
CD Pipeline / post-deploy-checks (push) Successful in 1m53s

This commit is contained in:
Your Name
2026-06-01 13:18:52 +08:00
parent 740795c7fa
commit 5a56162a75
7 changed files with 1146 additions and 9 deletions

View File

@@ -616,6 +616,7 @@ def validate(root: Path) -> None:
"s2_149_iwooos_topology_node_drilldown",
"s2_150_iwooos_topology_path_explorer",
"s2_151_iwooos_topology_intelligence_deck",
"s2_152_iwooos_decision_runway",
]
assert_equal(
"progress_delta_ledger.delta_ids",
@@ -1663,6 +1664,53 @@ def validate(root: Path) -> None:
iwooos_projection["summary"]["topology_intelligence_runtime_gate_count"],
0,
)
assert_true(
"iwooos_projection.summary.decision_runway_first_layer",
iwooos_projection["summary"]["decision_runway_first_layer"],
)
assert_equal(
"iwooos_projection.summary.decision_runway_step_count",
iwooos_projection["summary"]["decision_runway_step_count"],
5,
)
assert_equal(
"iwooos_projection.summary.decision_runway_default_step",
iwooos_projection["summary"]["decision_runway_default_step"],
"ownerEvidence",
)
assert_equal(
"iwooos_projection.summary.decision_runway_dependency_count",
iwooos_projection["summary"]["decision_runway_dependency_count"],
6,
)
assert_equal(
"iwooos_projection.summary.decision_runway_boundary_signal_count",
iwooos_projection["summary"]["decision_runway_boundary_signal_count"],
4,
)
assert_true(
"iwooos_projection.summary.decision_runway_above_gate_radar",
iwooos_projection["summary"]["decision_runway_above_gate_radar"],
)
assert_true(
"iwooos_projection.summary.decision_runway_interactive_step_allowed",
iwooos_projection["summary"]["decision_runway_interactive_step_allowed"],
)
assert_equal(
"iwooos_projection.summary.decision_runway_runtime_gate_count",
iwooos_projection["summary"]["decision_runway_runtime_gate_count"],
0,
)
assert_equal(
"iwooos_projection.summary.decision_runway_owner_response_received_count",
iwooos_projection["summary"]["decision_runway_owner_response_received_count"],
0,
)
assert_equal(
"iwooos_projection.summary.decision_runway_owner_response_accepted_count",
iwooos_projection["summary"]["decision_runway_owner_response_accepted_count"],
0,
)
assert_true(
"iwooos_projection.summary.gate_radar_first_layer",
iwooos_projection["summary"]["gate_radar_first_layer"],
@@ -12159,6 +12207,73 @@ def validate(root: Path) -> None:
iwooos_projection_page,
text,
)
for text in [
'data-testid="iwooos-decision-runway-board"',
'data-testid="iwooos-decision-runway-progress-rail"',
'data-testid="iwooos-decision-runway-selector"',
'data-testid="iwooos-decision-runway-active-panel"',
'data-testid="iwooos-decision-runway-dependency-grid"',
'data-testid="iwooos-decision-runway-boundary-strip"',
'data-testid="iwooos-decision-runway-boundaries"',
"IwoooSDecisionRunwayBoard",
"IwoooSDecisionRunwayStepKey",
"IwoooSDecisionRunwayStep",
"IwoooSDecisionRunwayDependency",
"IwoooSDecisionRunwayBoundarySignal",
"iwooosDecisionRunwaySteps",
"iwooosDecisionRunwayDependencies",
"iwooosDecisionRunwayBoundarySignals",
"iwooosDecisionRunwayBoundaries",
"iwooos-decision-runway-grid",
]:
assert_text_contains(
"iwooos_page.decision_runway",
iwooos_projection_page,
text,
)
assert_text_before(
"iwooos_page.topology_atlas_before_decision_runway",
iwooos_projection_page,
"<IwoooSTopologyAtlasBoard />",
"<IwoooSDecisionRunwayBoard />",
)
assert_text_before(
"iwooos_page.decision_runway_before_gate_radar",
iwooos_projection_page,
"<IwoooSDecisionRunwayBoard />",
"<IwoooSGateRadarBoard />",
)
assert_text_before(
"iwooos_page.decision_runway_before_command_map",
iwooos_projection_page,
"<IwoooSDecisionRunwayBoard />",
"<IwoooSCommandMapBoard />",
)
for text in [
"iwooos_decision_runway_first_layer=true",
"iwooos_decision_runway_step_count=5",
"iwooos_decision_runway_default_step=ownerEvidence",
"iwooos_decision_runway_dependency_count=6",
"iwooos_decision_runway_boundary_signal_count=4",
"iwooos_decision_runway_above_gate_radar=true",
"iwooos_decision_runway_interactive_step_allowed=true",
"iwooos_decision_runway_execution_action_buttons_allowed=false",
"iwooos_decision_runway_runtime_gate_count=0",
"iwooos_decision_runway_owner_response_received_count=0",
"iwooos_decision_runway_owner_response_accepted_count=0",
"iwooos_decision_runway_scan_authorized=false",
"iwooos_decision_runway_host_change_authorized=false",
"iwooos_decision_runway_source_control_mutation_authorized=false",
"runtime_execution_authorized=false",
"active_runtime_gate_count=0",
"action_buttons_allowed=false",
"not_authorization=true",
]:
assert_text_contains(
"iwooos_page.decision_runway_boundary",
iwooos_projection_page,
text,
)
for text in [
'data-testid="iwooos-gate-radar-board"',
'data-testid="iwooos-gate-radar-canvas"',
@@ -12761,6 +12876,133 @@ def validate(root: Path) -> None:
f"iwooos_projection.topology_intelligence_deck.{insight_id}.not_authorization",
item["not_authorization"],
)
expected_decision_runway_step_ids = [
"ownerEvidence",
"reviewerAcceptance",
"hostWindow",
"githubPrimary",
"runtimeGate",
]
decision_runway_steps = iwooos_projection["decision_runway_steps"]
assert_equal(
"iwooos_projection.decision_runway_steps.ids",
[item["step_id"] for item in decision_runway_steps],
expected_decision_runway_step_ids,
)
assert_equal(
"iwooos_projection.decision_runway_steps.display_order",
[item["display_order"] for item in decision_runway_steps],
list(range(1, len(expected_decision_runway_step_ids) + 1)),
)
assert_equal(
"iwooos_projection.decision_runway_steps.progress",
[item["progress"] for item in decision_runway_steps],
[18, 12, 35, 22, 0],
)
for item in decision_runway_steps:
step_id = item["step_id"]
assert_equal(
f"iwooos_projection.decision_runway_steps.{step_id}.display_mode",
item["display_mode"],
"first_screen_decision_runway",
)
assert_true(
f"iwooos_projection.decision_runway_steps.{step_id}.interactive_step_allowed",
item["interactive_step_allowed"],
)
assert_false(
f"iwooos_projection.decision_runway_steps.{step_id}.execution_action_button_allowed",
item["execution_action_button_allowed"],
)
assert_false(
f"iwooos_projection.decision_runway_steps.{step_id}.scan_authorized",
item["scan_authorized"],
)
assert_false(
f"iwooos_projection.decision_runway_steps.{step_id}.host_change_authorized",
item["host_change_authorized"],
)
assert_false(
f"iwooos_projection.decision_runway_steps.{step_id}.source_control_mutation_authorized",
item["source_control_mutation_authorized"],
)
assert_false(
f"iwooos_projection.decision_runway_steps.{step_id}.runtime_gate_opened",
item["runtime_gate_opened"],
)
assert_false(
f"iwooos_projection.decision_runway_steps.{step_id}.runtime_execution_authorized",
item["runtime_execution_authorized"],
)
assert_true(
f"iwooos_projection.decision_runway_steps.{step_id}.not_authorization",
item["not_authorization"],
)
expected_decision_runway_dependency_ids = [
"iwooos",
"awooop",
"vibework",
"kali",
"devHosts",
"monitoring",
]
decision_runway_dependencies = iwooos_projection["decision_runway_dependencies"]
assert_equal(
"iwooos_projection.decision_runway_dependencies.ids",
[item["dependency_id"] for item in decision_runway_dependencies],
expected_decision_runway_dependency_ids,
)
assert_equal(
"iwooos_projection.decision_runway_dependencies.display_order",
[item["display_order"] for item in decision_runway_dependencies],
list(range(1, len(expected_decision_runway_dependency_ids) + 1)),
)
for item in decision_runway_dependencies:
dependency_id = item["dependency_id"]
assert_equal(
f"iwooos_projection.decision_runway_dependencies.{dependency_id}.display_mode",
item["display_mode"],
"first_screen_decision_runway_dependency",
)
assert_false(
f"iwooos_projection.decision_runway_dependencies.{dependency_id}.runtime_delta",
item["runtime_delta"],
)
assert_true(
f"iwooos_projection.decision_runway_dependencies.{dependency_id}.not_authorization",
item["not_authorization"],
)
expected_decision_runway_boundary_signal_ids = [
"scan",
"hostChange",
"sourceMutation",
"runtimeExecution",
]
decision_runway_boundary_signals = iwooos_projection["decision_runway_boundary_signals"]
assert_equal(
"iwooos_projection.decision_runway_boundary_signals.ids",
[item["signal_id"] for item in decision_runway_boundary_signals],
expected_decision_runway_boundary_signal_ids,
)
assert_equal(
"iwooos_projection.decision_runway_boundary_signals.display_order",
[item["display_order"] for item in decision_runway_boundary_signals],
list(range(1, len(expected_decision_runway_boundary_signal_ids) + 1)),
)
for item in decision_runway_boundary_signals:
signal_id = item["signal_id"]
assert_false(
f"iwooos_projection.decision_runway_boundary_signals.{signal_id}.authorized",
item["authorized"],
)
assert_false(
f"iwooos_projection.decision_runway_boundary_signals.{signal_id}.runtime_gate_opened",
item["runtime_gate_opened"],
)
assert_true(
f"iwooos_projection.decision_runway_boundary_signals.{signal_id}.not_authorization",
item["not_authorization"],
)
expected_gate_radar_lane_ids = [
"visible",
"blocker",
@@ -13342,6 +13584,115 @@ def validate(root: Path) -> None:
list(web_messages_en["iwooos"]["topologyAtlas"]["charts"][key].keys()),
field,
)
assert_contains(
"web_messages.zh-TW.iwooos.decisionRunway",
list(web_messages_zh["iwooos"].keys()),
"decisionRunway",
)
assert_contains(
"web_messages.en.iwooos.decisionRunway",
list(web_messages_en["iwooos"].keys()),
"decisionRunway",
)
for key in [
"eyebrow",
"title",
"subtitle",
"railLabel",
"selectorLabel",
"fields",
"boundarySignals",
"steps",
"dependencies",
"boundaryTitle",
"boundaryIntro",
]:
assert_contains(
"web_messages.zh-TW.iwooos.decisionRunway.keys",
list(web_messages_zh["iwooos"]["decisionRunway"].keys()),
key,
)
assert_contains(
"web_messages.en.iwooos.decisionRunway.keys",
list(web_messages_en["iwooos"]["decisionRunway"].keys()),
key,
)
for key in ["evidence", "next", "blocked"]:
assert_contains(
"web_messages.zh-TW.iwooos.decisionRunway.fields",
list(web_messages_zh["iwooos"]["decisionRunway"]["fields"].keys()),
key,
)
assert_contains(
"web_messages.en.iwooos.decisionRunway.fields",
list(web_messages_en["iwooos"]["decisionRunway"]["fields"].keys()),
key,
)
for key in expected_decision_runway_boundary_signal_ids:
assert_contains(
"web_messages.zh-TW.iwooos.decisionRunway.boundarySignals",
list(web_messages_zh["iwooos"]["decisionRunway"]["boundarySignals"].keys()),
key,
)
assert_contains(
"web_messages.en.iwooos.decisionRunway.boundarySignals",
list(web_messages_en["iwooos"]["decisionRunway"]["boundarySignals"].keys()),
key,
)
assert_contains(
f"web_messages.zh-TW.iwooos.decisionRunway.boundarySignals.{key}",
list(web_messages_zh["iwooos"]["decisionRunway"]["boundarySignals"][key].keys()),
"label",
)
assert_contains(
f"web_messages.en.iwooos.decisionRunway.boundarySignals.{key}",
list(web_messages_en["iwooos"]["decisionRunway"]["boundarySignals"][key].keys()),
"label",
)
for key in expected_decision_runway_step_ids:
assert_contains(
"web_messages.zh-TW.iwooos.decisionRunway.steps",
list(web_messages_zh["iwooos"]["decisionRunway"]["steps"].keys()),
key,
)
assert_contains(
"web_messages.en.iwooos.decisionRunway.steps",
list(web_messages_en["iwooos"]["decisionRunway"]["steps"].keys()),
key,
)
for field in ["short", "title", "body", "evidence", "next", "blocked"]:
assert_contains(
f"web_messages.zh-TW.iwooos.decisionRunway.steps.{key}",
list(web_messages_zh["iwooos"]["decisionRunway"]["steps"][key].keys()),
field,
)
assert_contains(
f"web_messages.en.iwooos.decisionRunway.steps.{key}",
list(web_messages_en["iwooos"]["decisionRunway"]["steps"][key].keys()),
field,
)
for key in expected_decision_runway_dependency_ids:
assert_contains(
"web_messages.zh-TW.iwooos.decisionRunway.dependencies",
list(web_messages_zh["iwooos"]["decisionRunway"]["dependencies"].keys()),
key,
)
assert_contains(
"web_messages.en.iwooos.decisionRunway.dependencies",
list(web_messages_en["iwooos"]["decisionRunway"]["dependencies"].keys()),
key,
)
for field in ["title", "body"]:
assert_contains(
f"web_messages.zh-TW.iwooos.decisionRunway.dependencies.{key}",
list(web_messages_zh["iwooos"]["decisionRunway"]["dependencies"][key].keys()),
field,
)
assert_contains(
f"web_messages.en.iwooos.decisionRunway.dependencies.{key}",
list(web_messages_en["iwooos"]["decisionRunway"]["dependencies"][key].keys()),
field,
)
assert_contains(
"web_messages.zh-TW.iwooos.gateRadar",
list(web_messages_zh["iwooos"].keys()),