diff --git a/apps/web/src/lib/navigation/product-ia.ts b/apps/web/src/lib/navigation/product-ia.ts index 37420d41..158908e9 100644 --- a/apps/web/src/lib/navigation/product-ia.ts +++ b/apps/web/src/lib/navigation/product-ia.ts @@ -114,11 +114,11 @@ export const PRODUCT_NAV_SECTIONS: ProductNavSection[] = [ }, { id: 'iwooos-security', - href: '/governance', + href: '/iwooos', labelKey: 'iwooos', Icon: ShieldCheck, aliases: ['/security-compliance'], - relatedPaths: ['/iwooos', '/security', '/compliance'], + relatedPaths: ['/security', '/compliance'], }, { id: 'code-review', diff --git a/scripts/security/security-mirror-progress-guard.py b/scripts/security/security-mirror-progress-guard.py index f06e306f..f4b0de1f 100755 --- a/scripts/security/security-mirror-progress-guard.py +++ b/scripts/security/security-mirror-progress-guard.py @@ -409,6 +409,9 @@ def validate(root: Path) -> None: public_security_redaction = ( root / "apps" / "web" / "src" / "lib" / "public-security-redaction.ts" ).read_text(encoding="utf-8") + product_ia = (root / "apps" / "web" / "src" / "lib" / "navigation" / "product-ia.ts").read_text( + encoding="utf-8" + ) sidebar = (root / "apps" / "web" / "src" / "components" / "layout" / "sidebar.tsx").read_text( encoding="utf-8" ) @@ -646,14 +649,22 @@ def validate(root: Path) -> None: intake_contracts = [contract for wave in intake["intake_waves"] for contract in wave["contracts"]] assert_contains("intake.contracts", intake_contracts, "iwooos_posture_projection_v1") - assert_text_contains("sidebar.iwooos_security_unified_entry", sidebar, "id: 'iwooos-security'") - assert_text_contains("sidebar.iwooos_security_label", sidebar, "labelKey: 'iwooos'") - assert_text_not_contains("sidebar.iwooos_security_duplicate_label", sidebar, "labelKey: 'iwooosSecurityCompliance'") - assert_text_contains("sidebar.security_compliance_alias", sidebar, "aliases: ['/security-compliance']") + assert_text_contains("product_ia.iwooos_security_unified_entry", product_ia, "id: 'iwooos-security'") + assert_text_contains("product_ia.iwooos_security_route", product_ia, "href: '/iwooos'") + assert_text_contains("product_ia.iwooos_security_label", product_ia, "labelKey: 'iwooos'") + assert_text_not_contains( + "product_ia.iwooos_security_duplicate_label", + product_ia, + "labelKey: 'iwooosSecurityCompliance'", + ) + assert_text_contains("product_ia.security_compliance_alias", product_ia, "aliases: ['/security-compliance']") assert_text_not_contains("sidebar.duplicate_security_compliance_entry", sidebar, "id: 'security-compliance'") - assert_text_contains("command_palette.iwooos_entry", command_palette, "id: 'iwooos'") - assert_text_contains("command_palette.iwooos_route", command_palette, "nav('/iwooos')") - assert_text_contains("command_palette.security_keyword", command_palette, "'安全合規'") + assert_text_contains("command_palette.iwooos_entry", command_palette, "'iwooos-security'") + assert_text_contains( + "command_palette.product_ia_source", + command_palette, + "PRODUCT_NAV_SECTIONS.flatMap(section => section.items)", + ) assert_text_not_contains("command_palette.legacy_security_entry", command_palette, "id: 'security'") assert_text_not_contains("command_palette.legacy_security_compliance_route", command_palette, "nav('/security-compliance')") assert_equal(