From c43620a005e9fc39771dd8215c2c922ce7a55e40 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 25 Jun 2026 20:08:39 -0400 Subject: [PATCH] phase 16 implementation --- .gitignore | 21 +- CONTRIBUTING.md | 9 + PHASE_14_PACKAGE_MANIFEST_v1.0.json | 2350 ++++++++++++ PHASE_15_PACKAGE_MANIFEST_v1.0.json | 2762 ++++++++++++++ PHASE_16_PACKAGE_MANIFEST_v1.0.json | 3263 +++++++++++++++++ README.md | 126 +- docs/DECISION_LOG_v14.0.md | 36 + docs/DECISION_LOG_v15.0.md | 39 + docs/DECISION_LOG_v16.0.md | 28 + docs/IMPLEMENTATION_ISSUE_REGISTER_v1.4.csv | 43 + docs/IMPLEMENTATION_ISSUE_REGISTER_v1.5.csv | 48 + docs/IMPLEMENTATION_ISSUE_REGISTER_v1.6.csv | 48 + docs/PHASE_14_IMPLEMENTATION_REPORT_v1.0.md | 191 + docs/PHASE_15_HANDOFF_v1.0.md | 119 + docs/PHASE_15_IMPLEMENTATION_REPORT_v1.0.md | 191 + docs/PHASE_16_HANDOFF_v1.0.md | 65 + ...6_IMPLEMENTATION_AND_LAUNCH_REPORT_v1.0.md | 241 ++ docs/PHASE_17_OPERATIONS_HANDOFF_v1.0.md | 5 + .../phase14/ANALYTICS_EVENT_REGISTRY_v1.0.csv | 7 + docs/phase14/COMPONENT_VARIANT_UPDATE_v1.0.md | 8 + docs/phase14/CONSENT_MATRIX_v1.0.csv | 6 + docs/phase14/DATA_FLOW_INVENTORY_v1.0.csv | 11 + docs/phase14/DEMO_FORM_CONTRACT_v1.0.md | 25 + docs/phase14/DESTINATION_REGISTRY_v1.0.csv | 11 + .../ENVIRONMENT_VARIABLE_INVENTORY_v1.0.csv | 9 + .../EXTERNAL_SERVICE_INVENTORY_v1.0.csv | 6 + docs/phase14/FEATURE_FLAG_INVENTORY_v1.0.csv | 9 + docs/phase14/INTEGRATION_ARCHITECTURE_v1.0.md | 23 + .../INTEGRATION_TRACEABILITY_MATRIX_v1.0.csv | 6 + .../PERFORMANCE_AND_BUNDLE_REPORT_v1.0.md | 9 + docs/phase14/PRIVACY_REVIEW_REPORT_v1.0.md | 9 + docs/phase14/RELEASE_GATE_MATRIX_v1.0.csv | 11 + docs/phase14/SECURITY_REVIEW_REPORT_v1.0.md | 25 + .../SUCCESS_FAILURE_STATE_INVENTORY_v1.0.csv | 10 + docs/phase15/ABUSE_CONTROL_REPORT_v1.0.md | 22 + .../ANALYTICS_VALIDATION_REPORT_v1.0.md | 21 + .../AUTOMATED_ACCESSIBILITY_REPORT_v1.0.md | 21 + docs/phase15/BROWSER_HISTORY_REPORT_v1.0.md | 21 + docs/phase15/BUNDLE_ANALYSIS_REPORT_v1.0.md | 21 + .../CLEAN_ROOM_BASELINE_REPORT_v1.0.md | 24 + docs/phase15/COMMAND_MATRIX_v1.0.csv | 27 + .../phase15/CONSENT_VALIDATION_REPORT_v1.0.md | 23 + docs/phase15/CONTENT_EVIDENCE_REVIEW_v1.0.md | 22 + .../phase15/CROSS_BROWSER_TEST_REPORT_v1.0.md | 22 + docs/phase15/DEFECT_REGISTER_v1.0.csv | 6 + .../DEPLOYMENT_REHEARSAL_REPORT_v1.0.md | 21 + docs/phase15/DESIGN_FIDELITY_REPORT_v1.0.md | 21 + .../DESTINATION_BROKEN_LINK_REPORT_v1.0.md | 23 + docs/phase15/DEVICE_VIEWPORT_REPORT_v1.0.md | 21 + docs/phase15/END_TO_END_TEST_REPORT_v1.0.md | 22 + .../phase15/FAILURE_SIMULATION_REPORT_v1.0.md | 21 + .../FINAL_RELEASE_RECOMMENDATION_v1.0.md | 38 + .../IDEMPOTENCY_DUPLICATE_REPORT_v1.0.md | 22 + .../IMAGE_FONT_PERFORMANCE_REPORT_v1.0.md | 21 + docs/phase15/INTEGRATION_TEST_REPORT_v1.0.md | 23 + .../KEYBOARD_ACCESSIBILITY_REPORT_v1.0.md | 21 + docs/phase15/LOCALIZATION_QA_REPORT_v1.0.md | 24 + docs/phase15/MANUAL_TEST_MATRIX_v1.0.csv | 9 + .../OBSERVABILITY_VALIDATION_REPORT_v1.0.md | 21 + docs/phase15/PERFORMANCE_REPORT_v1.0.md | 22 + .../phase15/PRIVACY_VALIDATION_REPORT_v1.0.md | 23 + docs/phase15/RELEASE_GATE_MATRIX_v1.0.csv | 21 + .../REPOSITORY_INTEGRITY_AUDIT_v1.0.md | 23 + docs/phase15/RETEST_REPORT_v1.0.md | 24 + .../phase15/RISK_ACCEPTANCE_REGISTER_v1.0.csv | 1 + docs/phase15/RISK_ACCEPTANCE_SUMMARY_v1.0.md | 3 + .../phase15/ROLLBACK_REHEARSAL_REPORT_v1.0.md | 20 + docs/phase15/RTL_QA_REPORT_v1.0.md | 22 + docs/phase15/SCREEN_READER_REPORT_v1.0.md | 22 + .../SECURITY_VALIDATION_REPORT_v1.0.md | 23 + docs/phase15/SEO_METADATA_REVIEW_v1.0.md | 22 + docs/phase15/STATIC_ANALYSIS_REPORT_v1.0.md | 24 + docs/phase15/THEME_QA_REPORT_v1.0.md | 22 + docs/phase15/UNIT_TEST_REPORT_v1.0.md | 22 + docs/phase15/VISUAL_REGRESSION_REPORT_v1.0.md | 22 + .../WCAG_2_2_AA_EVIDENCE_MATRIX_v1.0.csv | 37 + docs/phase15/ZOOM_REFLOW_REPORT_v1.0.md | 23 + .../ACCESSIBILITY_APPROVAL_RECORD_v1.0.csv | 2 + .../ANALYTICS_APPROVAL_RECORD_v1.0.csv | 2 + docs/phase16/ARABIC_APPROVAL_RECORD_v1.0.csv | 2 + docs/phase16/ASSET_APPROVAL_RECORD_v1.0.csv | 2 + .../CDN_CACHING_VALIDATION_REPORT_v1.0.md | 11 + ...OMMAND_AND_PLATFORM_ACTION_MATRIX_v1.0.csv | 38 + docs/phase16/COMPLETE_LAUNCH_RECORD_v1.0.md | 31 + docs/phase16/CONSENT_APPROVAL_RECORD_v1.0.csv | 2 + .../CONTROLLED_LIVE_SUBMISSION_REPORT_v1.0.md | 11 + .../phase16/CRM_OPERATIONAL_APPROVAL_v1.0.csv | 2 + ...CUSTOMER_EVIDENCE_APPROVAL_RECORD_v1.0.csv | 2 + docs/phase16/DEFERRED_WORK_REGISTER_v1.0.csv | 42 + docs/phase16/DEPLOYMENT_LOG_v1.0.csv | 2 + docs/phase16/DNS_CUTOVER_LOG_v1.0.csv | 2 + docs/phase16/DOMAIN_DNS_PLAN_v1.0.md | 11 + ...AIL_SENDER_DOMAIN_READINESS_REPORT_v1.0.md | 11 + .../FEATURE_FLAG_RELEASE_STATE_v1.0.csv | 9 + ...FINAL_ACCEPTED_EXCEPTION_REGISTER_v1.0.csv | 2 + ...AL_CLAIM_EVIDENCE_APPROVAL_RECORD_v1.0.csv | 2 + .../FINAL_CONTENT_APPROVAL_RECORD_v1.0.csv | 2 + .../FINAL_DEFECT_DISPOSITION_REPORT_v1.0.csv | 6 + .../FINAL_DEFECT_DISPOSITION_REPORT_v1.0.md | 5 + docs/phase16/FINAL_LAUNCH_STATUS_v1.0.md | 19 + ..._POST_DEPLOYMENT_SMOKE_TEST_REPORT_v1.0.md | 11 + .../FINAL_RELEASE_GATE_MATRIX_v1.0.csv | 33 + docs/phase16/FRENCH_APPROVAL_RECORD_v1.0.csv | 2 + .../FROZEN_RELEASE_CANDIDATE_RECORD_v1.0.md | 20 + docs/phase16/HOTFIX_RECORD_v1.0.csv | 2 + docs/phase16/INCIDENT_RESPONSE_PLAN_v1.0.md | 11 + .../LAUNCH_AUTHORIZATION_RECORD_v1.0.md | 23 + docs/phase16/LAUNCH_MONITORING_REPORT_v1.0.md | 11 + docs/phase16/LAUNCH_OWNER_MATRIX_v1.0.csv | 24 + docs/phase16/LEGAL_APPROVAL_RECORD_v1.0.csv | 2 + ...VE_ACCESSIBILITY_SPOT_CHECK_REPORT_v1.0.md | 11 + .../LIVE_ANALYTICS_VALIDATION_REPORT_v1.0.md | 11 + .../LIVE_CONSENT_VALIDATION_REPORT_v1.0.md | 11 + ...VE_CRM_SCHEDULER_VALIDATION_REPORT_v1.0.md | 11 + .../LIVE_LOCALIZATION_RTL_REPORT_v1.0.md | 11 + docs/phase16/LIVE_PERFORMANCE_REPORT_v1.0.md | 11 + docs/phase16/LIVE_PRIVACY_REPORT_v1.0.md | 11 + docs/phase16/LIVE_SECURITY_REPORT_v1.0.md | 11 + .../LOCALIZATION_APPROVAL_RECORD_v1.0.csv | 2 + ...OBSERVABILITY_CONFIGURATION_REPORT_v1.0.md | 11 + docs/phase16/OPERATIONAL_HANDOFF_v1.0.md | 11 + .../PHASE_15_RECOMMENDATION_REVIEW_v1.0.md | 21 + ...UNCH_CONTENT_EVIDENCE_VERIFICATION_v1.0.md | 11 + docs/phase16/POST_LAUNCH_SEO_REPORT_v1.0.md | 11 + ...AUNCH_PRODUCTION_VALIDATION_REPORT_v1.0.md | 11 + docs/phase16/PRIVACY_APPROVAL_RECORD_v1.0.csv | 2 + ...ON_ENVIRONMENT_VARIABLE_INVENTORY_v1.0.csv | 9 + ...ODUCTION_INFRASTRUCTURE_INVENTORY_v1.0.csv | 25 + .../PRODUCTION_SMOKE_TEST_REPORT_v1.0.csv | 33 + docs/phase16/ROLLBACK_DECISION_RECORD_v1.0.md | 7 + docs/phase16/ROLLBACK_PLAN_v1.0.md | 11 + .../SCHEDULER_OPERATIONAL_APPROVAL_v1.0.csv | 2 + ...SEARCH_ENGINE_CONFIGURATION_REPORT_v1.0.md | 11 + .../SECRET_PROVISIONING_RECORD_v1.0.csv | 11 + .../phase16/SECURITY_APPROVAL_RECORD_v1.0.csv | 2 + .../SECURITY_HEADER_VALIDATION_REPORT_v1.0.md | 11 + .../TARGETED_REGRESSION_REPORT_v1.0.md | 13 + docs/phase16/TLS_VALIDATION_REPORT_v1.0.md | 11 + docs/quality/PHASE_14_COMMAND_LOG_v1.0.txt | 43 + docs/quality/PHASE_14_FILE_CHANGES_v1.0.txt | 137 + .../PHASE_14_HTTP_ROUTE_RESULTS_v1.0.json | 32 + .../PHASE_14_MANUAL_QA_RESULTS_v1.0.csv | 11 + .../PHASE_14_VALIDATION_RESULTS_v1.0.json | 139 + .../PHASE_14_VALIDATION_RESULTS_v1.0.md | 27 + ...ASE_14_VISUAL_REGRESSION_RESULTS_v1.0.json | 12 + ...15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.json | 199 + ...E_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.md | 148 + docs/quality/PHASE_15_COMMAND_LOG_v1.0.txt | 185 + docs/quality/PHASE_15_FILE_CHANGES_v1.0.txt | 114 + .../PHASE_15_STATIC_AUDIT_RESULTS_v1.0.json | 126 + .../PHASE_15_STATIC_AUDIT_RESULTS_v1.0.md | 135 + .../PHASE_15_VALIDATION_RESULTS_v1.0.json | 97 + .../PHASE_15_VALIDATION_RESULTS_v1.0.md | 29 + ...SE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json | 565 +++ ...HASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md | 574 +++ .../PHASE_16_LOCAL_COMMAND_RESULTS_v1.0.json | 182 + .../PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json | 126 + .../PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md | 135 + .../phase14/format-check-initial.duration | 1 + .../logs/phase14/format-check-initial.exit | 1 + .../logs/phase14/format-check.duration | 1 + docs/quality/logs/phase14/format-check.exit | 1 + docs/quality/logs/phase14/format-write.exit | 1 + .../logs/phase14/lint-initial.duration | 1 + docs/quality/logs/phase14/lint-initial.exit | 1 + docs/quality/logs/phase14/lint.duration | 1 + docs/quality/logs/phase14/lint.exit | 1 + docs/quality/logs/phase14/next-typegen.exit | 1 + .../logs/phase14/npm-install-baseline.exit | 1 + .../logs/phase14/npm-install-offline.duration | 1 + .../logs/phase14/npm-install-offline.exit | 1 + .../logs/phase14/static-validations.duration | 1 + .../logs/phase14/static-validations.exit | 1 + .../logs/phase14/typecheck-initial.duration | 1 + .../logs/phase14/typecheck-initial.exit | 1 + docs/quality/logs/phase14/typecheck.duration | 1 + docs/quality/logs/phase14/typecheck.exit | 1 + .../phase15-command-logs/01-validate.json | 1 + .../06-current-validations.exit | 1 + .../07-current-static-audit.exit | 1 + .../08-content-type-behavior.exit | 1 + .../phase15-command-logs/09-syntax-check.exit | 1 + .../11-corepack-prepare-pnpm.exit | 1 + .../22-final-validations.exit | 1 + next-env.d.ts | 2 +- package.json | 26 +- playwright.config.ts | 6 + scripts/generate-phase14-manifest.mjs | 56 + scripts/generate-phase15-manifest.mjs | 58 + scripts/generate-phase15-reports.py | 621 ++++ scripts/generate-phase16-manifest.mjs | 43 + scripts/phase15-static-audit.py | 324 ++ scripts/phase16-static-audit.py | 325 ++ scripts/prepare-typecheck.mjs | 4 + scripts/run-checks.mjs | 3 + scripts/run-validations.mjs | 6 + scripts/validate-phase14-environment.mjs | 35 + scripts/validate-phase14-integrations.mjs | 72 + scripts/validate-phase14-manifest.mjs | 69 + scripts/validate-phase14-privacy.mjs | 35 + scripts/validate-phase14-security.mjs | 43 + scripts/validate-phase15-manifest.mjs | 75 + scripts/validate-phase15-readiness.mjs | 111 + scripts/validate-phase16-manifest.mjs | 46 + scripts/validate-phase16-readiness.mjs | 31 + src/app/[locale]/layout.tsx | 21 +- src/app/[locale]/page.tsx | 32 +- src/app/api/demo/route.ts | 159 + src/components/app-shell/MobileNavigation.tsx | 16 +- src/components/app-shell/SiteFooter.tsx | 11 +- .../app-shell/SiteHeader.module.css | 6 + src/components/app-shell/SiteHeader.tsx | 26 +- src/components/forms/FormField.tsx | 10 +- src/components/forms/TextInput.tsx | 28 +- .../integrations/DemoDialogHost.module.css | 76 + .../integrations/DemoDialogHost.tsx | 449 +++ src/components/integrations/DemoTrigger.tsx | 62 + src/components/marketing/CTA.tsx | 34 +- src/content/locales/ar/homepage.json | 29 +- src/content/locales/en/homepage.json | 29 +- src/content/locales/fr/homepage.json | 29 +- src/lib/analytics/client.ts | 25 + src/lib/analytics/events.ts | 82 + src/lib/demo/adapters/blocked.ts | 14 + src/lib/demo/adapters/index.ts | 17 + src/lib/demo/adapters/local.ts | 46 + src/lib/demo/adapters/types.ts | 23 + src/lib/demo/idempotency.ts | 46 + src/lib/demo/redaction.ts | 32 + src/lib/demo/schema.ts | 94 + src/lib/demo/service.ts | 69 + src/lib/integrations/destinations.ts | 165 + src/lib/integrations/environment.ts | 119 + src/lib/integrations/feature-flags.ts | 25 + src/lib/security/content-type.ts | 9 + .../integrations/demo-workflow.a11y.spec.ts | 15 + tests/browser/homepage.spec.ts | 4 +- .../integrations/demo-workflow.spec.ts | 74 + tests/integration/demo-service.test.ts | 97 + tests/unit/integrations/analytics.test.ts | 30 + tests/unit/integrations/content-type.test.ts | 22 + tests/unit/integrations/demo-schema.test.ts | 46 + tests/unit/integrations/destinations.test.ts | 27 + tests/unit/integrations/redaction.test.ts | 21 + tests/visual/component-system.visual.spec.ts | 3 +- tests/visual/integrations.visual.spec.ts | 24 + tsconfig.json | 1 + vitest.integration.config.ts | 13 + 248 files changed, 18458 insertions(+), 90 deletions(-) create mode 100644 PHASE_14_PACKAGE_MANIFEST_v1.0.json create mode 100644 PHASE_15_PACKAGE_MANIFEST_v1.0.json create mode 100644 PHASE_16_PACKAGE_MANIFEST_v1.0.json create mode 100644 docs/DECISION_LOG_v14.0.md create mode 100644 docs/DECISION_LOG_v15.0.md create mode 100644 docs/DECISION_LOG_v16.0.md create mode 100644 docs/IMPLEMENTATION_ISSUE_REGISTER_v1.4.csv create mode 100644 docs/IMPLEMENTATION_ISSUE_REGISTER_v1.5.csv create mode 100644 docs/IMPLEMENTATION_ISSUE_REGISTER_v1.6.csv create mode 100644 docs/PHASE_14_IMPLEMENTATION_REPORT_v1.0.md create mode 100644 docs/PHASE_15_HANDOFF_v1.0.md create mode 100644 docs/PHASE_15_IMPLEMENTATION_REPORT_v1.0.md create mode 100644 docs/PHASE_16_HANDOFF_v1.0.md create mode 100644 docs/PHASE_16_IMPLEMENTATION_AND_LAUNCH_REPORT_v1.0.md create mode 100644 docs/PHASE_17_OPERATIONS_HANDOFF_v1.0.md create mode 100644 docs/phase14/ANALYTICS_EVENT_REGISTRY_v1.0.csv create mode 100644 docs/phase14/COMPONENT_VARIANT_UPDATE_v1.0.md create mode 100644 docs/phase14/CONSENT_MATRIX_v1.0.csv create mode 100644 docs/phase14/DATA_FLOW_INVENTORY_v1.0.csv create mode 100644 docs/phase14/DEMO_FORM_CONTRACT_v1.0.md create mode 100644 docs/phase14/DESTINATION_REGISTRY_v1.0.csv create mode 100644 docs/phase14/ENVIRONMENT_VARIABLE_INVENTORY_v1.0.csv create mode 100644 docs/phase14/EXTERNAL_SERVICE_INVENTORY_v1.0.csv create mode 100644 docs/phase14/FEATURE_FLAG_INVENTORY_v1.0.csv create mode 100644 docs/phase14/INTEGRATION_ARCHITECTURE_v1.0.md create mode 100644 docs/phase14/INTEGRATION_TRACEABILITY_MATRIX_v1.0.csv create mode 100644 docs/phase14/PERFORMANCE_AND_BUNDLE_REPORT_v1.0.md create mode 100644 docs/phase14/PRIVACY_REVIEW_REPORT_v1.0.md create mode 100644 docs/phase14/RELEASE_GATE_MATRIX_v1.0.csv create mode 100644 docs/phase14/SECURITY_REVIEW_REPORT_v1.0.md create mode 100644 docs/phase14/SUCCESS_FAILURE_STATE_INVENTORY_v1.0.csv create mode 100644 docs/phase15/ABUSE_CONTROL_REPORT_v1.0.md create mode 100644 docs/phase15/ANALYTICS_VALIDATION_REPORT_v1.0.md create mode 100644 docs/phase15/AUTOMATED_ACCESSIBILITY_REPORT_v1.0.md create mode 100644 docs/phase15/BROWSER_HISTORY_REPORT_v1.0.md create mode 100644 docs/phase15/BUNDLE_ANALYSIS_REPORT_v1.0.md create mode 100644 docs/phase15/CLEAN_ROOM_BASELINE_REPORT_v1.0.md create mode 100644 docs/phase15/COMMAND_MATRIX_v1.0.csv create mode 100644 docs/phase15/CONSENT_VALIDATION_REPORT_v1.0.md create mode 100644 docs/phase15/CONTENT_EVIDENCE_REVIEW_v1.0.md create mode 100644 docs/phase15/CROSS_BROWSER_TEST_REPORT_v1.0.md create mode 100644 docs/phase15/DEFECT_REGISTER_v1.0.csv create mode 100644 docs/phase15/DEPLOYMENT_REHEARSAL_REPORT_v1.0.md create mode 100644 docs/phase15/DESIGN_FIDELITY_REPORT_v1.0.md create mode 100644 docs/phase15/DESTINATION_BROKEN_LINK_REPORT_v1.0.md create mode 100644 docs/phase15/DEVICE_VIEWPORT_REPORT_v1.0.md create mode 100644 docs/phase15/END_TO_END_TEST_REPORT_v1.0.md create mode 100644 docs/phase15/FAILURE_SIMULATION_REPORT_v1.0.md create mode 100644 docs/phase15/FINAL_RELEASE_RECOMMENDATION_v1.0.md create mode 100644 docs/phase15/IDEMPOTENCY_DUPLICATE_REPORT_v1.0.md create mode 100644 docs/phase15/IMAGE_FONT_PERFORMANCE_REPORT_v1.0.md create mode 100644 docs/phase15/INTEGRATION_TEST_REPORT_v1.0.md create mode 100644 docs/phase15/KEYBOARD_ACCESSIBILITY_REPORT_v1.0.md create mode 100644 docs/phase15/LOCALIZATION_QA_REPORT_v1.0.md create mode 100644 docs/phase15/MANUAL_TEST_MATRIX_v1.0.csv create mode 100644 docs/phase15/OBSERVABILITY_VALIDATION_REPORT_v1.0.md create mode 100644 docs/phase15/PERFORMANCE_REPORT_v1.0.md create mode 100644 docs/phase15/PRIVACY_VALIDATION_REPORT_v1.0.md create mode 100644 docs/phase15/RELEASE_GATE_MATRIX_v1.0.csv create mode 100644 docs/phase15/REPOSITORY_INTEGRITY_AUDIT_v1.0.md create mode 100644 docs/phase15/RETEST_REPORT_v1.0.md create mode 100644 docs/phase15/RISK_ACCEPTANCE_REGISTER_v1.0.csv create mode 100644 docs/phase15/RISK_ACCEPTANCE_SUMMARY_v1.0.md create mode 100644 docs/phase15/ROLLBACK_REHEARSAL_REPORT_v1.0.md create mode 100644 docs/phase15/RTL_QA_REPORT_v1.0.md create mode 100644 docs/phase15/SCREEN_READER_REPORT_v1.0.md create mode 100644 docs/phase15/SECURITY_VALIDATION_REPORT_v1.0.md create mode 100644 docs/phase15/SEO_METADATA_REVIEW_v1.0.md create mode 100644 docs/phase15/STATIC_ANALYSIS_REPORT_v1.0.md create mode 100644 docs/phase15/THEME_QA_REPORT_v1.0.md create mode 100644 docs/phase15/UNIT_TEST_REPORT_v1.0.md create mode 100644 docs/phase15/VISUAL_REGRESSION_REPORT_v1.0.md create mode 100644 docs/phase15/WCAG_2_2_AA_EVIDENCE_MATRIX_v1.0.csv create mode 100644 docs/phase15/ZOOM_REFLOW_REPORT_v1.0.md create mode 100644 docs/phase16/ACCESSIBILITY_APPROVAL_RECORD_v1.0.csv create mode 100644 docs/phase16/ANALYTICS_APPROVAL_RECORD_v1.0.csv create mode 100644 docs/phase16/ARABIC_APPROVAL_RECORD_v1.0.csv create mode 100644 docs/phase16/ASSET_APPROVAL_RECORD_v1.0.csv create mode 100644 docs/phase16/CDN_CACHING_VALIDATION_REPORT_v1.0.md create mode 100644 docs/phase16/COMMAND_AND_PLATFORM_ACTION_MATRIX_v1.0.csv create mode 100644 docs/phase16/COMPLETE_LAUNCH_RECORD_v1.0.md create mode 100644 docs/phase16/CONSENT_APPROVAL_RECORD_v1.0.csv create mode 100644 docs/phase16/CONTROLLED_LIVE_SUBMISSION_REPORT_v1.0.md create mode 100644 docs/phase16/CRM_OPERATIONAL_APPROVAL_v1.0.csv create mode 100644 docs/phase16/CUSTOMER_EVIDENCE_APPROVAL_RECORD_v1.0.csv create mode 100644 docs/phase16/DEFERRED_WORK_REGISTER_v1.0.csv create mode 100644 docs/phase16/DEPLOYMENT_LOG_v1.0.csv create mode 100644 docs/phase16/DNS_CUTOVER_LOG_v1.0.csv create mode 100644 docs/phase16/DOMAIN_DNS_PLAN_v1.0.md create mode 100644 docs/phase16/EMAIL_SENDER_DOMAIN_READINESS_REPORT_v1.0.md create mode 100644 docs/phase16/FEATURE_FLAG_RELEASE_STATE_v1.0.csv create mode 100644 docs/phase16/FINAL_ACCEPTED_EXCEPTION_REGISTER_v1.0.csv create mode 100644 docs/phase16/FINAL_CLAIM_EVIDENCE_APPROVAL_RECORD_v1.0.csv create mode 100644 docs/phase16/FINAL_CONTENT_APPROVAL_RECORD_v1.0.csv create mode 100644 docs/phase16/FINAL_DEFECT_DISPOSITION_REPORT_v1.0.csv create mode 100644 docs/phase16/FINAL_DEFECT_DISPOSITION_REPORT_v1.0.md create mode 100644 docs/phase16/FINAL_LAUNCH_STATUS_v1.0.md create mode 100644 docs/phase16/FINAL_POST_DEPLOYMENT_SMOKE_TEST_REPORT_v1.0.md create mode 100644 docs/phase16/FINAL_RELEASE_GATE_MATRIX_v1.0.csv create mode 100644 docs/phase16/FRENCH_APPROVAL_RECORD_v1.0.csv create mode 100644 docs/phase16/FROZEN_RELEASE_CANDIDATE_RECORD_v1.0.md create mode 100644 docs/phase16/HOTFIX_RECORD_v1.0.csv create mode 100644 docs/phase16/INCIDENT_RESPONSE_PLAN_v1.0.md create mode 100644 docs/phase16/LAUNCH_AUTHORIZATION_RECORD_v1.0.md create mode 100644 docs/phase16/LAUNCH_MONITORING_REPORT_v1.0.md create mode 100644 docs/phase16/LAUNCH_OWNER_MATRIX_v1.0.csv create mode 100644 docs/phase16/LEGAL_APPROVAL_RECORD_v1.0.csv create mode 100644 docs/phase16/LIVE_ACCESSIBILITY_SPOT_CHECK_REPORT_v1.0.md create mode 100644 docs/phase16/LIVE_ANALYTICS_VALIDATION_REPORT_v1.0.md create mode 100644 docs/phase16/LIVE_CONSENT_VALIDATION_REPORT_v1.0.md create mode 100644 docs/phase16/LIVE_CRM_SCHEDULER_VALIDATION_REPORT_v1.0.md create mode 100644 docs/phase16/LIVE_LOCALIZATION_RTL_REPORT_v1.0.md create mode 100644 docs/phase16/LIVE_PERFORMANCE_REPORT_v1.0.md create mode 100644 docs/phase16/LIVE_PRIVACY_REPORT_v1.0.md create mode 100644 docs/phase16/LIVE_SECURITY_REPORT_v1.0.md create mode 100644 docs/phase16/LOCALIZATION_APPROVAL_RECORD_v1.0.csv create mode 100644 docs/phase16/OBSERVABILITY_CONFIGURATION_REPORT_v1.0.md create mode 100644 docs/phase16/OPERATIONAL_HANDOFF_v1.0.md create mode 100644 docs/phase16/PHASE_15_RECOMMENDATION_REVIEW_v1.0.md create mode 100644 docs/phase16/POST_LAUNCH_CONTENT_EVIDENCE_VERIFICATION_v1.0.md create mode 100644 docs/phase16/POST_LAUNCH_SEO_REPORT_v1.0.md create mode 100644 docs/phase16/PRELAUNCH_PRODUCTION_VALIDATION_REPORT_v1.0.md create mode 100644 docs/phase16/PRIVACY_APPROVAL_RECORD_v1.0.csv create mode 100644 docs/phase16/PRODUCTION_ENVIRONMENT_VARIABLE_INVENTORY_v1.0.csv create mode 100644 docs/phase16/PRODUCTION_INFRASTRUCTURE_INVENTORY_v1.0.csv create mode 100644 docs/phase16/PRODUCTION_SMOKE_TEST_REPORT_v1.0.csv create mode 100644 docs/phase16/ROLLBACK_DECISION_RECORD_v1.0.md create mode 100644 docs/phase16/ROLLBACK_PLAN_v1.0.md create mode 100644 docs/phase16/SCHEDULER_OPERATIONAL_APPROVAL_v1.0.csv create mode 100644 docs/phase16/SEARCH_ENGINE_CONFIGURATION_REPORT_v1.0.md create mode 100644 docs/phase16/SECRET_PROVISIONING_RECORD_v1.0.csv create mode 100644 docs/phase16/SECURITY_APPROVAL_RECORD_v1.0.csv create mode 100644 docs/phase16/SECURITY_HEADER_VALIDATION_REPORT_v1.0.md create mode 100644 docs/phase16/TARGETED_REGRESSION_REPORT_v1.0.md create mode 100644 docs/phase16/TLS_VALIDATION_REPORT_v1.0.md create mode 100644 docs/quality/PHASE_14_COMMAND_LOG_v1.0.txt create mode 100644 docs/quality/PHASE_14_FILE_CHANGES_v1.0.txt create mode 100644 docs/quality/PHASE_14_HTTP_ROUTE_RESULTS_v1.0.json create mode 100644 docs/quality/PHASE_14_MANUAL_QA_RESULTS_v1.0.csv create mode 100644 docs/quality/PHASE_14_VALIDATION_RESULTS_v1.0.json create mode 100644 docs/quality/PHASE_14_VALIDATION_RESULTS_v1.0.md create mode 100644 docs/quality/PHASE_14_VISUAL_REGRESSION_RESULTS_v1.0.json create mode 100644 docs/quality/PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.json create mode 100644 docs/quality/PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.md create mode 100644 docs/quality/PHASE_15_COMMAND_LOG_v1.0.txt create mode 100644 docs/quality/PHASE_15_FILE_CHANGES_v1.0.txt create mode 100644 docs/quality/PHASE_15_STATIC_AUDIT_RESULTS_v1.0.json create mode 100644 docs/quality/PHASE_15_STATIC_AUDIT_RESULTS_v1.0.md create mode 100644 docs/quality/PHASE_15_VALIDATION_RESULTS_v1.0.json create mode 100644 docs/quality/PHASE_15_VALIDATION_RESULTS_v1.0.md create mode 100644 docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json create mode 100644 docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md create mode 100644 docs/quality/PHASE_16_LOCAL_COMMAND_RESULTS_v1.0.json create mode 100644 docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json create mode 100644 docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md create mode 100644 docs/quality/logs/phase14/format-check-initial.duration create mode 100644 docs/quality/logs/phase14/format-check-initial.exit create mode 100644 docs/quality/logs/phase14/format-check.duration create mode 100644 docs/quality/logs/phase14/format-check.exit create mode 100644 docs/quality/logs/phase14/format-write.exit create mode 100644 docs/quality/logs/phase14/lint-initial.duration create mode 100644 docs/quality/logs/phase14/lint-initial.exit create mode 100644 docs/quality/logs/phase14/lint.duration create mode 100644 docs/quality/logs/phase14/lint.exit create mode 100644 docs/quality/logs/phase14/next-typegen.exit create mode 100644 docs/quality/logs/phase14/npm-install-baseline.exit create mode 100644 docs/quality/logs/phase14/npm-install-offline.duration create mode 100644 docs/quality/logs/phase14/npm-install-offline.exit create mode 100644 docs/quality/logs/phase14/static-validations.duration create mode 100644 docs/quality/logs/phase14/static-validations.exit create mode 100644 docs/quality/logs/phase14/typecheck-initial.duration create mode 100644 docs/quality/logs/phase14/typecheck-initial.exit create mode 100644 docs/quality/logs/phase14/typecheck.duration create mode 100644 docs/quality/logs/phase14/typecheck.exit create mode 100644 docs/quality/phase15-command-logs/01-validate.json create mode 100644 docs/quality/phase15-command-logs/06-current-validations.exit create mode 100644 docs/quality/phase15-command-logs/07-current-static-audit.exit create mode 100644 docs/quality/phase15-command-logs/08-content-type-behavior.exit create mode 100644 docs/quality/phase15-command-logs/09-syntax-check.exit create mode 100644 docs/quality/phase16-command-logs/11-corepack-prepare-pnpm.exit create mode 100644 docs/quality/phase16-command-logs/22-final-validations.exit create mode 100644 scripts/generate-phase14-manifest.mjs create mode 100644 scripts/generate-phase15-manifest.mjs create mode 100755 scripts/generate-phase15-reports.py create mode 100644 scripts/generate-phase16-manifest.mjs create mode 100755 scripts/phase15-static-audit.py create mode 100755 scripts/phase16-static-audit.py create mode 100644 scripts/prepare-typecheck.mjs create mode 100644 scripts/validate-phase14-environment.mjs create mode 100644 scripts/validate-phase14-integrations.mjs create mode 100644 scripts/validate-phase14-manifest.mjs create mode 100644 scripts/validate-phase14-privacy.mjs create mode 100644 scripts/validate-phase14-security.mjs create mode 100644 scripts/validate-phase15-manifest.mjs create mode 100644 scripts/validate-phase15-readiness.mjs create mode 100644 scripts/validate-phase16-manifest.mjs create mode 100644 scripts/validate-phase16-readiness.mjs create mode 100644 src/app/api/demo/route.ts create mode 100644 src/components/integrations/DemoDialogHost.module.css create mode 100644 src/components/integrations/DemoDialogHost.tsx create mode 100644 src/components/integrations/DemoTrigger.tsx create mode 100644 src/lib/analytics/client.ts create mode 100644 src/lib/analytics/events.ts create mode 100644 src/lib/demo/adapters/blocked.ts create mode 100644 src/lib/demo/adapters/index.ts create mode 100644 src/lib/demo/adapters/local.ts create mode 100644 src/lib/demo/adapters/types.ts create mode 100644 src/lib/demo/idempotency.ts create mode 100644 src/lib/demo/redaction.ts create mode 100644 src/lib/demo/schema.ts create mode 100644 src/lib/demo/service.ts create mode 100644 src/lib/integrations/destinations.ts create mode 100644 src/lib/integrations/environment.ts create mode 100644 src/lib/integrations/feature-flags.ts create mode 100644 src/lib/security/content-type.ts create mode 100644 tests/a11y/integrations/demo-workflow.a11y.spec.ts create mode 100644 tests/browser/integrations/demo-workflow.spec.ts create mode 100644 tests/integration/demo-service.test.ts create mode 100644 tests/unit/integrations/analytics.test.ts create mode 100644 tests/unit/integrations/content-type.test.ts create mode 100644 tests/unit/integrations/demo-schema.test.ts create mode 100644 tests/unit/integrations/destinations.test.ts create mode 100644 tests/unit/integrations/redaction.test.ts create mode 100644 tests/visual/integrations.visual.spec.ts create mode 100644 vitest.integration.config.ts diff --git a/.gitignore b/.gitignore index 5cc0fde..4871c04 100644 --- a/.gitignore +++ b/.gitignore @@ -19,7 +19,8 @@ .LSOverride # Icon must end with two \r -Icon +Icon + # Thumbnails ._* @@ -40,3 +41,21 @@ Network Trash Folder Temporary Items .apdisk +# ---> Node.js +node_modules + +# ---> Next.js +.next/ + +# ---> Logs +*.log + +# ---> Environment +.env*.local + +# ---> Testing +coverage/ +playwright-report/ + +# ---> pnpm +.pnpm-store/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6256091..277200a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -37,3 +37,12 @@ Do not regenerate visual snapshots merely to silence a failure. A consistently w ## Architecture changes Changes to routing, localization loading, token authority, theme persistence, CSP, styling system, state management, metadata generation, or the server/client boundary require an ADR before implementation. + +## Phase 14 integration rules + +- Keep all vendor access behind typed server-side adapters. +- Never add personal data to URLs, analytics, logs, snapshots, or browser storage. +- Preserve the immutable Phase 9 form field contract unless an approved contract revision is supplied. +- Production demo submission must fail closed until legal, CRM, retention, duplicate, and operational decisions are approved. +- Browser tests use fictional `.test` identities and must never contact real services. +- Run `npm run validate:phase14`, `npm run typecheck`, `npm run test:unit`, `npm run test:integration`, and `npm run build` before proposing a change. The authoritative release environment remains Node 24.17.0 with pnpm 11.9.0. diff --git a/PHASE_14_PACKAGE_MANIFEST_v1.0.json b/PHASE_14_PACKAGE_MANIFEST_v1.0.json new file mode 100644 index 0000000..d225d91 --- /dev/null +++ b/PHASE_14_PACKAGE_MANIFEST_v1.0.json @@ -0,0 +1,2350 @@ +{ + "schema_version": "1.0", + "project": "RentalDriveGo", + "phase": 14, + "generated_at": "2026-06-25", + "excludes": [ + ".git", + ".next", + "node_modules", + "coverage", + "playwright-report", + "test-results", + "PHASE_14_PACKAGE_MANIFEST_v1.0.json", + "package-lock.json", + "tsconfig.tsbuildinfo" + ], + "file_count": 466, + "files": [ + { + "path": ".dockerignore", + "bytes": 97, + "sha256": "d78b037a836881c2d63f074d525b8027b2ecb06fefe3af4d5356327ec01dc5e1" + }, + { + "path": ".editorconfig", + "bytes": 188, + "sha256": "a6b98ea7cb6d61ed8d430dd0dffa46c87012b5cf859d4ce7207898954951fdcd" + }, + { + "path": ".env.example", + "bytes": 824, + "sha256": "500309bbe79dc8d3b71aaa3965ea4c0a170c353c7d7ea82ce35508a91aa8e5d1" + }, + { + "path": ".github/dependabot.yml", + "bytes": 416, + "sha256": "0a9bdd1890c8fcb78f61f91071df45fecbdcfbbd48441f7da0dba266ba168d82" + }, + { + "path": ".github/workflows/ci.yml", + "bytes": 1739, + "sha256": "c3d1671011688d7ebc4be9f38265e82b290b1aefc9ddd237c1d82fafd3e765f4" + }, + { + "path": ".gitignore", + "bytes": 135, + "sha256": "01c7cded7467134f023106b85684e3ce5df721149fc3ff4af5e02ef79541bb14" + }, + { + "path": ".node-version", + "bytes": 8, + "sha256": "98182b41c9ce3357797985cf12dc3b0124490ef88bc918a905373e7688e6aec9" + }, + { + "path": ".npmrc", + "bytes": 146, + "sha256": "e696a3cc1b84316377f18da909b079072ce02383d16c8fed410f8cabbb9ac054" + }, + { + "path": ".nvmrc", + "bytes": 8, + "sha256": "98182b41c9ce3357797985cf12dc3b0124490ef88bc918a905373e7688e6aec9" + }, + { + "path": ".prettierignore", + "bytes": 129, + "sha256": "272622f9ebbe7cc23717e19053be7c49a6fc63353cad9be57f107cd96b96a142" + }, + { + "path": "contracts/phase9/09_DEVELOPER_HANDOFF_v1.0.md", + "bytes": 8091, + "sha256": "e82d486f1e566d1bf0263f1baa7dd8035ae62da5c36bb6bfa417e61331ec8d51" + }, + { + "path": "contracts/phase9/annotated/ANNOTATION_INDEX_v1.0.md", + "bytes": 685, + "sha256": "a2e87dfdb138409604cac4cc5f52375cce97940da7363f7778af30490699decd" + }, + { + "path": "contracts/phase9/annotated/demo-dialog-en-light_v1.0.png", + "bytes": 51457, + "sha256": "d91bf102100af48feac31478770f8bfdded994ac8b47f60845e4465c50462394" + }, + { + "path": "contracts/phase9/annotated/desktop-en-light_v1.0.png", + "bytes": 144908, + "sha256": "a4151a788317aa9bf8f7262f09f645ebdb54d4a3e1254ab5703ae37e8d3cec16" + }, + { + "path": "contracts/phase9/annotated/mobile-ar-dark_v1.0.png", + "bytes": 75193, + "sha256": "6adcaf68b48bacbf105b670e71edda078a60aa26b732831bd194e1cb9da11556" + }, + { + "path": "contracts/phase9/annotated/mobile-drawer-ar-dark_v1.0.png", + "bytes": 28321, + "sha256": "bc0c14447fb6e80ce904ffcb13c237b51eaa92723702191139bee59b0f7ebdeb" + }, + { + "path": "contracts/phase9/annotated/SCREEN_ANNOTATIONS_v1.0.csv", + "bytes": 1457, + "sha256": "d7b8120926a545f472b62a436b87d2a9d20320a4d95fcf90aa96162c50e8a6da" + }, + { + "path": "contracts/phase9/annotated/tablet-fr-light_v1.0.png", + "bytes": 102305, + "sha256": "dd526fe6859e470ea4c67b4c1ef511cfe0e11126561f86bcff07e57378084347" + }, + { + "path": "contracts/phase9/annotated/tour-dialog-fr-dark_v1.0.png", + "bytes": 94445, + "sha256": "2dd7b24f6505f16a565ac1b5490499ccdae91d0257de608c97c54b7d5b6c2c78" + }, + { + "path": "contracts/phase9/assets/ASSET_MANIFEST_v1.0.csv", + "bytes": 1049, + "sha256": "dd77547327096b4c4084ec8b9311aaff719e378a91f16c2b3ea39832d1bc7b3a" + }, + { + "path": "contracts/phase9/assets/ASSET_USAGE_RULES_v1.0.md", + "bytes": 747, + "sha256": "46821e8e6588a62eba860e4d228b2910a05aa60124610966bdc524a86921f658" + }, + { + "path": "contracts/phase9/assets/brand-mark_v1.0.svg", + "bytes": 443, + "sha256": "bcb3a3fb8037aec69d92da06f0d60fab969547b979a0112f12e6a5c2ab8efdaa" + }, + { + "path": "contracts/phase9/assets/logo-horizontal_v1.0.svg", + "bytes": 576, + "sha256": "04be1c45e1b6e85586efc6dbd36bf3e1e9275fa138a36b93cf6532bbd7409b02" + }, + { + "path": "contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md", + "bytes": 9800, + "sha256": "84b455fe725bff11b6ab54bb13373b1aa52991b062a36fad07db47a940187a53" + }, + { + "path": "contracts/phase9/components/COMPONENT_STATE_MATRIX_v1.0.csv", + "bytes": 4283, + "sha256": "c85f96f6d5e020a27c2bd44427a2c3aed3f3cad8657d88a22fc2de9ecd3f6cda" + }, + { + "path": "contracts/phase9/components/CONTENT_CONSTRAINTS_v1.0.csv", + "bytes": 1147, + "sha256": "f4d32b7775f856ff4aac775791566427e3cc340f39cd3f9845d8a3271167228b" + }, + { + "path": "contracts/phase9/components/RESPONSIVE_BEHAVIOR_MATRIX_v1.0.csv", + "bytes": 1416, + "sha256": "0e0e262c0388c37e41f5ab7f3e80835b8edb09e00a9264e81d92953743893353" + }, + { + "path": "contracts/phase9/components/RTL_THEME_MATRIX_v1.0.csv", + "bytes": 4048, + "sha256": "b47f4b3b4e50f1fed6b1b69523a05d61952773e95a966288bfba85dd414edb15" + }, + { + "path": "contracts/phase9/DECISION_LOG_v9.0.md", + "bytes": 38775, + "sha256": "85569a7418f8cad57d094ee9ec1d83b7727b5ab91a405cbda26de0271a8d76a1" + }, + { + "path": "contracts/phase9/DEFINITION_OF_DONE_v1.0.md", + "bytes": 3234, + "sha256": "dfe53a550b7853f015901b83adb960ffb26ab08fa6d7f9f8f8a3386adc705179" + }, + { + "path": "contracts/phase9/implementation/component-contracts_v1.0.ts", + "bytes": 2844, + "sha256": "177dd2420b804290cf1296e43f41a7e759c8859b3253073fbdc523a81f6f94c0" + }, + { + "path": "contracts/phase9/implementation/hreflang-generator_v1.0.ts", + "bytes": 751, + "sha256": "ab919a36a5d08a28c38ae51b4ddd0d84cef5d3ec3bed13649ebd26c3fb80ac8a" + }, + { + "path": "contracts/phase9/implementation/localization-config_v1.0.ts", + "bytes": 772, + "sha256": "bd8ca09f121bfe516ece817948a81d58136e9205fbd2c05dad2ce87f2d7a1782" + }, + { + "path": "contracts/phase9/implementation/TECHNOLOGY_PROFILE_v1.0.md", + "bytes": 1953, + "sha256": "a59504c81bdbb6396eb21e68518ca84862ac89c6c65744de710e9ae273e47c7b" + }, + { + "path": "contracts/phase9/implementation/theme-config_v1.0.ts", + "bytes": 725, + "sha256": "f56d37da4129d5830ba9ebd77b18cd6084a144e8514bfd8a8152387ecf76607c" + }, + { + "path": "contracts/phase9/interaction/ANALYTICS_EVENT_SPEC_v1.0.csv", + "bytes": 1713, + "sha256": "1282ebca5b031f6267f8139033db437e30b62ac391d25823c8a4783b64151008" + }, + { + "path": "contracts/phase9/interaction/analytics-contract_v1.0.ts", + "bytes": 832, + "sha256": "2716eb69cc98032005e068ab7bdc265a4c896a8e1a1bed682c7fdd4f45368123" + }, + { + "path": "contracts/phase9/interaction/demo-form-contract_v1.0.ts", + "bytes": 632, + "sha256": "194db77f7cfca417dbe35e6f2c2ea94cdd02806b83b1d0f1993fe509d8c10154" + }, + { + "path": "contracts/phase9/interaction/INTERACTION_NOTES_v1.0.md", + "bytes": 2332, + "sha256": "0456815622cbb072f1a7594e6b47f52e572e2570280c3a618876246e1b43d2a7" + }, + { + "path": "contracts/phase9/interaction/theme-bootstrap_v1.0.js", + "bytes": 753, + "sha256": "7b89a849bdcd72e1049714ebf76f0c0decb39e44261480f0cb08bb7dfe734e4a" + }, + { + "path": "contracts/phase9/localization/locales/ar/homepage.json", + "bytes": 18615, + "sha256": "fe08aabd60203dbdebc718117f5e497b52a453a8a6fb671fe0bca28651bf0d47" + }, + { + "path": "contracts/phase9/localization/locales/en/homepage.json", + "bytes": 13869, + "sha256": "a5ed956c7f07fad016ca39b40b770c25e8beeae2799ff0fece82dbf087f18e51" + }, + { + "path": "contracts/phase9/localization/locales/fr/homepage.json", + "bytes": 15512, + "sha256": "24079356bd47431ffeb66b7eb2981e108c03080205861b1bb42514b03b945a0a" + }, + { + "path": "contracts/phase9/localization/LOCALIZATION_IMPLEMENTATION_v1.0.md", + "bytes": 2062, + "sha256": "87a494d7ef7ed9f5012ed1699edf90e38995aa89a0efc3800db854e1d57e1024" + }, + { + "path": "contracts/phase9/localization/ROUTE_MANIFEST_v1.0.json", + "bytes": 1573, + "sha256": "fa29b8d31da1f36f87d216a1228fd1bbe1cde337636950b40b0024a10efaf49a" + }, + { + "path": "contracts/phase9/localization/TRANSLATION_KEY_INVENTORY_v1.0.csv", + "bytes": 10599, + "sha256": "01289dc9eb94d546ae717b881b2aed4dfc63b38df38e7767054800122bbb46c2" + }, + { + "path": "contracts/phase9/OPEN_ISSUE_REGISTER_v1.0.csv", + "bytes": 3519, + "sha256": "b8778b3dc7d1e47446584cac046d490a9932c3dfdfa03750716f29852694a214" + }, + { + "path": "contracts/phase9/OPEN_QUESTIONS_v1.0.md", + "bytes": 1085, + "sha256": "82a2abd71830fa4023d346f3b42b138de9e1bbdff74a827d770e6b660d89bd0e" + }, + { + "path": "contracts/phase9/PACKAGE_MANIFEST_v1.0.json", + "bytes": 10649, + "sha256": "1a143f086f40f83414460bd4519e86bd3a34617079e3cfef4c5736375460a24e" + }, + { + "path": "contracts/phase9/PHASE_9_HANDOFF_v1.0.md", + "bytes": 939, + "sha256": "90530b4e70d1fd64d5d934429c009431902639c0570e7944cf050e6d67eb73a3" + }, + { + "path": "contracts/phase9/qa/ACCESSIBILITY_CHECKLIST_v1.0.csv", + "bytes": 1498, + "sha256": "0d9c108e0c02b78aaf11badf6b5f5125cac2b03876cfddf82bd2e97230fdd28b" + }, + { + "path": "contracts/phase9/qa/BROWSER_SUPPORT_MATRIX_v1.0.csv", + "bytes": 986, + "sha256": "5ffb43732fea90530b1b088fb68172b9fc7b2c2683198448734a21cf39c234d1" + }, + { + "path": "contracts/phase9/qa/PERFORMANCE_BUDGETS_v1.0.json", + "bytes": 815, + "sha256": "e1679ce45d8a1225c46c085c7533d3230a41279c32d0812de5c5f05cb55eefa8" + }, + { + "path": "contracts/phase9/qa/PLAYWRIGHT_ACCEPTANCE_SPEC_v1.0.md", + "bytes": 800, + "sha256": "b16384a861d06eb76db5a836868d9a6e03cf72a6a896209279330e19a8d1a785" + }, + { + "path": "contracts/phase9/qa/QA_MATRIX_v1.0.csv", + "bytes": 3557, + "sha256": "6b14b92ce20a9d706de7d6d4cf9f0bb450ecceed27673ed62ae01e145d2143f8" + }, + { + "path": "contracts/phase9/qa/test-ids_v1.0.csv", + "bytes": 598, + "sha256": "6201007ae98632654a2684a0b09ce95d85d9870e0f29774687df0a9876048202" + }, + { + "path": "contracts/phase9/qa/validate-phase9-package_v1.0.mjs", + "bytes": 2534, + "sha256": "631892318cf95c0530a605e5bf08def9b06c93af79b555205f3aeb8a2bcd87ed" + }, + { + "path": "contracts/phase9/qa/visual-regression-scenarios_v1.0.json", + "bytes": 1401, + "sha256": "08a04f676cbb93e73b4c6bc112a55ebf287cb97be3dd3176ab80161e6de743c2" + }, + { + "path": "contracts/phase9/README_v1.0.md", + "bytes": 1258, + "sha256": "ef0010b98ba641c4db453d875171a0d1dad4cb17e991ad23698acde8ac4783ae" + }, + { + "path": "contracts/phase9/reference/FINDINGS_REPORT_v1.0.md", + "bytes": 3062, + "sha256": "ba34afd535856d0eaa8ed7e174c23a7b5f0eae87344c8fcee5daafe00c068ce4" + }, + { + "path": "contracts/phase9/reference/PHASE_8_HANDOFF_v1.0.md", + "bytes": 1117, + "sha256": "2e51ed6645fcc99f30cd4aa9da11ac59e5c2e331c384bfbd758739ad6f42c788" + }, + { + "path": "contracts/phase9/reference/PRIORITIZED_REVISIONS_v1.0.csv", + "bytes": 1071, + "sha256": "65b17813756a2d01c8a9df9faa049b170dca197f243b62a44e070d69f8959df5" + }, + { + "path": "contracts/phase9/reference/SUCCESS_METRICS_v1.0.csv", + "bytes": 1552, + "sha256": "e7b734564735ab65dcaf84ab8374ba163472cca48db1257c4c626415a779ecbe" + }, + { + "path": "contracts/phase9/reference/VALIDATION_RESULTS_v1.0.md", + "bytes": 2068, + "sha256": "3cb17f099569e5bdf4bcd731fe7f687d1636f0e82623c205e07df2cdc2b7d2f2" + }, + { + "path": "contracts/phase9/SOURCE_TRACEABILITY_v1.0.csv", + "bytes": 765, + "sha256": "76dc8677ad0d50263301fd5242bc0649c23bb01d3bbd099bdc8a7e2c04fc2d46" + }, + { + "path": "contracts/phase9/tokens/design-tokens_v1.0.json", + "bytes": 3771, + "sha256": "470d7bc9d4a466cce4e51f0fdc21fe199ec5b0d4007f5063704c523ce1b9ef0c" + }, + { + "path": "contracts/phase9/tokens/semantic-tokens_v1.0.css", + "bytes": 3553, + "sha256": "99912762e078bfc78b4878fc46b8c7d03d90c073e9c236942a58d83f6585a1b9" + }, + { + "path": "contracts/phase9/tokens/TOKEN_USAGE_RULES_v1.0.md", + "bytes": 1222, + "sha256": "b9f7d9b0a9c0595e6f6df2a53e0bcf4acfb47a56abfc6c590a6281c15b04a7b2" + }, + { + "path": "contracts/phase9/tokens/tokens_v1.0.ts", + "bytes": 442, + "sha256": "ec265270251f8dd01d9166aeca3fcec9be2b5e534d825c9058fb6ed3f51e3224" + }, + { + "path": "contracts/phase9/validation/CONTENT_AND_STRUCTURE_VALIDATION_v1.0.json", + "bytes": 189, + "sha256": "e055ef15c2de2191a3465d85ed54f4cf6bd9e1cde4d5d2bba787e14873027b73" + }, + { + "path": "contracts/phase9/validation/STATIC_VALIDATION_RESULTS_v1.0.json", + "bytes": 56, + "sha256": "b60367adf55cf4c61b705d11131b7adebc0aae6ff53732c8272ec9cf2bc95dd3" + }, + { + "path": "contracts/phase9/validation/VALIDATION_RESULTS_v1.0.md", + "bytes": 1179, + "sha256": "6f9df81e75d7149d3826ce215143c21784f39b154660fcefc5325ac114ac70b2" + }, + { + "path": "CONTRIBUTING.md", + "bytes": 2052, + "sha256": "abb7059cbb8347456c40a472d980548bb0a50400300fb66d3a42983563725ce8" + }, + { + "path": "Dockerfile", + "bytes": 1033, + "sha256": "5e586fd24911d9635ac45d36b9dcba24a44c8eb161b61df7d931f1103e0d70f2" + }, + { + "path": "docs/architecture/ADR-0001_REPOSITORY_FOUNDATION.md", + "bytes": 8931, + "sha256": "e2933f3ff3bd9c3066027e20049805fbc2e1ce720534998882f110024afba375" + }, + { + "path": "docs/architecture/ADR-0002_PHASE_11_FOUNDATIONS.md", + "bytes": 4154, + "sha256": "2f04e81f0fac6439fd94a4620c8fa88f062ea7c32ae83c0b26a6b488255e651d" + }, + { + "path": "docs/architecture/ADR-0003_PHASE_12_COMPONENT_SYSTEM.md", + "bytes": 1918, + "sha256": "7ba7bed100e43614b5904d6a20161c55ce99460dbf5e35376cd80b02df9a12eb" + }, + { + "path": "docs/BRAND_MIGRATION_v1.0.md", + "bytes": 1322, + "sha256": "b1fb78b8a0c50b629c8f3af36ec841aa2126739008069a80021b18f8219a3d1c" + }, + { + "path": "docs/DECISION_LOG_v12.0.md", + "bytes": 2835, + "sha256": "c69af78a6af60ba743b057c0c8b50691f7d826923d91c204179fc0683487a0af" + }, + { + "path": "docs/DECISION_LOG_v13.0.md", + "bytes": 2411, + "sha256": "4d5747f12e7b1446ff944540d724957e859264ba0c29b95cba84013591478fdc" + }, + { + "path": "docs/DECISION_LOG_v14.0.md", + "bytes": 2001, + "sha256": "b29dc315d9cf857d229183e728d1b44804dfc4b80a3c6cc381a165193c69c5d8" + }, + { + "path": "docs/DEPENDENCY_MANIFEST_v1.0.md", + "bytes": 4109, + "sha256": "0dfdaf10352a56b1468ad35436dd873a16d12171e3ea14eac2268359ec02823a" + }, + { + "path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.0.csv", + "bytes": 5347, + "sha256": "4300820e10088d76f6407ee358a8cc1a3cab89fe6554f658fd770469c8c6c77d" + }, + { + "path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv", + "bytes": 6721, + "sha256": "8569e669ddf280d82ebb68526191315aecb108163cb34e4ad1e32a810888cb93" + }, + { + "path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.2.csv", + "bytes": 8902, + "sha256": "24725fbb71279b0e6bfdfb05a8d48d01ec132b863fb311eb8d012d9b2151f3d1" + }, + { + "path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.3.csv", + "bytes": 10248, + "sha256": "67b3a47100f6404ec1473f4979917b5202169df0b5610f10ff0cb75861b9cc21" + }, + { + "path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.4.csv", + "bytes": 13058, + "sha256": "cd2fb58000d337c6abf5ae767a848472e71488a7cd2abda1e0a89d50bdce7a35" + }, + { + "path": "docs/PHASE_10_HANDOFF_v1.0.md", + "bytes": 3370, + "sha256": "8cf52ee1b49cabbf0678da222413b0186ed982fb0c8cfc805482ca18eb1fefc7" + }, + { + "path": "docs/PHASE_10_IMPLEMENTATION_REPORT_v1.0.md", + "bytes": 6805, + "sha256": "6a2e5da443bf15351a0e88e5c92117c8f7c780509d51f2e44c4a148a26a6d4e2" + }, + { + "path": "docs/PHASE_11_IMPLEMENTATION_REPORT_v1.0.md", + "bytes": 13394, + "sha256": "79c1a01be6d5188db29d0bb4a3d2d30b18a5c25b5fa367c7d878309fb5e4dfbb" + }, + { + "path": "docs/PHASE_12_HANDOFF_v1.0.md", + "bytes": 7671, + "sha256": "04000f05533c3accf2409e7810e95ca3188338e33ddae98914ee30e059a09c25" + }, + { + "path": "docs/PHASE_12_IMPLEMENTATION_REPORT_v1.0.md", + "bytes": 12420, + "sha256": "b52db7413ef0365f9ae917133ac4449bf22a95760b25c8bef2fca4f64f3f6040" + }, + { + "path": "docs/PHASE_13_HANDOFF_v1.0.md", + "bytes": 11204, + "sha256": "f82e319eb0d11c861a7d77c4abdc3bcb48e966cb8cfa610389d7807bbaeedb0a" + }, + { + "path": "docs/PHASE_13_IMPLEMENTATION_REPORT_v1.0.md", + "bytes": 8099, + "sha256": "3a7ba99ebf1f22f433e854adb48529575daf1c357aa3271c10fbec152c91479f" + }, + { + "path": "docs/PHASE_14_IMPLEMENTATION_REPORT_v1.0.md", + "bytes": 14891, + "sha256": "363b05580f70ec38193b56ef194a387860fa6a8e523b85c0d4d2a82e31aecd76" + }, + { + "path": "docs/PHASE_15_HANDOFF_v1.0.md", + "bytes": 8196, + "sha256": "b0317610aca92be814dbcc84cb0cb16244c00ff6988ec1ac19f45868ddbf5f36" + }, + { + "path": "docs/phase12/ACCESSIBILITY_BEHAVIOR_MATRIX_v1.0.csv", + "bytes": 10934, + "sha256": "bf23d29033b091f0556f7a5c07ffc86e31484d82c6fd01a80ffcc33c5daedb0c" + }, + { + "path": "docs/phase12/BUNDLE_IMPACT_REPORT_v1.0.md", + "bytes": 1704, + "sha256": "795ab11fc56780f57c8bba78821106cd5ea00dd02e9aac63c3ddc8865af7f453" + }, + { + "path": "docs/phase12/COMPONENT_CATALOG_v1.0.md", + "bytes": 26256, + "sha256": "93c3d22539c7489166119a8126712995d81fefade081cd06488f3898fa7d519c" + }, + { + "path": "docs/phase12/COMPONENT_INVENTORY_v1.0.json", + "bytes": 42210, + "sha256": "b64cff5d50f7777e6384e6ca19e49a38430925b4a19a53543d35e4452f42d112" + }, + { + "path": "docs/phase12/COMPONENT_SPECIFICATION_TRACEABILITY_v1.0.csv", + "bytes": 11328, + "sha256": "1d352fd6ce9bc3dae7e135725c1deb2ebd44faf679658e8eeb8622266ee08b58" + }, + { + "path": "docs/phase12/DEFINITION_OF_DONE_STATUS_v1.0.md", + "bytes": 1581, + "sha256": "692e3847c7e120939a2ee16dbadd9e6908decaf7f04fa9187e1063f5337dd016" + }, + { + "path": "docs/phase12/DEPENDENCY_CHANGE_REPORT_v1.0.md", + "bytes": 1273, + "sha256": "7c668afb6d310a56fa94d3b88a20cdde5b0594b7005857c915a27edb40aaba0e" + }, + { + "path": "docs/phase12/RESPONSIVE_VALIDATION_MATRIX_v1.0.csv", + "bytes": 16762, + "sha256": "9542e345b81d123e67b12167afc67b946667729cf35a3ce469756627b5368c4d" + }, + { + "path": "docs/phase12/RTL_BEHAVIOR_MATRIX_UPDATE_v1.0.csv", + "bytes": 17557, + "sha256": "c172ed56ff3513bb986894d6fd5814b05391ffcdc432ba3282005e7b8e7c8953" + }, + { + "path": "docs/phase12/STORY_AND_FIXTURE_INVENTORY_v1.0.csv", + "bytes": 565, + "sha256": "f1b3f012c7319e3eacf5b625ada085856dab9fe4392302cc2eb67d79042b5d64" + }, + { + "path": "docs/phase12/TEST_COVERAGE_REPORT_v1.0.csv", + "bytes": 983, + "sha256": "fa174206dec0855a7a9ce328981132ad2114dca73a8511aba8dfd2e953ac9535" + }, + { + "path": "docs/phase12/VARIANT_INVENTORY_v1.0.csv", + "bytes": 17312, + "sha256": "58b988f565cf4e92175bcbd14b0c242b6785d24b5f695e1c12a2a53cb18d0bd1" + }, + { + "path": "docs/phase13/COMPONENT_VARIANT_UPDATE_v1.0.md", + "bytes": 550, + "sha256": "48c1efca62cca59af1d041b811cd15e3ff123cebff22ac905a3a2ca4fab8164a" + }, + { + "path": "docs/phase13/HOMEPAGE_CONTENT_MODEL_v1.0.md", + "bytes": 2290, + "sha256": "d20dd8d92bdd0e73589cc6907c7863d6e6b023d6716aba69cab88d5b97d019fd" + }, + { + "path": "docs/phase13/HOMEPAGE_SECTION_MATRIX_v1.0.csv", + "bytes": 2239, + "sha256": "4fd5ad3074b5217c735ab0c8c02da5690032b50ae5a432776488104313bb3d95" + }, + { + "path": "docs/phase14/ANALYTICS_EVENT_REGISTRY_v1.0.csv", + "bytes": 1063, + "sha256": "639e73f41589f057773001c15cecadef429460eba96770e89170266673aa06ac" + }, + { + "path": "docs/phase14/COMPONENT_VARIANT_UPDATE_v1.0.md", + "bytes": 576, + "sha256": "57ff3870af656b42bf1863a16f952750b45654e166989c8fe2155f05feb9c386" + }, + { + "path": "docs/phase14/CONSENT_MATRIX_v1.0.csv", + "bytes": 619, + "sha256": "613fa4645ffcd6a1d48e2d0e318dcf53f043f288e1f37e46806a2ac1a2f5c304" + }, + { + "path": "docs/phase14/DATA_FLOW_INVENTORY_v1.0.csv", + "bytes": 2637, + "sha256": "fe8323cbfc1781cdb56002c33260de4835bf2cca2ac4d25191d711be0ad84708" + }, + { + "path": "docs/phase14/DEMO_FORM_CONTRACT_v1.0.md", + "bytes": 1768, + "sha256": "7d94a5747126f42017154dc2e9c3e1943bf52bbea71574ec5ad369be0abccd3e" + }, + { + "path": "docs/phase14/DESTINATION_REGISTRY_v1.0.csv", + "bytes": 1499, + "sha256": "51799df5507584d1100571ee4dd5c7e1c1f8560e80379f731709fd71e267c92d" + }, + { + "path": "docs/phase14/ENVIRONMENT_VARIABLE_INVENTORY_v1.0.csv", + "bytes": 1088, + "sha256": "2481efc9103383a81c8d306bbfb2d95a839790eab6491baed60c62e94e8c0799" + }, + { + "path": "docs/phase14/EXTERNAL_SERVICE_INVENTORY_v1.0.csv", + "bytes": 633, + "sha256": "1cc6b490cb0365b7fa8c13c65cf9508af8f09b37842d7028287f3d26bc143774" + }, + { + "path": "docs/phase14/FEATURE_FLAG_INVENTORY_v1.0.csv", + "bytes": 849, + "sha256": "5f9a7d3e227197d145b31f94bcfba5c5211fe7a60d210a6d229e9530d4e7a62e" + }, + { + "path": "docs/phase14/INTEGRATION_ARCHITECTURE_v1.0.md", + "bytes": 1268, + "sha256": "5efca5219e639c9056296b02a3918508d9e3c5098980f0c3c602ec7c1737425c" + }, + { + "path": "docs/phase14/INTEGRATION_TRACEABILITY_MATRIX_v1.0.csv", + "bytes": 1766, + "sha256": "4ac262459d885d7c9e510fb0fc33680272b4ca274a2a2b42fb9fe8e2306b08bf" + }, + { + "path": "docs/phase14/PERFORMANCE_AND_BUNDLE_REPORT_v1.0.md", + "bytes": 1250, + "sha256": "d8b47d763381291d82f6cbfabe29148405d17f59ab09f51d03b23dc41888b362" + }, + { + "path": "docs/phase14/PRIVACY_REVIEW_REPORT_v1.0.md", + "bytes": 1027, + "sha256": "c00b7412b8bda45b0de26311e2b7660c015836da61c81a6acb4c4d4f6c9fdd1a" + }, + { + "path": "docs/phase14/RELEASE_GATE_MATRIX_v1.0.csv", + "bytes": 1533, + "sha256": "a8bc810d74d344d686f1a62de38f3c3fa73bdeecae6754208098aa868a12ecb6" + }, + { + "path": "docs/phase14/SECURITY_REVIEW_REPORT_v1.0.md", + "bytes": 1716, + "sha256": "0d81f0a8e008741ceb715dc8e316d24efa06c6530afcf4475d3482aa25128d54" + }, + { + "path": "docs/phase14/SUCCESS_FAILURE_STATE_INVENTORY_v1.0.csv", + "bytes": 939, + "sha256": "a24550a1c2b11c627d3747697622626cbb0003c38b697f83a030970a33d0f67c" + }, + { + "path": "docs/quality/logs/build-initial.log", + "bytes": 719, + "sha256": "9245b913520a4477ec638d0cdce23f2079c575bdc4a989d0fe68b9d437a5e3b3" + }, + { + "path": "docs/quality/logs/build-missing-site-origin.exit", + "bytes": 2, + "sha256": "4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865" + }, + { + "path": "docs/quality/logs/build-missing-site-origin.log", + "bytes": 922, + "sha256": "b2bff4cccbc95305d2f9304982446920ca76ecfbb6addc9fbff2d95a1538c1f5" + }, + { + "path": "docs/quality/logs/build.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/build.log", + "bytes": 719, + "sha256": "dd0cee291d02930e6ba19eb4a24ab40d03111c67c2b0dadddcf9de6b07caaa7c" + }, + { + "path": "docs/quality/logs/file-diff-summary.log", + "bytes": 5005, + "sha256": "fbcbd30011449146fddd37ee1436880cb0847febaadacccfcfbc18fc707a957f" + }, + { + "path": "docs/quality/logs/format-check.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/format-check.log", + "bytes": 128, + "sha256": "35faa5623e1ca69a144301db1bcd12a99642c93e392c00f27f0e373494758bdc" + }, + { + "path": "docs/quality/logs/format-write.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/format-write.log", + "bytes": 13943, + "sha256": "98740297fc6e5972e6da3d76ac01cdfccc56b5babdbc4ffa74ca96b2584128c7" + }, + { + "path": "docs/quality/logs/lint.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/lint.log", + "bytes": 61, + "sha256": "60d1821dc1b8a730153d1b48f9c84e86346955bb7638b724d0d3c321faa5c3f1" + }, + { + "path": "docs/quality/logs/next-typegen.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/next-typegen.log", + "bytes": 59, + "sha256": "adba4af9194e10e47dda75ff0fd0f8c2b756474896d0eba5612799c527ff372a" + }, + { + "path": "docs/quality/logs/npm-install-fallback.log", + "bytes": 284, + "sha256": "e19919345ade861c8cd863d631f57f11c3453e7cc7385a09af24f268875eabd7" + }, + { + "path": "docs/quality/logs/phase14/a11y-integration-chromium.log", + "bytes": 6088, + "sha256": "c5d3866f9168ef7f664ed70c52bd437c692fc1bfac431da077b8af78cf51cde4" + }, + { + "path": "docs/quality/logs/phase14/browser-integration-chromium.log", + "bytes": 10278, + "sha256": "41558b0435514b2e59f2604440eca09809b1338c8bf4474bbe3dc53c665ace60" + }, + { + "path": "docs/quality/logs/phase14/bundle-inventory.log", + "bytes": 3202, + "sha256": "b06b6fe93eab76f94a50d95a6f098763726ffbeeeb8bdcd1b50318b32fbf0d2d" + }, + { + "path": "docs/quality/logs/phase14/dependency-audit.log", + "bytes": 56, + "sha256": "671f3c588b8c2f48975e845e6a3c9593e392fedf123507fcfe411357c1204cde" + }, + { + "path": "docs/quality/logs/phase14/format-check-initial.duration", + "bytes": 2, + "sha256": "7de1555df0c2700329e815b93b32c571c3ea54dc967b89e81ab73b9972b72d1d" + }, + { + "path": "docs/quality/logs/phase14/format-check-initial.exit", + "bytes": 2, + "sha256": "4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865" + }, + { + "path": "docs/quality/logs/phase14/format-check-initial.log", + "bytes": 1215, + "sha256": "7e7a75fa5b8966231ea888b26f904fc63c605a92460e694a353ab2bffc52c261" + }, + { + "path": "docs/quality/logs/phase14/format-check.duration", + "bytes": 2, + "sha256": "1121cfccd5913f0a63fec40a6ffd44ea64f9dc135c66634ba001d10bcf4302a2" + }, + { + "path": "docs/quality/logs/phase14/format-check.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/phase14/format-check.log", + "bytes": 141, + "sha256": "63ba8cad5e9cfee6c4106223b6e0ed5d37d600af8ebbc92b2da4db755c20eb8e" + }, + { + "path": "docs/quality/logs/phase14/format-write.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/phase14/format-write.log", + "bytes": 17257, + "sha256": "e991154d666ec7f969debed34a4a8afc0d68cdabd6d70c14c23d2e729122b53f" + }, + { + "path": "docs/quality/logs/phase14/integration-tests.log", + "bytes": 651, + "sha256": "be8eb369f59c1f2698cb6fec93ce5983b4af54bb8a188072e6a23cabec132d38" + }, + { + "path": "docs/quality/logs/phase14/lint-initial.duration", + "bytes": 3, + "sha256": "25d4f2a86deb5e2574bb3210b67bb24fcc4afb19f93a7b65a057daa874a9d18e" + }, + { + "path": "docs/quality/logs/phase14/lint-initial.exit", + "bytes": 2, + "sha256": "4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865" + }, + { + "path": "docs/quality/logs/phase14/lint-initial.log", + "bytes": 327, + "sha256": "c78f7d3a439eea74037d8e882f14039adfeed525d3e51a4763adbc5529088ce1" + }, + { + "path": "docs/quality/logs/phase14/lint.duration", + "bytes": 3, + "sha256": "917df3320d778ddbaa5c5c7742bc4046bf803c36ed2b050f30844ed206783469" + }, + { + "path": "docs/quality/logs/phase14/lint.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/phase14/lint.log", + "bytes": 115, + "sha256": "5b4488f3b77f0c99ccd64a52f0a4ba6a633534c858d4663225b5f9fd1bdf2396" + }, + { + "path": "docs/quality/logs/phase14/next-typegen.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/phase14/next-typegen.log", + "bytes": 59, + "sha256": "adba4af9194e10e47dda75ff0fd0f8c2b756474896d0eba5612799c527ff372a" + }, + { + "path": "docs/quality/logs/phase14/npm-install-baseline.exit", + "bytes": 2, + "sha256": "4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865" + }, + { + "path": "docs/quality/logs/phase14/npm-install-baseline.log", + "bytes": 472, + "sha256": "2972385383929897c4b8f9635af2e49523d6fb29bb98cc2c04400f865ba1ef59" + }, + { + "path": "docs/quality/logs/phase14/npm-install-fallback.log", + "bytes": 423, + "sha256": "02a978f37de6fbdd4c3a16d42f6ce0600783a5a666e8036b722ddde3d8d2cc36" + }, + { + "path": "docs/quality/logs/phase14/npm-install-offline.duration", + "bytes": 3, + "sha256": "e6c21e8d260fe71882debdb339d2402a2ca7648529bc2303f48649bce0380017" + }, + { + "path": "docs/quality/logs/phase14/npm-install-offline.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/phase14/npm-install-offline.log", + "bytes": 284, + "sha256": "9e8c404f98cc8bee09bce52131993443004ab883b7d99dee99f261da73971244" + }, + { + "path": "docs/quality/logs/phase14/phase14-environment.log", + "bytes": 265, + "sha256": "ce4e16395260d1d1f404d84bcc2b631de619495c1697ea34d9a79e44e4403ef3" + }, + { + "path": "docs/quality/logs/phase14/phase14-integrations.log", + "bytes": 271, + "sha256": "bb9ee4f2c7a7c2584d31c06908182d9ca722f50ec6a7751dc3af159ba3a592a3" + }, + { + "path": "docs/quality/logs/phase14/phase14-privacy.log", + "bytes": 248, + "sha256": "2f6ec738b614507be789b34557c41a22c4022a35f756546e84578109c6658295" + }, + { + "path": "docs/quality/logs/phase14/phase14-security.log", + "bytes": 262, + "sha256": "acb5634a18ea0e56de831b4ee233daf1634dcfeb6bfcfbc395c31eb60205791d" + }, + { + "path": "docs/quality/logs/phase14/playwright-inventory.log", + "bytes": 45412, + "sha256": "7ae624b1c71accb381a0f91a9a1a5310c3c83d4d2be440efac356116d6d07c7d" + }, + { + "path": "docs/quality/logs/phase14/production-build.log", + "bytes": 919, + "sha256": "f72141f9619f96be5503047134cf700adb192c25cc34f445d852072cf81070dc" + }, + { + "path": "docs/quality/logs/phase14/secret-scan.log", + "bytes": 172, + "sha256": "4f0c1a646295f4c6fd2003d60e4241d9f462fe95c6a2025133f64ddaa922916b" + }, + { + "path": "docs/quality/logs/phase14/static-validations.duration", + "bytes": 2, + "sha256": "53c234e5e8472b6ac51c1ae1cab3fe06fad053beb8ebfd8977b010655bfdd3c3" + }, + { + "path": "docs/quality/logs/phase14/static-validations.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/phase14/static-validations.log", + "bytes": 1533, + "sha256": "99c1db43e72c7ec11e2056412e319595df16220d637069c9d72a64036325bf97" + }, + { + "path": "docs/quality/logs/phase14/typecheck-initial.duration", + "bytes": 2, + "sha256": "aa67a169b0bba217aa0aa88a65346920c84c42447c36ba5f7ea65f422c1fe5d8" + }, + { + "path": "docs/quality/logs/phase14/typecheck-initial.exit", + "bytes": 2, + "sha256": "53c234e5e8472b6ac51c1ae1cab3fe06fad053beb8ebfd8977b010655bfdd3c3" + }, + { + "path": "docs/quality/logs/phase14/typecheck-initial.log", + "bytes": 8524, + "sha256": "b976ddc01db0f215ddb114b34ee6748cee50746f556cee837ecd9a9bf8a62b82" + }, + { + "path": "docs/quality/logs/phase14/typecheck.duration", + "bytes": 2, + "sha256": "aa67a169b0bba217aa0aa88a65346920c84c42447c36ba5f7ea65f422c1fe5d8" + }, + { + "path": "docs/quality/logs/phase14/typecheck.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/phase14/typecheck.log", + "bytes": 260, + "sha256": "e25348d1ac1da31577e9836d0db995eadd0dea27b6c9ef0541a26a68c760bbde" + }, + { + "path": "docs/quality/logs/phase14/unit-initial.log", + "bytes": 151, + "sha256": "b17128dc00e8a6ad9608f7b73dea5bc825eff545e04a759bccc5511f356680f0" + }, + { + "path": "docs/quality/logs/phase14/unit-tests-coverage.log", + "bytes": 2912, + "sha256": "0f3d2db357cdb4c1139f382da63657e16ad674b3ae283952af3b357dc5e2a81a" + }, + { + "path": "docs/quality/logs/phase14/unit.log", + "bytes": 151, + "sha256": "b17128dc00e8a6ad9608f7b73dea5bc825eff545e04a759bccc5511f356680f0" + }, + { + "path": "docs/quality/logs/phase14/visual-integration-chromium.log", + "bytes": 10885, + "sha256": "b7a8527c636146b8be469688b61d9505dd186be03ad1d1e87243f79d52169782" + }, + { + "path": "docs/quality/logs/playwright-browser-a11y.log", + "bytes": 61590, + "sha256": "18073dbbf92df28ad060b108985fe0e16e7e6c8ae67ff73bc041cd6024ba6339" + }, + { + "path": "docs/quality/logs/playwright-test-inventory.log", + "bytes": 4605, + "sha256": "e06d4c78a08d0f2cc4b7f329be06904d90d35aa1352b61d593725293649e8d02" + }, + { + "path": "docs/quality/logs/pnpm-audit.log", + "bytes": 367, + "sha256": "c9ca5f084a99651b415d489941280a105a13c553bb38b7f8764a6dd77ecd931b" + }, + { + "path": "docs/quality/logs/pnpm-install-frozen.log", + "bytes": 3204, + "sha256": "5a074969195194b6acad18870ebc51784b1b701f24e9ab76ca9177c317b88b39" + }, + { + "path": "docs/quality/logs/standalone-server.log", + "bytes": 114, + "sha256": "8af62068e13751692799c95679ce8588b6cbbf774d6f8a951668ce2fff36b957" + }, + { + "path": "docs/quality/logs/typecheck.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/typecheck.log", + "bytes": 53, + "sha256": "8b3269bf93de41d5b37919b9c9eb1fdf891529124832dddde796d61642ae0a5b" + }, + { + "path": "docs/quality/logs/unit.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/unit.log", + "bytes": 2254, + "sha256": "0bb10fc9568d6e8e8d15a8027966382cfe691d1e5a0991f1789d26854f171f0f" + }, + { + "path": "docs/quality/logs/validate.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/validate.log", + "bytes": 974, + "sha256": "d71250a821c15c3beb71107aa0098fc014d247d1ea4e5127ca43ba81c7232c2d" + }, + { + "path": "docs/quality/MANUAL_QA_RESULTS_v1.0.csv", + "bytes": 2842, + "sha256": "dba020cda7ffbbc6b05f275fb1c479d102e1f00900ddfc910b6a436f54322a08" + }, + { + "path": "docs/quality/PHASE_11_COMMAND_LOG_v1.0.txt", + "bytes": 2779, + "sha256": "e750ffab91024cb562f5919b8229ce7ed7c0753bc62e96956e7e7275df330cae" + }, + { + "path": "docs/quality/PHASE_11_FILE_CHANGES_v1.0.txt", + "bytes": 3003, + "sha256": "8ac89bb910a600664d799605b51d08b6bc1b99887e36c880b70f9862b684b09c" + }, + { + "path": "docs/quality/PHASE_11_VALIDATION_RESULTS_v1.0.json", + "bytes": 1169, + "sha256": "f61ba0cf4eb87f5d4f3b7343c5b0b1c9ce242b28ac673dd9c22a88fdd49f3d47" + }, + { + "path": "docs/quality/PHASE_11_VALIDATION_RESULTS_v1.0.md", + "bytes": 2235, + "sha256": "e8eac6f793b461586119e219caa89979b87f3d3ea0254f8fa4602777b2cb7f7d" + }, + { + "path": "docs/quality/PHASE_12_COMMAND_LOG_v1.0.txt", + "bytes": 2261, + "sha256": "9e8d7eeb7d671bbef13b5b48876d095f44558780badb6a3f2dcecd1034ccabba" + }, + { + "path": "docs/quality/PHASE_12_FILE_CHANGES_v1.0.txt", + "bytes": 6129, + "sha256": "46120beed9a87cd0a8272dc3c3b81e41b10cdc150877344ce3658ba370efebdd" + }, + { + "path": "docs/quality/PHASE_12_HTTP_ROUTE_RESULTS_v1.0.json", + "bytes": 999, + "sha256": "502e79659692e8c9c8a97fd1495cefa67250d746db2f4be4d9aa5f1c693042cb" + }, + { + "path": "docs/quality/PHASE_12_MANUAL_QA_RESULTS_v1.0.csv", + "bytes": 3628, + "sha256": "e1a2e78e7e323fe3a2b2e0d1f4f2733234dee6b079393158fd39dcb1261f8902" + }, + { + "path": "docs/quality/PHASE_12_VALIDATION_RESULTS_v1.0.json", + "bytes": 4743, + "sha256": "66c771151857321f5de310f3f1d9670ec01f91acb12d209b3e4414530995d3f6" + }, + { + "path": "docs/quality/PHASE_12_VALIDATION_RESULTS_v1.0.md", + "bytes": 4050, + "sha256": "581f82dd3a3935914c28a849de0677699662fbf883a17f84d2a8e6ac554c0296" + }, + { + "path": "docs/quality/PHASE_12_VISUAL_REGRESSION_RESULTS_v1.0.json", + "bytes": 517, + "sha256": "d4ffcc9b730a57d3d6a46d4f617cb40b9c0fe5489189dfda7e8e2c2c521bf6d8" + }, + { + "path": "docs/quality/PHASE_13_COMMAND_LOG_v1.0.txt", + "bytes": 1225, + "sha256": "4f8a2074c0ccc3b16e3d1656688d52ea0fe6fc3b9bd125d23b00b1b682b8533a" + }, + { + "path": "docs/quality/PHASE_13_FILE_CHANGES_v1.0.txt", + "bytes": 1051, + "sha256": "95e446fe77e3412f02f236f6c6891df11ab76857aa77b4497a82f2c64e0b34cb" + }, + { + "path": "docs/quality/PHASE_13_HTTP_ROUTE_RESULTS_v1.0.json", + "bytes": 553, + "sha256": "6ab331a76652ad7b7183d4ead068fb9e5af13c10e361148a36c207f619c235c4" + }, + { + "path": "docs/quality/PHASE_13_MANUAL_QA_RESULTS_v1.0.csv", + "bytes": 1571, + "sha256": "5cffba29bff2974118bc17ca9bc9ceb94cc1b5504d1a04a92ad43a67b04dbe47" + }, + { + "path": "docs/quality/PHASE_13_VALIDATION_RESULTS_v1.0.json", + "bytes": 2964, + "sha256": "bde83fe8e06a47fcf235821c055f9fa12f72c5cdd472d04e35f1f9b99738fe23" + }, + { + "path": "docs/quality/PHASE_13_VALIDATION_RESULTS_v1.0.md", + "bytes": 4094, + "sha256": "457a045db7fa620029f94929f2fd86e7d1549a787b53949a50b08b4f039182a6" + }, + { + "path": "docs/quality/PHASE_14_COMMAND_LOG_v1.0.txt", + "bytes": 2061, + "sha256": "929f481348f4f8e9981665f763c74d97f3a5b03a3d3fd79e13fa874586dccdf1" + }, + { + "path": "docs/quality/PHASE_14_FILE_CHANGES_v1.0.txt", + "bytes": 5414, + "sha256": "2c7587b49801ff92871a1eaba3669b2c5078c85233a571079679f87b6c5ee06d" + }, + { + "path": "docs/quality/PHASE_14_HTTP_ROUTE_RESULTS_v1.0.json", + "bytes": 764, + "sha256": "b1b2cf79c7b913e893931482750f5de6fbe11f1a167e19e5bd88aca37ba5c9f0" + }, + { + "path": "docs/quality/PHASE_14_MANUAL_QA_RESULTS_v1.0.csv", + "bytes": 2082, + "sha256": "3c65888853cd8e1c1b04cffb9cf851916a6db7fd29e93af7b2cc5d90faf084cc" + }, + { + "path": "docs/quality/PHASE_14_VALIDATION_RESULTS_v1.0.json", + "bytes": 3810, + "sha256": "a2b881a68c34dca6fc1fb85d47a225c9f1583499848ea45deef4de029d9f0ff9" + }, + { + "path": "docs/quality/PHASE_14_VALIDATION_RESULTS_v1.0.md", + "bytes": 1648, + "sha256": "4ffac0d2e5461bee305d346b3da2589f33120ff9ba31f6a6b740d8b52393ac5d" + }, + { + "path": "docs/quality/PHASE_14_VISUAL_REGRESSION_RESULTS_v1.0.json", + "bytes": 501, + "sha256": "8f27f81463c6850bf6b93b4efd61f761af7ccf011b220b336f69b8a4ef5d453c" + }, + { + "path": "docs/quality/VALIDATION_RESULTS_v1.0.json", + "bytes": 1397, + "sha256": "9b663f7667620496bcbd872e3fc06c725adfb7dbbf6d7bfe8848896f400105d7" + }, + { + "path": "docs/quality/VALIDATION_RESULTS_v1.0.md", + "bytes": 4623, + "sha256": "47d44ee6095cb0bc68fe23148c98403d39309edbb4dd6acdf4a696019e9f0065" + }, + { + "path": "docs/quality/VISUAL_REGRESSION_RESULTS_v1.0.json", + "bytes": 659, + "sha256": "2e94e41c1bdae854d8b1b1db8f62027e896783ece58df0108287c181c7e8caa5" + }, + { + "path": "docs/TOKEN_IMPLEMENTATION_v1.0.md", + "bytes": 2281, + "sha256": "fe6cb88b5689f989cd325a961f2d28cde6f20bea31d2cf572d2a5706c2d7fed7" + }, + { + "path": "eslint.config.mjs", + "bytes": 1031, + "sha256": "14ef56a9899d4c5440c6fe71e713f321b1e1db3de2041b6ad13cd8f798a5225d" + }, + { + "path": "next-env.d.ts", + "bytes": 247, + "sha256": "7b550dda9686c16f36a17bf9051d5dbf31e98555b30d114ac49fc49a1e712651" + }, + { + "path": "next.config.ts", + "bytes": 198, + "sha256": "cd5d6988c4b5ba3b924c236876af7df12edf1f6df71d654ed67500ad450a48eb" + }, + { + "path": "package.json", + "bytes": 3716, + "sha256": "a00be27528360c8e7efb11c4084b14a00aac7c5414552a4fc97beb40f7a96a9a" + }, + { + "path": "PHASE_10_PACKAGE_MANIFEST_v1.0.json", + "bytes": 25522, + "sha256": "5a6e185cba91cf3801480ef83f07ed392cd2a85f1f717bb2c4b341235613269c" + }, + { + "path": "PHASE_11_PACKAGE_MANIFEST_v1.0.json", + "bytes": 35023, + "sha256": "060cf87e54f52d00928722188166a24e20949b91c3237e5ac148bdf660b66aaf" + }, + { + "path": "PHASE_12_PACKAGE_MANIFEST_v1.0.json", + "bytes": 58828, + "sha256": "1eb7d488f70fd147f0e34d5ffcb2f40e05d6e6094629c9fb2374f42cb4651906" + }, + { + "path": "PHASE_13_PACKAGE_MANIFEST_v1.0.json", + "bytes": 62522, + "sha256": "6d1478e402a429a9e48a4bd157f7eef473bb6ac09021913acd8ca143527f4807" + }, + { + "path": "playwright.config.ts", + "bytes": 2003, + "sha256": "d054578e388ff2bc3af53a0f02a54952225a4e88fda528d0181a5ff17ff6f9ff" + }, + { + "path": "pnpm-lock.yaml", + "bytes": 168864, + "sha256": "c8b40337671246d5a691a4c2c322f6ed184c6b7f99c10095519cf768eb1ace3d" + }, + { + "path": "pnpm-workspace.yaml", + "bytes": 338, + "sha256": "568eba518a28bcd58534a51483092d0a27919aefaec2446e6dd5c6d6ddd80160" + }, + { + "path": "prettier.config.mjs", + "bytes": 164, + "sha256": "2d5316ad27ef10ead128dd2ee82e11b79f067fcf25ea6d504624966739260335" + }, + { + "path": "public/.gitkeep", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "README.md", + "bytes": 4499, + "sha256": "af6addc1b409a534512759c6495a1112ac0895c0d1b5589025fa6355ce2b1c10" + }, + { + "path": "scripts/generate-phase10-manifest.mjs", + "bytes": 1800, + "sha256": "6917fd46f99aacf9de7c89f058380facbf4c8c4adf0baaafb0bf7d1333497808" + }, + { + "path": "scripts/generate-phase11-manifest.mjs", + "bytes": 1800, + "sha256": "4f659193f9741a6c4d0b1bfc8153b426952ce7a9a895b8229bc8fe82530d832b" + }, + { + "path": "scripts/generate-phase12-manifest.mjs", + "bytes": 1771, + "sha256": "2be2e9d9089fc37041ecba9196ca6f2eaed818b7572c470fea4d4c2a4ea4ecd4" + }, + { + "path": "scripts/generate-phase13-manifest.mjs", + "bytes": 1801, + "sha256": "43e242d20eee8fd4a06747c340187e43a87fcd1da7f99c2c295ece7d62c9a710" + }, + { + "path": "scripts/generate-phase14-manifest.mjs", + "bytes": 1801, + "sha256": "c17d335321be709cd455c357c53d902a8b4f1c279b86254e232e922ca21ee3b4" + }, + { + "path": "scripts/lib.mjs", + "bytes": 1446, + "sha256": "81c8af9b271572e92ade805dd317dc8738647efe8e89cb37a7c9d1873b5d5edc" + }, + { + "path": "scripts/prepare-standalone.mjs", + "bytes": 813, + "sha256": "f1c1398022048160d71ae14bfa53dd2e431dd2f5aca8f39571de159259af535b" + }, + { + "path": "scripts/prepare-typecheck.mjs", + "bytes": 200, + "sha256": "ab77db302cfc2e9ee25147989f5c8de5bd244a8efcce63d862fdb0f9350c227f" + }, + { + "path": "scripts/run-checks.mjs", + "bytes": 695, + "sha256": "f7e2e25fec5ba927fe2be4ef4d1d19479159c151ad4cec4f53a254b487c8a43a" + }, + { + "path": "scripts/run-validations.mjs", + "bytes": 754, + "sha256": "a36eff2467b22be74c46579f4193d40b779474cd90f401ebc8fc93ab843ec540" + }, + { + "path": "scripts/validate-css-logical.mjs", + "bytes": 943, + "sha256": "d47f0346ba94621442c5dc700b53a0219ade3dda7485b4c7f49fb384738c424c" + }, + { + "path": "scripts/validate-locales.mjs", + "bytes": 1875, + "sha256": "dfaf3f34079ea571b17dd2d71d0abf47b48be924818b39c5df93495188b95f43" + }, + { + "path": "scripts/validate-metadata.mjs", + "bytes": 1268, + "sha256": "78127c2c0387e38914388f1a6292ed7a408d672739f8ef5a51e3919fdd2addb0" + }, + { + "path": "scripts/validate-phase10-manifest.mjs", + "bytes": 1192, + "sha256": "29386f182d08ee9096e51a01ea115ae145023724f3d8527fc3ac550152f34d20" + }, + { + "path": "scripts/validate-phase11-foundation.mjs", + "bytes": 2898, + "sha256": "6ada4344545ae50710d9207e0de636c1a8452e6a6bbe3815d51f82ae66667b0d" + }, + { + "path": "scripts/validate-phase11-manifest.mjs", + "bytes": 2950, + "sha256": "977c184291541ad5c6926f8075f96e093dd8957ffc6fe722cc4481a7c079aab7" + }, + { + "path": "scripts/validate-phase12-components.mjs", + "bytes": 3533, + "sha256": "5f07dfdba17bc909cda2fcb0bb52dfac689d1bb9ee4daed5a5640545f48fd01a" + }, + { + "path": "scripts/validate-phase12-manifest.mjs", + "bytes": 2545, + "sha256": "8968feb1e9a0aa6fae696e18fbc1d73dd34881ff4bfe80cfd5f8114a16667ac8" + }, + { + "path": "scripts/validate-phase13-homepage.mjs", + "bytes": 2514, + "sha256": "5a8e8cfb5f1512d02a08a6c8d7952436700b1fd9ebc9d6384ae3191a4eda353c" + }, + { + "path": "scripts/validate-phase13-manifest.mjs", + "bytes": 2576, + "sha256": "407e334829c01206c92ad80fcb9347f8288e48e46455de19a50a26cc9f87ed1f" + }, + { + "path": "scripts/validate-phase14-environment.mjs", + "bytes": 1237, + "sha256": "236f2c7d06b0b879cd475d0e28f09881201972c977b4d108f85d8da692d664e3" + }, + { + "path": "scripts/validate-phase14-integrations.mjs", + "bytes": 2556, + "sha256": "b87d7a29cfff50a824c772a511c0b7dbc2d5d016c3a8b792248fb86370019f06" + }, + { + "path": "scripts/validate-phase14-manifest.mjs", + "bytes": 2576, + "sha256": "9f586d4de1e321c4bf6113a153d0b033c38e15e57046d6d6e9dcb4aa93c4f1ed" + }, + { + "path": "scripts/validate-phase14-privacy.mjs", + "bytes": 1383, + "sha256": "28ad1dae9ec12952a3f00b20dcd9cd8a258b8d7e12064872f39e4d8813f910b3" + }, + { + "path": "scripts/validate-phase14-security.mjs", + "bytes": 1706, + "sha256": "e4e86e52060c80cf7c14e0db178438765ea6e12715f9994a93fc2e1bb805fdc7" + }, + { + "path": "scripts/validate-phase9-contract.mjs", + "bytes": 1424, + "sha256": "5fce16d33bf6cf7d95136b89f62fd595f109c5d003d54652998dfe3e5b866d6e" + }, + { + "path": "scripts/validate-prohibited-content.mjs", + "bytes": 1068, + "sha256": "3dd645162ad8cd95a28395840fba47a11e2b34e744c7cebdd61a0a9ed3003872" + }, + { + "path": "scripts/validate-routes.mjs", + "bytes": 1611, + "sha256": "d495d43cdfc9505c951b1ed4f7c717d5369b2a637ca31b0b87aae118295c9568" + }, + { + "path": "scripts/validate-runtime-dependencies.mjs", + "bytes": 2188, + "sha256": "f4c43bcaf8fdc78ece6698bcfcdd95413d7a28c1e991f352d74441d0dbbda17f" + }, + { + "path": "scripts/validate-tokens.mjs", + "bytes": 1682, + "sha256": "a508dbee00fe1f991d4f09c2072719e508eb9e14f3ab7d474ba67ca826f45557" + }, + { + "path": "src/app/[locale]/[slug]/page.tsx", + "bytes": 2222, + "sha256": "1f0a103dc658ba88003f5203e3842ec13dc5bdc2bc10695510968043f9ea4dfd" + }, + { + "path": "src/app/[locale]/component-lab/ComponentLabInteractive.tsx", + "bytes": 3620, + "sha256": "87a236be050916440bce01f0c4c5ec9ef31f33a64eff706dbd8ff53febb9868b" + }, + { + "path": "src/app/[locale]/component-lab/page.module.css", + "bytes": 618, + "sha256": "5aa5740b49a0b17da98bb9041e95e9680ae2bfc6de28244b6ddc1d36bdc30372" + }, + { + "path": "src/app/[locale]/component-lab/page.tsx", + "bytes": 2960, + "sha256": "ef7007fbcedfeb3dd96e16ff657b43ed9cac72cd5792dea067d68a61b011c60c" + }, + { + "path": "src/app/[locale]/error.tsx", + "bytes": 693, + "sha256": "129089239ad9e7e5fb941607803ef5dded6df716d3d913b355db015901cea2b5" + }, + { + "path": "src/app/[locale]/layout.tsx", + "bytes": 2932, + "sha256": "aaae9374813073c4cde0877f4bf6ba11f98027262bb5d1e001f8b654d2fff6e5" + }, + { + "path": "src/app/[locale]/loading.tsx", + "bytes": 146, + "sha256": "54cff43832c7ad9d05b82cddb5e2262ec11589a937a54b3c5a2c0da3da6c46b5" + }, + { + "path": "src/app/[locale]/not-found.tsx", + "bytes": 150, + "sha256": "ddb7a1c6f57acebb313117af5c5312398b39a6b698f7347b8fed69c4816e9c00" + }, + { + "path": "src/app/[locale]/page.module.css", + "bytes": 3805, + "sha256": "ae5a4800050ffb7c4afae1b427a2a8c1900baa825064b7cbc96ac6316a68319d" + }, + { + "path": "src/app/[locale]/page.tsx", + "bytes": 12595, + "sha256": "dcde623280a31fa552f0b8ca322656714ced4bf3241a037a7c122e463ee5c84d" + }, + { + "path": "src/app/api/demo/route.ts", + "bytes": 4458, + "sha256": "08f6b254967a69f551988a3d6ced3ee388b53746d26100c5c53094422a6910fd" + }, + { + "path": "src/app/robots.ts", + "bytes": 397, + "sha256": "6c1e263671da52c65da390bcbf38b2a11ec9c580a0072295cad11028e082900f" + }, + { + "path": "src/components/actions/ActionLink.module.css", + "bytes": 1250, + "sha256": "7aa5f13eb3a26877c3301056b4e05e30ef9433513bdfdbf2cde544708d7fa7c0" + }, + { + "path": "src/components/actions/ActionLink.tsx", + "bytes": 1963, + "sha256": "5c239401c7c16a7ed42818e664b8f8b6d1929f1d1d2ad26defd832a88372c9cc" + }, + { + "path": "src/components/actions/Button.module.css", + "bytes": 3018, + "sha256": "667e7b647fdec7030cda77a06d5f4509fc1ed941e2b68c65a6e656161708d4a2" + }, + { + "path": "src/components/actions/Button.tsx", + "bytes": 2720, + "sha256": "27933a21d5566700b9cb2dc99f68a53e05f965cae829191f0fe83d75679fc89c" + }, + { + "path": "src/components/app-shell/BrandLink.tsx", + "bytes": 684, + "sha256": "54c482a2e5be262941b943cf2ed123b61dbd4199993d225ec5d22be530b375bb" + }, + { + "path": "src/components/app-shell/Controls.module.css", + "bytes": 743, + "sha256": "fde735d74c28c3131a4c2c6b91146fd844e4af1af351d481033b32e2a8ec1a8c" + }, + { + "path": "src/components/app-shell/DisabledAction.tsx", + "bytes": 682, + "sha256": "4c8327532ccd967895c9ea03477b136eef7f47b169e04ecc728e3af80a152073" + }, + { + "path": "src/components/app-shell/HeaderNavigation.tsx", + "bytes": 1634, + "sha256": "ebfd217810ca31dbafd64ceeaaf8de45a89c6e2aa1d4806a66f2f25dd55e0188" + }, + { + "path": "src/components/app-shell/LocaleSelector.tsx", + "bytes": 1330, + "sha256": "bfcda377c8177aab6e2f5e17fc761dd77009e0310fd281f7dbc07a72f88c162d" + }, + { + "path": "src/components/app-shell/LocalizedLoading.tsx", + "bytes": 503, + "sha256": "b362aa5b94495c599c7cc22e0a3cfa04a29229b6c7f74dde71202f5027a831a5" + }, + { + "path": "src/components/app-shell/LocalizedNotFound.tsx", + "bytes": 794, + "sha256": "3b7a9c001bd3e9818c7bda6f25bc29c9df816d4ced1486542be2b31ccdc476e9" + }, + { + "path": "src/components/app-shell/MobileNavigation.tsx", + "bytes": 4188, + "sha256": "be0e5104d96f71c89354bf7de042f40d2cf740c756acf74cb11a0b16c89c17c0" + }, + { + "path": "src/components/app-shell/SiteFooter.module.css", + "bytes": 2260, + "sha256": "491af5e5b3137180ffec3833ff2d9e6bfe1d47cf7615a886034e1ff12b89cceb" + }, + { + "path": "src/components/app-shell/SiteFooter.tsx", + "bytes": 4999, + "sha256": "e50e289a87c9b9adc26931b5bec9382a9eaf176ce2abed5b4c1693b6cb64bfe0" + }, + { + "path": "src/components/app-shell/SiteHeader.module.css", + "bytes": 5197, + "sha256": "a0bd449a7fceb0837a35b09acc743750061e0c77ec0060e13cbd20a843fe509d" + }, + { + "path": "src/components/app-shell/SiteHeader.tsx", + "bytes": 2707, + "sha256": "a02bc01a005a2d796d981e3aab7181f881c9bb787cf3e30c04c8ccbbea986a38" + }, + { + "path": "src/components/app-shell/StateShell.module.css", + "bytes": 2014, + "sha256": "acdf7af0cd11250c411dd44291e36cc5053a195a07d3849c2ca9050f6524cf40" + }, + { + "path": "src/components/app-shell/StateShell.tsx", + "bytes": 1378, + "sha256": "633c5d35f024d6c1c7a7b5f2bc128d13ef35a25ac07820c7428dc871d5c01f50" + }, + { + "path": "src/components/app-shell/ThemeController.tsx", + "bytes": 1017, + "sha256": "e3e646ff02c7480a191d4700971ba03b947ddff769687af1f3769e11cd740ce9" + }, + { + "path": "src/components/app-shell/ThemeSelector.tsx", + "bytes": 2319, + "sha256": "04bb79e8b99006786e669ccae0a8d1a845efafceebe6b5d0ab43380a190d1b6f" + }, + { + "path": "src/components/controls/Accordion.module.css", + "bytes": 809, + "sha256": "5a0bf706ab23537146dfa6a03e76753d22987a6df2cab0ddc9a60094f7865ba6" + }, + { + "path": "src/components/controls/Accordion.tsx", + "bytes": 880, + "sha256": "0c26c34d4b7ed1f343101f5a7897806e4a42301181070074a3489668cd425ca3" + }, + { + "path": "src/components/controls/Pagination.module.css", + "bytes": 605, + "sha256": "cb6d2109fd8706e16090e38c0154380c7272c40b723899600d93bd7d44d4af47" + }, + { + "path": "src/components/controls/Pagination.tsx", + "bytes": 1423, + "sha256": "7ea4663bdb23f16c57d29d3503684bed127d7f0f09f68e10e061c3ec8f9255c4" + }, + { + "path": "src/components/controls/SegmentedControl.module.css", + "bytes": 742, + "sha256": "b03cd7de287c4bc182917391461023b103c298bc249b082eebeaaeda12dca041" + }, + { + "path": "src/components/controls/SegmentedControl.tsx", + "bytes": 977, + "sha256": "6fd779b2a0d7f2a8f9a376f595144b92f42b41bc4f520768c104be90085baaf6" + }, + { + "path": "src/components/controls/Tabs.module.css", + "bytes": 688, + "sha256": "2b09531d587bd42d8a45cb78b68ae3581f2ec4979a1d749781311a6a81dbc5b7" + }, + { + "path": "src/components/controls/Tabs.tsx", + "bytes": 3706, + "sha256": "a978deffdbb453dc3f15a149476fbcedc2a857c9e39d1677aa3dfc13423f42da" + }, + { + "path": "src/components/feedback/Alert.module.css", + "bytes": 701, + "sha256": "42437211c46949b798d0544e96983457d34ad17af5a251528a5000a393a7fd11" + }, + { + "path": "src/components/feedback/Alert.tsx", + "bytes": 1185, + "sha256": "743f79b9b1aec74db9d86655bd60d660e5ff8a2b9a2b446f744aa68a9aa401f1" + }, + { + "path": "src/components/feedback/Loading.module.css", + "bytes": 782, + "sha256": "2f8be2f2f54e1b1dae4307012ebc8d7e1b516f99241b99bcc0385632a5583717" + }, + { + "path": "src/components/feedback/Loading.tsx", + "bytes": 1046, + "sha256": "bf766131b06eff6f4bebd03a24839037a2583975256d535462d79b72f1f1214e" + }, + { + "path": "src/components/feedback/Progress.module.css", + "bytes": 298, + "sha256": "a959f3d0f793a16bd913edfbec2c744d037715fb8108dbd7d9f0a4aea2e57f27" + }, + { + "path": "src/components/feedback/Progress.tsx", + "bytes": 969, + "sha256": "a2ec6d0993ec49146170ecf655f23bbcdce7f944dc6b6ae4189676671e77bd08" + }, + { + "path": "src/components/feedback/StateMessage.module.css", + "bytes": 343, + "sha256": "90a4e7a10b9d39eeacd2b127c1c80d0550d3b364cc566667a59ccd6b2d6a436b" + }, + { + "path": "src/components/feedback/StateMessage.tsx", + "bytes": 729, + "sha256": "2f327960e793cefbf8bd501ef7948764390485708217d8f1934eb08c23260f5a" + }, + { + "path": "src/components/forms/ChoiceControls.module.css", + "bytes": 1780, + "sha256": "2ba09892007180658bcbe8621261f1508034398af16929df379684fcdb2850b9" + }, + { + "path": "src/components/forms/ChoiceControls.tsx", + "bytes": 1763, + "sha256": "ddee24498db928491fe82b4db2fa559a5c8b8867bf8d8d7ff1cbfa090218da4d" + }, + { + "path": "src/components/forms/ErrorSummary.module.css", + "bytes": 482, + "sha256": "581e9b4db50083165ec0d9f5e5ccc04d9d5c63696f387389f5a154e039873a87" + }, + { + "path": "src/components/forms/ErrorSummary.tsx", + "bytes": 801, + "sha256": "e5e876e863a894506d717e15953aee906bb54903d6f79df0d09a88e9f0f8108d" + }, + { + "path": "src/components/forms/FormField.module.css", + "bytes": 749, + "sha256": "7bb3eca2e81143d98fb6d6aa4da6cb15f6886ed8ad1885cc5ba83bd10155bdfd" + }, + { + "path": "src/components/forms/FormField.tsx", + "bytes": 1643, + "sha256": "a99559d7a5d4fcb1d442ef7401ae3bffb31f069b46d97855606111a84bbcc559" + }, + { + "path": "src/components/forms/TextInput.module.css", + "bytes": 942, + "sha256": "ebb94b50515bd443c97353b42b8414f1f8848c64e4ffeb1d0e10f517f6857a2b" + }, + { + "path": "src/components/forms/TextInput.tsx", + "bytes": 2571, + "sha256": "777d7acb6f8ad35c27c1c0401d29e02781bdfd2261951a9c3d2020f8976dfdb4" + }, + { + "path": "src/components/foundation/AccessibleIcon.tsx", + "bytes": 352, + "sha256": "cc68b314b3a704037460272f12a05e4185bfbcc08be62bf0facd0d1efa5a5f5c" + }, + { + "path": "src/components/foundation/BidiText.module.css", + "bytes": 35, + "sha256": "0d9480f398007b7e1395f25afd4ba982c6a5dcf299f796ee96fdc1302e5f8b06" + }, + { + "path": "src/components/foundation/BidiText.tsx", + "bytes": 581, + "sha256": "2ed6cb4a821ec1c345b532f51808045490ebaca935bfe93c4bde5fec9292d1f3" + }, + { + "path": "src/components/foundation/client-hooks.ts", + "bytes": 2387, + "sha256": "d4bd6fd5efdd4560d2e356447b24944ffb9ba8f96f57b82b63617923ec457e61" + }, + { + "path": "src/components/foundation/Icon.module.css", + "bytes": 371, + "sha256": "33b3daa50a01cfeb683ea1fa92831efb8d7fd08a7e150370027b88c99118cf4d" + }, + { + "path": "src/components/foundation/Icon.tsx", + "bytes": 3549, + "sha256": "65d3f672bb32bd84745d9f9afd1d1f006debf244aba9e4147c89b3346a4a8764" + }, + { + "path": "src/components/foundation/LiveRegion.module.css", + "bytes": 184, + "sha256": "f5793a73b271c20d10b389245651d7c79fae6417c29e55701e381c0025d20df0" + }, + { + "path": "src/components/foundation/LiveRegion.tsx", + "bytes": 403, + "sha256": "d64aad4af939e2696b955a0632b2869533409698ae3dffede57a18a776e64acf" + }, + { + "path": "src/components/foundation/StatusBadge.module.css", + "bytes": 799, + "sha256": "1f46642795f813e177956bbb25973238275b98b5febb311bb8e7f18597bb2fdb" + }, + { + "path": "src/components/foundation/StatusBadge.tsx", + "bytes": 677, + "sha256": "57eb1b5fdc93f40a3ce5599a4691e76a5976ec8a76d451e8c5008a68262a9706" + }, + { + "path": "src/components/foundation/VisuallyHidden.tsx", + "bytes": 409, + "sha256": "babb1e41cb3ee8691da2653446f8ea38ecce94bcf90645f797cd23f08152213d" + }, + { + "path": "src/components/integrations/DemoDialogHost.module.css", + "bytes": 1075, + "sha256": "f15803f7d41b1f1705a150070c5aaf81bc7c8b02f63256bedaa4d1ca830df074" + }, + { + "path": "src/components/integrations/DemoDialogHost.tsx", + "bytes": 15878, + "sha256": "bcf7b8324cf3a90b6300d3d3c41fd15c972181f1d9ec6f87c7755d11a31ec296" + }, + { + "path": "src/components/integrations/DemoTrigger.tsx", + "bytes": 1325, + "sha256": "52bf30616912131dc256dc1d0432574746f3937bbe1e447547ef020640c14e2e" + }, + { + "path": "src/components/layout/LayoutPrimitives.module.css", + "bytes": 1106, + "sha256": "4463342699789f2bc38703a7178b62138f10a255555347b692855ea07536dbcc" + }, + { + "path": "src/components/layout/LayoutPrimitives.tsx", + "bytes": 2161, + "sha256": "e3eceb28bcaec129f0324558fd2a13fbfe413615c16943cc691a2a993089de33" + }, + { + "path": "src/components/marketing/Comparison.module.css", + "bytes": 571, + "sha256": "60624d31af0a9fb00f7ebe7bb705d7e6287911133ccd993e6b192ba45da94aec" + }, + { + "path": "src/components/marketing/Comparison.tsx", + "bytes": 1540, + "sha256": "d61e9fbec9780b9252dc5653b3915291fa9c5fc9f58284664a53aa11718cc366" + }, + { + "path": "src/components/marketing/CTA.module.css", + "bytes": 695, + "sha256": "15f1bfe8ac1ce9af110c48985ac572b3369bfca946a02f9392b2adeed8a6eb14" + }, + { + "path": "src/components/marketing/CTA.tsx", + "bytes": 2041, + "sha256": "7e8d0f1e0476e792682131e3be2bbbed8e9f4311b9a161c5629cd186c7935d83" + }, + { + "path": "src/components/marketing/Evidence.module.css", + "bytes": 412, + "sha256": "a77743583735f99b9b30368987428585ef31f2aabd9c786529657036b82a21f3" + }, + { + "path": "src/components/marketing/Evidence.tsx", + "bytes": 2248, + "sha256": "9fd018f402ef8dc9c130d6a432f6874d74949bf06e2e4947fea62b41d86cec9c" + }, + { + "path": "src/components/marketing/FeatureCard.module.css", + "bytes": 348, + "sha256": "57c384aca1b2526e928463041164d522e69a69d065be274f6429464beb87136f" + }, + { + "path": "src/components/marketing/FeatureCard.tsx", + "bytes": 1444, + "sha256": "9c4bb352e1c4fffaa5566b2b5b190a2305b5935752205dee8b395a25ec9ba206" + }, + { + "path": "src/components/marketing/ProductPreview.module.css", + "bytes": 1272, + "sha256": "4901558b80324028252db79ff79ad7502d55554ca42d42b3b3e6ff4e4462a7dc" + }, + { + "path": "src/components/marketing/ProductPreview.tsx", + "bytes": 2137, + "sha256": "00dbcf972d8414cc79538a7552843ac93d28c97dec700d596d4a2571ea7f3c5c" + }, + { + "path": "src/components/marketing/SectionHeader.module.css", + "bytes": 216, + "sha256": "6f99ef1f489c765738189363fa8cce40b768db43be0645ac9532e670dd7fd31f" + }, + { + "path": "src/components/marketing/SectionHeader.tsx", + "bytes": 835, + "sha256": "8b9ab5d01fe69b25bd16574105feb74b9e70758df5a9daef32da5d29250760e9" + }, + { + "path": "src/components/marketing/SectionPatterns.module.css", + "bytes": 849, + "sha256": "3f27c9f58bb61032f3432b58fc83c20e619322e573a8460b36113b0116560027" + }, + { + "path": "src/components/marketing/SectionPatterns.tsx", + "bytes": 1004, + "sha256": "0ae2ee1c2a340db787e239a4222b9dd23eb8a688ff711497890570acd8b5eadf" + }, + { + "path": "src/components/marketing/Workflow.module.css", + "bytes": 967, + "sha256": "545620b59d472a2c696183a9e9827f3e7ed8682f462664eee1b6887313a60d56" + }, + { + "path": "src/components/marketing/Workflow.tsx", + "bytes": 1407, + "sha256": "2d64639b356b9f14e3250bff7489b78ee32eceb3e7c628cde5b8f5c68bfa8dce" + }, + { + "path": "src/components/media/MediaFrame.module.css", + "bytes": 634, + "sha256": "c59c885869c8f432c8047f926810b55a185d5f46e1b908a03ef12bc7ed8bf2b7" + }, + { + "path": "src/components/media/MediaFrame.tsx", + "bytes": 1266, + "sha256": "8ef160e29c45690e7dccc3abfd63126425b62cc56673c47a57e01daa00464bf3" + }, + { + "path": "src/components/navigation/Breadcrumbs.module.css", + "bytes": 314, + "sha256": "c981af1d7501fed7832714dfa480f6627928477ff954937c8849f0a9be280aca" + }, + { + "path": "src/components/navigation/Breadcrumbs.tsx", + "bytes": 1175, + "sha256": "359f1e615f25fc3e94c173409fc1946ff95a6fdb9209d86973c3ae96f20c014f" + }, + { + "path": "src/components/navigation/FooterLinkGroup.module.css", + "bytes": 181, + "sha256": "b2622a0cf021181427f219e5aa76a89fdb821240092725bae98282a70aedeb44" + }, + { + "path": "src/components/navigation/FooterLinkGroup.tsx", + "bytes": 775, + "sha256": "9363f1038f6a33840351a51d51374f02c6c1ef32a19cce009c166b141e3d3461" + }, + { + "path": "src/components/navigation/SectionNavigation.module.css", + "bytes": 409, + "sha256": "da941d8adf08ae0826651f3e801965025f4d958b982f3b22a2aa29315b204086" + }, + { + "path": "src/components/navigation/SectionNavigation.tsx", + "bytes": 759, + "sha256": "e86a7d478baa53d315685e79a62b2e8a50d8bbf87d8201f13ae6347844b5f847" + }, + { + "path": "src/components/overlays/Dialog.module.css", + "bytes": 1464, + "sha256": "d1d8402dd4cf4a2777d66d6d08a4859db3b841156c331a5784dd00428ed2ecc4" + }, + { + "path": "src/components/overlays/Dialog.tsx", + "bytes": 2721, + "sha256": "1e52fc4d7a96ee892b7b9c31e8d504831a468bce2b9df17ee576431146f49bf4" + }, + { + "path": "src/components/overlays/DropdownMenu.module.css", + "bytes": 899, + "sha256": "d0f6cab314861fca4f0db886dd9a8981361274503df1aaf123409731302ecdd2" + }, + { + "path": "src/components/overlays/DropdownMenu.tsx", + "bytes": 2776, + "sha256": "db44d077ddb5a05457f1a60cc33383e3fab4ecb6cf0729cef55b21e4dabb58e6" + }, + { + "path": "src/components/overlays/Tooltip.module.css", + "bytes": 1103, + "sha256": "650d232057f795a046e8a7d04109ddaffe10dbbe71ce8796661bc63bb2edf931" + }, + { + "path": "src/components/overlays/Tooltip.tsx", + "bytes": 470, + "sha256": "839d3d08ecc8712eed9f84b3d69cb7e0f43fe450c0454015b85c6d83045115e0" + }, + { + "path": "src/components/surfaces/Callout.module.css", + "bytes": 374, + "sha256": "2f8c824f873308c30bb4612360b30a8807f4718c5820da5068cda35a17809783" + }, + { + "path": "src/components/surfaces/Callout.tsx", + "bytes": 496, + "sha256": "6eff5ca0fa0471ec35463de3e6a632c390ce68685e6dc10f8ea7ba36cb52cec4" + }, + { + "path": "src/components/surfaces/Card.module.css", + "bytes": 977, + "sha256": "014884cdeb170b200f30176e71ac35a01d491048e37c12901063d31fb9ed04d1" + }, + { + "path": "src/components/surfaces/Card.tsx", + "bytes": 1034, + "sha256": "76f6e68536848df8955031f352bee4787d10f191bb486d483438559c2babb4ee" + }, + { + "path": "src/components/typography/Typography.module.css", + "bytes": 1393, + "sha256": "bc1e060c8cdaaf977b787dc1a9a11d08eca8ff3100945d47ca82180e828a47b6" + }, + { + "path": "src/components/typography/Typography.tsx", + "bytes": 1676, + "sha256": "80ec8b42765b90b6558486557cdd677e528f9507fa3bfd205b91cfb52422842c" + }, + { + "path": "src/content/development/component-lab.ts", + "bytes": 14891, + "sha256": "0d90fb8aaac23cd12664ac98d7277d3b32eaf19d19db65ff308c46d5c89cd9b3" + }, + { + "path": "src/content/homepage-model.ts", + "bytes": 7885, + "sha256": "41b10af10f4b9351e994d22302704c9c118db7b91a896c992fa3e4a6e1870bc8" + }, + { + "path": "src/content/locales/ar/homepage.json", + "bytes": 18727, + "sha256": "18ee401ff18c52c033bb0a21a4aea3adf0425094f0decda453edd2a0e6d69c8d" + }, + { + "path": "src/content/locales/ar/shell.json", + "bytes": 4917, + "sha256": "48360fff06aabe1079a7149fc420a3667d25dd2ae67ec38c60f8b02e4a13bb2d" + }, + { + "path": "src/content/locales/en/homepage.json", + "bytes": 13772, + "sha256": "fa2f5c3e05a84888791c84d8edf65a56e2254655c951851ed428e38fc14d3191" + }, + { + "path": "src/content/locales/en/shell.json", + "bytes": 3682, + "sha256": "359f2ca2d531eab3a7d07f98d78c7f17989e7dc6581c353816979efb1d0734ea" + }, + { + "path": "src/content/locales/fr/homepage.json", + "bytes": 15718, + "sha256": "0ae27d726c5df34f8845c08b302ae8cfe3927a21af7076b8f46abfbeeb116f23" + }, + { + "path": "src/content/locales/fr/shell.json", + "bytes": 4271, + "sha256": "24624347f923a5d166c7c19ee79e6a7fa4e083be994ce5ea48bae588f95e92af" + }, + { + "path": "src/contracts/phase9/analytics-contract.ts", + "bytes": 918, + "sha256": "d79b32503a5f8346816c647b8a7f45a62468b96f4fc9525d6d5147b5d2f2ec45" + }, + { + "path": "src/contracts/phase9/analytics-event-spec.csv", + "bytes": 1713, + "sha256": "1282ebca5b031f6267f8139033db437e30b62ac391d25823c8a4783b64151008" + }, + { + "path": "src/contracts/phase9/component-contracts.ts", + "bytes": 3041, + "sha256": "45fb0222d99308b2f28014572316b13c2d7308bc16b1bd02f63b6e2257148399" + }, + { + "path": "src/contracts/phase9/demo-form-contract.ts", + "bytes": 699, + "sha256": "073cf70224f93312d177f77abd7987704205628209e30c44824ae45f929ee59e" + }, + { + "path": "src/contracts/phase9/design-tokens.json", + "bytes": 3771, + "sha256": "470d7bc9d4a466cce4e51f0fdc21fe199ec5b0d4007f5063704c523ce1b9ef0c" + }, + { + "path": "src/contracts/phase9/performance-budgets.json", + "bytes": 815, + "sha256": "e1679ce45d8a1225c46c085c7533d3230a41279c32d0812de5c5f05cb55eefa8" + }, + { + "path": "src/contracts/phase9/route-manifest.json", + "bytes": 1433, + "sha256": "e08ac94ba1f3899bb02dfa934695f530d1089f9f03b0fadaa0feabd466ad8ec4" + }, + { + "path": "src/contracts/phase9/visual-regression-scenarios.json", + "bytes": 1209, + "sha256": "27d961c33c32775485475f7037b8d3bbd13f634b65fe2f59d6eea898860edf5f" + }, + { + "path": "src/lib/analytics/client.ts", + "bytes": 831, + "sha256": "582efdc793da2930e52df2b87bf3e48876d7e03b206062c867836a7d36532763" + }, + { + "path": "src/lib/analytics/events.ts", + "bytes": 2097, + "sha256": "cc98e599c7783c993362ca2bac420ff774c56cc006026648df8086ecc6118ebb" + }, + { + "path": "src/lib/components/classNames.ts", + "bytes": 135, + "sha256": "9ec04c6ee51488fbcfebcace04c9e1ea9de3fda7cbc69e233b0bce353ad77824" + }, + { + "path": "src/lib/demo/adapters/blocked.ts", + "bytes": 388, + "sha256": "ebed470f8546d729bc626e9c427315acb17f262a190871f02c9d6e9bfc4535e2" + }, + { + "path": "src/lib/demo/adapters/index.ts", + "bytes": 746, + "sha256": "fe6ecd9a1dcee482ede19d6319b462fbde7cebbe822bf85df8128aaca887752f" + }, + { + "path": "src/lib/demo/adapters/local.ts", + "bytes": 1403, + "sha256": "09f48c5e257dc51aa87932d39cf640f971520bf29105ccdc25030efde8cf34cf" + }, + { + "path": "src/lib/demo/adapters/types.ts", + "bytes": 709, + "sha256": "1935ebf701b5fa7b8e91f6871607e397d1d0fb4c228b3e990740e6238a3da350" + }, + { + "path": "src/lib/demo/idempotency.ts", + "bytes": 1191, + "sha256": "7be87b7e0a5993dc3258ba397eed2506adfca04ee65498d85588d566ec3569f7" + }, + { + "path": "src/lib/demo/redaction.ts", + "bytes": 867, + "sha256": "82fa6ba5a7056826374a5e6633db4245108a9bb6363fed22c3093ebddd3e3384" + }, + { + "path": "src/lib/demo/schema.ts", + "bytes": 2778, + "sha256": "87409564c90edd84807870ff420adb10d09512d6be105e0c8d3eb9159c858a47" + }, + { + "path": "src/lib/demo/service.ts", + "bytes": 2381, + "sha256": "aec47fa5858dce9ef1f73c0de1b4dfbe7141d3bc619ec0ed0ea0dbf4cf482907" + }, + { + "path": "src/lib/integrations/destinations.ts", + "bytes": 4461, + "sha256": "99ea9479cce8d5170a188e6696b87a3d58cabe257de4280d9c059a96c542829e" + }, + { + "path": "src/lib/integrations/environment.ts", + "bytes": 4053, + "sha256": "b0c164af55ce6e88f214b50a4de4e634cf242fb0e9ce12ea8857e999e4e4dc60" + }, + { + "path": "src/lib/integrations/feature-flags.ts", + "bytes": 770, + "sha256": "947f1f1dfd0686a94a1896ff6b7c81b607881e1a5c601afb4f6b2f6eb0e6c725" + }, + { + "path": "src/lib/localization/client-messages.ts", + "bytes": 499, + "sha256": "402d73487e9c57e7f68b2b91b77de8cae27027bac56ac344f310eacd0bb41bd3" + }, + { + "path": "src/lib/localization/client.ts", + "bytes": 593, + "sha256": "bc1ae4b418151cd7b0816b655bf09a4f640ac09540016468e32376594001eb04" + }, + { + "path": "src/lib/localization/config.ts", + "bytes": 4758, + "sha256": "5658aebdfbb912e86b20cef052f6f2784ce64ea89c82fa3d2c05a3a32ec03ed8" + }, + { + "path": "src/lib/localization/format.ts", + "bytes": 2327, + "sha256": "a8f9fbe9bdb5838a910e86897ed13ef9bbfdca6e86514e466bc6a212c236bbfc" + }, + { + "path": "src/lib/localization/messages.ts", + "bytes": 878, + "sha256": "9307df65a80b08e7e1ea7c4e16358fc5fcbde299a00810076bcb36d0a13f9ced" + }, + { + "path": "src/lib/localization/site-origin.ts", + "bytes": 771, + "sha256": "40400ce29fc4adbd9c4490b456968e41fc7596d77ac5bea1c65179e0e4e760ff" + }, + { + "path": "src/lib/metadata/build-metadata.ts", + "bytes": 1322, + "sha256": "3496f11871e635ea6622746de07d74de63a09e648bae9ade02f7c75f042cde7e" + }, + { + "path": "src/lib/security/csp.ts", + "bytes": 830, + "sha256": "f9244e061cc397fbe8720a055e5415b6df34e6c74d0c439ae8d25054d1239c5e" + }, + { + "path": "src/lib/theme/bootstrap-script.ts", + "bytes": 755, + "sha256": "ad1ac642ca61e133f41a5e5b3c062f1b23046f24a58565c6baaacf8c9b261f12" + }, + { + "path": "src/lib/theme/client.ts", + "bytes": 1368, + "sha256": "8bdad550d093755a6f1a20f8b5b59b9d19e0dbd78dbf24c3f4eda5a6dec5811f" + }, + { + "path": "src/lib/theme/config.ts", + "bytes": 821, + "sha256": "c04cd00ce7838fc964d5bdbfaa4c2380f7cd774a9d754987946c97ee8849e60c" + }, + { + "path": "src/proxy.ts", + "bytes": 2625, + "sha256": "522ad1c3650646e652099d61b403075000b4d6e12272df381f5653dbd4745dea" + }, + { + "path": "src/styles/component-tokens.css", + "bytes": 5898, + "sha256": "70665f8912d1e45cbcd1a2674a5cb547395391dae053d0951da157ad88d7de51" + }, + { + "path": "src/styles/globals.css", + "bytes": 2472, + "sha256": "15c39da4ef19e6127bd7f40db21a98d7d2599463af1a13bbd2c3ce786a7ef385" + }, + { + "path": "src/styles/tokens.css", + "bytes": 3553, + "sha256": "99912762e078bfc78b4878fc46b8c7d03d90c073e9c236942a58d83f6585a1b9" + }, + { + "path": "tests/a11y/component-system.a11y.spec.ts", + "bytes": 422, + "sha256": "6324716ef093a4c61601721f36ef652fc40db10f8e93af67ba01ab880d266285" + }, + { + "path": "tests/a11y/homepage.a11y.spec.ts", + "bytes": 901, + "sha256": "b096866589cdc74dba4224cc4b8dd2af045ff33c04168d6e3de0a9f8b42152c8" + }, + { + "path": "tests/a11y/integrations/demo-workflow.a11y.spec.ts", + "bytes": 616, + "sha256": "3365258ce02878f7ec7ab3171e16a6989ba904d516d4c8ae818631706da00760" + }, + { + "path": "tests/a11y/shell.a11y.spec.ts", + "bytes": 781, + "sha256": "9f6299337a822d8e4f6783cbfbb3e5da02e42bcca99d8e4519d7f0193072b205" + }, + { + "path": "tests/browser/component-system.spec.ts", + "bytes": 1714, + "sha256": "09bd3833504f68a55952a69299601dbacb3aa3f9e42c3abf9ee4103ac5b0fd32" + }, + { + "path": "tests/browser/homepage.spec.ts", + "bytes": 2100, + "sha256": "a230acbefa587e81a5e35ef3b56fa6cb5b570190f2d661df6f80e522845267c9" + }, + { + "path": "tests/browser/integrations/demo-workflow.spec.ts", + "bytes": 3415, + "sha256": "8984e7581a5b2fd140c63e120f0ea7cf3373a151705f65e16cee424449e3fb06" + }, + { + "path": "tests/browser/navigation.spec.ts", + "bytes": 1120, + "sha256": "7b4aa8bcb7b5c2f09fe82f6c4a5405673e69d45fb5f0833cbe37ee1d237c4c7a" + }, + { + "path": "tests/browser/no-javascript.spec.ts", + "bytes": 568, + "sha256": "a57739c1d0c7c45960129256218a9e95b87ac80a17fc7dee8bd4c95295280fbc" + }, + { + "path": "tests/browser/responsive.spec.ts", + "bytes": 865, + "sha256": "1730baaf20abfe6c47b514a2290f083e28fedd639bc9663e79cddc3f8330eb97" + }, + { + "path": "tests/browser/shell.spec.ts", + "bytes": 2425, + "sha256": "bdd0ce3d9f5e53ff485c45a3f9442e28fb6157d08cb0eccf02268351e18202e6" + }, + { + "path": "tests/browser/text-expansion.spec.ts", + "bytes": 712, + "sha256": "27459e2864eb747d839966b2cb66f4f7527175c953deae9893116a6aa0cf9540" + }, + { + "path": "tests/browser/theme-csp.spec.ts", + "bytes": 2362, + "sha256": "7f9824a86fe70143ff380e82e51076b88a0e466af399ef8a5de4b88c5483d646" + }, + { + "path": "tests/fixtures/component-system/component-matrix.json", + "bytes": 453, + "sha256": "baf694a484a6d769bd9c534e030cf873852612fb60dfe82dc854ea893e92a5a6" + }, + { + "path": "tests/fixtures/foundation-matrix.json", + "bytes": 571, + "sha256": "b5487f1c3970b3413549c7b7500dfc4fb4541cf312ff86b570fa1de56d163ab3" + }, + { + "path": "tests/fixtures/README.md", + "bytes": 495, + "sha256": "e3dba7bdd085bbb1fa43a6b33a94e66641b4437cd01bcfaaaf9c329eee93d3ec" + }, + { + "path": "tests/integration/demo-service.test.ts", + "bytes": 3265, + "sha256": "58efc6f4cf8e5e47d0f961db554d8c9b70942662dbccb92301f02a955da689b4" + }, + { + "path": "tests/setup.ts", + "bytes": 43, + "sha256": "91a3c8962a0edcb956206a501d943fe99e1c78c6d4d8b5c9a948a3362c75978c" + }, + { + "path": "tests/types/component-contracts.test-d.tsx", + "bytes": 432, + "sha256": "3a639ef230284c29901abf6b5cc625a515f94853701a57a84b27ac4168352f98" + }, + { + "path": "tests/unit/components/actions.test.tsx", + "bytes": 1366, + "sha256": "891c69eab0e33883408ad5e07b302b2e59dfde1c6eab449f82f0573e4359a835" + }, + { + "path": "tests/unit/components/controls.test.tsx", + "bytes": 1299, + "sha256": "52b52f6603290d5c060e943966e0ba5ec7572f0a914ad295a781bd0657d08b63" + }, + { + "path": "tests/unit/components/evidence.test.tsx", + "bytes": 1276, + "sha256": "0d45214874c8810a57adfc6f5d3b83f9927fc4c9faa930e66d614b041f7e0305" + }, + { + "path": "tests/unit/components/forms.test.tsx", + "bytes": 1349, + "sha256": "71866e0245af2c6f4c8ef955000db91c796142f68f5235dfe22064d381b453f1" + }, + { + "path": "tests/unit/csp.test.ts", + "bytes": 969, + "sha256": "18e4aa4145976102239e92a9c147cc8f0b8442b1bce37b84888246b137280de9" + }, + { + "path": "tests/unit/format.test.ts", + "bytes": 1488, + "sha256": "e7bc5eb89fa3017739180208a1dcfb3f03f3cb3077997dfc7e6e03faa68a9ad1" + }, + { + "path": "tests/unit/homepage-content.test.ts", + "bytes": 1752, + "sha256": "3755d445f9420d2bd8044a712c2ff4dd16d562d93bbe4f5b76b4d8b838f0f803" + }, + { + "path": "tests/unit/integrations/analytics.test.ts", + "bytes": 1020, + "sha256": "2ab2f3e15a7f043b218f61b6ea62d345f214737fb02485d2cc50209f356b8574" + }, + { + "path": "tests/unit/integrations/demo-schema.test.ts", + "bytes": 1527, + "sha256": "eafc7ebccdda7160ca9e4d2119c97a5a801f70462ccd9a186b12c2b6e57f3a05" + }, + { + "path": "tests/unit/integrations/destinations.test.ts", + "bytes": 1211, + "sha256": "5d2c512f707932aa5684c14d93032ca146f9069a5e3472961c237d00f99145e5" + }, + { + "path": "tests/unit/integrations/redaction.test.ts", + "bytes": 742, + "sha256": "d4d5e1f908fd2e433e9a45523d242eff7bad47f43fa400911d31587b47d84e21" + }, + { + "path": "tests/unit/localization.test.ts", + "bytes": 2155, + "sha256": "b2e65d904e9ee8018a837ba0c275287d98b44341b9bca65abdb754c09f897511" + }, + { + "path": "tests/unit/theme.test.ts", + "bytes": 734, + "sha256": "45f25fd23f69af3df199473053c47fe219c88fb36a58cffac20a125bdbd47433" + }, + { + "path": "tests/visual/component-system.visual.spec.ts", + "bytes": 799, + "sha256": "60a3ca791efaacf0ca1b38209edfdfe95105740e25228f781ddf771134b82e18" + }, + { + "path": "tests/visual/homepage.visual.spec.ts", + "bytes": 1336, + "sha256": "fe75876ca2073be31b0c5423b5f329dde0ea19fa065bae514bfb4758544de97f" + }, + { + "path": "tests/visual/integrations.visual.spec.ts", + "bytes": 884, + "sha256": "0928c78c3c3fee8053861d5db88c1f946a80c22a6649f61869bdcfadc2bc7ea9" + }, + { + "path": "tests/visual/README.md", + "bytes": 525, + "sha256": "27327d51bda7fc0725a73f6ebb06db1cfa84abd3508985edbb0723da66d18667" + }, + { + "path": "tests/visual/shell.visual.spec.ts", + "bytes": 2273, + "sha256": "07bd6dd398cbab81176ea19741eb8737859bcacaa313a8c17308cd47f736ea5b" + }, + { + "path": "tsconfig.json", + "bytes": 1100, + "sha256": "f1e1e6ec6ae158e72060af04dd664d5ec9389656e8326f99b10a446bc9e31443" + }, + { + "path": "vitest.config.ts", + "bytes": 699, + "sha256": "c2ac8f10ad2894df28a93e3d2bba2c213f24b9a044db25307078648e010dc3d5" + }, + { + "path": "vitest.integration.config.ts", + "bytes": 319, + "sha256": "17e7ff31793ae0e69413c2c6372e02ebe1b8aff77e95a5d1344b9d08e6a2fa4a" + } + ] +} diff --git a/PHASE_15_PACKAGE_MANIFEST_v1.0.json b/PHASE_15_PACKAGE_MANIFEST_v1.0.json new file mode 100644 index 0000000..7ba6173 --- /dev/null +++ b/PHASE_15_PACKAGE_MANIFEST_v1.0.json @@ -0,0 +1,2762 @@ +{ + "schema_version": "1.0", + "project": "RentalDriveGo", + "phase": 15, + "generated_at": "2026-06-25", + "excludes": [ + ".git", + ".next", + "node_modules", + "coverage", + "playwright-report", + "test-results", + "__pycache__", + "PHASE_15_PACKAGE_MANIFEST_v1.0.json", + "package-lock.json", + "tsconfig.tsbuildinfo", + "docs/quality/phase15-command-logs/12-phase15-package-manifest.log" + ], + "file_count": 548, + "files": [ + { + "path": ".dockerignore", + "bytes": 116, + "sha256": "f5c4f2a6bb5aee2eab9e3c5f838dba58c97bf62ef432bdc181778cf4a167e78c" + }, + { + "path": ".editorconfig", + "bytes": 188, + "sha256": "a6b98ea7cb6d61ed8d430dd0dffa46c87012b5cf859d4ce7207898954951fdcd" + }, + { + "path": ".env.example", + "bytes": 824, + "sha256": "500309bbe79dc8d3b71aaa3965ea4c0a170c353c7d7ea82ce35508a91aa8e5d1" + }, + { + "path": ".github/dependabot.yml", + "bytes": 416, + "sha256": "0a9bdd1890c8fcb78f61f91071df45fecbdcfbbd48441f7da0dba266ba168d82" + }, + { + "path": ".github/workflows/ci.yml", + "bytes": 1967, + "sha256": "1f539bcae4f26429b959690339a57ad8abd200fed149a2ee786ed6b27f769bb3" + }, + { + "path": ".gitignore", + "bytes": 155, + "sha256": "7a502eb52bc55e5be5e971624211c692f279d7c8d85e1b89a5abc3e2e5c7c9d5" + }, + { + "path": ".node-version", + "bytes": 8, + "sha256": "98182b41c9ce3357797985cf12dc3b0124490ef88bc918a905373e7688e6aec9" + }, + { + "path": ".npmrc", + "bytes": 146, + "sha256": "e696a3cc1b84316377f18da909b079072ce02383d16c8fed410f8cabbb9ac054" + }, + { + "path": ".nvmrc", + "bytes": 8, + "sha256": "98182b41c9ce3357797985cf12dc3b0124490ef88bc918a905373e7688e6aec9" + }, + { + "path": ".prettierignore", + "bytes": 129, + "sha256": "272622f9ebbe7cc23717e19053be7c49a6fc63353cad9be57f107cd96b96a142" + }, + { + "path": "contracts/phase9/09_DEVELOPER_HANDOFF_v1.0.md", + "bytes": 8091, + "sha256": "e82d486f1e566d1bf0263f1baa7dd8035ae62da5c36bb6bfa417e61331ec8d51" + }, + { + "path": "contracts/phase9/annotated/ANNOTATION_INDEX_v1.0.md", + "bytes": 685, + "sha256": "a2e87dfdb138409604cac4cc5f52375cce97940da7363f7778af30490699decd" + }, + { + "path": "contracts/phase9/annotated/demo-dialog-en-light_v1.0.png", + "bytes": 51457, + "sha256": "d91bf102100af48feac31478770f8bfdded994ac8b47f60845e4465c50462394" + }, + { + "path": "contracts/phase9/annotated/desktop-en-light_v1.0.png", + "bytes": 144908, + "sha256": "a4151a788317aa9bf8f7262f09f645ebdb54d4a3e1254ab5703ae37e8d3cec16" + }, + { + "path": "contracts/phase9/annotated/mobile-ar-dark_v1.0.png", + "bytes": 75193, + "sha256": "6adcaf68b48bacbf105b670e71edda078a60aa26b732831bd194e1cb9da11556" + }, + { + "path": "contracts/phase9/annotated/mobile-drawer-ar-dark_v1.0.png", + "bytes": 28321, + "sha256": "bc0c14447fb6e80ce904ffcb13c237b51eaa92723702191139bee59b0f7ebdeb" + }, + { + "path": "contracts/phase9/annotated/SCREEN_ANNOTATIONS_v1.0.csv", + "bytes": 1457, + "sha256": "d7b8120926a545f472b62a436b87d2a9d20320a4d95fcf90aa96162c50e8a6da" + }, + { + "path": "contracts/phase9/annotated/tablet-fr-light_v1.0.png", + "bytes": 102305, + "sha256": "dd526fe6859e470ea4c67b4c1ef511cfe0e11126561f86bcff07e57378084347" + }, + { + "path": "contracts/phase9/annotated/tour-dialog-fr-dark_v1.0.png", + "bytes": 94445, + "sha256": "2dd7b24f6505f16a565ac1b5490499ccdae91d0257de608c97c54b7d5b6c2c78" + }, + { + "path": "contracts/phase9/assets/ASSET_MANIFEST_v1.0.csv", + "bytes": 1049, + "sha256": "dd77547327096b4c4084ec8b9311aaff719e378a91f16c2b3ea39832d1bc7b3a" + }, + { + "path": "contracts/phase9/assets/ASSET_USAGE_RULES_v1.0.md", + "bytes": 747, + "sha256": "46821e8e6588a62eba860e4d228b2910a05aa60124610966bdc524a86921f658" + }, + { + "path": "contracts/phase9/assets/brand-mark_v1.0.svg", + "bytes": 443, + "sha256": "bcb3a3fb8037aec69d92da06f0d60fab969547b979a0112f12e6a5c2ab8efdaa" + }, + { + "path": "contracts/phase9/assets/logo-horizontal_v1.0.svg", + "bytes": 576, + "sha256": "04be1c45e1b6e85586efc6dbd36bf3e1e9275fa138a36b93cf6532bbd7409b02" + }, + { + "path": "contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md", + "bytes": 9800, + "sha256": "84b455fe725bff11b6ab54bb13373b1aa52991b062a36fad07db47a940187a53" + }, + { + "path": "contracts/phase9/components/COMPONENT_STATE_MATRIX_v1.0.csv", + "bytes": 4283, + "sha256": "c85f96f6d5e020a27c2bd44427a2c3aed3f3cad8657d88a22fc2de9ecd3f6cda" + }, + { + "path": "contracts/phase9/components/CONTENT_CONSTRAINTS_v1.0.csv", + "bytes": 1147, + "sha256": "f4d32b7775f856ff4aac775791566427e3cc340f39cd3f9845d8a3271167228b" + }, + { + "path": "contracts/phase9/components/RESPONSIVE_BEHAVIOR_MATRIX_v1.0.csv", + "bytes": 1416, + "sha256": "0e0e262c0388c37e41f5ab7f3e80835b8edb09e00a9264e81d92953743893353" + }, + { + "path": "contracts/phase9/components/RTL_THEME_MATRIX_v1.0.csv", + "bytes": 4048, + "sha256": "b47f4b3b4e50f1fed6b1b69523a05d61952773e95a966288bfba85dd414edb15" + }, + { + "path": "contracts/phase9/DECISION_LOG_v9.0.md", + "bytes": 38775, + "sha256": "85569a7418f8cad57d094ee9ec1d83b7727b5ab91a405cbda26de0271a8d76a1" + }, + { + "path": "contracts/phase9/DEFINITION_OF_DONE_v1.0.md", + "bytes": 3234, + "sha256": "dfe53a550b7853f015901b83adb960ffb26ab08fa6d7f9f8f8a3386adc705179" + }, + { + "path": "contracts/phase9/implementation/component-contracts_v1.0.ts", + "bytes": 2844, + "sha256": "177dd2420b804290cf1296e43f41a7e759c8859b3253073fbdc523a81f6f94c0" + }, + { + "path": "contracts/phase9/implementation/hreflang-generator_v1.0.ts", + "bytes": 751, + "sha256": "ab919a36a5d08a28c38ae51b4ddd0d84cef5d3ec3bed13649ebd26c3fb80ac8a" + }, + { + "path": "contracts/phase9/implementation/localization-config_v1.0.ts", + "bytes": 772, + "sha256": "bd8ca09f121bfe516ece817948a81d58136e9205fbd2c05dad2ce87f2d7a1782" + }, + { + "path": "contracts/phase9/implementation/TECHNOLOGY_PROFILE_v1.0.md", + "bytes": 1953, + "sha256": "a59504c81bdbb6396eb21e68518ca84862ac89c6c65744de710e9ae273e47c7b" + }, + { + "path": "contracts/phase9/implementation/theme-config_v1.0.ts", + "bytes": 725, + "sha256": "f56d37da4129d5830ba9ebd77b18cd6084a144e8514bfd8a8152387ecf76607c" + }, + { + "path": "contracts/phase9/interaction/ANALYTICS_EVENT_SPEC_v1.0.csv", + "bytes": 1713, + "sha256": "1282ebca5b031f6267f8139033db437e30b62ac391d25823c8a4783b64151008" + }, + { + "path": "contracts/phase9/interaction/analytics-contract_v1.0.ts", + "bytes": 832, + "sha256": "2716eb69cc98032005e068ab7bdc265a4c896a8e1a1bed682c7fdd4f45368123" + }, + { + "path": "contracts/phase9/interaction/demo-form-contract_v1.0.ts", + "bytes": 632, + "sha256": "194db77f7cfca417dbe35e6f2c2ea94cdd02806b83b1d0f1993fe509d8c10154" + }, + { + "path": "contracts/phase9/interaction/INTERACTION_NOTES_v1.0.md", + "bytes": 2332, + "sha256": "0456815622cbb072f1a7594e6b47f52e572e2570280c3a618876246e1b43d2a7" + }, + { + "path": "contracts/phase9/interaction/theme-bootstrap_v1.0.js", + "bytes": 753, + "sha256": "7b89a849bdcd72e1049714ebf76f0c0decb39e44261480f0cb08bb7dfe734e4a" + }, + { + "path": "contracts/phase9/localization/locales/ar/homepage.json", + "bytes": 18615, + "sha256": "fe08aabd60203dbdebc718117f5e497b52a453a8a6fb671fe0bca28651bf0d47" + }, + { + "path": "contracts/phase9/localization/locales/en/homepage.json", + "bytes": 13869, + "sha256": "a5ed956c7f07fad016ca39b40b770c25e8beeae2799ff0fece82dbf087f18e51" + }, + { + "path": "contracts/phase9/localization/locales/fr/homepage.json", + "bytes": 15512, + "sha256": "24079356bd47431ffeb66b7eb2981e108c03080205861b1bb42514b03b945a0a" + }, + { + "path": "contracts/phase9/localization/LOCALIZATION_IMPLEMENTATION_v1.0.md", + "bytes": 2062, + "sha256": "87a494d7ef7ed9f5012ed1699edf90e38995aa89a0efc3800db854e1d57e1024" + }, + { + "path": "contracts/phase9/localization/ROUTE_MANIFEST_v1.0.json", + "bytes": 1573, + "sha256": "fa29b8d31da1f36f87d216a1228fd1bbe1cde337636950b40b0024a10efaf49a" + }, + { + "path": "contracts/phase9/localization/TRANSLATION_KEY_INVENTORY_v1.0.csv", + "bytes": 10599, + "sha256": "01289dc9eb94d546ae717b881b2aed4dfc63b38df38e7767054800122bbb46c2" + }, + { + "path": "contracts/phase9/OPEN_ISSUE_REGISTER_v1.0.csv", + "bytes": 3519, + "sha256": "b8778b3dc7d1e47446584cac046d490a9932c3dfdfa03750716f29852694a214" + }, + { + "path": "contracts/phase9/OPEN_QUESTIONS_v1.0.md", + "bytes": 1085, + "sha256": "82a2abd71830fa4023d346f3b42b138de9e1bbdff74a827d770e6b660d89bd0e" + }, + { + "path": "contracts/phase9/PACKAGE_MANIFEST_v1.0.json", + "bytes": 10649, + "sha256": "1a143f086f40f83414460bd4519e86bd3a34617079e3cfef4c5736375460a24e" + }, + { + "path": "contracts/phase9/PHASE_9_HANDOFF_v1.0.md", + "bytes": 939, + "sha256": "90530b4e70d1fd64d5d934429c009431902639c0570e7944cf050e6d67eb73a3" + }, + { + "path": "contracts/phase9/qa/ACCESSIBILITY_CHECKLIST_v1.0.csv", + "bytes": 1498, + "sha256": "0d9c108e0c02b78aaf11badf6b5f5125cac2b03876cfddf82bd2e97230fdd28b" + }, + { + "path": "contracts/phase9/qa/BROWSER_SUPPORT_MATRIX_v1.0.csv", + "bytes": 986, + "sha256": "5ffb43732fea90530b1b088fb68172b9fc7b2c2683198448734a21cf39c234d1" + }, + { + "path": "contracts/phase9/qa/PERFORMANCE_BUDGETS_v1.0.json", + "bytes": 815, + "sha256": "e1679ce45d8a1225c46c085c7533d3230a41279c32d0812de5c5f05cb55eefa8" + }, + { + "path": "contracts/phase9/qa/PLAYWRIGHT_ACCEPTANCE_SPEC_v1.0.md", + "bytes": 800, + "sha256": "b16384a861d06eb76db5a836868d9a6e03cf72a6a896209279330e19a8d1a785" + }, + { + "path": "contracts/phase9/qa/QA_MATRIX_v1.0.csv", + "bytes": 3557, + "sha256": "6b14b92ce20a9d706de7d6d4cf9f0bb450ecceed27673ed62ae01e145d2143f8" + }, + { + "path": "contracts/phase9/qa/test-ids_v1.0.csv", + "bytes": 598, + "sha256": "6201007ae98632654a2684a0b09ce95d85d9870e0f29774687df0a9876048202" + }, + { + "path": "contracts/phase9/qa/validate-phase9-package_v1.0.mjs", + "bytes": 2534, + "sha256": "631892318cf95c0530a605e5bf08def9b06c93af79b555205f3aeb8a2bcd87ed" + }, + { + "path": "contracts/phase9/qa/visual-regression-scenarios_v1.0.json", + "bytes": 1401, + "sha256": "08a04f676cbb93e73b4c6bc112a55ebf287cb97be3dd3176ab80161e6de743c2" + }, + { + "path": "contracts/phase9/README_v1.0.md", + "bytes": 1258, + "sha256": "ef0010b98ba641c4db453d875171a0d1dad4cb17e991ad23698acde8ac4783ae" + }, + { + "path": "contracts/phase9/reference/FINDINGS_REPORT_v1.0.md", + "bytes": 3062, + "sha256": "ba34afd535856d0eaa8ed7e174c23a7b5f0eae87344c8fcee5daafe00c068ce4" + }, + { + "path": "contracts/phase9/reference/PHASE_8_HANDOFF_v1.0.md", + "bytes": 1117, + "sha256": "2e51ed6645fcc99f30cd4aa9da11ac59e5c2e331c384bfbd758739ad6f42c788" + }, + { + "path": "contracts/phase9/reference/PRIORITIZED_REVISIONS_v1.0.csv", + "bytes": 1071, + "sha256": "65b17813756a2d01c8a9df9faa049b170dca197f243b62a44e070d69f8959df5" + }, + { + "path": "contracts/phase9/reference/SUCCESS_METRICS_v1.0.csv", + "bytes": 1552, + "sha256": "e7b734564735ab65dcaf84ab8374ba163472cca48db1257c4c626415a779ecbe" + }, + { + "path": "contracts/phase9/reference/VALIDATION_RESULTS_v1.0.md", + "bytes": 2068, + "sha256": "3cb17f099569e5bdf4bcd731fe7f687d1636f0e82623c205e07df2cdc2b7d2f2" + }, + { + "path": "contracts/phase9/SOURCE_TRACEABILITY_v1.0.csv", + "bytes": 765, + "sha256": "76dc8677ad0d50263301fd5242bc0649c23bb01d3bbd099bdc8a7e2c04fc2d46" + }, + { + "path": "contracts/phase9/tokens/design-tokens_v1.0.json", + "bytes": 3771, + "sha256": "470d7bc9d4a466cce4e51f0fdc21fe199ec5b0d4007f5063704c523ce1b9ef0c" + }, + { + "path": "contracts/phase9/tokens/semantic-tokens_v1.0.css", + "bytes": 3553, + "sha256": "99912762e078bfc78b4878fc46b8c7d03d90c073e9c236942a58d83f6585a1b9" + }, + { + "path": "contracts/phase9/tokens/TOKEN_USAGE_RULES_v1.0.md", + "bytes": 1222, + "sha256": "b9f7d9b0a9c0595e6f6df2a53e0bcf4acfb47a56abfc6c590a6281c15b04a7b2" + }, + { + "path": "contracts/phase9/tokens/tokens_v1.0.ts", + "bytes": 442, + "sha256": "ec265270251f8dd01d9166aeca3fcec9be2b5e534d825c9058fb6ed3f51e3224" + }, + { + "path": "contracts/phase9/validation/CONTENT_AND_STRUCTURE_VALIDATION_v1.0.json", + "bytes": 189, + "sha256": "e055ef15c2de2191a3465d85ed54f4cf6bd9e1cde4d5d2bba787e14873027b73" + }, + { + "path": "contracts/phase9/validation/STATIC_VALIDATION_RESULTS_v1.0.json", + "bytes": 56, + "sha256": "b60367adf55cf4c61b705d11131b7adebc0aae6ff53732c8272ec9cf2bc95dd3" + }, + { + "path": "contracts/phase9/validation/VALIDATION_RESULTS_v1.0.md", + "bytes": 1179, + "sha256": "6f9df81e75d7149d3826ce215143c21784f39b154660fcefc5325ac114ac70b2" + }, + { + "path": "CONTRIBUTING.md", + "bytes": 2052, + "sha256": "abb7059cbb8347456c40a472d980548bb0a50400300fb66d3a42983563725ce8" + }, + { + "path": "Dockerfile", + "bytes": 1033, + "sha256": "5e586fd24911d9635ac45d36b9dcba24a44c8eb161b61df7d931f1103e0d70f2" + }, + { + "path": "docs/architecture/ADR-0001_REPOSITORY_FOUNDATION.md", + "bytes": 8931, + "sha256": "e2933f3ff3bd9c3066027e20049805fbc2e1ce720534998882f110024afba375" + }, + { + "path": "docs/architecture/ADR-0002_PHASE_11_FOUNDATIONS.md", + "bytes": 4154, + "sha256": "2f04e81f0fac6439fd94a4620c8fa88f062ea7c32ae83c0b26a6b488255e651d" + }, + { + "path": "docs/architecture/ADR-0003_PHASE_12_COMPONENT_SYSTEM.md", + "bytes": 1918, + "sha256": "7ba7bed100e43614b5904d6a20161c55ce99460dbf5e35376cd80b02df9a12eb" + }, + { + "path": "docs/BRAND_MIGRATION_v1.0.md", + "bytes": 1322, + "sha256": "b1fb78b8a0c50b629c8f3af36ec841aa2126739008069a80021b18f8219a3d1c" + }, + { + "path": "docs/DECISION_LOG_v12.0.md", + "bytes": 2835, + "sha256": "c69af78a6af60ba743b057c0c8b50691f7d826923d91c204179fc0683487a0af" + }, + { + "path": "docs/DECISION_LOG_v13.0.md", + "bytes": 2411, + "sha256": "4d5747f12e7b1446ff944540d724957e859264ba0c29b95cba84013591478fdc" + }, + { + "path": "docs/DECISION_LOG_v14.0.md", + "bytes": 2001, + "sha256": "b29dc315d9cf857d229183e728d1b44804dfc4b80a3c6cc381a165193c69c5d8" + }, + { + "path": "docs/DECISION_LOG_v15.0.md", + "bytes": 2592, + "sha256": "c59ef94dbf9cee22b762acdb7fbe13ea77b14eba2bb12a15196a50a7d4e38f41" + }, + { + "path": "docs/DEPENDENCY_MANIFEST_v1.0.md", + "bytes": 4109, + "sha256": "0dfdaf10352a56b1468ad35436dd873a16d12171e3ea14eac2268359ec02823a" + }, + { + "path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.0.csv", + "bytes": 5347, + "sha256": "4300820e10088d76f6407ee358a8cc1a3cab89fe6554f658fd770469c8c6c77d" + }, + { + "path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv", + "bytes": 6721, + "sha256": "8569e669ddf280d82ebb68526191315aecb108163cb34e4ad1e32a810888cb93" + }, + { + "path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.2.csv", + "bytes": 8902, + "sha256": "24725fbb71279b0e6bfdfb05a8d48d01ec132b863fb311eb8d012d9b2151f3d1" + }, + { + "path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.3.csv", + "bytes": 10248, + "sha256": "67b3a47100f6404ec1473f4979917b5202169df0b5610f10ff0cb75861b9cc21" + }, + { + "path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.4.csv", + "bytes": 13060, + "sha256": "fea9c6bbe4db7a72b5f58a9dcffd215514915e3eae79941b104e195b1ec42bd2" + }, + { + "path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.5.csv", + "bytes": 15395, + "sha256": "818eda19723bd1aafe4359831d3f9547e4c6fd545d6ae08313c0a6e5e413dc3f" + }, + { + "path": "docs/PHASE_10_HANDOFF_v1.0.md", + "bytes": 3370, + "sha256": "8cf52ee1b49cabbf0678da222413b0186ed982fb0c8cfc805482ca18eb1fefc7" + }, + { + "path": "docs/PHASE_10_IMPLEMENTATION_REPORT_v1.0.md", + "bytes": 6805, + "sha256": "6a2e5da443bf15351a0e88e5c92117c8f7c780509d51f2e44c4a148a26a6d4e2" + }, + { + "path": "docs/PHASE_11_IMPLEMENTATION_REPORT_v1.0.md", + "bytes": 13394, + "sha256": "79c1a01be6d5188db29d0bb4a3d2d30b18a5c25b5fa367c7d878309fb5e4dfbb" + }, + { + "path": "docs/PHASE_12_HANDOFF_v1.0.md", + "bytes": 7671, + "sha256": "04000f05533c3accf2409e7810e95ca3188338e33ddae98914ee30e059a09c25" + }, + { + "path": "docs/PHASE_12_IMPLEMENTATION_REPORT_v1.0.md", + "bytes": 12420, + "sha256": "b52db7413ef0365f9ae917133ac4449bf22a95760b25c8bef2fca4f64f3f6040" + }, + { + "path": "docs/PHASE_13_HANDOFF_v1.0.md", + "bytes": 11204, + "sha256": "f82e319eb0d11c861a7d77c4abdc3bcb48e966cb8cfa610389d7807bbaeedb0a" + }, + { + "path": "docs/PHASE_13_IMPLEMENTATION_REPORT_v1.0.md", + "bytes": 8099, + "sha256": "3a7ba99ebf1f22f433e854adb48529575daf1c357aa3271c10fbec152c91479f" + }, + { + "path": "docs/PHASE_14_IMPLEMENTATION_REPORT_v1.0.md", + "bytes": 14891, + "sha256": "363b05580f70ec38193b56ef194a387860fa6a8e523b85c0d4d2a82e31aecd76" + }, + { + "path": "docs/PHASE_15_HANDOFF_v1.0.md", + "bytes": 8196, + "sha256": "b0317610aca92be814dbcc84cb0cb16244c00ff6988ec1ac19f45868ddbf5f36" + }, + { + "path": "docs/PHASE_15_IMPLEMENTATION_REPORT_v1.0.md", + "bytes": 6822, + "sha256": "b9fa26b635b70eba3e414f553f9def60916535bcc4f2eb9da482231aef28c1d5" + }, + { + "path": "docs/PHASE_16_HANDOFF_v1.0.md", + "bytes": 4583, + "sha256": "de5d8f974eecf517f61a6b7f7c3f394518efa26cd41771cb57305365e20fa83e" + }, + { + "path": "docs/phase12/ACCESSIBILITY_BEHAVIOR_MATRIX_v1.0.csv", + "bytes": 10934, + "sha256": "bf23d29033b091f0556f7a5c07ffc86e31484d82c6fd01a80ffcc33c5daedb0c" + }, + { + "path": "docs/phase12/BUNDLE_IMPACT_REPORT_v1.0.md", + "bytes": 1704, + "sha256": "795ab11fc56780f57c8bba78821106cd5ea00dd02e9aac63c3ddc8865af7f453" + }, + { + "path": "docs/phase12/COMPONENT_CATALOG_v1.0.md", + "bytes": 26256, + "sha256": "93c3d22539c7489166119a8126712995d81fefade081cd06488f3898fa7d519c" + }, + { + "path": "docs/phase12/COMPONENT_INVENTORY_v1.0.json", + "bytes": 42210, + "sha256": "b64cff5d50f7777e6384e6ca19e49a38430925b4a19a53543d35e4452f42d112" + }, + { + "path": "docs/phase12/COMPONENT_SPECIFICATION_TRACEABILITY_v1.0.csv", + "bytes": 11328, + "sha256": "1d352fd6ce9bc3dae7e135725c1deb2ebd44faf679658e8eeb8622266ee08b58" + }, + { + "path": "docs/phase12/DEFINITION_OF_DONE_STATUS_v1.0.md", + "bytes": 1581, + "sha256": "692e3847c7e120939a2ee16dbadd9e6908decaf7f04fa9187e1063f5337dd016" + }, + { + "path": "docs/phase12/DEPENDENCY_CHANGE_REPORT_v1.0.md", + "bytes": 1273, + "sha256": "7c668afb6d310a56fa94d3b88a20cdde5b0594b7005857c915a27edb40aaba0e" + }, + { + "path": "docs/phase12/RESPONSIVE_VALIDATION_MATRIX_v1.0.csv", + "bytes": 16762, + "sha256": "9542e345b81d123e67b12167afc67b946667729cf35a3ce469756627b5368c4d" + }, + { + "path": "docs/phase12/RTL_BEHAVIOR_MATRIX_UPDATE_v1.0.csv", + "bytes": 17557, + "sha256": "c172ed56ff3513bb986894d6fd5814b05391ffcdc432ba3282005e7b8e7c8953" + }, + { + "path": "docs/phase12/STORY_AND_FIXTURE_INVENTORY_v1.0.csv", + "bytes": 565, + "sha256": "f1b3f012c7319e3eacf5b625ada085856dab9fe4392302cc2eb67d79042b5d64" + }, + { + "path": "docs/phase12/TEST_COVERAGE_REPORT_v1.0.csv", + "bytes": 983, + "sha256": "fa174206dec0855a7a9ce328981132ad2114dca73a8511aba8dfd2e953ac9535" + }, + { + "path": "docs/phase12/VARIANT_INVENTORY_v1.0.csv", + "bytes": 17312, + "sha256": "58b988f565cf4e92175bcbd14b0c242b6785d24b5f695e1c12a2a53cb18d0bd1" + }, + { + "path": "docs/phase13/COMPONENT_VARIANT_UPDATE_v1.0.md", + "bytes": 550, + "sha256": "48c1efca62cca59af1d041b811cd15e3ff123cebff22ac905a3a2ca4fab8164a" + }, + { + "path": "docs/phase13/HOMEPAGE_CONTENT_MODEL_v1.0.md", + "bytes": 2290, + "sha256": "d20dd8d92bdd0e73589cc6907c7863d6e6b023d6716aba69cab88d5b97d019fd" + }, + { + "path": "docs/phase13/HOMEPAGE_SECTION_MATRIX_v1.0.csv", + "bytes": 2239, + "sha256": "4fd5ad3074b5217c735ab0c8c02da5690032b50ae5a432776488104313bb3d95" + }, + { + "path": "docs/phase14/ANALYTICS_EVENT_REGISTRY_v1.0.csv", + "bytes": 1063, + "sha256": "639e73f41589f057773001c15cecadef429460eba96770e89170266673aa06ac" + }, + { + "path": "docs/phase14/COMPONENT_VARIANT_UPDATE_v1.0.md", + "bytes": 576, + "sha256": "57ff3870af656b42bf1863a16f952750b45654e166989c8fe2155f05feb9c386" + }, + { + "path": "docs/phase14/CONSENT_MATRIX_v1.0.csv", + "bytes": 619, + "sha256": "613fa4645ffcd6a1d48e2d0e318dcf53f043f288e1f37e46806a2ac1a2f5c304" + }, + { + "path": "docs/phase14/DATA_FLOW_INVENTORY_v1.0.csv", + "bytes": 2637, + "sha256": "fe8323cbfc1781cdb56002c33260de4835bf2cca2ac4d25191d711be0ad84708" + }, + { + "path": "docs/phase14/DEMO_FORM_CONTRACT_v1.0.md", + "bytes": 1768, + "sha256": "7d94a5747126f42017154dc2e9c3e1943bf52bbea71574ec5ad369be0abccd3e" + }, + { + "path": "docs/phase14/DESTINATION_REGISTRY_v1.0.csv", + "bytes": 1499, + "sha256": "51799df5507584d1100571ee4dd5c7e1c1f8560e80379f731709fd71e267c92d" + }, + { + "path": "docs/phase14/ENVIRONMENT_VARIABLE_INVENTORY_v1.0.csv", + "bytes": 1088, + "sha256": "2481efc9103383a81c8d306bbfb2d95a839790eab6491baed60c62e94e8c0799" + }, + { + "path": "docs/phase14/EXTERNAL_SERVICE_INVENTORY_v1.0.csv", + "bytes": 633, + "sha256": "1cc6b490cb0365b7fa8c13c65cf9508af8f09b37842d7028287f3d26bc143774" + }, + { + "path": "docs/phase14/FEATURE_FLAG_INVENTORY_v1.0.csv", + "bytes": 849, + "sha256": "5f9a7d3e227197d145b31f94bcfba5c5211fe7a60d210a6d229e9530d4e7a62e" + }, + { + "path": "docs/phase14/INTEGRATION_ARCHITECTURE_v1.0.md", + "bytes": 1268, + "sha256": "5efca5219e639c9056296b02a3918508d9e3c5098980f0c3c602ec7c1737425c" + }, + { + "path": "docs/phase14/INTEGRATION_TRACEABILITY_MATRIX_v1.0.csv", + "bytes": 1766, + "sha256": "4ac262459d885d7c9e510fb0fc33680272b4ca274a2a2b42fb9fe8e2306b08bf" + }, + { + "path": "docs/phase14/PERFORMANCE_AND_BUNDLE_REPORT_v1.0.md", + "bytes": 1250, + "sha256": "d8b47d763381291d82f6cbfabe29148405d17f59ab09f51d03b23dc41888b362" + }, + { + "path": "docs/phase14/PRIVACY_REVIEW_REPORT_v1.0.md", + "bytes": 1027, + "sha256": "c00b7412b8bda45b0de26311e2b7660c015836da61c81a6acb4c4d4f6c9fdd1a" + }, + { + "path": "docs/phase14/RELEASE_GATE_MATRIX_v1.0.csv", + "bytes": 1533, + "sha256": "a8bc810d74d344d686f1a62de38f3c3fa73bdeecae6754208098aa868a12ecb6" + }, + { + "path": "docs/phase14/SECURITY_REVIEW_REPORT_v1.0.md", + "bytes": 1716, + "sha256": "0d81f0a8e008741ceb715dc8e316d24efa06c6530afcf4475d3482aa25128d54" + }, + { + "path": "docs/phase14/SUCCESS_FAILURE_STATE_INVENTORY_v1.0.csv", + "bytes": 939, + "sha256": "a24550a1c2b11c627d3747697622626cbb0003c38b697f83a030970a33d0f67c" + }, + { + "path": "docs/phase15/ABUSE_CONTROL_REPORT_v1.0.md", + "bytes": 718, + "sha256": "d56f05fba3ce6670b2fc833f0da3eb6cf7643bb82b61b2fa68f057f211a1ed0e" + }, + { + "path": "docs/phase15/ANALYTICS_VALIDATION_REPORT_v1.0.md", + "bytes": 725, + "sha256": "2e24b9e1dc7ebcc424bff217d308d73f169ceb2fee8a54ecefdb2ab9d94f9bfe" + }, + { + "path": "docs/phase15/AUTOMATED_ACCESSIBILITY_REPORT_v1.0.md", + "bytes": 545, + "sha256": "1647ac95ffc1c8ec3df901dafaf7954166b9bad7fb0c147eb3acfe9020befec2" + }, + { + "path": "docs/phase15/BROWSER_HISTORY_REPORT_v1.0.md", + "bytes": 684, + "sha256": "b33b65266826d986bf90164e3ab01bb80c61049c7679b189968d201e06c0511f" + }, + { + "path": "docs/phase15/BUNDLE_ANALYSIS_REPORT_v1.0.md", + "bytes": 698, + "sha256": "245d4a1f9fd5d91eb1b2941676c9eef390426f27aade7b24e2366951f03e079e" + }, + { + "path": "docs/phase15/CLEAN_ROOM_BASELINE_REPORT_v1.0.md", + "bytes": 939, + "sha256": "61423268ab8f5a75decb112f0cb4a62b7b3b3954bf6a7ca11cf688c569910e4d" + }, + { + "path": "docs/phase15/COMMAND_MATRIX_v1.0.csv", + "bytes": 6523, + "sha256": "eaeaaca0e3b7b74a4768ca6303486eae273e6bad575f5c3b41b61bb8c63e4700" + }, + { + "path": "docs/phase15/CONSENT_VALIDATION_REPORT_v1.0.md", + "bytes": 774, + "sha256": "f1a9eb92eb164532f82000a4655a7310fa9103f9140529cc5f7eb12b74a5c795" + }, + { + "path": "docs/phase15/CONTENT_EVIDENCE_REVIEW_v1.0.md", + "bytes": 794, + "sha256": "e7f1c8350fc3cedec81e089a2b076fab4de740d2bb003171f42ad35d343e04f5" + }, + { + "path": "docs/phase15/CROSS_BROWSER_TEST_REPORT_v1.0.md", + "bytes": 646, + "sha256": "ed06fa73e138f99131882ffbce8340c6b61d727396a38ed37eb40e70526dd539" + }, + { + "path": "docs/phase15/DEFECT_REGISTER_v1.0.csv", + "bytes": 3919, + "sha256": "8906ccb503e5ea62b8d7fa74f60e188d7ffedf61dc866462895d0616cea8f212" + }, + { + "path": "docs/phase15/DEPLOYMENT_REHEARSAL_REPORT_v1.0.md", + "bytes": 646, + "sha256": "3d4c41f057091efb3034ca56fe9f1e3625777e86d7c4168c627c02180dcb9202" + }, + { + "path": "docs/phase15/DESIGN_FIDELITY_REPORT_v1.0.md", + "bytes": 631, + "sha256": "32e63d3665f3fda5095424402e88a98f30816b0c4e82a6ee297150dee6a5be4e" + }, + { + "path": "docs/phase15/DESTINATION_BROKEN_LINK_REPORT_v1.0.md", + "bytes": 781, + "sha256": "ce69dd34db9e9587495b1f82c68173506ddde20410a70458b37f561590fd1289" + }, + { + "path": "docs/phase15/DEVICE_VIEWPORT_REPORT_v1.0.md", + "bytes": 630, + "sha256": "e6e9287808a3279b45782c69f9cf6de5229f80ece51b0ca5fadf7ac800183789" + }, + { + "path": "docs/phase15/END_TO_END_TEST_REPORT_v1.0.md", + "bytes": 692, + "sha256": "d58adbb88000647a6b8a921e1f1902c17c0cda892cbe137d9b5964b68f22d13d" + }, + { + "path": "docs/phase15/FAILURE_SIMULATION_REPORT_v1.0.md", + "bytes": 635, + "sha256": "f2e5cea8b80ad0369c07d31b795885ffa885e6e9360881c1f7ceac758ea093ed" + }, + { + "path": "docs/phase15/FINAL_RELEASE_RECOMMENDATION_v1.0.md", + "bytes": 2743, + "sha256": "08209591849ce8663423e3eb5eef1c5309e80c087c7b8a7dfc8d68bd71a8839b" + }, + { + "path": "docs/phase15/IDEMPOTENCY_DUPLICATE_REPORT_v1.0.md", + "bytes": 744, + "sha256": "ed5478b42914d736866b4e4916337f698a5fb309455868f1f958d01d0f5415fc" + }, + { + "path": "docs/phase15/IMAGE_FONT_PERFORMANCE_REPORT_v1.0.md", + "bytes": 770, + "sha256": "b28fb2b989f8a3457ae5c48433fbb3f27337d24fea00db8be451b52f461f1e45" + }, + { + "path": "docs/phase15/INTEGRATION_TEST_REPORT_v1.0.md", + "bytes": 858, + "sha256": "c51b4629b42f4175840f822717153fff72f311b53c638de3227761afb51e8bbb" + }, + { + "path": "docs/phase15/KEYBOARD_ACCESSIBILITY_REPORT_v1.0.md", + "bytes": 602, + "sha256": "fd7dcca8715f727326e5a7fdd49532f95c58ef092a2374def637717ee6755504" + }, + { + "path": "docs/phase15/LOCALIZATION_QA_REPORT_v1.0.md", + "bytes": 712, + "sha256": "93f20fe6b0f5a064c5a3a0f9f7b2e8483f30feafb06bdf789a0e0b73c3761deb" + }, + { + "path": "docs/phase15/MANUAL_TEST_MATRIX_v1.0.csv", + "bytes": 1196, + "sha256": "d953be08010beb84b68e701b534a7c91cbe550cb73c29cc5aeb86ac9c523ca4b" + }, + { + "path": "docs/phase15/OBSERVABILITY_VALIDATION_REPORT_v1.0.md", + "bytes": 610, + "sha256": "5c42216a452694bfc6b1ef015a6fc4ff6ea9da261810f64212e676dd40a60c50" + }, + { + "path": "docs/phase15/PERFORMANCE_REPORT_v1.0.md", + "bytes": 753, + "sha256": "aa6d44c92788e5f81910ad04609e81bec6d3afa2ef689eb335b30fa25d94bde4" + }, + { + "path": "docs/phase15/PRIVACY_VALIDATION_REPORT_v1.0.md", + "bytes": 789, + "sha256": "8e04998010b052f041f88639fc695df4f3f31576feb248bbbe0604e066fb25bc" + }, + { + "path": "docs/phase15/RELEASE_GATE_MATRIX_v1.0.csv", + "bytes": 3258, + "sha256": "9d7254919043b08c3e3e60574bc8825817d4e6ec08f48a97e8194fa020b5571e" + }, + { + "path": "docs/phase15/REPOSITORY_INTEGRITY_AUDIT_v1.0.md", + "bytes": 850, + "sha256": "f88c5d2aac92dc1d1c569d5f69b1fbab4e9d170ff1fbdacdd9ad29dda0b6deb5" + }, + { + "path": "docs/phase15/RETEST_REPORT_v1.0.md", + "bytes": 738, + "sha256": "dff702ec540e9046da64800f168ca818b2de2c638a85c684c42dc2097cf8193a" + }, + { + "path": "docs/phase15/RISK_ACCEPTANCE_REGISTER_v1.0.csv", + "bytes": 98, + "sha256": "51359ece589175db561b8e857c14ed1ee36594d2921b7f1e37d7981d5d544d8d" + }, + { + "path": "docs/phase15/RISK_ACCEPTANCE_SUMMARY_v1.0.md", + "bytes": 149, + "sha256": "fa52be6a049910986cc528696d96067ac2784c7641dd19c1665c67cd431f6439" + }, + { + "path": "docs/phase15/ROLLBACK_REHEARSAL_REPORT_v1.0.md", + "bytes": 601, + "sha256": "3af1fbd033a14f2a2a36d9eb334fd447396c631f8cf92de69a12944ee464e2dd" + }, + { + "path": "docs/phase15/RTL_QA_REPORT_v1.0.md", + "bytes": 736, + "sha256": "26b4a61e973451e319dd50658bd1a7234f264b3abd701a2107ede1a64a425a09" + }, + { + "path": "docs/phase15/SCREEN_READER_REPORT_v1.0.md", + "bytes": 658, + "sha256": "59e983f4e89a449bf982a53753f59d77f941800ca4a4303c6ae111ed0f0f80c1" + }, + { + "path": "docs/phase15/SECURITY_VALIDATION_REPORT_v1.0.md", + "bytes": 943, + "sha256": "3653103c7eb52420143056f8ba40c86023fd742b39a52177c9cbc0ce414a3309" + }, + { + "path": "docs/phase15/SEO_METADATA_REVIEW_v1.0.md", + "bytes": 675, + "sha256": "e7a475200c09a016e6500c7417a0fb9d713899aace20b2814e0e134f2d76dd0a" + }, + { + "path": "docs/phase15/STATIC_ANALYSIS_REPORT_v1.0.md", + "bytes": 961, + "sha256": "13a392beacefd2fe814e3eb91504d2d27b19c029ff48169cd43f5f0d8ab2c385" + }, + { + "path": "docs/phase15/THEME_QA_REPORT_v1.0.md", + "bytes": 662, + "sha256": "031e26a400ae401cf92956913e5a5125d2e3db35532d8c03eff1ae480941b292" + }, + { + "path": "docs/phase15/UNIT_TEST_REPORT_v1.0.md", + "bytes": 781, + "sha256": "080982bbf26c06c7bee39bcbac2bd7abee7f543e3d4a7441b29cf3a5cdf033e1" + }, + { + "path": "docs/phase15/VISUAL_REGRESSION_REPORT_v1.0.md", + "bytes": 674, + "sha256": "fe2d467b20c387f879023db4e806a1a31072bca546741b7a3e540011e04a7086" + }, + { + "path": "docs/phase15/WCAG_2_2_AA_EVIDENCE_MATRIX_v1.0.csv", + "bytes": 5049, + "sha256": "26b7a86b005dc3014da833a27eec5b0bda0135cd5c4942a55714162ff4c7569f" + }, + { + "path": "docs/phase15/ZOOM_REFLOW_REPORT_v1.0.md", + "bytes": 652, + "sha256": "2e4d188a04af2d50d8804bcb6b702691e9e06b6de98607d3a455fd480b19a7de" + }, + { + "path": "docs/quality/logs/build-initial.log", + "bytes": 719, + "sha256": "9245b913520a4477ec638d0cdce23f2079c575bdc4a989d0fe68b9d437a5e3b3" + }, + { + "path": "docs/quality/logs/build-missing-site-origin.exit", + "bytes": 2, + "sha256": "4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865" + }, + { + "path": "docs/quality/logs/build-missing-site-origin.log", + "bytes": 922, + "sha256": "b2bff4cccbc95305d2f9304982446920ca76ecfbb6addc9fbff2d95a1538c1f5" + }, + { + "path": "docs/quality/logs/build.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/build.log", + "bytes": 719, + "sha256": "dd0cee291d02930e6ba19eb4a24ab40d03111c67c2b0dadddcf9de6b07caaa7c" + }, + { + "path": "docs/quality/logs/file-diff-summary.log", + "bytes": 5005, + "sha256": "fbcbd30011449146fddd37ee1436880cb0847febaadacccfcfbc18fc707a957f" + }, + { + "path": "docs/quality/logs/format-check.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/format-check.log", + "bytes": 128, + "sha256": "35faa5623e1ca69a144301db1bcd12a99642c93e392c00f27f0e373494758bdc" + }, + { + "path": "docs/quality/logs/format-write.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/format-write.log", + "bytes": 13943, + "sha256": "98740297fc6e5972e6da3d76ac01cdfccc56b5babdbc4ffa74ca96b2584128c7" + }, + { + "path": "docs/quality/logs/lint.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/lint.log", + "bytes": 61, + "sha256": "60d1821dc1b8a730153d1b48f9c84e86346955bb7638b724d0d3c321faa5c3f1" + }, + { + "path": "docs/quality/logs/next-typegen.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/next-typegen.log", + "bytes": 59, + "sha256": "adba4af9194e10e47dda75ff0fd0f8c2b756474896d0eba5612799c527ff372a" + }, + { + "path": "docs/quality/logs/npm-install-fallback.log", + "bytes": 284, + "sha256": "e19919345ade861c8cd863d631f57f11c3453e7cc7385a09af24f268875eabd7" + }, + { + "path": "docs/quality/logs/phase14/a11y-integration-chromium.log", + "bytes": 6088, + "sha256": "c5d3866f9168ef7f664ed70c52bd437c692fc1bfac431da077b8af78cf51cde4" + }, + { + "path": "docs/quality/logs/phase14/browser-integration-chromium.log", + "bytes": 10278, + "sha256": "41558b0435514b2e59f2604440eca09809b1338c8bf4474bbe3dc53c665ace60" + }, + { + "path": "docs/quality/logs/phase14/bundle-inventory.log", + "bytes": 3202, + "sha256": "b06b6fe93eab76f94a50d95a6f098763726ffbeeeb8bdcd1b50318b32fbf0d2d" + }, + { + "path": "docs/quality/logs/phase14/dependency-audit.log", + "bytes": 56, + "sha256": "671f3c588b8c2f48975e845e6a3c9593e392fedf123507fcfe411357c1204cde" + }, + { + "path": "docs/quality/logs/phase14/format-check-initial.duration", + "bytes": 2, + "sha256": "7de1555df0c2700329e815b93b32c571c3ea54dc967b89e81ab73b9972b72d1d" + }, + { + "path": "docs/quality/logs/phase14/format-check-initial.exit", + "bytes": 2, + "sha256": "4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865" + }, + { + "path": "docs/quality/logs/phase14/format-check-initial.log", + "bytes": 1215, + "sha256": "7e7a75fa5b8966231ea888b26f904fc63c605a92460e694a353ab2bffc52c261" + }, + { + "path": "docs/quality/logs/phase14/format-check.duration", + "bytes": 2, + "sha256": "1121cfccd5913f0a63fec40a6ffd44ea64f9dc135c66634ba001d10bcf4302a2" + }, + { + "path": "docs/quality/logs/phase14/format-check.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/phase14/format-check.log", + "bytes": 141, + "sha256": "63ba8cad5e9cfee6c4106223b6e0ed5d37d600af8ebbc92b2da4db755c20eb8e" + }, + { + "path": "docs/quality/logs/phase14/format-write.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/phase14/format-write.log", + "bytes": 17257, + "sha256": "e991154d666ec7f969debed34a4a8afc0d68cdabd6d70c14c23d2e729122b53f" + }, + { + "path": "docs/quality/logs/phase14/integration-tests.log", + "bytes": 651, + "sha256": "be8eb369f59c1f2698cb6fec93ce5983b4af54bb8a188072e6a23cabec132d38" + }, + { + "path": "docs/quality/logs/phase14/lint-initial.duration", + "bytes": 3, + "sha256": "25d4f2a86deb5e2574bb3210b67bb24fcc4afb19f93a7b65a057daa874a9d18e" + }, + { + "path": "docs/quality/logs/phase14/lint-initial.exit", + "bytes": 2, + "sha256": "4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865" + }, + { + "path": "docs/quality/logs/phase14/lint-initial.log", + "bytes": 327, + "sha256": "c78f7d3a439eea74037d8e882f14039adfeed525d3e51a4763adbc5529088ce1" + }, + { + "path": "docs/quality/logs/phase14/lint.duration", + "bytes": 3, + "sha256": "917df3320d778ddbaa5c5c7742bc4046bf803c36ed2b050f30844ed206783469" + }, + { + "path": "docs/quality/logs/phase14/lint.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/phase14/lint.log", + "bytes": 115, + "sha256": "5b4488f3b77f0c99ccd64a52f0a4ba6a633534c858d4663225b5f9fd1bdf2396" + }, + { + "path": "docs/quality/logs/phase14/next-typegen.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/phase14/next-typegen.log", + "bytes": 59, + "sha256": "adba4af9194e10e47dda75ff0fd0f8c2b756474896d0eba5612799c527ff372a" + }, + { + "path": "docs/quality/logs/phase14/npm-install-baseline.exit", + "bytes": 2, + "sha256": "4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865" + }, + { + "path": "docs/quality/logs/phase14/npm-install-baseline.log", + "bytes": 472, + "sha256": "2972385383929897c4b8f9635af2e49523d6fb29bb98cc2c04400f865ba1ef59" + }, + { + "path": "docs/quality/logs/phase14/npm-install-fallback.log", + "bytes": 423, + "sha256": "02a978f37de6fbdd4c3a16d42f6ce0600783a5a666e8036b722ddde3d8d2cc36" + }, + { + "path": "docs/quality/logs/phase14/npm-install-offline.duration", + "bytes": 3, + "sha256": "e6c21e8d260fe71882debdb339d2402a2ca7648529bc2303f48649bce0380017" + }, + { + "path": "docs/quality/logs/phase14/npm-install-offline.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/phase14/npm-install-offline.log", + "bytes": 284, + "sha256": "9e8c404f98cc8bee09bce52131993443004ab883b7d99dee99f261da73971244" + }, + { + "path": "docs/quality/logs/phase14/phase14-environment.log", + "bytes": 265, + "sha256": "ce4e16395260d1d1f404d84bcc2b631de619495c1697ea34d9a79e44e4403ef3" + }, + { + "path": "docs/quality/logs/phase14/phase14-integrations.log", + "bytes": 271, + "sha256": "bb9ee4f2c7a7c2584d31c06908182d9ca722f50ec6a7751dc3af159ba3a592a3" + }, + { + "path": "docs/quality/logs/phase14/phase14-privacy.log", + "bytes": 248, + "sha256": "2f6ec738b614507be789b34557c41a22c4022a35f756546e84578109c6658295" + }, + { + "path": "docs/quality/logs/phase14/phase14-security.log", + "bytes": 262, + "sha256": "acb5634a18ea0e56de831b4ee233daf1634dcfeb6bfcfbc395c31eb60205791d" + }, + { + "path": "docs/quality/logs/phase14/playwright-inventory.log", + "bytes": 45412, + "sha256": "7ae624b1c71accb381a0f91a9a1a5310c3c83d4d2be440efac356116d6d07c7d" + }, + { + "path": "docs/quality/logs/phase14/production-build.log", + "bytes": 919, + "sha256": "f72141f9619f96be5503047134cf700adb192c25cc34f445d852072cf81070dc" + }, + { + "path": "docs/quality/logs/phase14/secret-scan.log", + "bytes": 172, + "sha256": "4f0c1a646295f4c6fd2003d60e4241d9f462fe95c6a2025133f64ddaa922916b" + }, + { + "path": "docs/quality/logs/phase14/static-validations.duration", + "bytes": 2, + "sha256": "53c234e5e8472b6ac51c1ae1cab3fe06fad053beb8ebfd8977b010655bfdd3c3" + }, + { + "path": "docs/quality/logs/phase14/static-validations.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/phase14/static-validations.log", + "bytes": 1533, + "sha256": "99c1db43e72c7ec11e2056412e319595df16220d637069c9d72a64036325bf97" + }, + { + "path": "docs/quality/logs/phase14/typecheck-initial.duration", + "bytes": 2, + "sha256": "aa67a169b0bba217aa0aa88a65346920c84c42447c36ba5f7ea65f422c1fe5d8" + }, + { + "path": "docs/quality/logs/phase14/typecheck-initial.exit", + "bytes": 2, + "sha256": "53c234e5e8472b6ac51c1ae1cab3fe06fad053beb8ebfd8977b010655bfdd3c3" + }, + { + "path": "docs/quality/logs/phase14/typecheck-initial.log", + "bytes": 8524, + "sha256": "b976ddc01db0f215ddb114b34ee6748cee50746f556cee837ecd9a9bf8a62b82" + }, + { + "path": "docs/quality/logs/phase14/typecheck.duration", + "bytes": 2, + "sha256": "aa67a169b0bba217aa0aa88a65346920c84c42447c36ba5f7ea65f422c1fe5d8" + }, + { + "path": "docs/quality/logs/phase14/typecheck.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/phase14/typecheck.log", + "bytes": 260, + "sha256": "e25348d1ac1da31577e9836d0db995eadd0dea27b6c9ef0541a26a68c760bbde" + }, + { + "path": "docs/quality/logs/phase14/unit-initial.log", + "bytes": 151, + "sha256": "b17128dc00e8a6ad9608f7b73dea5bc825eff545e04a759bccc5511f356680f0" + }, + { + "path": "docs/quality/logs/phase14/unit-tests-coverage.log", + "bytes": 2912, + "sha256": "0f3d2db357cdb4c1139f382da63657e16ad674b3ae283952af3b357dc5e2a81a" + }, + { + "path": "docs/quality/logs/phase14/unit.log", + "bytes": 151, + "sha256": "b17128dc00e8a6ad9608f7b73dea5bc825eff545e04a759bccc5511f356680f0" + }, + { + "path": "docs/quality/logs/phase14/visual-integration-chromium.log", + "bytes": 10885, + "sha256": "b7a8527c636146b8be469688b61d9505dd186be03ad1d1e87243f79d52169782" + }, + { + "path": "docs/quality/logs/playwright-browser-a11y.log", + "bytes": 61590, + "sha256": "18073dbbf92df28ad060b108985fe0e16e7e6c8ae67ff73bc041cd6024ba6339" + }, + { + "path": "docs/quality/logs/playwright-test-inventory.log", + "bytes": 4605, + "sha256": "e06d4c78a08d0f2cc4b7f329be06904d90d35aa1352b61d593725293649e8d02" + }, + { + "path": "docs/quality/logs/pnpm-audit.log", + "bytes": 367, + "sha256": "c9ca5f084a99651b415d489941280a105a13c553bb38b7f8764a6dd77ecd931b" + }, + { + "path": "docs/quality/logs/pnpm-install-frozen.log", + "bytes": 3204, + "sha256": "5a074969195194b6acad18870ebc51784b1b701f24e9ab76ca9177c317b88b39" + }, + { + "path": "docs/quality/logs/standalone-server.log", + "bytes": 114, + "sha256": "8af62068e13751692799c95679ce8588b6cbbf774d6f8a951668ce2fff36b957" + }, + { + "path": "docs/quality/logs/typecheck.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/typecheck.log", + "bytes": 53, + "sha256": "8b3269bf93de41d5b37919b9c9eb1fdf891529124832dddde796d61642ae0a5b" + }, + { + "path": "docs/quality/logs/unit.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/unit.log", + "bytes": 2254, + "sha256": "0bb10fc9568d6e8e8d15a8027966382cfe691d1e5a0991f1789d26854f171f0f" + }, + { + "path": "docs/quality/logs/validate.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/validate.log", + "bytes": 974, + "sha256": "d71250a821c15c3beb71107aa0098fc014d247d1ea4e5127ca43ba81c7232c2d" + }, + { + "path": "docs/quality/MANUAL_QA_RESULTS_v1.0.csv", + "bytes": 2842, + "sha256": "dba020cda7ffbbc6b05f275fb1c479d102e1f00900ddfc910b6a436f54322a08" + }, + { + "path": "docs/quality/PHASE_11_COMMAND_LOG_v1.0.txt", + "bytes": 2779, + "sha256": "e750ffab91024cb562f5919b8229ce7ed7c0753bc62e96956e7e7275df330cae" + }, + { + "path": "docs/quality/PHASE_11_FILE_CHANGES_v1.0.txt", + "bytes": 3003, + "sha256": "8ac89bb910a600664d799605b51d08b6bc1b99887e36c880b70f9862b684b09c" + }, + { + "path": "docs/quality/PHASE_11_VALIDATION_RESULTS_v1.0.json", + "bytes": 1169, + "sha256": "f61ba0cf4eb87f5d4f3b7343c5b0b1c9ce242b28ac673dd9c22a88fdd49f3d47" + }, + { + "path": "docs/quality/PHASE_11_VALIDATION_RESULTS_v1.0.md", + "bytes": 2235, + "sha256": "e8eac6f793b461586119e219caa89979b87f3d3ea0254f8fa4602777b2cb7f7d" + }, + { + "path": "docs/quality/PHASE_12_COMMAND_LOG_v1.0.txt", + "bytes": 2261, + "sha256": "9e8d7eeb7d671bbef13b5b48876d095f44558780badb6a3f2dcecd1034ccabba" + }, + { + "path": "docs/quality/PHASE_12_FILE_CHANGES_v1.0.txt", + "bytes": 6129, + "sha256": "46120beed9a87cd0a8272dc3c3b81e41b10cdc150877344ce3658ba370efebdd" + }, + { + "path": "docs/quality/PHASE_12_HTTP_ROUTE_RESULTS_v1.0.json", + "bytes": 999, + "sha256": "502e79659692e8c9c8a97fd1495cefa67250d746db2f4be4d9aa5f1c693042cb" + }, + { + "path": "docs/quality/PHASE_12_MANUAL_QA_RESULTS_v1.0.csv", + "bytes": 3628, + "sha256": "e1a2e78e7e323fe3a2b2e0d1f4f2733234dee6b079393158fd39dcb1261f8902" + }, + { + "path": "docs/quality/PHASE_12_VALIDATION_RESULTS_v1.0.json", + "bytes": 4743, + "sha256": "66c771151857321f5de310f3f1d9670ec01f91acb12d209b3e4414530995d3f6" + }, + { + "path": "docs/quality/PHASE_12_VALIDATION_RESULTS_v1.0.md", + "bytes": 4050, + "sha256": "581f82dd3a3935914c28a849de0677699662fbf883a17f84d2a8e6ac554c0296" + }, + { + "path": "docs/quality/PHASE_12_VISUAL_REGRESSION_RESULTS_v1.0.json", + "bytes": 517, + "sha256": "d4ffcc9b730a57d3d6a46d4f617cb40b9c0fe5489189dfda7e8e2c2c521bf6d8" + }, + { + "path": "docs/quality/PHASE_13_COMMAND_LOG_v1.0.txt", + "bytes": 1225, + "sha256": "4f8a2074c0ccc3b16e3d1656688d52ea0fe6fc3b9bd125d23b00b1b682b8533a" + }, + { + "path": "docs/quality/PHASE_13_FILE_CHANGES_v1.0.txt", + "bytes": 1051, + "sha256": "95e446fe77e3412f02f236f6c6891df11ab76857aa77b4497a82f2c64e0b34cb" + }, + { + "path": "docs/quality/PHASE_13_HTTP_ROUTE_RESULTS_v1.0.json", + "bytes": 553, + "sha256": "6ab331a76652ad7b7183d4ead068fb9e5af13c10e361148a36c207f619c235c4" + }, + { + "path": "docs/quality/PHASE_13_MANUAL_QA_RESULTS_v1.0.csv", + "bytes": 1571, + "sha256": "5cffba29bff2974118bc17ca9bc9ceb94cc1b5504d1a04a92ad43a67b04dbe47" + }, + { + "path": "docs/quality/PHASE_13_VALIDATION_RESULTS_v1.0.json", + "bytes": 2964, + "sha256": "bde83fe8e06a47fcf235821c055f9fa12f72c5cdd472d04e35f1f9b99738fe23" + }, + { + "path": "docs/quality/PHASE_13_VALIDATION_RESULTS_v1.0.md", + "bytes": 4094, + "sha256": "457a045db7fa620029f94929f2fd86e7d1549a787b53949a50b08b4f039182a6" + }, + { + "path": "docs/quality/PHASE_14_COMMAND_LOG_v1.0.txt", + "bytes": 2061, + "sha256": "929f481348f4f8e9981665f763c74d97f3a5b03a3d3fd79e13fa874586dccdf1" + }, + { + "path": "docs/quality/PHASE_14_FILE_CHANGES_v1.0.txt", + "bytes": 5414, + "sha256": "2c7587b49801ff92871a1eaba3669b2c5078c85233a571079679f87b6c5ee06d" + }, + { + "path": "docs/quality/PHASE_14_HTTP_ROUTE_RESULTS_v1.0.json", + "bytes": 764, + "sha256": "b1b2cf79c7b913e893931482750f5de6fbe11f1a167e19e5bd88aca37ba5c9f0" + }, + { + "path": "docs/quality/PHASE_14_MANUAL_QA_RESULTS_v1.0.csv", + "bytes": 2086, + "sha256": "e7a3c123fa363bc18d6f4f150e34a4ec0f47836f0cdc60e4a6ac4d02a6961a6f" + }, + { + "path": "docs/quality/PHASE_14_VALIDATION_RESULTS_v1.0.json", + "bytes": 3810, + "sha256": "a2b881a68c34dca6fc1fb85d47a225c9f1583499848ea45deef4de029d9f0ff9" + }, + { + "path": "docs/quality/PHASE_14_VALIDATION_RESULTS_v1.0.md", + "bytes": 1648, + "sha256": "4ffac0d2e5461bee305d346b3da2589f33120ff9ba31f6a6b740d8b52393ac5d" + }, + { + "path": "docs/quality/PHASE_14_VISUAL_REGRESSION_RESULTS_v1.0.json", + "bytes": 501, + "sha256": "8f27f81463c6850bf6b93b4efd61f761af7ccf011b220b336f69b8a4ef5d453c" + }, + { + "path": "docs/quality/PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.json", + "bytes": 5595, + "sha256": "4cf636fd2a163700b666f0a04946b453dd22c4a4b43bc03bb420c3760a37353d" + }, + { + "path": "docs/quality/PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.md", + "bytes": 4606, + "sha256": "0f3fb7ce9257fadfb7819143ad6a840ab1b6a5a848d0a8e3b19972e430cb0bab" + }, + { + "path": "docs/quality/PHASE_15_COMMAND_LOG_v1.0.txt", + "bytes": 11190, + "sha256": "b92aea4d16329cc54aab02e2dd035275425d3703a7e17703aa31f3224f78a484" + }, + { + "path": "docs/quality/PHASE_15_FILE_CHANGES_v1.0.txt", + "bytes": 13959, + "sha256": "ec77798e607ad9ef876b4eb5ce5c3c33d494f8d16c4f149f0eeca757d78a8bb3" + }, + { + "path": "docs/quality/PHASE_15_STATIC_AUDIT_RESULTS_v1.0.json", + "bytes": 3211, + "sha256": "ef3216e76c58a1656f68cae7d6a792a0da6ea5e63465bf3879c610ab235b3158" + }, + { + "path": "docs/quality/PHASE_15_STATIC_AUDIT_RESULTS_v1.0.md", + "bytes": 3065, + "sha256": "595afc2c185c9d091ca952325b37a268b357478a23467ea920e4945f86b6ab9a" + }, + { + "path": "docs/quality/PHASE_15_TOOLCHAIN_SETUP.log", + "bytes": 1554, + "sha256": "313029491c83cc00c9abf5e8ab63db6bd350c9bb94d5e2b80415fd716091db64" + }, + { + "path": "docs/quality/PHASE_15_VALIDATION_RESULTS_v1.0.json", + "bytes": 2479, + "sha256": "ae6fd775d5d6a67406b59296796ea3f904b79a78cc24a33f85cf2b4b87067008" + }, + { + "path": "docs/quality/PHASE_15_VALIDATION_RESULTS_v1.0.md", + "bytes": 1515, + "sha256": "1c50f03fbeee648e398f51499b9348245cb2b85edfad9e21f5eb14415454d7c9" + }, + { + "path": "docs/quality/phase15-command-logs/01-validate.json", + "bytes": 136, + "sha256": "690ec5e56e1c2d1260bbda500aae6935eec51c7e1c957ac8043d3b5eacf8fe45" + }, + { + "path": "docs/quality/phase15-command-logs/01-validate.log", + "bytes": 1482, + "sha256": "a8702ea1ad801f38a464f52e1961f4d0301082499f928e38290e8c9a3ad0a38c" + }, + { + "path": "docs/quality/phase15-command-logs/02-phase14-manifest-baseline.log", + "bytes": 131, + "sha256": "e1bc16ca75ee3f5fc063bee211ed1aebebff3365039c0c0558817467c4e4e13d" + }, + { + "path": "docs/quality/phase15-command-logs/02-phase14-manifest.log", + "bytes": 428, + "sha256": "d304fc1d9d340a8af6588bc023099451663d47d300c4787aff5a30e693cd4ec4" + }, + { + "path": "docs/quality/phase15-command-logs/03-syntax-check.log", + "bytes": 225, + "sha256": "99246276d42a08b275fc645efc9f84a762534bd51b3f88888676fcba28d54744" + }, + { + "path": "docs/quality/phase15-command-logs/04-baseline-static-audit.log", + "bytes": 223, + "sha256": "09c63142e71f71f0f0f5c652902a32b0a1cbd1908e9eadf5830ff71659643905" + }, + { + "path": "docs/quality/phase15-command-logs/05-current-static-audit.log", + "bytes": 66, + "sha256": "8785c8611db8a489da6792f6377236f4c9b9c1a0f5ac5636986e206c03b6f36c" + }, + { + "path": "docs/quality/phase15-command-logs/06-current-validations.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/phase15-command-logs/06-current-validations.log", + "bytes": 1597, + "sha256": "2d44d3eea802e5b8f17b9c9eb01c1280276e7cb30a3617f9226bf552af18922e" + }, + { + "path": "docs/quality/phase15-command-logs/07-current-static-audit.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/phase15-command-logs/07-current-static-audit.log", + "bytes": 106, + "sha256": "175b57f0a4b5dd6f7293d8534050b6cefbd98c899a2fb686b8d4d9f5c6917f0c" + }, + { + "path": "docs/quality/phase15-command-logs/08-content-type-behavior.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/phase15-command-logs/08-content-type-behavior.log", + "bytes": 643, + "sha256": "2e1077c48d47f02ae73c2ee7b9006b1ef887faae6b6eb04be673d5f395825ab4" + }, + { + "path": "docs/quality/phase15-command-logs/09-syntax-check.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/phase15-command-logs/09-syntax-check.log", + "bytes": 117, + "sha256": "0ef5177d69f49bdbf89a8b9a6bcef2110728108969453dcc36f27a0b1ce83161" + }, + { + "path": "docs/quality/phase15-command-logs/10-final-validations.log", + "bytes": 1612, + "sha256": "a48348ed8aaa988ad1c267603e272725d5be2d057ed4915868c871a0678a1935" + }, + { + "path": "docs/quality/phase15-command-logs/11-final-static-audit-pre-report.log", + "bytes": 128, + "sha256": "c806167d316db60d36fb6069f03ce47c623d43ce6710c77fb6b03ccc7144e1c5" + }, + { + "path": "docs/quality/phase15-command-logs/13-final-static-audit.log", + "bytes": 128, + "sha256": "f0bdbb5e1d170a394eec143cb960a8ba62355edfcbe5fa5bc10cbe39565d876c" + }, + { + "path": "docs/quality/VALIDATION_RESULTS_v1.0.json", + "bytes": 1397, + "sha256": "9b663f7667620496bcbd872e3fc06c725adfb7dbbf6d7bfe8848896f400105d7" + }, + { + "path": "docs/quality/VALIDATION_RESULTS_v1.0.md", + "bytes": 4623, + "sha256": "47d44ee6095cb0bc68fe23148c98403d39309edbb4dd6acdf4a696019e9f0065" + }, + { + "path": "docs/quality/VISUAL_REGRESSION_RESULTS_v1.0.json", + "bytes": 659, + "sha256": "2e94e41c1bdae854d8b1b1db8f62027e896783ece58df0108287c181c7e8caa5" + }, + { + "path": "docs/TOKEN_IMPLEMENTATION_v1.0.md", + "bytes": 2281, + "sha256": "fe6cb88b5689f989cd325a961f2d28cde6f20bea31d2cf572d2a5706c2d7fed7" + }, + { + "path": "eslint.config.mjs", + "bytes": 1031, + "sha256": "14ef56a9899d4c5440c6fe71e713f321b1e1db3de2041b6ad13cd8f798a5225d" + }, + { + "path": "next-env.d.ts", + "bytes": 247, + "sha256": "7b550dda9686c16f36a17bf9051d5dbf31e98555b30d114ac49fc49a1e712651" + }, + { + "path": "next.config.ts", + "bytes": 198, + "sha256": "cd5d6988c4b5ba3b924c236876af7df12edf1f6df71d654ed67500ad450a48eb" + }, + { + "path": "package.json", + "bytes": 3975, + "sha256": "e894298ee2078480a3a14e5582f5972cb64a2890ca0022f8085ce634351ec4e2" + }, + { + "path": "PHASE_10_PACKAGE_MANIFEST_v1.0.json", + "bytes": 25522, + "sha256": "5a6e185cba91cf3801480ef83f07ed392cd2a85f1f717bb2c4b341235613269c" + }, + { + "path": "PHASE_11_PACKAGE_MANIFEST_v1.0.json", + "bytes": 35023, + "sha256": "060cf87e54f52d00928722188166a24e20949b91c3237e5ac148bdf660b66aaf" + }, + { + "path": "PHASE_12_PACKAGE_MANIFEST_v1.0.json", + "bytes": 58828, + "sha256": "1eb7d488f70fd147f0e34d5ffcb2f40e05d6e6094629c9fb2374f42cb4651906" + }, + { + "path": "PHASE_13_PACKAGE_MANIFEST_v1.0.json", + "bytes": 62522, + "sha256": "6d1478e402a429a9e48a4bd157f7eef473bb6ac09021913acd8ca143527f4807" + }, + { + "path": "PHASE_14_PACKAGE_MANIFEST_v1.0.json", + "bytes": 81610, + "sha256": "dda774ec235d1bb912355604dd2f7f091dc0d117b3849fb8cc15df4da92c86c1" + }, + { + "path": "playwright.config.ts", + "bytes": 2003, + "sha256": "d054578e388ff2bc3af53a0f02a54952225a4e88fda528d0181a5ff17ff6f9ff" + }, + { + "path": "pnpm-lock.yaml", + "bytes": 168864, + "sha256": "c8b40337671246d5a691a4c2c322f6ed184c6b7f99c10095519cf768eb1ace3d" + }, + { + "path": "pnpm-workspace.yaml", + "bytes": 338, + "sha256": "568eba518a28bcd58534a51483092d0a27919aefaec2446e6dd5c6d6ddd80160" + }, + { + "path": "prettier.config.mjs", + "bytes": 164, + "sha256": "2d5316ad27ef10ead128dd2ee82e11b79f067fcf25ea6d504624966739260335" + }, + { + "path": "public/.gitkeep", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "README.md", + "bytes": 5544, + "sha256": "6c65fce47358960186dc639f267b3d18c97d9eb56325772c5318a088fafa5915" + }, + { + "path": "scripts/generate-phase10-manifest.mjs", + "bytes": 1800, + "sha256": "6917fd46f99aacf9de7c89f058380facbf4c8c4adf0baaafb0bf7d1333497808" + }, + { + "path": "scripts/generate-phase11-manifest.mjs", + "bytes": 1800, + "sha256": "4f659193f9741a6c4d0b1bfc8153b426952ce7a9a895b8229bc8fe82530d832b" + }, + { + "path": "scripts/generate-phase12-manifest.mjs", + "bytes": 1771, + "sha256": "2be2e9d9089fc37041ecba9196ca6f2eaed818b7572c470fea4d4c2a4ea4ecd4" + }, + { + "path": "scripts/generate-phase13-manifest.mjs", + "bytes": 1801, + "sha256": "43e242d20eee8fd4a06747c340187e43a87fcd1da7f99c2c295ece7d62c9a710" + }, + { + "path": "scripts/generate-phase14-manifest.mjs", + "bytes": 1801, + "sha256": "c17d335321be709cd455c357c53d902a8b4f1c279b86254e232e922ca21ee3b4" + }, + { + "path": "scripts/generate-phase15-manifest.mjs", + "bytes": 1889, + "sha256": "483f9b1222368fe9bd255d5d4b07d1f8ea6898b575c0e07a13c5f693ef70f932" + }, + { + "path": "scripts/generate-phase15-reports.py", + "bytes": 67112, + "sha256": "23bba1a926c5696ee9c02a3a6861f931426e452ea803d757f81d79c5dd83a1e8" + }, + { + "path": "scripts/lib.mjs", + "bytes": 1446, + "sha256": "81c8af9b271572e92ade805dd317dc8738647efe8e89cb37a7c9d1873b5d5edc" + }, + { + "path": "scripts/phase15-static-audit.py", + "bytes": 17442, + "sha256": "9a72263a697c17e157432dab091a2f30cc0fa2a6019cb5e521c9af57e949ac5a" + }, + { + "path": "scripts/prepare-standalone.mjs", + "bytes": 813, + "sha256": "f1c1398022048160d71ae14bfa53dd2e431dd2f5aca8f39571de159259af535b" + }, + { + "path": "scripts/prepare-typecheck.mjs", + "bytes": 200, + "sha256": "ab77db302cfc2e9ee25147989f5c8de5bd244a8efcce63d862fdb0f9350c227f" + }, + { + "path": "scripts/run-checks.mjs", + "bytes": 695, + "sha256": "f7e2e25fec5ba927fe2be4ef4d1d19479159c151ad4cec4f53a254b487c8a43a" + }, + { + "path": "scripts/run-validations.mjs", + "bytes": 790, + "sha256": "5a443dbb37ebeffacd32c214b94ac6d2c316fc6bf16e19c0719b608345a8aa6a" + }, + { + "path": "scripts/validate-css-logical.mjs", + "bytes": 943, + "sha256": "d47f0346ba94621442c5dc700b53a0219ade3dda7485b4c7f49fb384738c424c" + }, + { + "path": "scripts/validate-locales.mjs", + "bytes": 1875, + "sha256": "dfaf3f34079ea571b17dd2d71d0abf47b48be924818b39c5df93495188b95f43" + }, + { + "path": "scripts/validate-metadata.mjs", + "bytes": 1268, + "sha256": "78127c2c0387e38914388f1a6292ed7a408d672739f8ef5a51e3919fdd2addb0" + }, + { + "path": "scripts/validate-phase10-manifest.mjs", + "bytes": 1192, + "sha256": "29386f182d08ee9096e51a01ea115ae145023724f3d8527fc3ac550152f34d20" + }, + { + "path": "scripts/validate-phase11-foundation.mjs", + "bytes": 2898, + "sha256": "6ada4344545ae50710d9207e0de636c1a8452e6a6bbe3815d51f82ae66667b0d" + }, + { + "path": "scripts/validate-phase11-manifest.mjs", + "bytes": 2950, + "sha256": "977c184291541ad5c6926f8075f96e093dd8957ffc6fe722cc4481a7c079aab7" + }, + { + "path": "scripts/validate-phase12-components.mjs", + "bytes": 3533, + "sha256": "5f07dfdba17bc909cda2fcb0bb52dfac689d1bb9ee4daed5a5640545f48fd01a" + }, + { + "path": "scripts/validate-phase12-manifest.mjs", + "bytes": 2545, + "sha256": "8968feb1e9a0aa6fae696e18fbc1d73dd34881ff4bfe80cfd5f8114a16667ac8" + }, + { + "path": "scripts/validate-phase13-homepage.mjs", + "bytes": 2514, + "sha256": "5a8e8cfb5f1512d02a08a6c8d7952436700b1fd9ebc9d6384ae3191a4eda353c" + }, + { + "path": "scripts/validate-phase13-manifest.mjs", + "bytes": 2576, + "sha256": "407e334829c01206c92ad80fcb9347f8288e48e46455de19a50a26cc9f87ed1f" + }, + { + "path": "scripts/validate-phase14-environment.mjs", + "bytes": 1237, + "sha256": "236f2c7d06b0b879cd475d0e28f09881201972c977b4d108f85d8da692d664e3" + }, + { + "path": "scripts/validate-phase14-integrations.mjs", + "bytes": 2556, + "sha256": "b87d7a29cfff50a824c772a511c0b7dbc2d5d016c3a8b792248fb86370019f06" + }, + { + "path": "scripts/validate-phase14-manifest.mjs", + "bytes": 2576, + "sha256": "9f586d4de1e321c4bf6113a153d0b033c38e15e57046d6d6e9dcb4aa93c4f1ed" + }, + { + "path": "scripts/validate-phase14-privacy.mjs", + "bytes": 1383, + "sha256": "28ad1dae9ec12952a3f00b20dcd9cd8a258b8d7e12064872f39e4d8813f910b3" + }, + { + "path": "scripts/validate-phase14-security.mjs", + "bytes": 1706, + "sha256": "e4e86e52060c80cf7c14e0db178438765ea6e12715f9994a93fc2e1bb805fdc7" + }, + { + "path": "scripts/validate-phase15-manifest.mjs", + "bytes": 2673, + "sha256": "129ea44a368c82e130c803156cf8096342438545571accd1ed700cd768bdf5a4" + }, + { + "path": "scripts/validate-phase15-readiness.mjs", + "bytes": 3472, + "sha256": "6764887cce0b291f6e210492a41ec515369d5146802e6fb0fdd5a6906d42e792" + }, + { + "path": "scripts/validate-phase9-contract.mjs", + "bytes": 1424, + "sha256": "5fce16d33bf6cf7d95136b89f62fd595f109c5d003d54652998dfe3e5b866d6e" + }, + { + "path": "scripts/validate-prohibited-content.mjs", + "bytes": 1068, + "sha256": "3dd645162ad8cd95a28395840fba47a11e2b34e744c7cebdd61a0a9ed3003872" + }, + { + "path": "scripts/validate-routes.mjs", + "bytes": 1611, + "sha256": "d495d43cdfc9505c951b1ed4f7c717d5369b2a637ca31b0b87aae118295c9568" + }, + { + "path": "scripts/validate-runtime-dependencies.mjs", + "bytes": 2188, + "sha256": "f4c43bcaf8fdc78ece6698bcfcdd95413d7a28c1e991f352d74441d0dbbda17f" + }, + { + "path": "scripts/validate-tokens.mjs", + "bytes": 1682, + "sha256": "a508dbee00fe1f991d4f09c2072719e508eb9e14f3ab7d474ba67ca826f45557" + }, + { + "path": "src/app/[locale]/[slug]/page.tsx", + "bytes": 2222, + "sha256": "1f0a103dc658ba88003f5203e3842ec13dc5bdc2bc10695510968043f9ea4dfd" + }, + { + "path": "src/app/[locale]/component-lab/ComponentLabInteractive.tsx", + "bytes": 3620, + "sha256": "87a236be050916440bce01f0c4c5ec9ef31f33a64eff706dbd8ff53febb9868b" + }, + { + "path": "src/app/[locale]/component-lab/page.module.css", + "bytes": 618, + "sha256": "5aa5740b49a0b17da98bb9041e95e9680ae2bfc6de28244b6ddc1d36bdc30372" + }, + { + "path": "src/app/[locale]/component-lab/page.tsx", + "bytes": 2960, + "sha256": "ef7007fbcedfeb3dd96e16ff657b43ed9cac72cd5792dea067d68a61b011c60c" + }, + { + "path": "src/app/[locale]/error.tsx", + "bytes": 693, + "sha256": "129089239ad9e7e5fb941607803ef5dded6df716d3d913b355db015901cea2b5" + }, + { + "path": "src/app/[locale]/layout.tsx", + "bytes": 2932, + "sha256": "aaae9374813073c4cde0877f4bf6ba11f98027262bb5d1e001f8b654d2fff6e5" + }, + { + "path": "src/app/[locale]/loading.tsx", + "bytes": 146, + "sha256": "54cff43832c7ad9d05b82cddb5e2262ec11589a937a54b3c5a2c0da3da6c46b5" + }, + { + "path": "src/app/[locale]/not-found.tsx", + "bytes": 150, + "sha256": "ddb7a1c6f57acebb313117af5c5312398b39a6b698f7347b8fed69c4816e9c00" + }, + { + "path": "src/app/[locale]/page.module.css", + "bytes": 3805, + "sha256": "ae5a4800050ffb7c4afae1b427a2a8c1900baa825064b7cbc96ac6316a68319d" + }, + { + "path": "src/app/[locale]/page.tsx", + "bytes": 12595, + "sha256": "dcde623280a31fa552f0b8ca322656714ced4bf3241a037a7c122e463ee5c84d" + }, + { + "path": "src/app/api/demo/route.ts", + "bytes": 4491, + "sha256": "5f9f17acf083d42e6c74af48a75c82a253abaee97788bfa07c6d0e480caeaf70" + }, + { + "path": "src/app/robots.ts", + "bytes": 397, + "sha256": "6c1e263671da52c65da390bcbf38b2a11ec9c580a0072295cad11028e082900f" + }, + { + "path": "src/components/actions/ActionLink.module.css", + "bytes": 1250, + "sha256": "7aa5f13eb3a26877c3301056b4e05e30ef9433513bdfdbf2cde544708d7fa7c0" + }, + { + "path": "src/components/actions/ActionLink.tsx", + "bytes": 1963, + "sha256": "5c239401c7c16a7ed42818e664b8f8b6d1929f1d1d2ad26defd832a88372c9cc" + }, + { + "path": "src/components/actions/Button.module.css", + "bytes": 3018, + "sha256": "667e7b647fdec7030cda77a06d5f4509fc1ed941e2b68c65a6e656161708d4a2" + }, + { + "path": "src/components/actions/Button.tsx", + "bytes": 2720, + "sha256": "27933a21d5566700b9cb2dc99f68a53e05f965cae829191f0fe83d75679fc89c" + }, + { + "path": "src/components/app-shell/BrandLink.tsx", + "bytes": 684, + "sha256": "54c482a2e5be262941b943cf2ed123b61dbd4199993d225ec5d22be530b375bb" + }, + { + "path": "src/components/app-shell/Controls.module.css", + "bytes": 743, + "sha256": "fde735d74c28c3131a4c2c6b91146fd844e4af1af351d481033b32e2a8ec1a8c" + }, + { + "path": "src/components/app-shell/DisabledAction.tsx", + "bytes": 682, + "sha256": "4c8327532ccd967895c9ea03477b136eef7f47b169e04ecc728e3af80a152073" + }, + { + "path": "src/components/app-shell/HeaderNavigation.tsx", + "bytes": 1634, + "sha256": "ebfd217810ca31dbafd64ceeaaf8de45a89c6e2aa1d4806a66f2f25dd55e0188" + }, + { + "path": "src/components/app-shell/LocaleSelector.tsx", + "bytes": 1330, + "sha256": "bfcda377c8177aab6e2f5e17fc761dd77009e0310fd281f7dbc07a72f88c162d" + }, + { + "path": "src/components/app-shell/LocalizedLoading.tsx", + "bytes": 503, + "sha256": "b362aa5b94495c599c7cc22e0a3cfa04a29229b6c7f74dde71202f5027a831a5" + }, + { + "path": "src/components/app-shell/LocalizedNotFound.tsx", + "bytes": 794, + "sha256": "3b7a9c001bd3e9818c7bda6f25bc29c9df816d4ced1486542be2b31ccdc476e9" + }, + { + "path": "src/components/app-shell/MobileNavigation.tsx", + "bytes": 4188, + "sha256": "be0e5104d96f71c89354bf7de042f40d2cf740c756acf74cb11a0b16c89c17c0" + }, + { + "path": "src/components/app-shell/SiteFooter.module.css", + "bytes": 2260, + "sha256": "491af5e5b3137180ffec3833ff2d9e6bfe1d47cf7615a886034e1ff12b89cceb" + }, + { + "path": "src/components/app-shell/SiteFooter.tsx", + "bytes": 4999, + "sha256": "e50e289a87c9b9adc26931b5bec9382a9eaf176ce2abed5b4c1693b6cb64bfe0" + }, + { + "path": "src/components/app-shell/SiteHeader.module.css", + "bytes": 5197, + "sha256": "a0bd449a7fceb0837a35b09acc743750061e0c77ec0060e13cbd20a843fe509d" + }, + { + "path": "src/components/app-shell/SiteHeader.tsx", + "bytes": 2707, + "sha256": "a02bc01a005a2d796d981e3aab7181f881c9bb787cf3e30c04c8ccbbea986a38" + }, + { + "path": "src/components/app-shell/StateShell.module.css", + "bytes": 2014, + "sha256": "acdf7af0cd11250c411dd44291e36cc5053a195a07d3849c2ca9050f6524cf40" + }, + { + "path": "src/components/app-shell/StateShell.tsx", + "bytes": 1378, + "sha256": "633c5d35f024d6c1c7a7b5f2bc128d13ef35a25ac07820c7428dc871d5c01f50" + }, + { + "path": "src/components/app-shell/ThemeController.tsx", + "bytes": 1017, + "sha256": "e3e646ff02c7480a191d4700971ba03b947ddff769687af1f3769e11cd740ce9" + }, + { + "path": "src/components/app-shell/ThemeSelector.tsx", + "bytes": 2319, + "sha256": "04bb79e8b99006786e669ccae0a8d1a845efafceebe6b5d0ab43380a190d1b6f" + }, + { + "path": "src/components/controls/Accordion.module.css", + "bytes": 809, + "sha256": "5a0bf706ab23537146dfa6a03e76753d22987a6df2cab0ddc9a60094f7865ba6" + }, + { + "path": "src/components/controls/Accordion.tsx", + "bytes": 880, + "sha256": "0c26c34d4b7ed1f343101f5a7897806e4a42301181070074a3489668cd425ca3" + }, + { + "path": "src/components/controls/Pagination.module.css", + "bytes": 605, + "sha256": "cb6d2109fd8706e16090e38c0154380c7272c40b723899600d93bd7d44d4af47" + }, + { + "path": "src/components/controls/Pagination.tsx", + "bytes": 1423, + "sha256": "7ea4663bdb23f16c57d29d3503684bed127d7f0f09f68e10e061c3ec8f9255c4" + }, + { + "path": "src/components/controls/SegmentedControl.module.css", + "bytes": 742, + "sha256": "b03cd7de287c4bc182917391461023b103c298bc249b082eebeaaeda12dca041" + }, + { + "path": "src/components/controls/SegmentedControl.tsx", + "bytes": 977, + "sha256": "6fd779b2a0d7f2a8f9a376f595144b92f42b41bc4f520768c104be90085baaf6" + }, + { + "path": "src/components/controls/Tabs.module.css", + "bytes": 688, + "sha256": "2b09531d587bd42d8a45cb78b68ae3581f2ec4979a1d749781311a6a81dbc5b7" + }, + { + "path": "src/components/controls/Tabs.tsx", + "bytes": 3706, + "sha256": "a978deffdbb453dc3f15a149476fbcedc2a857c9e39d1677aa3dfc13423f42da" + }, + { + "path": "src/components/feedback/Alert.module.css", + "bytes": 701, + "sha256": "42437211c46949b798d0544e96983457d34ad17af5a251528a5000a393a7fd11" + }, + { + "path": "src/components/feedback/Alert.tsx", + "bytes": 1185, + "sha256": "743f79b9b1aec74db9d86655bd60d660e5ff8a2b9a2b446f744aa68a9aa401f1" + }, + { + "path": "src/components/feedback/Loading.module.css", + "bytes": 782, + "sha256": "2f8be2f2f54e1b1dae4307012ebc8d7e1b516f99241b99bcc0385632a5583717" + }, + { + "path": "src/components/feedback/Loading.tsx", + "bytes": 1046, + "sha256": "bf766131b06eff6f4bebd03a24839037a2583975256d535462d79b72f1f1214e" + }, + { + "path": "src/components/feedback/Progress.module.css", + "bytes": 298, + "sha256": "a959f3d0f793a16bd913edfbec2c744d037715fb8108dbd7d9f0a4aea2e57f27" + }, + { + "path": "src/components/feedback/Progress.tsx", + "bytes": 969, + "sha256": "a2ec6d0993ec49146170ecf655f23bbcdce7f944dc6b6ae4189676671e77bd08" + }, + { + "path": "src/components/feedback/StateMessage.module.css", + "bytes": 343, + "sha256": "90a4e7a10b9d39eeacd2b127c1c80d0550d3b364cc566667a59ccd6b2d6a436b" + }, + { + "path": "src/components/feedback/StateMessage.tsx", + "bytes": 729, + "sha256": "2f327960e793cefbf8bd501ef7948764390485708217d8f1934eb08c23260f5a" + }, + { + "path": "src/components/forms/ChoiceControls.module.css", + "bytes": 1780, + "sha256": "2ba09892007180658bcbe8621261f1508034398af16929df379684fcdb2850b9" + }, + { + "path": "src/components/forms/ChoiceControls.tsx", + "bytes": 1763, + "sha256": "ddee24498db928491fe82b4db2fa559a5c8b8867bf8d8d7ff1cbfa090218da4d" + }, + { + "path": "src/components/forms/ErrorSummary.module.css", + "bytes": 482, + "sha256": "581e9b4db50083165ec0d9f5e5ccc04d9d5c63696f387389f5a154e039873a87" + }, + { + "path": "src/components/forms/ErrorSummary.tsx", + "bytes": 801, + "sha256": "e5e876e863a894506d717e15953aee906bb54903d6f79df0d09a88e9f0f8108d" + }, + { + "path": "src/components/forms/FormField.module.css", + "bytes": 749, + "sha256": "7bb3eca2e81143d98fb6d6aa4da6cb15f6886ed8ad1885cc5ba83bd10155bdfd" + }, + { + "path": "src/components/forms/FormField.tsx", + "bytes": 1643, + "sha256": "a99559d7a5d4fcb1d442ef7401ae3bffb31f069b46d97855606111a84bbcc559" + }, + { + "path": "src/components/forms/TextInput.module.css", + "bytes": 942, + "sha256": "ebb94b50515bd443c97353b42b8414f1f8848c64e4ffeb1d0e10f517f6857a2b" + }, + { + "path": "src/components/forms/TextInput.tsx", + "bytes": 2571, + "sha256": "777d7acb6f8ad35c27c1c0401d29e02781bdfd2261951a9c3d2020f8976dfdb4" + }, + { + "path": "src/components/foundation/AccessibleIcon.tsx", + "bytes": 352, + "sha256": "cc68b314b3a704037460272f12a05e4185bfbcc08be62bf0facd0d1efa5a5f5c" + }, + { + "path": "src/components/foundation/BidiText.module.css", + "bytes": 35, + "sha256": "0d9480f398007b7e1395f25afd4ba982c6a5dcf299f796ee96fdc1302e5f8b06" + }, + { + "path": "src/components/foundation/BidiText.tsx", + "bytes": 581, + "sha256": "2ed6cb4a821ec1c345b532f51808045490ebaca935bfe93c4bde5fec9292d1f3" + }, + { + "path": "src/components/foundation/client-hooks.ts", + "bytes": 2387, + "sha256": "d4bd6fd5efdd4560d2e356447b24944ffb9ba8f96f57b82b63617923ec457e61" + }, + { + "path": "src/components/foundation/Icon.module.css", + "bytes": 371, + "sha256": "33b3daa50a01cfeb683ea1fa92831efb8d7fd08a7e150370027b88c99118cf4d" + }, + { + "path": "src/components/foundation/Icon.tsx", + "bytes": 3549, + "sha256": "65d3f672bb32bd84745d9f9afd1d1f006debf244aba9e4147c89b3346a4a8764" + }, + { + "path": "src/components/foundation/LiveRegion.module.css", + "bytes": 184, + "sha256": "f5793a73b271c20d10b389245651d7c79fae6417c29e55701e381c0025d20df0" + }, + { + "path": "src/components/foundation/LiveRegion.tsx", + "bytes": 403, + "sha256": "d64aad4af939e2696b955a0632b2869533409698ae3dffede57a18a776e64acf" + }, + { + "path": "src/components/foundation/StatusBadge.module.css", + "bytes": 799, + "sha256": "1f46642795f813e177956bbb25973238275b98b5febb311bb8e7f18597bb2fdb" + }, + { + "path": "src/components/foundation/StatusBadge.tsx", + "bytes": 677, + "sha256": "57eb1b5fdc93f40a3ce5599a4691e76a5976ec8a76d451e8c5008a68262a9706" + }, + { + "path": "src/components/foundation/VisuallyHidden.tsx", + "bytes": 409, + "sha256": "babb1e41cb3ee8691da2653446f8ea38ecce94bcf90645f797cd23f08152213d" + }, + { + "path": "src/components/integrations/DemoDialogHost.module.css", + "bytes": 1075, + "sha256": "f15803f7d41b1f1705a150070c5aaf81bc7c8b02f63256bedaa4d1ca830df074" + }, + { + "path": "src/components/integrations/DemoDialogHost.tsx", + "bytes": 15878, + "sha256": "bcf7b8324cf3a90b6300d3d3c41fd15c972181f1d9ec6f87c7755d11a31ec296" + }, + { + "path": "src/components/integrations/DemoTrigger.tsx", + "bytes": 1325, + "sha256": "52bf30616912131dc256dc1d0432574746f3937bbe1e447547ef020640c14e2e" + }, + { + "path": "src/components/layout/LayoutPrimitives.module.css", + "bytes": 1106, + "sha256": "4463342699789f2bc38703a7178b62138f10a255555347b692855ea07536dbcc" + }, + { + "path": "src/components/layout/LayoutPrimitives.tsx", + "bytes": 2161, + "sha256": "e3eceb28bcaec129f0324558fd2a13fbfe413615c16943cc691a2a993089de33" + }, + { + "path": "src/components/marketing/Comparison.module.css", + "bytes": 571, + "sha256": "60624d31af0a9fb00f7ebe7bb705d7e6287911133ccd993e6b192ba45da94aec" + }, + { + "path": "src/components/marketing/Comparison.tsx", + "bytes": 1540, + "sha256": "d61e9fbec9780b9252dc5653b3915291fa9c5fc9f58284664a53aa11718cc366" + }, + { + "path": "src/components/marketing/CTA.module.css", + "bytes": 695, + "sha256": "15f1bfe8ac1ce9af110c48985ac572b3369bfca946a02f9392b2adeed8a6eb14" + }, + { + "path": "src/components/marketing/CTA.tsx", + "bytes": 2041, + "sha256": "7e8d0f1e0476e792682131e3be2bbbed8e9f4311b9a161c5629cd186c7935d83" + }, + { + "path": "src/components/marketing/Evidence.module.css", + "bytes": 412, + "sha256": "a77743583735f99b9b30368987428585ef31f2aabd9c786529657036b82a21f3" + }, + { + "path": "src/components/marketing/Evidence.tsx", + "bytes": 2248, + "sha256": "9fd018f402ef8dc9c130d6a432f6874d74949bf06e2e4947fea62b41d86cec9c" + }, + { + "path": "src/components/marketing/FeatureCard.module.css", + "bytes": 348, + "sha256": "57c384aca1b2526e928463041164d522e69a69d065be274f6429464beb87136f" + }, + { + "path": "src/components/marketing/FeatureCard.tsx", + "bytes": 1444, + "sha256": "9c4bb352e1c4fffaa5566b2b5b190a2305b5935752205dee8b395a25ec9ba206" + }, + { + "path": "src/components/marketing/ProductPreview.module.css", + "bytes": 1272, + "sha256": "4901558b80324028252db79ff79ad7502d55554ca42d42b3b3e6ff4e4462a7dc" + }, + { + "path": "src/components/marketing/ProductPreview.tsx", + "bytes": 2137, + "sha256": "00dbcf972d8414cc79538a7552843ac93d28c97dec700d596d4a2571ea7f3c5c" + }, + { + "path": "src/components/marketing/SectionHeader.module.css", + "bytes": 216, + "sha256": "6f99ef1f489c765738189363fa8cce40b768db43be0645ac9532e670dd7fd31f" + }, + { + "path": "src/components/marketing/SectionHeader.tsx", + "bytes": 835, + "sha256": "8b9ab5d01fe69b25bd16574105feb74b9e70758df5a9daef32da5d29250760e9" + }, + { + "path": "src/components/marketing/SectionPatterns.module.css", + "bytes": 849, + "sha256": "3f27c9f58bb61032f3432b58fc83c20e619322e573a8460b36113b0116560027" + }, + { + "path": "src/components/marketing/SectionPatterns.tsx", + "bytes": 1004, + "sha256": "0ae2ee1c2a340db787e239a4222b9dd23eb8a688ff711497890570acd8b5eadf" + }, + { + "path": "src/components/marketing/Workflow.module.css", + "bytes": 967, + "sha256": "545620b59d472a2c696183a9e9827f3e7ed8682f462664eee1b6887313a60d56" + }, + { + "path": "src/components/marketing/Workflow.tsx", + "bytes": 1407, + "sha256": "2d64639b356b9f14e3250bff7489b78ee32eceb3e7c628cde5b8f5c68bfa8dce" + }, + { + "path": "src/components/media/MediaFrame.module.css", + "bytes": 634, + "sha256": "c59c885869c8f432c8047f926810b55a185d5f46e1b908a03ef12bc7ed8bf2b7" + }, + { + "path": "src/components/media/MediaFrame.tsx", + "bytes": 1266, + "sha256": "8ef160e29c45690e7dccc3abfd63126425b62cc56673c47a57e01daa00464bf3" + }, + { + "path": "src/components/navigation/Breadcrumbs.module.css", + "bytes": 314, + "sha256": "c981af1d7501fed7832714dfa480f6627928477ff954937c8849f0a9be280aca" + }, + { + "path": "src/components/navigation/Breadcrumbs.tsx", + "bytes": 1175, + "sha256": "359f1e615f25fc3e94c173409fc1946ff95a6fdb9209d86973c3ae96f20c014f" + }, + { + "path": "src/components/navigation/FooterLinkGroup.module.css", + "bytes": 181, + "sha256": "b2622a0cf021181427f219e5aa76a89fdb821240092725bae98282a70aedeb44" + }, + { + "path": "src/components/navigation/FooterLinkGroup.tsx", + "bytes": 775, + "sha256": "9363f1038f6a33840351a51d51374f02c6c1ef32a19cce009c166b141e3d3461" + }, + { + "path": "src/components/navigation/SectionNavigation.module.css", + "bytes": 409, + "sha256": "da941d8adf08ae0826651f3e801965025f4d958b982f3b22a2aa29315b204086" + }, + { + "path": "src/components/navigation/SectionNavigation.tsx", + "bytes": 759, + "sha256": "e86a7d478baa53d315685e79a62b2e8a50d8bbf87d8201f13ae6347844b5f847" + }, + { + "path": "src/components/overlays/Dialog.module.css", + "bytes": 1464, + "sha256": "d1d8402dd4cf4a2777d66d6d08a4859db3b841156c331a5784dd00428ed2ecc4" + }, + { + "path": "src/components/overlays/Dialog.tsx", + "bytes": 2721, + "sha256": "1e52fc4d7a96ee892b7b9c31e8d504831a468bce2b9df17ee576431146f49bf4" + }, + { + "path": "src/components/overlays/DropdownMenu.module.css", + "bytes": 899, + "sha256": "d0f6cab314861fca4f0db886dd9a8981361274503df1aaf123409731302ecdd2" + }, + { + "path": "src/components/overlays/DropdownMenu.tsx", + "bytes": 2776, + "sha256": "db44d077ddb5a05457f1a60cc33383e3fab4ecb6cf0729cef55b21e4dabb58e6" + }, + { + "path": "src/components/overlays/Tooltip.module.css", + "bytes": 1103, + "sha256": "650d232057f795a046e8a7d04109ddaffe10dbbe71ce8796661bc63bb2edf931" + }, + { + "path": "src/components/overlays/Tooltip.tsx", + "bytes": 470, + "sha256": "839d3d08ecc8712eed9f84b3d69cb7e0f43fe450c0454015b85c6d83045115e0" + }, + { + "path": "src/components/surfaces/Callout.module.css", + "bytes": 374, + "sha256": "2f8c824f873308c30bb4612360b30a8807f4718c5820da5068cda35a17809783" + }, + { + "path": "src/components/surfaces/Callout.tsx", + "bytes": 496, + "sha256": "6eff5ca0fa0471ec35463de3e6a632c390ce68685e6dc10f8ea7ba36cb52cec4" + }, + { + "path": "src/components/surfaces/Card.module.css", + "bytes": 977, + "sha256": "014884cdeb170b200f30176e71ac35a01d491048e37c12901063d31fb9ed04d1" + }, + { + "path": "src/components/surfaces/Card.tsx", + "bytes": 1034, + "sha256": "76f6e68536848df8955031f352bee4787d10f191bb486d483438559c2babb4ee" + }, + { + "path": "src/components/typography/Typography.module.css", + "bytes": 1393, + "sha256": "bc1e060c8cdaaf977b787dc1a9a11d08eca8ff3100945d47ca82180e828a47b6" + }, + { + "path": "src/components/typography/Typography.tsx", + "bytes": 1676, + "sha256": "80ec8b42765b90b6558486557cdd677e528f9507fa3bfd205b91cfb52422842c" + }, + { + "path": "src/content/development/component-lab.ts", + "bytes": 14891, + "sha256": "0d90fb8aaac23cd12664ac98d7277d3b32eaf19d19db65ff308c46d5c89cd9b3" + }, + { + "path": "src/content/homepage-model.ts", + "bytes": 7885, + "sha256": "41b10af10f4b9351e994d22302704c9c118db7b91a896c992fa3e4a6e1870bc8" + }, + { + "path": "src/content/locales/ar/homepage.json", + "bytes": 18727, + "sha256": "18ee401ff18c52c033bb0a21a4aea3adf0425094f0decda453edd2a0e6d69c8d" + }, + { + "path": "src/content/locales/ar/shell.json", + "bytes": 4917, + "sha256": "48360fff06aabe1079a7149fc420a3667d25dd2ae67ec38c60f8b02e4a13bb2d" + }, + { + "path": "src/content/locales/en/homepage.json", + "bytes": 13772, + "sha256": "fa2f5c3e05a84888791c84d8edf65a56e2254655c951851ed428e38fc14d3191" + }, + { + "path": "src/content/locales/en/shell.json", + "bytes": 3682, + "sha256": "359f2ca2d531eab3a7d07f98d78c7f17989e7dc6581c353816979efb1d0734ea" + }, + { + "path": "src/content/locales/fr/homepage.json", + "bytes": 15718, + "sha256": "0ae27d726c5df34f8845c08b302ae8cfe3927a21af7076b8f46abfbeeb116f23" + }, + { + "path": "src/content/locales/fr/shell.json", + "bytes": 4271, + "sha256": "24624347f923a5d166c7c19ee79e6a7fa4e083be994ce5ea48bae588f95e92af" + }, + { + "path": "src/contracts/phase9/analytics-contract.ts", + "bytes": 918, + "sha256": "d79b32503a5f8346816c647b8a7f45a62468b96f4fc9525d6d5147b5d2f2ec45" + }, + { + "path": "src/contracts/phase9/analytics-event-spec.csv", + "bytes": 1713, + "sha256": "1282ebca5b031f6267f8139033db437e30b62ac391d25823c8a4783b64151008" + }, + { + "path": "src/contracts/phase9/component-contracts.ts", + "bytes": 3041, + "sha256": "45fb0222d99308b2f28014572316b13c2d7308bc16b1bd02f63b6e2257148399" + }, + { + "path": "src/contracts/phase9/demo-form-contract.ts", + "bytes": 699, + "sha256": "073cf70224f93312d177f77abd7987704205628209e30c44824ae45f929ee59e" + }, + { + "path": "src/contracts/phase9/design-tokens.json", + "bytes": 3771, + "sha256": "470d7bc9d4a466cce4e51f0fdc21fe199ec5b0d4007f5063704c523ce1b9ef0c" + }, + { + "path": "src/contracts/phase9/performance-budgets.json", + "bytes": 815, + "sha256": "e1679ce45d8a1225c46c085c7533d3230a41279c32d0812de5c5f05cb55eefa8" + }, + { + "path": "src/contracts/phase9/route-manifest.json", + "bytes": 1433, + "sha256": "e08ac94ba1f3899bb02dfa934695f530d1089f9f03b0fadaa0feabd466ad8ec4" + }, + { + "path": "src/contracts/phase9/visual-regression-scenarios.json", + "bytes": 1209, + "sha256": "27d961c33c32775485475f7037b8d3bbd13f634b65fe2f59d6eea898860edf5f" + }, + { + "path": "src/lib/analytics/client.ts", + "bytes": 831, + "sha256": "582efdc793da2930e52df2b87bf3e48876d7e03b206062c867836a7d36532763" + }, + { + "path": "src/lib/analytics/events.ts", + "bytes": 2097, + "sha256": "cc98e599c7783c993362ca2bac420ff774c56cc006026648df8086ecc6118ebb" + }, + { + "path": "src/lib/components/classNames.ts", + "bytes": 135, + "sha256": "9ec04c6ee51488fbcfebcace04c9e1ea9de3fda7cbc69e233b0bce353ad77824" + }, + { + "path": "src/lib/demo/adapters/blocked.ts", + "bytes": 388, + "sha256": "ebed470f8546d729bc626e9c427315acb17f262a190871f02c9d6e9bfc4535e2" + }, + { + "path": "src/lib/demo/adapters/index.ts", + "bytes": 746, + "sha256": "fe6ecd9a1dcee482ede19d6319b462fbde7cebbe822bf85df8128aaca887752f" + }, + { + "path": "src/lib/demo/adapters/local.ts", + "bytes": 1403, + "sha256": "09f48c5e257dc51aa87932d39cf640f971520bf29105ccdc25030efde8cf34cf" + }, + { + "path": "src/lib/demo/adapters/types.ts", + "bytes": 709, + "sha256": "1935ebf701b5fa7b8e91f6871607e397d1d0fb4c228b3e990740e6238a3da350" + }, + { + "path": "src/lib/demo/idempotency.ts", + "bytes": 1191, + "sha256": "7be87b7e0a5993dc3258ba397eed2506adfca04ee65498d85588d566ec3569f7" + }, + { + "path": "src/lib/demo/redaction.ts", + "bytes": 867, + "sha256": "82fa6ba5a7056826374a5e6633db4245108a9bb6363fed22c3093ebddd3e3384" + }, + { + "path": "src/lib/demo/schema.ts", + "bytes": 2778, + "sha256": "87409564c90edd84807870ff420adb10d09512d6be105e0c8d3eb9159c858a47" + }, + { + "path": "src/lib/demo/service.ts", + "bytes": 2381, + "sha256": "aec47fa5858dce9ef1f73c0de1b4dfbe7141d3bc619ec0ed0ea0dbf4cf482907" + }, + { + "path": "src/lib/integrations/destinations.ts", + "bytes": 4461, + "sha256": "99ea9479cce8d5170a188e6696b87a3d58cabe257de4280d9c059a96c542829e" + }, + { + "path": "src/lib/integrations/environment.ts", + "bytes": 4053, + "sha256": "b0c164af55ce6e88f214b50a4de4e634cf242fb0e9ce12ea8857e999e4e4dc60" + }, + { + "path": "src/lib/integrations/feature-flags.ts", + "bytes": 770, + "sha256": "947f1f1dfd0686a94a1896ff6b7c81b607881e1a5c601afb4f6b2f6eb0e6c725" + }, + { + "path": "src/lib/localization/client-messages.ts", + "bytes": 499, + "sha256": "402d73487e9c57e7f68b2b91b77de8cae27027bac56ac344f310eacd0bb41bd3" + }, + { + "path": "src/lib/localization/client.ts", + "bytes": 593, + "sha256": "bc1ae4b418151cd7b0816b655bf09a4f640ac09540016468e32376594001eb04" + }, + { + "path": "src/lib/localization/config.ts", + "bytes": 4758, + "sha256": "5658aebdfbb912e86b20cef052f6f2784ce64ea89c82fa3d2c05a3a32ec03ed8" + }, + { + "path": "src/lib/localization/format.ts", + "bytes": 2327, + "sha256": "a8f9fbe9bdb5838a910e86897ed13ef9bbfdca6e86514e466bc6a212c236bbfc" + }, + { + "path": "src/lib/localization/messages.ts", + "bytes": 878, + "sha256": "9307df65a80b08e7e1ea7c4e16358fc5fcbde299a00810076bcb36d0a13f9ced" + }, + { + "path": "src/lib/localization/site-origin.ts", + "bytes": 771, + "sha256": "40400ce29fc4adbd9c4490b456968e41fc7596d77ac5bea1c65179e0e4e760ff" + }, + { + "path": "src/lib/metadata/build-metadata.ts", + "bytes": 1322, + "sha256": "3496f11871e635ea6622746de07d74de63a09e648bae9ade02f7c75f042cde7e" + }, + { + "path": "src/lib/security/content-type.ts", + "bytes": 385, + "sha256": "8179360d02d132a2d386a89523a470455977544b2286628cff4c60e50d71105a" + }, + { + "path": "src/lib/security/csp.ts", + "bytes": 830, + "sha256": "f9244e061cc397fbe8720a055e5415b6df34e6c74d0c439ae8d25054d1239c5e" + }, + { + "path": "src/lib/theme/bootstrap-script.ts", + "bytes": 755, + "sha256": "ad1ac642ca61e133f41a5e5b3c062f1b23046f24a58565c6baaacf8c9b261f12" + }, + { + "path": "src/lib/theme/client.ts", + "bytes": 1368, + "sha256": "8bdad550d093755a6f1a20f8b5b59b9d19e0dbd78dbf24c3f4eda5a6dec5811f" + }, + { + "path": "src/lib/theme/config.ts", + "bytes": 821, + "sha256": "c04cd00ce7838fc964d5bdbfaa4c2380f7cd774a9d754987946c97ee8849e60c" + }, + { + "path": "src/proxy.ts", + "bytes": 2625, + "sha256": "522ad1c3650646e652099d61b403075000b4d6e12272df381f5653dbd4745dea" + }, + { + "path": "src/styles/component-tokens.css", + "bytes": 5898, + "sha256": "70665f8912d1e45cbcd1a2674a5cb547395391dae053d0951da157ad88d7de51" + }, + { + "path": "src/styles/globals.css", + "bytes": 2472, + "sha256": "15c39da4ef19e6127bd7f40db21a98d7d2599463af1a13bbd2c3ce786a7ef385" + }, + { + "path": "src/styles/tokens.css", + "bytes": 3553, + "sha256": "99912762e078bfc78b4878fc46b8c7d03d90c073e9c236942a58d83f6585a1b9" + }, + { + "path": "tests/a11y/component-system.a11y.spec.ts", + "bytes": 422, + "sha256": "6324716ef093a4c61601721f36ef652fc40db10f8e93af67ba01ab880d266285" + }, + { + "path": "tests/a11y/homepage.a11y.spec.ts", + "bytes": 901, + "sha256": "b096866589cdc74dba4224cc4b8dd2af045ff33c04168d6e3de0a9f8b42152c8" + }, + { + "path": "tests/a11y/integrations/demo-workflow.a11y.spec.ts", + "bytes": 616, + "sha256": "3365258ce02878f7ec7ab3171e16a6989ba904d516d4c8ae818631706da00760" + }, + { + "path": "tests/a11y/shell.a11y.spec.ts", + "bytes": 781, + "sha256": "9f6299337a822d8e4f6783cbfbb3e5da02e42bcca99d8e4519d7f0193072b205" + }, + { + "path": "tests/browser/component-system.spec.ts", + "bytes": 1714, + "sha256": "09bd3833504f68a55952a69299601dbacb3aa3f9e42c3abf9ee4103ac5b0fd32" + }, + { + "path": "tests/browser/homepage.spec.ts", + "bytes": 2100, + "sha256": "a230acbefa587e81a5e35ef3b56fa6cb5b570190f2d661df6f80e522845267c9" + }, + { + "path": "tests/browser/integrations/demo-workflow.spec.ts", + "bytes": 3415, + "sha256": "8984e7581a5b2fd140c63e120f0ea7cf3373a151705f65e16cee424449e3fb06" + }, + { + "path": "tests/browser/navigation.spec.ts", + "bytes": 1120, + "sha256": "7b4aa8bcb7b5c2f09fe82f6c4a5405673e69d45fb5f0833cbe37ee1d237c4c7a" + }, + { + "path": "tests/browser/no-javascript.spec.ts", + "bytes": 568, + "sha256": "a57739c1d0c7c45960129256218a9e95b87ac80a17fc7dee8bd4c95295280fbc" + }, + { + "path": "tests/browser/responsive.spec.ts", + "bytes": 865, + "sha256": "1730baaf20abfe6c47b514a2290f083e28fedd639bc9663e79cddc3f8330eb97" + }, + { + "path": "tests/browser/shell.spec.ts", + "bytes": 2425, + "sha256": "bdd0ce3d9f5e53ff485c45a3f9442e28fb6157d08cb0eccf02268351e18202e6" + }, + { + "path": "tests/browser/text-expansion.spec.ts", + "bytes": 712, + "sha256": "27459e2864eb747d839966b2cb66f4f7527175c953deae9893116a6aa0cf9540" + }, + { + "path": "tests/browser/theme-csp.spec.ts", + "bytes": 2362, + "sha256": "7f9824a86fe70143ff380e82e51076b88a0e466af399ef8a5de4b88c5483d646" + }, + { + "path": "tests/fixtures/component-system/component-matrix.json", + "bytes": 453, + "sha256": "baf694a484a6d769bd9c534e030cf873852612fb60dfe82dc854ea893e92a5a6" + }, + { + "path": "tests/fixtures/foundation-matrix.json", + "bytes": 571, + "sha256": "b5487f1c3970b3413549c7b7500dfc4fb4541cf312ff86b570fa1de56d163ab3" + }, + { + "path": "tests/fixtures/README.md", + "bytes": 495, + "sha256": "e3dba7bdd085bbb1fa43a6b33a94e66641b4437cd01bcfaaaf9c329eee93d3ec" + }, + { + "path": "tests/integration/demo-service.test.ts", + "bytes": 3265, + "sha256": "58efc6f4cf8e5e47d0f961db554d8c9b70942662dbccb92301f02a955da689b4" + }, + { + "path": "tests/setup.ts", + "bytes": 43, + "sha256": "91a3c8962a0edcb956206a501d943fe99e1c78c6d4d8b5c9a948a3362c75978c" + }, + { + "path": "tests/types/component-contracts.test-d.tsx", + "bytes": 432, + "sha256": "3a639ef230284c29901abf6b5cc625a515f94853701a57a84b27ac4168352f98" + }, + { + "path": "tests/unit/components/actions.test.tsx", + "bytes": 1366, + "sha256": "891c69eab0e33883408ad5e07b302b2e59dfde1c6eab449f82f0573e4359a835" + }, + { + "path": "tests/unit/components/controls.test.tsx", + "bytes": 1299, + "sha256": "52b52f6603290d5c060e943966e0ba5ec7572f0a914ad295a781bd0657d08b63" + }, + { + "path": "tests/unit/components/evidence.test.tsx", + "bytes": 1276, + "sha256": "0d45214874c8810a57adfc6f5d3b83f9927fc4c9faa930e66d614b041f7e0305" + }, + { + "path": "tests/unit/components/forms.test.tsx", + "bytes": 1349, + "sha256": "71866e0245af2c6f4c8ef955000db91c796142f68f5235dfe22064d381b453f1" + }, + { + "path": "tests/unit/csp.test.ts", + "bytes": 969, + "sha256": "18e4aa4145976102239e92a9c147cc8f0b8442b1bce37b84888246b137280de9" + }, + { + "path": "tests/unit/format.test.ts", + "bytes": 1488, + "sha256": "e7bc5eb89fa3017739180208a1dcfb3f03f3cb3077997dfc7e6e03faa68a9ad1" + }, + { + "path": "tests/unit/homepage-content.test.ts", + "bytes": 1752, + "sha256": "3755d445f9420d2bd8044a712c2ff4dd16d562d93bbe4f5b76b4d8b838f0f803" + }, + { + "path": "tests/unit/integrations/analytics.test.ts", + "bytes": 1020, + "sha256": "2ab2f3e15a7f043b218f61b6ea62d345f214737fb02485d2cc50209f356b8574" + }, + { + "path": "tests/unit/integrations/content-type.test.ts", + "bytes": 570, + "sha256": "6c55b144602bae6ad9bfb9f09f2aa752dd46dc32e662aaa4642d045da22c7731" + }, + { + "path": "tests/unit/integrations/demo-schema.test.ts", + "bytes": 1527, + "sha256": "eafc7ebccdda7160ca9e4d2119c97a5a801f70462ccd9a186b12c2b6e57f3a05" + }, + { + "path": "tests/unit/integrations/destinations.test.ts", + "bytes": 1211, + "sha256": "5d2c512f707932aa5684c14d93032ca146f9069a5e3472961c237d00f99145e5" + }, + { + "path": "tests/unit/integrations/redaction.test.ts", + "bytes": 742, + "sha256": "d4d5e1f908fd2e433e9a45523d242eff7bad47f43fa400911d31587b47d84e21" + }, + { + "path": "tests/unit/localization.test.ts", + "bytes": 2155, + "sha256": "b2e65d904e9ee8018a837ba0c275287d98b44341b9bca65abdb754c09f897511" + }, + { + "path": "tests/unit/theme.test.ts", + "bytes": 734, + "sha256": "45f25fd23f69af3df199473053c47fe219c88fb36a58cffac20a125bdbd47433" + }, + { + "path": "tests/visual/component-system.visual.spec.ts", + "bytes": 899, + "sha256": "983ee872b9b7a1993ccaafb8c3ea2ee4fb82cf562a5f9e1521de29faa307c8e7" + }, + { + "path": "tests/visual/homepage.visual.spec.ts", + "bytes": 1336, + "sha256": "fe75876ca2073be31b0c5423b5f329dde0ea19fa065bae514bfb4758544de97f" + }, + { + "path": "tests/visual/integrations.visual.spec.ts", + "bytes": 984, + "sha256": "71896bfb083931ab8bf434dd85911cc50c82e854744b871ff31c1f3f4ad650a5" + }, + { + "path": "tests/visual/README.md", + "bytes": 525, + "sha256": "27327d51bda7fc0725a73f6ebb06db1cfa84abd3508985edbb0723da66d18667" + }, + { + "path": "tests/visual/shell.visual.spec.ts", + "bytes": 2273, + "sha256": "07bd6dd398cbab81176ea19741eb8737859bcacaa313a8c17308cd47f736ea5b" + }, + { + "path": "tsconfig.json", + "bytes": 1100, + "sha256": "f1e1e6ec6ae158e72060af04dd664d5ec9389656e8326f99b10a446bc9e31443" + }, + { + "path": "vitest.config.ts", + "bytes": 699, + "sha256": "c2ac8f10ad2894df28a93e3d2bba2c213f24b9a044db25307078648e010dc3d5" + }, + { + "path": "vitest.integration.config.ts", + "bytes": 319, + "sha256": "17e7ff31793ae0e69413c2c6372e02ebe1b8aff77e95a5d1344b9d08e6a2fa4a" + } + ] +} diff --git a/PHASE_16_PACKAGE_MANIFEST_v1.0.json b/PHASE_16_PACKAGE_MANIFEST_v1.0.json new file mode 100644 index 0000000..afa33b5 --- /dev/null +++ b/PHASE_16_PACKAGE_MANIFEST_v1.0.json @@ -0,0 +1,3263 @@ +{ + "schema_version": "1.0", + "project": "RentalDriveGo", + "phase": 16, + "generated_at": "2026-06-25", + "release_status": "Launch aborted before deployment", + "launch_authorization": "Rejected", + "excludes": [ + ".git", + ".next", + "node_modules", + "coverage", + "playwright-report", + "test-results", + "__pycache__", + "PHASE_16_PACKAGE_MANIFEST_v1.0.json", + "package-lock.json", + "tsconfig.tsbuildinfo" + ], + "file_count": 648, + "files": [ + { + "path": ".dockerignore", + "bytes": 116, + "sha256": "f5c4f2a6bb5aee2eab9e3c5f838dba58c97bf62ef432bdc181778cf4a167e78c" + }, + { + "path": ".editorconfig", + "bytes": 188, + "sha256": "a6b98ea7cb6d61ed8d430dd0dffa46c87012b5cf859d4ce7207898954951fdcd" + }, + { + "path": ".env.example", + "bytes": 824, + "sha256": "500309bbe79dc8d3b71aaa3965ea4c0a170c353c7d7ea82ce35508a91aa8e5d1" + }, + { + "path": ".github/dependabot.yml", + "bytes": 416, + "sha256": "0a9bdd1890c8fcb78f61f91071df45fecbdcfbbd48441f7da0dba266ba168d82" + }, + { + "path": ".github/workflows/ci.yml", + "bytes": 1967, + "sha256": "1f539bcae4f26429b959690339a57ad8abd200fed149a2ee786ed6b27f769bb3" + }, + { + "path": ".gitignore", + "bytes": 155, + "sha256": "7a502eb52bc55e5be5e971624211c692f279d7c8d85e1b89a5abc3e2e5c7c9d5" + }, + { + "path": ".node-version", + "bytes": 8, + "sha256": "98182b41c9ce3357797985cf12dc3b0124490ef88bc918a905373e7688e6aec9" + }, + { + "path": ".npmrc", + "bytes": 146, + "sha256": "e696a3cc1b84316377f18da909b079072ce02383d16c8fed410f8cabbb9ac054" + }, + { + "path": ".nvmrc", + "bytes": 8, + "sha256": "98182b41c9ce3357797985cf12dc3b0124490ef88bc918a905373e7688e6aec9" + }, + { + "path": ".prettierignore", + "bytes": 129, + "sha256": "272622f9ebbe7cc23717e19053be7c49a6fc63353cad9be57f107cd96b96a142" + }, + { + "path": "contracts/phase9/09_DEVELOPER_HANDOFF_v1.0.md", + "bytes": 8091, + "sha256": "e82d486f1e566d1bf0263f1baa7dd8035ae62da5c36bb6bfa417e61331ec8d51" + }, + { + "path": "contracts/phase9/annotated/ANNOTATION_INDEX_v1.0.md", + "bytes": 685, + "sha256": "a2e87dfdb138409604cac4cc5f52375cce97940da7363f7778af30490699decd" + }, + { + "path": "contracts/phase9/annotated/demo-dialog-en-light_v1.0.png", + "bytes": 51457, + "sha256": "d91bf102100af48feac31478770f8bfdded994ac8b47f60845e4465c50462394" + }, + { + "path": "contracts/phase9/annotated/desktop-en-light_v1.0.png", + "bytes": 144908, + "sha256": "a4151a788317aa9bf8f7262f09f645ebdb54d4a3e1254ab5703ae37e8d3cec16" + }, + { + "path": "contracts/phase9/annotated/mobile-ar-dark_v1.0.png", + "bytes": 75193, + "sha256": "6adcaf68b48bacbf105b670e71edda078a60aa26b732831bd194e1cb9da11556" + }, + { + "path": "contracts/phase9/annotated/mobile-drawer-ar-dark_v1.0.png", + "bytes": 28321, + "sha256": "bc0c14447fb6e80ce904ffcb13c237b51eaa92723702191139bee59b0f7ebdeb" + }, + { + "path": "contracts/phase9/annotated/SCREEN_ANNOTATIONS_v1.0.csv", + "bytes": 1457, + "sha256": "d7b8120926a545f472b62a436b87d2a9d20320a4d95fcf90aa96162c50e8a6da" + }, + { + "path": "contracts/phase9/annotated/tablet-fr-light_v1.0.png", + "bytes": 102305, + "sha256": "dd526fe6859e470ea4c67b4c1ef511cfe0e11126561f86bcff07e57378084347" + }, + { + "path": "contracts/phase9/annotated/tour-dialog-fr-dark_v1.0.png", + "bytes": 94445, + "sha256": "2dd7b24f6505f16a565ac1b5490499ccdae91d0257de608c97c54b7d5b6c2c78" + }, + { + "path": "contracts/phase9/assets/ASSET_MANIFEST_v1.0.csv", + "bytes": 1049, + "sha256": "dd77547327096b4c4084ec8b9311aaff719e378a91f16c2b3ea39832d1bc7b3a" + }, + { + "path": "contracts/phase9/assets/ASSET_USAGE_RULES_v1.0.md", + "bytes": 747, + "sha256": "46821e8e6588a62eba860e4d228b2910a05aa60124610966bdc524a86921f658" + }, + { + "path": "contracts/phase9/assets/brand-mark_v1.0.svg", + "bytes": 443, + "sha256": "bcb3a3fb8037aec69d92da06f0d60fab969547b979a0112f12e6a5c2ab8efdaa" + }, + { + "path": "contracts/phase9/assets/logo-horizontal_v1.0.svg", + "bytes": 576, + "sha256": "04be1c45e1b6e85586efc6dbd36bf3e1e9275fa138a36b93cf6532bbd7409b02" + }, + { + "path": "contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md", + "bytes": 9800, + "sha256": "84b455fe725bff11b6ab54bb13373b1aa52991b062a36fad07db47a940187a53" + }, + { + "path": "contracts/phase9/components/COMPONENT_STATE_MATRIX_v1.0.csv", + "bytes": 4283, + "sha256": "c85f96f6d5e020a27c2bd44427a2c3aed3f3cad8657d88a22fc2de9ecd3f6cda" + }, + { + "path": "contracts/phase9/components/CONTENT_CONSTRAINTS_v1.0.csv", + "bytes": 1147, + "sha256": "f4d32b7775f856ff4aac775791566427e3cc340f39cd3f9845d8a3271167228b" + }, + { + "path": "contracts/phase9/components/RESPONSIVE_BEHAVIOR_MATRIX_v1.0.csv", + "bytes": 1416, + "sha256": "0e0e262c0388c37e41f5ab7f3e80835b8edb09e00a9264e81d92953743893353" + }, + { + "path": "contracts/phase9/components/RTL_THEME_MATRIX_v1.0.csv", + "bytes": 4048, + "sha256": "b47f4b3b4e50f1fed6b1b69523a05d61952773e95a966288bfba85dd414edb15" + }, + { + "path": "contracts/phase9/DECISION_LOG_v9.0.md", + "bytes": 38775, + "sha256": "85569a7418f8cad57d094ee9ec1d83b7727b5ab91a405cbda26de0271a8d76a1" + }, + { + "path": "contracts/phase9/DEFINITION_OF_DONE_v1.0.md", + "bytes": 3234, + "sha256": "dfe53a550b7853f015901b83adb960ffb26ab08fa6d7f9f8f8a3386adc705179" + }, + { + "path": "contracts/phase9/implementation/component-contracts_v1.0.ts", + "bytes": 2844, + "sha256": "177dd2420b804290cf1296e43f41a7e759c8859b3253073fbdc523a81f6f94c0" + }, + { + "path": "contracts/phase9/implementation/hreflang-generator_v1.0.ts", + "bytes": 751, + "sha256": "ab919a36a5d08a28c38ae51b4ddd0d84cef5d3ec3bed13649ebd26c3fb80ac8a" + }, + { + "path": "contracts/phase9/implementation/localization-config_v1.0.ts", + "bytes": 772, + "sha256": "bd8ca09f121bfe516ece817948a81d58136e9205fbd2c05dad2ce87f2d7a1782" + }, + { + "path": "contracts/phase9/implementation/TECHNOLOGY_PROFILE_v1.0.md", + "bytes": 1953, + "sha256": "a59504c81bdbb6396eb21e68518ca84862ac89c6c65744de710e9ae273e47c7b" + }, + { + "path": "contracts/phase9/implementation/theme-config_v1.0.ts", + "bytes": 725, + "sha256": "f56d37da4129d5830ba9ebd77b18cd6084a144e8514bfd8a8152387ecf76607c" + }, + { + "path": "contracts/phase9/interaction/ANALYTICS_EVENT_SPEC_v1.0.csv", + "bytes": 1713, + "sha256": "1282ebca5b031f6267f8139033db437e30b62ac391d25823c8a4783b64151008" + }, + { + "path": "contracts/phase9/interaction/analytics-contract_v1.0.ts", + "bytes": 832, + "sha256": "2716eb69cc98032005e068ab7bdc265a4c896a8e1a1bed682c7fdd4f45368123" + }, + { + "path": "contracts/phase9/interaction/demo-form-contract_v1.0.ts", + "bytes": 632, + "sha256": "194db77f7cfca417dbe35e6f2c2ea94cdd02806b83b1d0f1993fe509d8c10154" + }, + { + "path": "contracts/phase9/interaction/INTERACTION_NOTES_v1.0.md", + "bytes": 2332, + "sha256": "0456815622cbb072f1a7594e6b47f52e572e2570280c3a618876246e1b43d2a7" + }, + { + "path": "contracts/phase9/interaction/theme-bootstrap_v1.0.js", + "bytes": 753, + "sha256": "7b89a849bdcd72e1049714ebf76f0c0decb39e44261480f0cb08bb7dfe734e4a" + }, + { + "path": "contracts/phase9/localization/locales/ar/homepage.json", + "bytes": 18615, + "sha256": "fe08aabd60203dbdebc718117f5e497b52a453a8a6fb671fe0bca28651bf0d47" + }, + { + "path": "contracts/phase9/localization/locales/en/homepage.json", + "bytes": 13869, + "sha256": "a5ed956c7f07fad016ca39b40b770c25e8beeae2799ff0fece82dbf087f18e51" + }, + { + "path": "contracts/phase9/localization/locales/fr/homepage.json", + "bytes": 15512, + "sha256": "24079356bd47431ffeb66b7eb2981e108c03080205861b1bb42514b03b945a0a" + }, + { + "path": "contracts/phase9/localization/LOCALIZATION_IMPLEMENTATION_v1.0.md", + "bytes": 2062, + "sha256": "87a494d7ef7ed9f5012ed1699edf90e38995aa89a0efc3800db854e1d57e1024" + }, + { + "path": "contracts/phase9/localization/ROUTE_MANIFEST_v1.0.json", + "bytes": 1573, + "sha256": "fa29b8d31da1f36f87d216a1228fd1bbe1cde337636950b40b0024a10efaf49a" + }, + { + "path": "contracts/phase9/localization/TRANSLATION_KEY_INVENTORY_v1.0.csv", + "bytes": 10599, + "sha256": "01289dc9eb94d546ae717b881b2aed4dfc63b38df38e7767054800122bbb46c2" + }, + { + "path": "contracts/phase9/OPEN_ISSUE_REGISTER_v1.0.csv", + "bytes": 3519, + "sha256": "b8778b3dc7d1e47446584cac046d490a9932c3dfdfa03750716f29852694a214" + }, + { + "path": "contracts/phase9/OPEN_QUESTIONS_v1.0.md", + "bytes": 1085, + "sha256": "82a2abd71830fa4023d346f3b42b138de9e1bbdff74a827d770e6b660d89bd0e" + }, + { + "path": "contracts/phase9/PACKAGE_MANIFEST_v1.0.json", + "bytes": 10649, + "sha256": "1a143f086f40f83414460bd4519e86bd3a34617079e3cfef4c5736375460a24e" + }, + { + "path": "contracts/phase9/PHASE_9_HANDOFF_v1.0.md", + "bytes": 939, + "sha256": "90530b4e70d1fd64d5d934429c009431902639c0570e7944cf050e6d67eb73a3" + }, + { + "path": "contracts/phase9/qa/ACCESSIBILITY_CHECKLIST_v1.0.csv", + "bytes": 1498, + "sha256": "0d9c108e0c02b78aaf11badf6b5f5125cac2b03876cfddf82bd2e97230fdd28b" + }, + { + "path": "contracts/phase9/qa/BROWSER_SUPPORT_MATRIX_v1.0.csv", + "bytes": 986, + "sha256": "5ffb43732fea90530b1b088fb68172b9fc7b2c2683198448734a21cf39c234d1" + }, + { + "path": "contracts/phase9/qa/PERFORMANCE_BUDGETS_v1.0.json", + "bytes": 815, + "sha256": "e1679ce45d8a1225c46c085c7533d3230a41279c32d0812de5c5f05cb55eefa8" + }, + { + "path": "contracts/phase9/qa/PLAYWRIGHT_ACCEPTANCE_SPEC_v1.0.md", + "bytes": 800, + "sha256": "b16384a861d06eb76db5a836868d9a6e03cf72a6a896209279330e19a8d1a785" + }, + { + "path": "contracts/phase9/qa/QA_MATRIX_v1.0.csv", + "bytes": 3557, + "sha256": "6b14b92ce20a9d706de7d6d4cf9f0bb450ecceed27673ed62ae01e145d2143f8" + }, + { + "path": "contracts/phase9/qa/test-ids_v1.0.csv", + "bytes": 598, + "sha256": "6201007ae98632654a2684a0b09ce95d85d9870e0f29774687df0a9876048202" + }, + { + "path": "contracts/phase9/qa/validate-phase9-package_v1.0.mjs", + "bytes": 2534, + "sha256": "631892318cf95c0530a605e5bf08def9b06c93af79b555205f3aeb8a2bcd87ed" + }, + { + "path": "contracts/phase9/qa/visual-regression-scenarios_v1.0.json", + "bytes": 1401, + "sha256": "08a04f676cbb93e73b4c6bc112a55ebf287cb97be3dd3176ab80161e6de743c2" + }, + { + "path": "contracts/phase9/README_v1.0.md", + "bytes": 1258, + "sha256": "ef0010b98ba641c4db453d875171a0d1dad4cb17e991ad23698acde8ac4783ae" + }, + { + "path": "contracts/phase9/reference/FINDINGS_REPORT_v1.0.md", + "bytes": 3062, + "sha256": "ba34afd535856d0eaa8ed7e174c23a7b5f0eae87344c8fcee5daafe00c068ce4" + }, + { + "path": "contracts/phase9/reference/PHASE_8_HANDOFF_v1.0.md", + "bytes": 1117, + "sha256": "2e51ed6645fcc99f30cd4aa9da11ac59e5c2e331c384bfbd758739ad6f42c788" + }, + { + "path": "contracts/phase9/reference/PRIORITIZED_REVISIONS_v1.0.csv", + "bytes": 1071, + "sha256": "65b17813756a2d01c8a9df9faa049b170dca197f243b62a44e070d69f8959df5" + }, + { + "path": "contracts/phase9/reference/SUCCESS_METRICS_v1.0.csv", + "bytes": 1552, + "sha256": "e7b734564735ab65dcaf84ab8374ba163472cca48db1257c4c626415a779ecbe" + }, + { + "path": "contracts/phase9/reference/VALIDATION_RESULTS_v1.0.md", + "bytes": 2068, + "sha256": "3cb17f099569e5bdf4bcd731fe7f687d1636f0e82623c205e07df2cdc2b7d2f2" + }, + { + "path": "contracts/phase9/SOURCE_TRACEABILITY_v1.0.csv", + "bytes": 765, + "sha256": "76dc8677ad0d50263301fd5242bc0649c23bb01d3bbd099bdc8a7e2c04fc2d46" + }, + { + "path": "contracts/phase9/tokens/design-tokens_v1.0.json", + "bytes": 3771, + "sha256": "470d7bc9d4a466cce4e51f0fdc21fe199ec5b0d4007f5063704c523ce1b9ef0c" + }, + { + "path": "contracts/phase9/tokens/semantic-tokens_v1.0.css", + "bytes": 3553, + "sha256": "99912762e078bfc78b4878fc46b8c7d03d90c073e9c236942a58d83f6585a1b9" + }, + { + "path": "contracts/phase9/tokens/TOKEN_USAGE_RULES_v1.0.md", + "bytes": 1222, + "sha256": "b9f7d9b0a9c0595e6f6df2a53e0bcf4acfb47a56abfc6c590a6281c15b04a7b2" + }, + { + "path": "contracts/phase9/tokens/tokens_v1.0.ts", + "bytes": 442, + "sha256": "ec265270251f8dd01d9166aeca3fcec9be2b5e534d825c9058fb6ed3f51e3224" + }, + { + "path": "contracts/phase9/validation/CONTENT_AND_STRUCTURE_VALIDATION_v1.0.json", + "bytes": 189, + "sha256": "e055ef15c2de2191a3465d85ed54f4cf6bd9e1cde4d5d2bba787e14873027b73" + }, + { + "path": "contracts/phase9/validation/STATIC_VALIDATION_RESULTS_v1.0.json", + "bytes": 56, + "sha256": "b60367adf55cf4c61b705d11131b7adebc0aae6ff53732c8272ec9cf2bc95dd3" + }, + { + "path": "contracts/phase9/validation/VALIDATION_RESULTS_v1.0.md", + "bytes": 1179, + "sha256": "6f9df81e75d7149d3826ce215143c21784f39b154660fcefc5325ac114ac70b2" + }, + { + "path": "CONTRIBUTING.md", + "bytes": 2052, + "sha256": "abb7059cbb8347456c40a472d980548bb0a50400300fb66d3a42983563725ce8" + }, + { + "path": "Dockerfile", + "bytes": 1033, + "sha256": "5e586fd24911d9635ac45d36b9dcba24a44c8eb161b61df7d931f1103e0d70f2" + }, + { + "path": "docs/architecture/ADR-0001_REPOSITORY_FOUNDATION.md", + "bytes": 8931, + "sha256": "e2933f3ff3bd9c3066027e20049805fbc2e1ce720534998882f110024afba375" + }, + { + "path": "docs/architecture/ADR-0002_PHASE_11_FOUNDATIONS.md", + "bytes": 4154, + "sha256": "2f04e81f0fac6439fd94a4620c8fa88f062ea7c32ae83c0b26a6b488255e651d" + }, + { + "path": "docs/architecture/ADR-0003_PHASE_12_COMPONENT_SYSTEM.md", + "bytes": 1918, + "sha256": "7ba7bed100e43614b5904d6a20161c55ce99460dbf5e35376cd80b02df9a12eb" + }, + { + "path": "docs/BRAND_MIGRATION_v1.0.md", + "bytes": 1322, + "sha256": "b1fb78b8a0c50b629c8f3af36ec841aa2126739008069a80021b18f8219a3d1c" + }, + { + "path": "docs/DECISION_LOG_v12.0.md", + "bytes": 2835, + "sha256": "c69af78a6af60ba743b057c0c8b50691f7d826923d91c204179fc0683487a0af" + }, + { + "path": "docs/DECISION_LOG_v13.0.md", + "bytes": 2411, + "sha256": "4d5747f12e7b1446ff944540d724957e859264ba0c29b95cba84013591478fdc" + }, + { + "path": "docs/DECISION_LOG_v14.0.md", + "bytes": 2001, + "sha256": "b29dc315d9cf857d229183e728d1b44804dfc4b80a3c6cc381a165193c69c5d8" + }, + { + "path": "docs/DECISION_LOG_v15.0.md", + "bytes": 2592, + "sha256": "c59ef94dbf9cee22b762acdb7fbe13ea77b14eba2bb12a15196a50a7d4e38f41" + }, + { + "path": "docs/DECISION_LOG_v16.0.md", + "bytes": 1305, + "sha256": "8ef1f378afdd06f570bd32b0e403d50658bc52be57f046836e86e1e69b725d82" + }, + { + "path": "docs/DEPENDENCY_MANIFEST_v1.0.md", + "bytes": 4109, + "sha256": "0dfdaf10352a56b1468ad35436dd873a16d12171e3ea14eac2268359ec02823a" + }, + { + "path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.0.csv", + "bytes": 5347, + "sha256": "4300820e10088d76f6407ee358a8cc1a3cab89fe6554f658fd770469c8c6c77d" + }, + { + "path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv", + "bytes": 6721, + "sha256": "8569e669ddf280d82ebb68526191315aecb108163cb34e4ad1e32a810888cb93" + }, + { + "path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.2.csv", + "bytes": 8902, + "sha256": "24725fbb71279b0e6bfdfb05a8d48d01ec132b863fb311eb8d012d9b2151f3d1" + }, + { + "path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.3.csv", + "bytes": 10248, + "sha256": "67b3a47100f6404ec1473f4979917b5202169df0b5610f10ff0cb75861b9cc21" + }, + { + "path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.4.csv", + "bytes": 13060, + "sha256": "fea9c6bbe4db7a72b5f58a9dcffd215514915e3eae79941b104e195b1ec42bd2" + }, + { + "path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.5.csv", + "bytes": 15395, + "sha256": "818eda19723bd1aafe4359831d3f9547e4c6fd545d6ae08313c0a6e5e413dc3f" + }, + { + "path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.6.csv", + "bytes": 15595, + "sha256": "dcc8dadbad4e01db34fab08a5a076df466b11e3913ac6ead7a8d4f1f28957bd3" + }, + { + "path": "docs/PHASE_10_HANDOFF_v1.0.md", + "bytes": 3370, + "sha256": "8cf52ee1b49cabbf0678da222413b0186ed982fb0c8cfc805482ca18eb1fefc7" + }, + { + "path": "docs/PHASE_10_IMPLEMENTATION_REPORT_v1.0.md", + "bytes": 6805, + "sha256": "6a2e5da443bf15351a0e88e5c92117c8f7c780509d51f2e44c4a148a26a6d4e2" + }, + { + "path": "docs/PHASE_11_IMPLEMENTATION_REPORT_v1.0.md", + "bytes": 13394, + "sha256": "79c1a01be6d5188db29d0bb4a3d2d30b18a5c25b5fa367c7d878309fb5e4dfbb" + }, + { + "path": "docs/PHASE_12_HANDOFF_v1.0.md", + "bytes": 7671, + "sha256": "04000f05533c3accf2409e7810e95ca3188338e33ddae98914ee30e059a09c25" + }, + { + "path": "docs/PHASE_12_IMPLEMENTATION_REPORT_v1.0.md", + "bytes": 12420, + "sha256": "b52db7413ef0365f9ae917133ac4449bf22a95760b25c8bef2fca4f64f3f6040" + }, + { + "path": "docs/PHASE_13_HANDOFF_v1.0.md", + "bytes": 11204, + "sha256": "f82e319eb0d11c861a7d77c4abdc3bcb48e966cb8cfa610389d7807bbaeedb0a" + }, + { + "path": "docs/PHASE_13_IMPLEMENTATION_REPORT_v1.0.md", + "bytes": 8099, + "sha256": "3a7ba99ebf1f22f433e854adb48529575daf1c357aa3271c10fbec152c91479f" + }, + { + "path": "docs/PHASE_14_IMPLEMENTATION_REPORT_v1.0.md", + "bytes": 14891, + "sha256": "363b05580f70ec38193b56ef194a387860fa6a8e523b85c0d4d2a82e31aecd76" + }, + { + "path": "docs/PHASE_15_HANDOFF_v1.0.md", + "bytes": 8196, + "sha256": "b0317610aca92be814dbcc84cb0cb16244c00ff6988ec1ac19f45868ddbf5f36" + }, + { + "path": "docs/PHASE_15_IMPLEMENTATION_REPORT_v1.0.md", + "bytes": 6822, + "sha256": "b9fa26b635b70eba3e414f553f9def60916535bcc4f2eb9da482231aef28c1d5" + }, + { + "path": "docs/PHASE_16_HANDOFF_v1.0.md", + "bytes": 4583, + "sha256": "de5d8f974eecf517f61a6b7f7c3f394518efa26cd41771cb57305365e20fa83e" + }, + { + "path": "docs/PHASE_16_IMPLEMENTATION_AND_LAUNCH_REPORT_v1.0.md", + "bytes": 5234, + "sha256": "ca6383410950b1f3ce4f7e3fdae3f8601c551886da23e34b3523fafd5778c502" + }, + { + "path": "docs/PHASE_17_OPERATIONS_HANDOFF_v1.0.md", + "bytes": 697, + "sha256": "124c91e5f1cd5f0cf696b47b627bbab8e43a1f1c871a0450e470aa6cd15e37b0" + }, + { + "path": "docs/phase12/ACCESSIBILITY_BEHAVIOR_MATRIX_v1.0.csv", + "bytes": 10934, + "sha256": "bf23d29033b091f0556f7a5c07ffc86e31484d82c6fd01a80ffcc33c5daedb0c" + }, + { + "path": "docs/phase12/BUNDLE_IMPACT_REPORT_v1.0.md", + "bytes": 1704, + "sha256": "795ab11fc56780f57c8bba78821106cd5ea00dd02e9aac63c3ddc8865af7f453" + }, + { + "path": "docs/phase12/COMPONENT_CATALOG_v1.0.md", + "bytes": 26256, + "sha256": "93c3d22539c7489166119a8126712995d81fefade081cd06488f3898fa7d519c" + }, + { + "path": "docs/phase12/COMPONENT_INVENTORY_v1.0.json", + "bytes": 42210, + "sha256": "b64cff5d50f7777e6384e6ca19e49a38430925b4a19a53543d35e4452f42d112" + }, + { + "path": "docs/phase12/COMPONENT_SPECIFICATION_TRACEABILITY_v1.0.csv", + "bytes": 11328, + "sha256": "1d352fd6ce9bc3dae7e135725c1deb2ebd44faf679658e8eeb8622266ee08b58" + }, + { + "path": "docs/phase12/DEFINITION_OF_DONE_STATUS_v1.0.md", + "bytes": 1581, + "sha256": "692e3847c7e120939a2ee16dbadd9e6908decaf7f04fa9187e1063f5337dd016" + }, + { + "path": "docs/phase12/DEPENDENCY_CHANGE_REPORT_v1.0.md", + "bytes": 1273, + "sha256": "7c668afb6d310a56fa94d3b88a20cdde5b0594b7005857c915a27edb40aaba0e" + }, + { + "path": "docs/phase12/RESPONSIVE_VALIDATION_MATRIX_v1.0.csv", + "bytes": 16762, + "sha256": "9542e345b81d123e67b12167afc67b946667729cf35a3ce469756627b5368c4d" + }, + { + "path": "docs/phase12/RTL_BEHAVIOR_MATRIX_UPDATE_v1.0.csv", + "bytes": 17557, + "sha256": "c172ed56ff3513bb986894d6fd5814b05391ffcdc432ba3282005e7b8e7c8953" + }, + { + "path": "docs/phase12/STORY_AND_FIXTURE_INVENTORY_v1.0.csv", + "bytes": 565, + "sha256": "f1b3f012c7319e3eacf5b625ada085856dab9fe4392302cc2eb67d79042b5d64" + }, + { + "path": "docs/phase12/TEST_COVERAGE_REPORT_v1.0.csv", + "bytes": 983, + "sha256": "fa174206dec0855a7a9ce328981132ad2114dca73a8511aba8dfd2e953ac9535" + }, + { + "path": "docs/phase12/VARIANT_INVENTORY_v1.0.csv", + "bytes": 17312, + "sha256": "58b988f565cf4e92175bcbd14b0c242b6785d24b5f695e1c12a2a53cb18d0bd1" + }, + { + "path": "docs/phase13/COMPONENT_VARIANT_UPDATE_v1.0.md", + "bytes": 550, + "sha256": "48c1efca62cca59af1d041b811cd15e3ff123cebff22ac905a3a2ca4fab8164a" + }, + { + "path": "docs/phase13/HOMEPAGE_CONTENT_MODEL_v1.0.md", + "bytes": 2290, + "sha256": "d20dd8d92bdd0e73589cc6907c7863d6e6b023d6716aba69cab88d5b97d019fd" + }, + { + "path": "docs/phase13/HOMEPAGE_SECTION_MATRIX_v1.0.csv", + "bytes": 2239, + "sha256": "4fd5ad3074b5217c735ab0c8c02da5690032b50ae5a432776488104313bb3d95" + }, + { + "path": "docs/phase14/ANALYTICS_EVENT_REGISTRY_v1.0.csv", + "bytes": 1063, + "sha256": "639e73f41589f057773001c15cecadef429460eba96770e89170266673aa06ac" + }, + { + "path": "docs/phase14/COMPONENT_VARIANT_UPDATE_v1.0.md", + "bytes": 576, + "sha256": "57ff3870af656b42bf1863a16f952750b45654e166989c8fe2155f05feb9c386" + }, + { + "path": "docs/phase14/CONSENT_MATRIX_v1.0.csv", + "bytes": 619, + "sha256": "613fa4645ffcd6a1d48e2d0e318dcf53f043f288e1f37e46806a2ac1a2f5c304" + }, + { + "path": "docs/phase14/DATA_FLOW_INVENTORY_v1.0.csv", + "bytes": 2637, + "sha256": "fe8323cbfc1781cdb56002c33260de4835bf2cca2ac4d25191d711be0ad84708" + }, + { + "path": "docs/phase14/DEMO_FORM_CONTRACT_v1.0.md", + "bytes": 1768, + "sha256": "7d94a5747126f42017154dc2e9c3e1943bf52bbea71574ec5ad369be0abccd3e" + }, + { + "path": "docs/phase14/DESTINATION_REGISTRY_v1.0.csv", + "bytes": 1499, + "sha256": "51799df5507584d1100571ee4dd5c7e1c1f8560e80379f731709fd71e267c92d" + }, + { + "path": "docs/phase14/ENVIRONMENT_VARIABLE_INVENTORY_v1.0.csv", + "bytes": 1088, + "sha256": "2481efc9103383a81c8d306bbfb2d95a839790eab6491baed60c62e94e8c0799" + }, + { + "path": "docs/phase14/EXTERNAL_SERVICE_INVENTORY_v1.0.csv", + "bytes": 633, + "sha256": "1cc6b490cb0365b7fa8c13c65cf9508af8f09b37842d7028287f3d26bc143774" + }, + { + "path": "docs/phase14/FEATURE_FLAG_INVENTORY_v1.0.csv", + "bytes": 849, + "sha256": "5f9a7d3e227197d145b31f94bcfba5c5211fe7a60d210a6d229e9530d4e7a62e" + }, + { + "path": "docs/phase14/INTEGRATION_ARCHITECTURE_v1.0.md", + "bytes": 1268, + "sha256": "5efca5219e639c9056296b02a3918508d9e3c5098980f0c3c602ec7c1737425c" + }, + { + "path": "docs/phase14/INTEGRATION_TRACEABILITY_MATRIX_v1.0.csv", + "bytes": 1766, + "sha256": "4ac262459d885d7c9e510fb0fc33680272b4ca274a2a2b42fb9fe8e2306b08bf" + }, + { + "path": "docs/phase14/PERFORMANCE_AND_BUNDLE_REPORT_v1.0.md", + "bytes": 1250, + "sha256": "d8b47d763381291d82f6cbfabe29148405d17f59ab09f51d03b23dc41888b362" + }, + { + "path": "docs/phase14/PRIVACY_REVIEW_REPORT_v1.0.md", + "bytes": 1027, + "sha256": "c00b7412b8bda45b0de26311e2b7660c015836da61c81a6acb4c4d4f6c9fdd1a" + }, + { + "path": "docs/phase14/RELEASE_GATE_MATRIX_v1.0.csv", + "bytes": 1533, + "sha256": "a8bc810d74d344d686f1a62de38f3c3fa73bdeecae6754208098aa868a12ecb6" + }, + { + "path": "docs/phase14/SECURITY_REVIEW_REPORT_v1.0.md", + "bytes": 1716, + "sha256": "0d81f0a8e008741ceb715dc8e316d24efa06c6530afcf4475d3482aa25128d54" + }, + { + "path": "docs/phase14/SUCCESS_FAILURE_STATE_INVENTORY_v1.0.csv", + "bytes": 939, + "sha256": "a24550a1c2b11c627d3747697622626cbb0003c38b697f83a030970a33d0f67c" + }, + { + "path": "docs/phase15/ABUSE_CONTROL_REPORT_v1.0.md", + "bytes": 718, + "sha256": "d56f05fba3ce6670b2fc833f0da3eb6cf7643bb82b61b2fa68f057f211a1ed0e" + }, + { + "path": "docs/phase15/ANALYTICS_VALIDATION_REPORT_v1.0.md", + "bytes": 725, + "sha256": "2e24b9e1dc7ebcc424bff217d308d73f169ceb2fee8a54ecefdb2ab9d94f9bfe" + }, + { + "path": "docs/phase15/AUTOMATED_ACCESSIBILITY_REPORT_v1.0.md", + "bytes": 545, + "sha256": "1647ac95ffc1c8ec3df901dafaf7954166b9bad7fb0c147eb3acfe9020befec2" + }, + { + "path": "docs/phase15/BROWSER_HISTORY_REPORT_v1.0.md", + "bytes": 684, + "sha256": "b33b65266826d986bf90164e3ab01bb80c61049c7679b189968d201e06c0511f" + }, + { + "path": "docs/phase15/BUNDLE_ANALYSIS_REPORT_v1.0.md", + "bytes": 698, + "sha256": "245d4a1f9fd5d91eb1b2941676c9eef390426f27aade7b24e2366951f03e079e" + }, + { + "path": "docs/phase15/CLEAN_ROOM_BASELINE_REPORT_v1.0.md", + "bytes": 939, + "sha256": "61423268ab8f5a75decb112f0cb4a62b7b3b3954bf6a7ca11cf688c569910e4d" + }, + { + "path": "docs/phase15/COMMAND_MATRIX_v1.0.csv", + "bytes": 6523, + "sha256": "eaeaaca0e3b7b74a4768ca6303486eae273e6bad575f5c3b41b61bb8c63e4700" + }, + { + "path": "docs/phase15/CONSENT_VALIDATION_REPORT_v1.0.md", + "bytes": 774, + "sha256": "f1a9eb92eb164532f82000a4655a7310fa9103f9140529cc5f7eb12b74a5c795" + }, + { + "path": "docs/phase15/CONTENT_EVIDENCE_REVIEW_v1.0.md", + "bytes": 794, + "sha256": "e7f1c8350fc3cedec81e089a2b076fab4de740d2bb003171f42ad35d343e04f5" + }, + { + "path": "docs/phase15/CROSS_BROWSER_TEST_REPORT_v1.0.md", + "bytes": 646, + "sha256": "ed06fa73e138f99131882ffbce8340c6b61d727396a38ed37eb40e70526dd539" + }, + { + "path": "docs/phase15/DEFECT_REGISTER_v1.0.csv", + "bytes": 3919, + "sha256": "8906ccb503e5ea62b8d7fa74f60e188d7ffedf61dc866462895d0616cea8f212" + }, + { + "path": "docs/phase15/DEPLOYMENT_REHEARSAL_REPORT_v1.0.md", + "bytes": 646, + "sha256": "3d4c41f057091efb3034ca56fe9f1e3625777e86d7c4168c627c02180dcb9202" + }, + { + "path": "docs/phase15/DESIGN_FIDELITY_REPORT_v1.0.md", + "bytes": 631, + "sha256": "32e63d3665f3fda5095424402e88a98f30816b0c4e82a6ee297150dee6a5be4e" + }, + { + "path": "docs/phase15/DESTINATION_BROKEN_LINK_REPORT_v1.0.md", + "bytes": 781, + "sha256": "ce69dd34db9e9587495b1f82c68173506ddde20410a70458b37f561590fd1289" + }, + { + "path": "docs/phase15/DEVICE_VIEWPORT_REPORT_v1.0.md", + "bytes": 630, + "sha256": "e6e9287808a3279b45782c69f9cf6de5229f80ece51b0ca5fadf7ac800183789" + }, + { + "path": "docs/phase15/END_TO_END_TEST_REPORT_v1.0.md", + "bytes": 692, + "sha256": "d58adbb88000647a6b8a921e1f1902c17c0cda892cbe137d9b5964b68f22d13d" + }, + { + "path": "docs/phase15/FAILURE_SIMULATION_REPORT_v1.0.md", + "bytes": 635, + "sha256": "f2e5cea8b80ad0369c07d31b795885ffa885e6e9360881c1f7ceac758ea093ed" + }, + { + "path": "docs/phase15/FINAL_RELEASE_RECOMMENDATION_v1.0.md", + "bytes": 2743, + "sha256": "08209591849ce8663423e3eb5eef1c5309e80c087c7b8a7dfc8d68bd71a8839b" + }, + { + "path": "docs/phase15/IDEMPOTENCY_DUPLICATE_REPORT_v1.0.md", + "bytes": 744, + "sha256": "ed5478b42914d736866b4e4916337f698a5fb309455868f1f958d01d0f5415fc" + }, + { + "path": "docs/phase15/IMAGE_FONT_PERFORMANCE_REPORT_v1.0.md", + "bytes": 770, + "sha256": "b28fb2b989f8a3457ae5c48433fbb3f27337d24fea00db8be451b52f461f1e45" + }, + { + "path": "docs/phase15/INTEGRATION_TEST_REPORT_v1.0.md", + "bytes": 858, + "sha256": "c51b4629b42f4175840f822717153fff72f311b53c638de3227761afb51e8bbb" + }, + { + "path": "docs/phase15/KEYBOARD_ACCESSIBILITY_REPORT_v1.0.md", + "bytes": 602, + "sha256": "fd7dcca8715f727326e5a7fdd49532f95c58ef092a2374def637717ee6755504" + }, + { + "path": "docs/phase15/LOCALIZATION_QA_REPORT_v1.0.md", + "bytes": 712, + "sha256": "93f20fe6b0f5a064c5a3a0f9f7b2e8483f30feafb06bdf789a0e0b73c3761deb" + }, + { + "path": "docs/phase15/MANUAL_TEST_MATRIX_v1.0.csv", + "bytes": 1196, + "sha256": "d953be08010beb84b68e701b534a7c91cbe550cb73c29cc5aeb86ac9c523ca4b" + }, + { + "path": "docs/phase15/OBSERVABILITY_VALIDATION_REPORT_v1.0.md", + "bytes": 610, + "sha256": "5c42216a452694bfc6b1ef015a6fc4ff6ea9da261810f64212e676dd40a60c50" + }, + { + "path": "docs/phase15/PERFORMANCE_REPORT_v1.0.md", + "bytes": 753, + "sha256": "aa6d44c92788e5f81910ad04609e81bec6d3afa2ef689eb335b30fa25d94bde4" + }, + { + "path": "docs/phase15/PRIVACY_VALIDATION_REPORT_v1.0.md", + "bytes": 789, + "sha256": "8e04998010b052f041f88639fc695df4f3f31576feb248bbbe0604e066fb25bc" + }, + { + "path": "docs/phase15/RELEASE_GATE_MATRIX_v1.0.csv", + "bytes": 3258, + "sha256": "9d7254919043b08c3e3e60574bc8825817d4e6ec08f48a97e8194fa020b5571e" + }, + { + "path": "docs/phase15/REPOSITORY_INTEGRITY_AUDIT_v1.0.md", + "bytes": 850, + "sha256": "f88c5d2aac92dc1d1c569d5f69b1fbab4e9d170ff1fbdacdd9ad29dda0b6deb5" + }, + { + "path": "docs/phase15/RETEST_REPORT_v1.0.md", + "bytes": 738, + "sha256": "dff702ec540e9046da64800f168ca818b2de2c638a85c684c42dc2097cf8193a" + }, + { + "path": "docs/phase15/RISK_ACCEPTANCE_REGISTER_v1.0.csv", + "bytes": 98, + "sha256": "51359ece589175db561b8e857c14ed1ee36594d2921b7f1e37d7981d5d544d8d" + }, + { + "path": "docs/phase15/RISK_ACCEPTANCE_SUMMARY_v1.0.md", + "bytes": 149, + "sha256": "fa52be6a049910986cc528696d96067ac2784c7641dd19c1665c67cd431f6439" + }, + { + "path": "docs/phase15/ROLLBACK_REHEARSAL_REPORT_v1.0.md", + "bytes": 601, + "sha256": "3af1fbd033a14f2a2a36d9eb334fd447396c631f8cf92de69a12944ee464e2dd" + }, + { + "path": "docs/phase15/RTL_QA_REPORT_v1.0.md", + "bytes": 736, + "sha256": "26b4a61e973451e319dd50658bd1a7234f264b3abd701a2107ede1a64a425a09" + }, + { + "path": "docs/phase15/SCREEN_READER_REPORT_v1.0.md", + "bytes": 658, + "sha256": "59e983f4e89a449bf982a53753f59d77f941800ca4a4303c6ae111ed0f0f80c1" + }, + { + "path": "docs/phase15/SECURITY_VALIDATION_REPORT_v1.0.md", + "bytes": 943, + "sha256": "3653103c7eb52420143056f8ba40c86023fd742b39a52177c9cbc0ce414a3309" + }, + { + "path": "docs/phase15/SEO_METADATA_REVIEW_v1.0.md", + "bytes": 675, + "sha256": "e7a475200c09a016e6500c7417a0fb9d713899aace20b2814e0e134f2d76dd0a" + }, + { + "path": "docs/phase15/STATIC_ANALYSIS_REPORT_v1.0.md", + "bytes": 961, + "sha256": "13a392beacefd2fe814e3eb91504d2d27b19c029ff48169cd43f5f0d8ab2c385" + }, + { + "path": "docs/phase15/THEME_QA_REPORT_v1.0.md", + "bytes": 662, + "sha256": "031e26a400ae401cf92956913e5a5125d2e3db35532d8c03eff1ae480941b292" + }, + { + "path": "docs/phase15/UNIT_TEST_REPORT_v1.0.md", + "bytes": 781, + "sha256": "080982bbf26c06c7bee39bcbac2bd7abee7f543e3d4a7441b29cf3a5cdf033e1" + }, + { + "path": "docs/phase15/VISUAL_REGRESSION_REPORT_v1.0.md", + "bytes": 674, + "sha256": "fe2d467b20c387f879023db4e806a1a31072bca546741b7a3e540011e04a7086" + }, + { + "path": "docs/phase15/WCAG_2_2_AA_EVIDENCE_MATRIX_v1.0.csv", + "bytes": 5049, + "sha256": "26b7a86b005dc3014da833a27eec5b0bda0135cd5c4942a55714162ff4c7569f" + }, + { + "path": "docs/phase15/ZOOM_REFLOW_REPORT_v1.0.md", + "bytes": 652, + "sha256": "2e4d188a04af2d50d8804bcb6b702691e9e06b6de98607d3a455fd480b19a7de" + }, + { + "path": "docs/phase16/ACCESSIBILITY_APPROVAL_RECORD_v1.0.csv", + "bytes": 397, + "sha256": "bce9865f1102075aaeaec269f39d257650af9898f2c6d84e11bbfa43dc7a565b" + }, + { + "path": "docs/phase16/ANALYTICS_APPROVAL_RECORD_v1.0.csv", + "bytes": 415, + "sha256": "de7dfa33f5cfc0b56cc553f4f377236029e5396e605b8128a06b2095b7eed7b8" + }, + { + "path": "docs/phase16/ARABIC_APPROVAL_RECORD_v1.0.csv", + "bytes": 405, + "sha256": "517ba7ff7c1664dca162d349fda9d0f96bdda20e0914058d7065ca532974062e" + }, + { + "path": "docs/phase16/ASSET_APPROVAL_RECORD_v1.0.csv", + "bytes": 402, + "sha256": "cc6bd9c48b74004d0d031c8167ae4ef17932bea4ec54708994559b593f585503" + }, + { + "path": "docs/phase16/CDN_CACHING_VALIDATION_REPORT_v1.0.md", + "bytes": 351, + "sha256": "397ff140db33af7e5d2e446222087a1d6c6dd5f45b8c354a5cef5974da424ed1" + }, + { + "path": "docs/phase16/COMMAND_AND_PLATFORM_ACTION_MATRIX_v1.0.csv", + "bytes": 13744, + "sha256": "45cc83c5652ca80157182747061aca769867d693b28e09662406679bdcfcf652" + }, + { + "path": "docs/phase16/COMPLETE_LAUNCH_RECORD_v1.0.md", + "bytes": 1072, + "sha256": "f48d2357a21895eaa2f292da75232fb93ae0dc4b80940108e67464aef62836f8" + }, + { + "path": "docs/phase16/CONSENT_APPROVAL_RECORD_v1.0.csv", + "bytes": 405, + "sha256": "dc241bc38697c95982380377c6c4948752a7f2204e6e9d4a0b3c1b6fac107278" + }, + { + "path": "docs/phase16/CONTROLLED_LIVE_SUBMISSION_REPORT_v1.0.md", + "bytes": 313, + "sha256": "54616709d0dce4964afd4e77fdd1991ad866c012471e44ba995fb0927bf6f0eb" + }, + { + "path": "docs/phase16/CRM_OPERATIONAL_APPROVAL_v1.0.csv", + "bytes": 431, + "sha256": "f123ec64c4c7a2fab31b5de088a7e2a3d8ff43a94574cb211b97076894aa75ce" + }, + { + "path": "docs/phase16/CUSTOMER_EVIDENCE_APPROVAL_RECORD_v1.0.csv", + "bytes": 421, + "sha256": "36c96223ba00e7d1df25f5c92cde4b414b4d988fcd6efe32a532e605344df2a1" + }, + { + "path": "docs/phase16/DEFERRED_WORK_REGISTER_v1.0.csv", + "bytes": 23162, + "sha256": "7b2d0b5fb45c1f4bbc25c3cc0882b74b8d5b5ba9db3188614407ca2c611b404a" + }, + { + "path": "docs/phase16/DEPLOYMENT_LOG_v1.0.csv", + "bytes": 621, + "sha256": "0e37f126319a62bb73149c955b11de173d9f28b9f141be2f039f4b9c2d1bc81e" + }, + { + "path": "docs/phase16/DNS_CUTOVER_LOG_v1.0.csv", + "bytes": 222, + "sha256": "7dfec19776712474bcd441869a6dd6b3ebe8763970c7f32652c325e7b2b7536a" + }, + { + "path": "docs/phase16/DOMAIN_DNS_PLAN_v1.0.md", + "bytes": 321, + "sha256": "2612ba44f16485bba0cc3fea2598d88ae1fa1f609316261b8e29480e19197f63" + }, + { + "path": "docs/phase16/EMAIL_SENDER_DOMAIN_READINESS_REPORT_v1.0.md", + "bytes": 374, + "sha256": "169405db2fb1bbe3707f9113f630a91a80110e3c942a25a8aea7a8cc9855ce2b" + }, + { + "path": "docs/phase16/FEATURE_FLAG_RELEASE_STATE_v1.0.csv", + "bytes": 1837, + "sha256": "d85fa8439f6d0e26a888f913279dc3a54dce5c155b62ba007b1cb04af31b0bbe" + }, + { + "path": "docs/phase16/FINAL_ACCEPTED_EXCEPTION_REGISTER_v1.0.csv", + "bytes": 252, + "sha256": "b8de83f3e7ff927d5ce840c89d232445e13940a9fc03cf7ff88ea9df88573998" + }, + { + "path": "docs/phase16/FINAL_CLAIM_EVIDENCE_APPROVAL_RECORD_v1.0.csv", + "bytes": 427, + "sha256": "18877ed17b7d51c37c8e98ede5df2b28ca8f6dbfdb6404ccf15f1641ad486c06" + }, + { + "path": "docs/phase16/FINAL_CONTENT_APPROVAL_RECORD_v1.0.csv", + "bytes": 418, + "sha256": "6507c33dd10183f44ad9db6888ed53d67b0903fb5e41e4ff1e119275a23c7b56" + }, + { + "path": "docs/phase16/FINAL_DEFECT_DISPOSITION_REPORT_v1.0.csv", + "bytes": 1010, + "sha256": "6f6586bc44154ef0b2e70221ae6b28d99de5241f2570fa1e0de2aff1fb5fbd39" + }, + { + "path": "docs/phase16/FINAL_DEFECT_DISPOSITION_REPORT_v1.0.md", + "bytes": 518, + "sha256": "b54f9165250b83992afb3d78406dc672f9db063da23a1665c8e3e27d2b3a0955" + }, + { + "path": "docs/phase16/FINAL_LAUNCH_STATUS_v1.0.md", + "bytes": 847, + "sha256": "8ae62e097a55eadcf85982bad5ecc23d51cf32305fbc8ff60bcec3af8f018861" + }, + { + "path": "docs/phase16/FINAL_POST_DEPLOYMENT_SMOKE_TEST_REPORT_v1.0.md", + "bytes": 294, + "sha256": "5b0a7057d28a638749625c81e0d65378dc1e6c20818e404fb7d4fd3fa733ae69" + }, + { + "path": "docs/phase16/FINAL_RELEASE_GATE_MATRIX_v1.0.csv", + "bytes": 9322, + "sha256": "31ab3cfe93704294cca16c6a0e66f137c8665b0c76aab36b7936c583d5ee1e74" + }, + { + "path": "docs/phase16/FRENCH_APPROVAL_RECORD_v1.0.csv", + "bytes": 395, + "sha256": "1bc24c176e3f156d95ea70ed68eda0437c7f7e62a4b0d82277ba2bb3ec31b4c4" + }, + { + "path": "docs/phase16/FROZEN_RELEASE_CANDIDATE_RECORD_v1.0.md", + "bytes": 871, + "sha256": "45f628e26b86c8a472835c9d981541b55ac7be431cd0789491fedc1eb2da7abc" + }, + { + "path": "docs/phase16/HOTFIX_RECORD_v1.0.csv", + "bytes": 191, + "sha256": "126c9406df9030f10b5c4d98b4fe9933aa7b3664dc7f547cec96ff6ae0e86b96" + }, + { + "path": "docs/phase16/INCIDENT_RESPONSE_PLAN_v1.0.md", + "bytes": 404, + "sha256": "e0560218a74ce6c2a8977cec9bf85c693cbad9399e310267c2c0e814bd29d065" + }, + { + "path": "docs/phase16/LAUNCH_AUTHORIZATION_RECORD_v1.0.md", + "bytes": 1043, + "sha256": "7de8472b306d4f786f7e21bc26a7361cd613354b55ec43d6ae7c605c683843f3" + }, + { + "path": "docs/phase16/LAUNCH_MONITORING_REPORT_v1.0.md", + "bytes": 398, + "sha256": "63d03421638053ce31faacb54afd6e8ca6b783f36566b53aaac077cd1d84096a" + }, + { + "path": "docs/phase16/LAUNCH_OWNER_MATRIX_v1.0.csv", + "bytes": 1405, + "sha256": "0bed1fe39b2e72e0ec992362938899eaa6fbffd4a6fb48453f8907dd87767753" + }, + { + "path": "docs/phase16/LEGAL_APPROVAL_RECORD_v1.0.csv", + "bytes": 388, + "sha256": "8835202d8a64d0cbfe6d12074fcb11b9c60f2fdd6af3c16425e7e2cac64b6799" + }, + { + "path": "docs/phase16/LIVE_ACCESSIBILITY_SPOT_CHECK_REPORT_v1.0.md", + "bytes": 430, + "sha256": "6c45f528084314381288975e4681758416afa2951582f4994a704224ce63e2b8" + }, + { + "path": "docs/phase16/LIVE_ANALYTICS_VALIDATION_REPORT_v1.0.md", + "bytes": 364, + "sha256": "34dea95beb705896a0da47c26aa4f14c708450a8aabfab0e47432607621b5921" + }, + { + "path": "docs/phase16/LIVE_CONSENT_VALIDATION_REPORT_v1.0.md", + "bytes": 329, + "sha256": "eda0bf07de44e456c413ab4ce5ac266c0ec59c790b4829e56dc1e0c7e616e54a" + }, + { + "path": "docs/phase16/LIVE_CRM_SCHEDULER_VALIDATION_REPORT_v1.0.md", + "bytes": 355, + "sha256": "8f44ba35295e261bcbdf434c1661b08b161ed36e9aa3fbe79fd281eccb801902" + }, + { + "path": "docs/phase16/LIVE_LOCALIZATION_RTL_REPORT_v1.0.md", + "bytes": 377, + "sha256": "b17c9af6f7741d99401734501a193785f579387de5f3293cdc3c8c9431a40b14" + }, + { + "path": "docs/phase16/LIVE_PERFORMANCE_REPORT_v1.0.md", + "bytes": 367, + "sha256": "8e5d61000d2308a5444342152a792fed39af3ef663348c5406522ca610ed4479" + }, + { + "path": "docs/phase16/LIVE_PRIVACY_REPORT_v1.0.md", + "bytes": 379, + "sha256": "c2262ed5e2f080fef798c6237dbf9ab1dd4fdb5a68a6693bca739998edb0890c" + }, + { + "path": "docs/phase16/LIVE_SECURITY_REPORT_v1.0.md", + "bytes": 364, + "sha256": "0a8fdadbdddee0f022e64621508dfe253ced503d009f4b55b92579f0b81d16f7" + }, + { + "path": "docs/phase16/LOCALIZATION_APPROVAL_RECORD_v1.0.csv", + "bytes": 414, + "sha256": "e8f5d0d9b73e0e397d6a2c4c74b0bee74af1f6f1498a4762102f0d907130328e" + }, + { + "path": "docs/phase16/OBSERVABILITY_CONFIGURATION_REPORT_v1.0.md", + "bytes": 409, + "sha256": "c1e9d75f7791be0506852cc62d24a92e8bb4cb3a71e1d5467dc72e146d454129" + }, + { + "path": "docs/phase16/OPERATIONAL_HANDOFF_v1.0.md", + "bytes": 375, + "sha256": "bee491dd1481cb30a99b3098e5d2168b4bf5405ed717fcbefb180202e0298c8f" + }, + { + "path": "docs/phase16/PHASE_15_RECOMMENDATION_REVIEW_v1.0.md", + "bytes": 1407, + "sha256": "b975b02e63ac839fef690ea19678fd6fd721711ca86fbf28a1b165b97213783b" + }, + { + "path": "docs/phase16/POST_LAUNCH_CONTENT_EVIDENCE_VERIFICATION_v1.0.md", + "bytes": 323, + "sha256": "8557ef9b4fd9292dbc45d3429b28705b620741ad23f47c9811f191b9f9485684" + }, + { + "path": "docs/phase16/POST_LAUNCH_SEO_REPORT_v1.0.md", + "bytes": 271, + "sha256": "5628e99dac4d3365104ad8aaa8988d0ba40a404979cf203a3c7738a614da203e" + }, + { + "path": "docs/phase16/PRELAUNCH_PRODUCTION_VALIDATION_REPORT_v1.0.md", + "bytes": 406, + "sha256": "25c710f1c289169ba111e76378ed640a6ec6ed869a25014fed2794f5efb1c824" + }, + { + "path": "docs/phase16/PRIVACY_APPROVAL_RECORD_v1.0.csv", + "bytes": 407, + "sha256": "05cac982c6b1afcb168202fe6d323c045fa4f98e9a4907b1d2a67c7b3241d12d" + }, + { + "path": "docs/phase16/PRODUCTION_ENVIRONMENT_VARIABLE_INVENTORY_v1.0.csv", + "bytes": 2808, + "sha256": "6486ae0afb85292ecf87bbedf5c42f172c8894638afd9d0c8eb028861e31c849" + }, + { + "path": "docs/phase16/PRODUCTION_INFRASTRUCTURE_INVENTORY_v1.0.csv", + "bytes": 3894, + "sha256": "ed30c862ed27de7d0ef5f2c85499a032364fa0425834cd2d71a718dc94aff796" + }, + { + "path": "docs/phase16/PRODUCTION_SMOKE_TEST_REPORT_v1.0.csv", + "bytes": 3550, + "sha256": "4eab02d26c7176d05004f07038023af2c0f57f5eab0342dc196cc9b026fe25d9" + }, + { + "path": "docs/phase16/ROLLBACK_DECISION_RECORD_v1.0.md", + "bytes": 208, + "sha256": "334a6144aaed85c7670eeca68bcda953946bd9cdbdc3ce29a90064051e384fb5" + }, + { + "path": "docs/phase16/ROLLBACK_PLAN_v1.0.md", + "bytes": 393, + "sha256": "186ed9049a3076cc62492209a84f2d423cbbf389395e91fadb56d232ebfc412f" + }, + { + "path": "docs/phase16/SCHEDULER_OPERATIONAL_APPROVAL_v1.0.csv", + "bytes": 437, + "sha256": "666d694dac2b64fead253c3ddf529ed20d6a0aa913a0ba302368a6b7d227f60a" + }, + { + "path": "docs/phase16/SEARCH_ENGINE_CONFIGURATION_REPORT_v1.0.md", + "bytes": 409, + "sha256": "a126e4ba6ab08d66bd92f9a202cf34e616fdb65edffb99daea30f64ae2fb5d26" + }, + { + "path": "docs/phase16/SECRET_PROVISIONING_RECORD_v1.0.csv", + "bytes": 2666, + "sha256": "55614243bfa05729ddde24eefa8d90d6f3570daf4667c13c8d866cd96f63d9ac" + }, + { + "path": "docs/phase16/SECURITY_APPROVAL_RECORD_v1.0.csv", + "bytes": 409, + "sha256": "e4eeaa5d31b60adc55ec5b977b2d3478b48deccb4ed3ea7a5b56b6c26cb1ccda" + }, + { + "path": "docs/phase16/SECURITY_HEADER_VALIDATION_REPORT_v1.0.md", + "bytes": 388, + "sha256": "88926a315e9831c5a0ac75f4d87fe7547b7d77e107cb6428478e047fe11deaf9" + }, + { + "path": "docs/phase16/TARGETED_REGRESSION_REPORT_v1.0.md", + "bytes": 979, + "sha256": "d9158e65a35195b06a7b2863154c08a1887e29e7eb80b7be8ad14717cc7367ff" + }, + { + "path": "docs/phase16/TLS_VALIDATION_REPORT_v1.0.md", + "bytes": 349, + "sha256": "bb372bf8bd0de45ef155e6a2c08bb1d830e59e1cf286a6c167abb154d148c091" + }, + { + "path": "docs/quality/logs/build-initial.log", + "bytes": 719, + "sha256": "9245b913520a4477ec638d0cdce23f2079c575bdc4a989d0fe68b9d437a5e3b3" + }, + { + "path": "docs/quality/logs/build-missing-site-origin.exit", + "bytes": 2, + "sha256": "4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865" + }, + { + "path": "docs/quality/logs/build-missing-site-origin.log", + "bytes": 922, + "sha256": "b2bff4cccbc95305d2f9304982446920ca76ecfbb6addc9fbff2d95a1538c1f5" + }, + { + "path": "docs/quality/logs/build.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/build.log", + "bytes": 719, + "sha256": "dd0cee291d02930e6ba19eb4a24ab40d03111c67c2b0dadddcf9de6b07caaa7c" + }, + { + "path": "docs/quality/logs/file-diff-summary.log", + "bytes": 5005, + "sha256": "fbcbd30011449146fddd37ee1436880cb0847febaadacccfcfbc18fc707a957f" + }, + { + "path": "docs/quality/logs/format-check.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/format-check.log", + "bytes": 128, + "sha256": "35faa5623e1ca69a144301db1bcd12a99642c93e392c00f27f0e373494758bdc" + }, + { + "path": "docs/quality/logs/format-write.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/format-write.log", + "bytes": 13943, + "sha256": "98740297fc6e5972e6da3d76ac01cdfccc56b5babdbc4ffa74ca96b2584128c7" + }, + { + "path": "docs/quality/logs/lint.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/lint.log", + "bytes": 61, + "sha256": "60d1821dc1b8a730153d1b48f9c84e86346955bb7638b724d0d3c321faa5c3f1" + }, + { + "path": "docs/quality/logs/next-typegen.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/next-typegen.log", + "bytes": 59, + "sha256": "adba4af9194e10e47dda75ff0fd0f8c2b756474896d0eba5612799c527ff372a" + }, + { + "path": "docs/quality/logs/npm-install-fallback.log", + "bytes": 284, + "sha256": "e19919345ade861c8cd863d631f57f11c3453e7cc7385a09af24f268875eabd7" + }, + { + "path": "docs/quality/logs/phase14/a11y-integration-chromium.log", + "bytes": 6088, + "sha256": "c5d3866f9168ef7f664ed70c52bd437c692fc1bfac431da077b8af78cf51cde4" + }, + { + "path": "docs/quality/logs/phase14/browser-integration-chromium.log", + "bytes": 10278, + "sha256": "41558b0435514b2e59f2604440eca09809b1338c8bf4474bbe3dc53c665ace60" + }, + { + "path": "docs/quality/logs/phase14/bundle-inventory.log", + "bytes": 3202, + "sha256": "b06b6fe93eab76f94a50d95a6f098763726ffbeeeb8bdcd1b50318b32fbf0d2d" + }, + { + "path": "docs/quality/logs/phase14/dependency-audit.log", + "bytes": 56, + "sha256": "671f3c588b8c2f48975e845e6a3c9593e392fedf123507fcfe411357c1204cde" + }, + { + "path": "docs/quality/logs/phase14/format-check-initial.duration", + "bytes": 2, + "sha256": "7de1555df0c2700329e815b93b32c571c3ea54dc967b89e81ab73b9972b72d1d" + }, + { + "path": "docs/quality/logs/phase14/format-check-initial.exit", + "bytes": 2, + "sha256": "4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865" + }, + { + "path": "docs/quality/logs/phase14/format-check-initial.log", + "bytes": 1215, + "sha256": "7e7a75fa5b8966231ea888b26f904fc63c605a92460e694a353ab2bffc52c261" + }, + { + "path": "docs/quality/logs/phase14/format-check.duration", + "bytes": 2, + "sha256": "1121cfccd5913f0a63fec40a6ffd44ea64f9dc135c66634ba001d10bcf4302a2" + }, + { + "path": "docs/quality/logs/phase14/format-check.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/phase14/format-check.log", + "bytes": 141, + "sha256": "63ba8cad5e9cfee6c4106223b6e0ed5d37d600af8ebbc92b2da4db755c20eb8e" + }, + { + "path": "docs/quality/logs/phase14/format-write.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/phase14/format-write.log", + "bytes": 17257, + "sha256": "e991154d666ec7f969debed34a4a8afc0d68cdabd6d70c14c23d2e729122b53f" + }, + { + "path": "docs/quality/logs/phase14/integration-tests.log", + "bytes": 651, + "sha256": "be8eb369f59c1f2698cb6fec93ce5983b4af54bb8a188072e6a23cabec132d38" + }, + { + "path": "docs/quality/logs/phase14/lint-initial.duration", + "bytes": 3, + "sha256": "25d4f2a86deb5e2574bb3210b67bb24fcc4afb19f93a7b65a057daa874a9d18e" + }, + { + "path": "docs/quality/logs/phase14/lint-initial.exit", + "bytes": 2, + "sha256": "4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865" + }, + { + "path": "docs/quality/logs/phase14/lint-initial.log", + "bytes": 327, + "sha256": "c78f7d3a439eea74037d8e882f14039adfeed525d3e51a4763adbc5529088ce1" + }, + { + "path": "docs/quality/logs/phase14/lint.duration", + "bytes": 3, + "sha256": "917df3320d778ddbaa5c5c7742bc4046bf803c36ed2b050f30844ed206783469" + }, + { + "path": "docs/quality/logs/phase14/lint.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/phase14/lint.log", + "bytes": 115, + "sha256": "5b4488f3b77f0c99ccd64a52f0a4ba6a633534c858d4663225b5f9fd1bdf2396" + }, + { + "path": "docs/quality/logs/phase14/next-typegen.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/phase14/next-typegen.log", + "bytes": 59, + "sha256": "adba4af9194e10e47dda75ff0fd0f8c2b756474896d0eba5612799c527ff372a" + }, + { + "path": "docs/quality/logs/phase14/npm-install-baseline.exit", + "bytes": 2, + "sha256": "4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865" + }, + { + "path": "docs/quality/logs/phase14/npm-install-baseline.log", + "bytes": 472, + "sha256": "2972385383929897c4b8f9635af2e49523d6fb29bb98cc2c04400f865ba1ef59" + }, + { + "path": "docs/quality/logs/phase14/npm-install-fallback.log", + "bytes": 423, + "sha256": "02a978f37de6fbdd4c3a16d42f6ce0600783a5a666e8036b722ddde3d8d2cc36" + }, + { + "path": "docs/quality/logs/phase14/npm-install-offline.duration", + "bytes": 3, + "sha256": "e6c21e8d260fe71882debdb339d2402a2ca7648529bc2303f48649bce0380017" + }, + { + "path": "docs/quality/logs/phase14/npm-install-offline.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/phase14/npm-install-offline.log", + "bytes": 284, + "sha256": "9e8c404f98cc8bee09bce52131993443004ab883b7d99dee99f261da73971244" + }, + { + "path": "docs/quality/logs/phase14/phase14-environment.log", + "bytes": 265, + "sha256": "ce4e16395260d1d1f404d84bcc2b631de619495c1697ea34d9a79e44e4403ef3" + }, + { + "path": "docs/quality/logs/phase14/phase14-integrations.log", + "bytes": 271, + "sha256": "bb9ee4f2c7a7c2584d31c06908182d9ca722f50ec6a7751dc3af159ba3a592a3" + }, + { + "path": "docs/quality/logs/phase14/phase14-privacy.log", + "bytes": 248, + "sha256": "2f6ec738b614507be789b34557c41a22c4022a35f756546e84578109c6658295" + }, + { + "path": "docs/quality/logs/phase14/phase14-security.log", + "bytes": 262, + "sha256": "acb5634a18ea0e56de831b4ee233daf1634dcfeb6bfcfbc395c31eb60205791d" + }, + { + "path": "docs/quality/logs/phase14/playwright-inventory.log", + "bytes": 45412, + "sha256": "7ae624b1c71accb381a0f91a9a1a5310c3c83d4d2be440efac356116d6d07c7d" + }, + { + "path": "docs/quality/logs/phase14/production-build.log", + "bytes": 919, + "sha256": "f72141f9619f96be5503047134cf700adb192c25cc34f445d852072cf81070dc" + }, + { + "path": "docs/quality/logs/phase14/secret-scan.log", + "bytes": 172, + "sha256": "4f0c1a646295f4c6fd2003d60e4241d9f462fe95c6a2025133f64ddaa922916b" + }, + { + "path": "docs/quality/logs/phase14/static-validations.duration", + "bytes": 2, + "sha256": "53c234e5e8472b6ac51c1ae1cab3fe06fad053beb8ebfd8977b010655bfdd3c3" + }, + { + "path": "docs/quality/logs/phase14/static-validations.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/phase14/static-validations.log", + "bytes": 1533, + "sha256": "99c1db43e72c7ec11e2056412e319595df16220d637069c9d72a64036325bf97" + }, + { + "path": "docs/quality/logs/phase14/typecheck-initial.duration", + "bytes": 2, + "sha256": "aa67a169b0bba217aa0aa88a65346920c84c42447c36ba5f7ea65f422c1fe5d8" + }, + { + "path": "docs/quality/logs/phase14/typecheck-initial.exit", + "bytes": 2, + "sha256": "53c234e5e8472b6ac51c1ae1cab3fe06fad053beb8ebfd8977b010655bfdd3c3" + }, + { + "path": "docs/quality/logs/phase14/typecheck-initial.log", + "bytes": 8524, + "sha256": "b976ddc01db0f215ddb114b34ee6748cee50746f556cee837ecd9a9bf8a62b82" + }, + { + "path": "docs/quality/logs/phase14/typecheck.duration", + "bytes": 2, + "sha256": "aa67a169b0bba217aa0aa88a65346920c84c42447c36ba5f7ea65f422c1fe5d8" + }, + { + "path": "docs/quality/logs/phase14/typecheck.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/phase14/typecheck.log", + "bytes": 260, + "sha256": "e25348d1ac1da31577e9836d0db995eadd0dea27b6c9ef0541a26a68c760bbde" + }, + { + "path": "docs/quality/logs/phase14/unit-initial.log", + "bytes": 151, + "sha256": "b17128dc00e8a6ad9608f7b73dea5bc825eff545e04a759bccc5511f356680f0" + }, + { + "path": "docs/quality/logs/phase14/unit-tests-coverage.log", + "bytes": 2912, + "sha256": "0f3d2db357cdb4c1139f382da63657e16ad674b3ae283952af3b357dc5e2a81a" + }, + { + "path": "docs/quality/logs/phase14/unit.log", + "bytes": 151, + "sha256": "b17128dc00e8a6ad9608f7b73dea5bc825eff545e04a759bccc5511f356680f0" + }, + { + "path": "docs/quality/logs/phase14/visual-integration-chromium.log", + "bytes": 10885, + "sha256": "b7a8527c636146b8be469688b61d9505dd186be03ad1d1e87243f79d52169782" + }, + { + "path": "docs/quality/logs/playwright-browser-a11y.log", + "bytes": 61590, + "sha256": "18073dbbf92df28ad060b108985fe0e16e7e6c8ae67ff73bc041cd6024ba6339" + }, + { + "path": "docs/quality/logs/playwright-test-inventory.log", + "bytes": 4605, + "sha256": "e06d4c78a08d0f2cc4b7f329be06904d90d35aa1352b61d593725293649e8d02" + }, + { + "path": "docs/quality/logs/pnpm-audit.log", + "bytes": 367, + "sha256": "c9ca5f084a99651b415d489941280a105a13c553bb38b7f8764a6dd77ecd931b" + }, + { + "path": "docs/quality/logs/pnpm-install-frozen.log", + "bytes": 3204, + "sha256": "5a074969195194b6acad18870ebc51784b1b701f24e9ab76ca9177c317b88b39" + }, + { + "path": "docs/quality/logs/standalone-server.log", + "bytes": 114, + "sha256": "8af62068e13751692799c95679ce8588b6cbbf774d6f8a951668ce2fff36b957" + }, + { + "path": "docs/quality/logs/typecheck.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/typecheck.log", + "bytes": 53, + "sha256": "8b3269bf93de41d5b37919b9c9eb1fdf891529124832dddde796d61642ae0a5b" + }, + { + "path": "docs/quality/logs/unit.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/unit.log", + "bytes": 2254, + "sha256": "0bb10fc9568d6e8e8d15a8027966382cfe691d1e5a0991f1789d26854f171f0f" + }, + { + "path": "docs/quality/logs/validate.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/logs/validate.log", + "bytes": 974, + "sha256": "d71250a821c15c3beb71107aa0098fc014d247d1ea4e5127ca43ba81c7232c2d" + }, + { + "path": "docs/quality/MANUAL_QA_RESULTS_v1.0.csv", + "bytes": 2842, + "sha256": "dba020cda7ffbbc6b05f275fb1c479d102e1f00900ddfc910b6a436f54322a08" + }, + { + "path": "docs/quality/PHASE_11_COMMAND_LOG_v1.0.txt", + "bytes": 2779, + "sha256": "e750ffab91024cb562f5919b8229ce7ed7c0753bc62e96956e7e7275df330cae" + }, + { + "path": "docs/quality/PHASE_11_FILE_CHANGES_v1.0.txt", + "bytes": 3003, + "sha256": "8ac89bb910a600664d799605b51d08b6bc1b99887e36c880b70f9862b684b09c" + }, + { + "path": "docs/quality/PHASE_11_VALIDATION_RESULTS_v1.0.json", + "bytes": 1169, + "sha256": "f61ba0cf4eb87f5d4f3b7343c5b0b1c9ce242b28ac673dd9c22a88fdd49f3d47" + }, + { + "path": "docs/quality/PHASE_11_VALIDATION_RESULTS_v1.0.md", + "bytes": 2235, + "sha256": "e8eac6f793b461586119e219caa89979b87f3d3ea0254f8fa4602777b2cb7f7d" + }, + { + "path": "docs/quality/PHASE_12_COMMAND_LOG_v1.0.txt", + "bytes": 2261, + "sha256": "9e8d7eeb7d671bbef13b5b48876d095f44558780badb6a3f2dcecd1034ccabba" + }, + { + "path": "docs/quality/PHASE_12_FILE_CHANGES_v1.0.txt", + "bytes": 6129, + "sha256": "46120beed9a87cd0a8272dc3c3b81e41b10cdc150877344ce3658ba370efebdd" + }, + { + "path": "docs/quality/PHASE_12_HTTP_ROUTE_RESULTS_v1.0.json", + "bytes": 999, + "sha256": "502e79659692e8c9c8a97fd1495cefa67250d746db2f4be4d9aa5f1c693042cb" + }, + { + "path": "docs/quality/PHASE_12_MANUAL_QA_RESULTS_v1.0.csv", + "bytes": 3628, + "sha256": "e1a2e78e7e323fe3a2b2e0d1f4f2733234dee6b079393158fd39dcb1261f8902" + }, + { + "path": "docs/quality/PHASE_12_VALIDATION_RESULTS_v1.0.json", + "bytes": 4743, + "sha256": "66c771151857321f5de310f3f1d9670ec01f91acb12d209b3e4414530995d3f6" + }, + { + "path": "docs/quality/PHASE_12_VALIDATION_RESULTS_v1.0.md", + "bytes": 4050, + "sha256": "581f82dd3a3935914c28a849de0677699662fbf883a17f84d2a8e6ac554c0296" + }, + { + "path": "docs/quality/PHASE_12_VISUAL_REGRESSION_RESULTS_v1.0.json", + "bytes": 517, + "sha256": "d4ffcc9b730a57d3d6a46d4f617cb40b9c0fe5489189dfda7e8e2c2c521bf6d8" + }, + { + "path": "docs/quality/PHASE_13_COMMAND_LOG_v1.0.txt", + "bytes": 1225, + "sha256": "4f8a2074c0ccc3b16e3d1656688d52ea0fe6fc3b9bd125d23b00b1b682b8533a" + }, + { + "path": "docs/quality/PHASE_13_FILE_CHANGES_v1.0.txt", + "bytes": 1051, + "sha256": "95e446fe77e3412f02f236f6c6891df11ab76857aa77b4497a82f2c64e0b34cb" + }, + { + "path": "docs/quality/PHASE_13_HTTP_ROUTE_RESULTS_v1.0.json", + "bytes": 553, + "sha256": "6ab331a76652ad7b7183d4ead068fb9e5af13c10e361148a36c207f619c235c4" + }, + { + "path": "docs/quality/PHASE_13_MANUAL_QA_RESULTS_v1.0.csv", + "bytes": 1571, + "sha256": "5cffba29bff2974118bc17ca9bc9ceb94cc1b5504d1a04a92ad43a67b04dbe47" + }, + { + "path": "docs/quality/PHASE_13_VALIDATION_RESULTS_v1.0.json", + "bytes": 2964, + "sha256": "bde83fe8e06a47fcf235821c055f9fa12f72c5cdd472d04e35f1f9b99738fe23" + }, + { + "path": "docs/quality/PHASE_13_VALIDATION_RESULTS_v1.0.md", + "bytes": 4094, + "sha256": "457a045db7fa620029f94929f2fd86e7d1549a787b53949a50b08b4f039182a6" + }, + { + "path": "docs/quality/PHASE_14_COMMAND_LOG_v1.0.txt", + "bytes": 2061, + "sha256": "929f481348f4f8e9981665f763c74d97f3a5b03a3d3fd79e13fa874586dccdf1" + }, + { + "path": "docs/quality/PHASE_14_FILE_CHANGES_v1.0.txt", + "bytes": 5414, + "sha256": "2c7587b49801ff92871a1eaba3669b2c5078c85233a571079679f87b6c5ee06d" + }, + { + "path": "docs/quality/PHASE_14_HTTP_ROUTE_RESULTS_v1.0.json", + "bytes": 764, + "sha256": "b1b2cf79c7b913e893931482750f5de6fbe11f1a167e19e5bd88aca37ba5c9f0" + }, + { + "path": "docs/quality/PHASE_14_MANUAL_QA_RESULTS_v1.0.csv", + "bytes": 2086, + "sha256": "e7a3c123fa363bc18d6f4f150e34a4ec0f47836f0cdc60e4a6ac4d02a6961a6f" + }, + { + "path": "docs/quality/PHASE_14_VALIDATION_RESULTS_v1.0.json", + "bytes": 3810, + "sha256": "a2b881a68c34dca6fc1fb85d47a225c9f1583499848ea45deef4de029d9f0ff9" + }, + { + "path": "docs/quality/PHASE_14_VALIDATION_RESULTS_v1.0.md", + "bytes": 1648, + "sha256": "4ffac0d2e5461bee305d346b3da2589f33120ff9ba31f6a6b740d8b52393ac5d" + }, + { + "path": "docs/quality/PHASE_14_VISUAL_REGRESSION_RESULTS_v1.0.json", + "bytes": 501, + "sha256": "8f27f81463c6850bf6b93b4efd61f761af7ccf011b220b336f69b8a4ef5d453c" + }, + { + "path": "docs/quality/PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.json", + "bytes": 5595, + "sha256": "4cf636fd2a163700b666f0a04946b453dd22c4a4b43bc03bb420c3760a37353d" + }, + { + "path": "docs/quality/PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.md", + "bytes": 4606, + "sha256": "0f3fb7ce9257fadfb7819143ad6a840ab1b6a5a848d0a8e3b19972e430cb0bab" + }, + { + "path": "docs/quality/PHASE_15_COMMAND_LOG_v1.0.txt", + "bytes": 11190, + "sha256": "b92aea4d16329cc54aab02e2dd035275425d3703a7e17703aa31f3224f78a484" + }, + { + "path": "docs/quality/PHASE_15_FILE_CHANGES_v1.0.txt", + "bytes": 13959, + "sha256": "ec77798e607ad9ef876b4eb5ce5c3c33d494f8d16c4f149f0eeca757d78a8bb3" + }, + { + "path": "docs/quality/PHASE_15_STATIC_AUDIT_RESULTS_v1.0.json", + "bytes": 3211, + "sha256": "ef3216e76c58a1656f68cae7d6a792a0da6ea5e63465bf3879c610ab235b3158" + }, + { + "path": "docs/quality/PHASE_15_STATIC_AUDIT_RESULTS_v1.0.md", + "bytes": 3065, + "sha256": "595afc2c185c9d091ca952325b37a268b357478a23467ea920e4945f86b6ab9a" + }, + { + "path": "docs/quality/PHASE_15_TOOLCHAIN_SETUP.log", + "bytes": 1554, + "sha256": "313029491c83cc00c9abf5e8ab63db6bd350c9bb94d5e2b80415fd716091db64" + }, + { + "path": "docs/quality/PHASE_15_VALIDATION_RESULTS_v1.0.json", + "bytes": 2479, + "sha256": "ae6fd775d5d6a67406b59296796ea3f904b79a78cc24a33f85cf2b4b87067008" + }, + { + "path": "docs/quality/PHASE_15_VALIDATION_RESULTS_v1.0.md", + "bytes": 1515, + "sha256": "1c50f03fbeee648e398f51499b9348245cb2b85edfad9e21f5eb14415454d7c9" + }, + { + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json", + "bytes": 16774, + "sha256": "0847aadd971c795e7cc5077a7d250f847b4b4d77a5d6f7e7b9426046fba75568" + }, + { + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md", + "bytes": 15712, + "sha256": "94965d6163c8350187900144b5ea07ac54ebf71093e857bba81b3b5ba221618c" + }, + { + "path": "docs/quality/PHASE_16_LOCAL_COMMAND_RESULTS_v1.0.json", + "bytes": 6024, + "sha256": "bf2a50262cac1f5eff90d864c2e8bda307480ee792afb7f00cef4206345c2ac5" + }, + { + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json", + "bytes": 3249, + "sha256": "9a54699b88f252b635c1a3efe37e84670b33ed8f3516526d136485a93302a4ff" + }, + { + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md", + "bytes": 3065, + "sha256": "5f9ae09d8493b384dc9f7653db5700a4ea457dbcc94d6799330911a6875150cb" + }, + { + "path": "docs/quality/phase15-command-logs/01-validate.json", + "bytes": 136, + "sha256": "690ec5e56e1c2d1260bbda500aae6935eec51c7e1c957ac8043d3b5eacf8fe45" + }, + { + "path": "docs/quality/phase15-command-logs/01-validate.log", + "bytes": 1482, + "sha256": "a8702ea1ad801f38a464f52e1961f4d0301082499f928e38290e8c9a3ad0a38c" + }, + { + "path": "docs/quality/phase15-command-logs/02-phase14-manifest-baseline.log", + "bytes": 131, + "sha256": "e1bc16ca75ee3f5fc063bee211ed1aebebff3365039c0c0558817467c4e4e13d" + }, + { + "path": "docs/quality/phase15-command-logs/02-phase14-manifest.log", + "bytes": 428, + "sha256": "d304fc1d9d340a8af6588bc023099451663d47d300c4787aff5a30e693cd4ec4" + }, + { + "path": "docs/quality/phase15-command-logs/03-syntax-check.log", + "bytes": 225, + "sha256": "99246276d42a08b275fc645efc9f84a762534bd51b3f88888676fcba28d54744" + }, + { + "path": "docs/quality/phase15-command-logs/04-baseline-static-audit.log", + "bytes": 223, + "sha256": "09c63142e71f71f0f0f5c652902a32b0a1cbd1908e9eadf5830ff71659643905" + }, + { + "path": "docs/quality/phase15-command-logs/05-current-static-audit.log", + "bytes": 66, + "sha256": "8785c8611db8a489da6792f6377236f4c9b9c1a0f5ac5636986e206c03b6f36c" + }, + { + "path": "docs/quality/phase15-command-logs/06-current-validations.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/phase15-command-logs/06-current-validations.log", + "bytes": 1597, + "sha256": "2d44d3eea802e5b8f17b9c9eb01c1280276e7cb30a3617f9226bf552af18922e" + }, + { + "path": "docs/quality/phase15-command-logs/07-current-static-audit.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/phase15-command-logs/07-current-static-audit.log", + "bytes": 106, + "sha256": "175b57f0a4b5dd6f7293d8534050b6cefbd98c899a2fb686b8d4d9f5c6917f0c" + }, + { + "path": "docs/quality/phase15-command-logs/08-content-type-behavior.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/phase15-command-logs/08-content-type-behavior.log", + "bytes": 643, + "sha256": "2e1077c48d47f02ae73c2ee7b9006b1ef887faae6b6eb04be673d5f395825ab4" + }, + { + "path": "docs/quality/phase15-command-logs/09-syntax-check.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/phase15-command-logs/09-syntax-check.log", + "bytes": 117, + "sha256": "0ef5177d69f49bdbf89a8b9a6bcef2110728108969453dcc36f27a0b1ce83161" + }, + { + "path": "docs/quality/phase15-command-logs/10-final-validations.log", + "bytes": 1612, + "sha256": "a48348ed8aaa988ad1c267603e272725d5be2d057ed4915868c871a0678a1935" + }, + { + "path": "docs/quality/phase15-command-logs/11-final-static-audit-pre-report.log", + "bytes": 128, + "sha256": "c806167d316db60d36fb6069f03ce47c623d43ce6710c77fb6b03ccc7144e1c5" + }, + { + "path": "docs/quality/phase15-command-logs/12-phase15-package-manifest.log", + "bytes": 245, + "sha256": "44a35440eee52dede738dd0c609ac81a7f5b922226966b05096c46b3a8f44091" + }, + { + "path": "docs/quality/phase15-command-logs/13-final-static-audit.log", + "bytes": 128, + "sha256": "f0bdbb5e1d170a394eec143cb960a8ba62355edfcbe5fa5bc10cbe39565d876c" + }, + { + "path": "docs/quality/phase16-command-logs/01-phase15-manifest.log", + "bytes": 78, + "sha256": "2413a23a1ebf4644a486feaf0754c226782de186f80431304147119f18577f30" + }, + { + "path": "docs/quality/phase16-command-logs/02-validations.log", + "bytes": 1544, + "sha256": "e9c93de42afd2f5917a30c127f593966eeb5efe0d1ea84bb26c552d602d72384" + }, + { + "path": "docs/quality/phase16-command-logs/03-phase15-readiness.log", + "bytes": 115, + "sha256": "7a1ac06b55368e009483e696e168ba1bda5c9be4126870930f9448111a860432" + }, + { + "path": "docs/quality/phase16-command-logs/04-static-audit.log", + "bytes": 53, + "sha256": "838cb15dfbb32ef20b08ce23c8aea1e9c5f0009bee13eddcdea18bc7b4f0ce59" + }, + { + "path": "docs/quality/phase16-command-logs/05-phase14-integrations.log", + "bytes": 101, + "sha256": "e79b8f59512cc8002e7af1863b7e50561fe947598d0720a1f694915b91980718" + }, + { + "path": "docs/quality/phase16-command-logs/06-phase14-environment.log", + "bytes": 98, + "sha256": "c735669da270efee7dbffabbdec1b77fa09fdd2a9b287be1b065b9b54dc7a294" + }, + { + "path": "docs/quality/phase16-command-logs/07-phase14-security.log", + "bytes": 112, + "sha256": "4ae969f761850d30915ac8dd83e4978af938a8eb6dc8e7ceafc0360d9015ce54" + }, + { + "path": "docs/quality/phase16-command-logs/08-phase14-privacy.log", + "bytes": 101, + "sha256": "008b9f80c34a18546eeeed0ac88647608c419ad3d09acc8a9d5d616b03a1e9c2" + }, + { + "path": "docs/quality/phase16-command-logs/09-syntax-check.log", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "docs/quality/phase16-command-logs/10-container-runtime.log", + "bytes": 80, + "sha256": "077eb22fed6a1485b324290a72c8807fb432ab308a084f214a592edf7de0642e" + }, + { + "path": "docs/quality/phase16-command-logs/11-corepack-prepare-pnpm.exit", + "bytes": 2, + "sha256": "4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865" + }, + { + "path": "docs/quality/phase16-command-logs/11-corepack-prepare-pnpm.log", + "bytes": 1402, + "sha256": "3a24c0a30b994784e0f7b7bde02a8be1e588530663eab2a3a52ec92ae4f87226" + }, + { + "path": "docs/quality/phase16-command-logs/12-node-version.log", + "bytes": 16, + "sha256": "221a28868bd1d5010604082bade5ec859a5646cdc0c693666e293bdd473b930e" + }, + { + "path": "docs/quality/phase16-command-logs/13-contract-validation.log", + "bytes": 76, + "sha256": "b15487371f49a09e439025a0f6310dc58820c30b54cce3f9811b71eb793348cf" + }, + { + "path": "docs/quality/phase16-command-logs/14-token-validation.log", + "bytes": 98, + "sha256": "e0c8e98d4822612445d940fe59ee4110687b7d52378f29e3c482943556c9618f" + }, + { + "path": "docs/quality/phase16-command-logs/15-locale-validation.log", + "bytes": 95, + "sha256": "eec95bb6badd6522254dae238ce8ce2ac53822e5053e8bc19f792c887c36393c" + }, + { + "path": "docs/quality/phase16-command-logs/16-route-validation.log", + "bytes": 86, + "sha256": "7dde94bd40b5ec54446aa938ef3d7f590492c4df466092e43c22f331ade60e5e" + }, + { + "path": "docs/quality/phase16-command-logs/17-css-rtl-validation.log", + "bytes": 60, + "sha256": "1aaf870beabce02986df518b31d5d4661501e92f67e74d2a9b5d801e9707314d" + }, + { + "path": "docs/quality/phase16-command-logs/18-content-claims-validation.log", + "bytes": 107, + "sha256": "f632d7955f83a57625ddf3bcc1d9afb2e2d897398985e937a486358758702d31" + }, + { + "path": "docs/quality/phase16-command-logs/19-metadata-validation.log", + "bytes": 93, + "sha256": "9d5e54c6656dec36b28e5b392ac7ffca46f653b739509e901c3858c96fdb9f4b" + }, + { + "path": "docs/quality/phase16-command-logs/20-component-validation.log", + "bytes": 91, + "sha256": "80923526b68d6f0ac3dfe383b850b196f47051f9dc2ca738bb4738c2f63e8d96" + }, + { + "path": "docs/quality/phase16-command-logs/21-homepage-validation.log", + "bytes": 115, + "sha256": "b4b0ae12993dd9acd88b45d4e917d31f54bd1ede2cea2312ebe7eb37b13f0373" + }, + { + "path": "docs/quality/phase16-command-logs/22-final-validations.exit", + "bytes": 2, + "sha256": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa" + }, + { + "path": "docs/quality/phase16-command-logs/22-final-validations.log", + "bytes": 1681, + "sha256": "b2aff092be4e34bb528e90dd1a1e5b0004c31ac8533820b8018b6736d3d3d655" + }, + { + "path": "docs/quality/VALIDATION_RESULTS_v1.0.json", + "bytes": 1397, + "sha256": "9b663f7667620496bcbd872e3fc06c725adfb7dbbf6d7bfe8848896f400105d7" + }, + { + "path": "docs/quality/VALIDATION_RESULTS_v1.0.md", + "bytes": 4623, + "sha256": "47d44ee6095cb0bc68fe23148c98403d39309edbb4dd6acdf4a696019e9f0065" + }, + { + "path": "docs/quality/VISUAL_REGRESSION_RESULTS_v1.0.json", + "bytes": 659, + "sha256": "2e94e41c1bdae854d8b1b1db8f62027e896783ece58df0108287c181c7e8caa5" + }, + { + "path": "docs/TOKEN_IMPLEMENTATION_v1.0.md", + "bytes": 2281, + "sha256": "fe6cb88b5689f989cd325a961f2d28cde6f20bea31d2cf572d2a5706c2d7fed7" + }, + { + "path": "eslint.config.mjs", + "bytes": 1031, + "sha256": "14ef56a9899d4c5440c6fe71e713f321b1e1db3de2041b6ad13cd8f798a5225d" + }, + { + "path": "next-env.d.ts", + "bytes": 247, + "sha256": "7b550dda9686c16f36a17bf9051d5dbf31e98555b30d114ac49fc49a1e712651" + }, + { + "path": "next.config.ts", + "bytes": 198, + "sha256": "cd5d6988c4b5ba3b924c236876af7df12edf1f6df71d654ed67500ad450a48eb" + }, + { + "path": "package.json", + "bytes": 4052, + "sha256": "c7d075dd89de5199c60f9deef5b598b8335f406af9249b587d1472ad287c8b86" + }, + { + "path": "PHASE_10_PACKAGE_MANIFEST_v1.0.json", + "bytes": 25522, + "sha256": "5a6e185cba91cf3801480ef83f07ed392cd2a85f1f717bb2c4b341235613269c" + }, + { + "path": "PHASE_11_PACKAGE_MANIFEST_v1.0.json", + "bytes": 35023, + "sha256": "060cf87e54f52d00928722188166a24e20949b91c3237e5ac148bdf660b66aaf" + }, + { + "path": "PHASE_12_PACKAGE_MANIFEST_v1.0.json", + "bytes": 58828, + "sha256": "1eb7d488f70fd147f0e34d5ffcb2f40e05d6e6094629c9fb2374f42cb4651906" + }, + { + "path": "PHASE_13_PACKAGE_MANIFEST_v1.0.json", + "bytes": 62522, + "sha256": "6d1478e402a429a9e48a4bd157f7eef473bb6ac09021913acd8ca143527f4807" + }, + { + "path": "PHASE_14_PACKAGE_MANIFEST_v1.0.json", + "bytes": 81610, + "sha256": "dda774ec235d1bb912355604dd2f7f091dc0d117b3849fb8cc15df4da92c86c1" + }, + { + "path": "PHASE_15_PACKAGE_MANIFEST_v1.0.json", + "bytes": 96539, + "sha256": "6b927885d43934f7046e68f0f8d428890e02064b42939c7399b7748bc50b9b7f" + }, + { + "path": "playwright.config.ts", + "bytes": 2003, + "sha256": "d054578e388ff2bc3af53a0f02a54952225a4e88fda528d0181a5ff17ff6f9ff" + }, + { + "path": "pnpm-lock.yaml", + "bytes": 168864, + "sha256": "c8b40337671246d5a691a4c2c322f6ed184c6b7f99c10095519cf768eb1ace3d" + }, + { + "path": "pnpm-workspace.yaml", + "bytes": 338, + "sha256": "568eba518a28bcd58534a51483092d0a27919aefaec2446e6dd5c6d6ddd80160" + }, + { + "path": "prettier.config.mjs", + "bytes": 164, + "sha256": "2d5316ad27ef10ead128dd2ee82e11b79f067fcf25ea6d504624966739260335" + }, + { + "path": "public/.gitkeep", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "path": "README.md", + "bytes": 5908, + "sha256": "52eb72a3a0813ddb25bf103f3be860e795a31937b5898392adb14a92eec2c8dc" + }, + { + "path": "scripts/generate-phase10-manifest.mjs", + "bytes": 1800, + "sha256": "6917fd46f99aacf9de7c89f058380facbf4c8c4adf0baaafb0bf7d1333497808" + }, + { + "path": "scripts/generate-phase11-manifest.mjs", + "bytes": 1800, + "sha256": "4f659193f9741a6c4d0b1bfc8153b426952ce7a9a895b8229bc8fe82530d832b" + }, + { + "path": "scripts/generate-phase12-manifest.mjs", + "bytes": 1771, + "sha256": "2be2e9d9089fc37041ecba9196ca6f2eaed818b7572c470fea4d4c2a4ea4ecd4" + }, + { + "path": "scripts/generate-phase13-manifest.mjs", + "bytes": 1801, + "sha256": "43e242d20eee8fd4a06747c340187e43a87fcd1da7f99c2c295ece7d62c9a710" + }, + { + "path": "scripts/generate-phase14-manifest.mjs", + "bytes": 1801, + "sha256": "c17d335321be709cd455c357c53d902a8b4f1c279b86254e232e922ca21ee3b4" + }, + { + "path": "scripts/generate-phase15-manifest.mjs", + "bytes": 1889, + "sha256": "483f9b1222368fe9bd255d5d4b07d1f8ea6898b575c0e07a13c5f693ef70f932" + }, + { + "path": "scripts/generate-phase15-reports.py", + "bytes": 67112, + "sha256": "23bba1a926c5696ee9c02a3a6861f931426e452ea803d757f81d79c5dd83a1e8" + }, + { + "path": "scripts/generate-phase16-manifest.mjs", + "bytes": 1867, + "sha256": "b7480586cfefa5317ff5122f462894685d0b1fcd4d05b81d86a21f6fe930ba95" + }, + { + "path": "scripts/lib.mjs", + "bytes": 1446, + "sha256": "81c8af9b271572e92ade805dd317dc8738647efe8e89cb37a7c9d1873b5d5edc" + }, + { + "path": "scripts/phase15-static-audit.py", + "bytes": 17442, + "sha256": "9a72263a697c17e157432dab091a2f30cc0fa2a6019cb5e521c9af57e949ac5a" + }, + { + "path": "scripts/phase16-static-audit.py", + "bytes": 17582, + "sha256": "10783d0f095339971e80a00cb8313792df6fc7f2c8d57693a980fa06de337abc" + }, + { + "path": "scripts/prepare-standalone.mjs", + "bytes": 813, + "sha256": "f1c1398022048160d71ae14bfa53dd2e431dd2f5aca8f39571de159259af535b" + }, + { + "path": "scripts/prepare-typecheck.mjs", + "bytes": 200, + "sha256": "ab77db302cfc2e9ee25147989f5c8de5bd244a8efcce63d862fdb0f9350c227f" + }, + { + "path": "scripts/run-checks.mjs", + "bytes": 695, + "sha256": "f7e2e25fec5ba927fe2be4ef4d1d19479159c151ad4cec4f53a254b487c8a43a" + }, + { + "path": "scripts/run-validations.mjs", + "bytes": 826, + "sha256": "314b97961ec7428971c3d55c0e15e5ef679d4758e67d01c458f45a3f36cc7fb5" + }, + { + "path": "scripts/validate-css-logical.mjs", + "bytes": 943, + "sha256": "d47f0346ba94621442c5dc700b53a0219ade3dda7485b4c7f49fb384738c424c" + }, + { + "path": "scripts/validate-locales.mjs", + "bytes": 1875, + "sha256": "dfaf3f34079ea571b17dd2d71d0abf47b48be924818b39c5df93495188b95f43" + }, + { + "path": "scripts/validate-metadata.mjs", + "bytes": 1268, + "sha256": "78127c2c0387e38914388f1a6292ed7a408d672739f8ef5a51e3919fdd2addb0" + }, + { + "path": "scripts/validate-phase10-manifest.mjs", + "bytes": 1192, + "sha256": "29386f182d08ee9096e51a01ea115ae145023724f3d8527fc3ac550152f34d20" + }, + { + "path": "scripts/validate-phase11-foundation.mjs", + "bytes": 2898, + "sha256": "6ada4344545ae50710d9207e0de636c1a8452e6a6bbe3815d51f82ae66667b0d" + }, + { + "path": "scripts/validate-phase11-manifest.mjs", + "bytes": 2950, + "sha256": "977c184291541ad5c6926f8075f96e093dd8957ffc6fe722cc4481a7c079aab7" + }, + { + "path": "scripts/validate-phase12-components.mjs", + "bytes": 3533, + "sha256": "5f07dfdba17bc909cda2fcb0bb52dfac689d1bb9ee4daed5a5640545f48fd01a" + }, + { + "path": "scripts/validate-phase12-manifest.mjs", + "bytes": 2545, + "sha256": "8968feb1e9a0aa6fae696e18fbc1d73dd34881ff4bfe80cfd5f8114a16667ac8" + }, + { + "path": "scripts/validate-phase13-homepage.mjs", + "bytes": 2514, + "sha256": "5a8e8cfb5f1512d02a08a6c8d7952436700b1fd9ebc9d6384ae3191a4eda353c" + }, + { + "path": "scripts/validate-phase13-manifest.mjs", + "bytes": 2576, + "sha256": "407e334829c01206c92ad80fcb9347f8288e48e46455de19a50a26cc9f87ed1f" + }, + { + "path": "scripts/validate-phase14-environment.mjs", + "bytes": 1237, + "sha256": "236f2c7d06b0b879cd475d0e28f09881201972c977b4d108f85d8da692d664e3" + }, + { + "path": "scripts/validate-phase14-integrations.mjs", + "bytes": 2556, + "sha256": "b87d7a29cfff50a824c772a511c0b7dbc2d5d016c3a8b792248fb86370019f06" + }, + { + "path": "scripts/validate-phase14-manifest.mjs", + "bytes": 2576, + "sha256": "9f586d4de1e321c4bf6113a153d0b033c38e15e57046d6d6e9dcb4aa93c4f1ed" + }, + { + "path": "scripts/validate-phase14-privacy.mjs", + "bytes": 1383, + "sha256": "28ad1dae9ec12952a3f00b20dcd9cd8a258b8d7e12064872f39e4d8813f910b3" + }, + { + "path": "scripts/validate-phase14-security.mjs", + "bytes": 1706, + "sha256": "e4e86e52060c80cf7c14e0db178438765ea6e12715f9994a93fc2e1bb805fdc7" + }, + { + "path": "scripts/validate-phase15-manifest.mjs", + "bytes": 2673, + "sha256": "129ea44a368c82e130c803156cf8096342438545571accd1ed700cd768bdf5a4" + }, + { + "path": "scripts/validate-phase15-readiness.mjs", + "bytes": 3472, + "sha256": "6764887cce0b291f6e210492a41ec515369d5146802e6fb0fdd5a6906d42e792" + }, + { + "path": "scripts/validate-phase16-manifest.mjs", + "bytes": 2667, + "sha256": "9c1321444d4536bd72ece7689783b3f049521cb7907ba2bd7fb0a8a0a1c65d44" + }, + { + "path": "scripts/validate-phase16-readiness.mjs", + "bytes": 2103, + "sha256": "f4ca13074afc7ff0c3cf425ec8d1709bbfb81900c25849293d0c876ebf0d63d1" + }, + { + "path": "scripts/validate-phase9-contract.mjs", + "bytes": 1424, + "sha256": "5fce16d33bf6cf7d95136b89f62fd595f109c5d003d54652998dfe3e5b866d6e" + }, + { + "path": "scripts/validate-prohibited-content.mjs", + "bytes": 1068, + "sha256": "3dd645162ad8cd95a28395840fba47a11e2b34e744c7cebdd61a0a9ed3003872" + }, + { + "path": "scripts/validate-routes.mjs", + "bytes": 1611, + "sha256": "d495d43cdfc9505c951b1ed4f7c717d5369b2a637ca31b0b87aae118295c9568" + }, + { + "path": "scripts/validate-runtime-dependencies.mjs", + "bytes": 2188, + "sha256": "f4c43bcaf8fdc78ece6698bcfcdd95413d7a28c1e991f352d74441d0dbbda17f" + }, + { + "path": "scripts/validate-tokens.mjs", + "bytes": 1682, + "sha256": "a508dbee00fe1f991d4f09c2072719e508eb9e14f3ab7d474ba67ca826f45557" + }, + { + "path": "src/app/[locale]/[slug]/page.tsx", + "bytes": 2222, + "sha256": "1f0a103dc658ba88003f5203e3842ec13dc5bdc2bc10695510968043f9ea4dfd" + }, + { + "path": "src/app/[locale]/component-lab/ComponentLabInteractive.tsx", + "bytes": 3620, + "sha256": "87a236be050916440bce01f0c4c5ec9ef31f33a64eff706dbd8ff53febb9868b" + }, + { + "path": "src/app/[locale]/component-lab/page.module.css", + "bytes": 618, + "sha256": "5aa5740b49a0b17da98bb9041e95e9680ae2bfc6de28244b6ddc1d36bdc30372" + }, + { + "path": "src/app/[locale]/component-lab/page.tsx", + "bytes": 2960, + "sha256": "ef7007fbcedfeb3dd96e16ff657b43ed9cac72cd5792dea067d68a61b011c60c" + }, + { + "path": "src/app/[locale]/error.tsx", + "bytes": 693, + "sha256": "129089239ad9e7e5fb941607803ef5dded6df716d3d913b355db015901cea2b5" + }, + { + "path": "src/app/[locale]/layout.tsx", + "bytes": 2932, + "sha256": "aaae9374813073c4cde0877f4bf6ba11f98027262bb5d1e001f8b654d2fff6e5" + }, + { + "path": "src/app/[locale]/loading.tsx", + "bytes": 146, + "sha256": "54cff43832c7ad9d05b82cddb5e2262ec11589a937a54b3c5a2c0da3da6c46b5" + }, + { + "path": "src/app/[locale]/not-found.tsx", + "bytes": 150, + "sha256": "ddb7a1c6f57acebb313117af5c5312398b39a6b698f7347b8fed69c4816e9c00" + }, + { + "path": "src/app/[locale]/page.module.css", + "bytes": 3805, + "sha256": "ae5a4800050ffb7c4afae1b427a2a8c1900baa825064b7cbc96ac6316a68319d" + }, + { + "path": "src/app/[locale]/page.tsx", + "bytes": 12595, + "sha256": "dcde623280a31fa552f0b8ca322656714ced4bf3241a037a7c122e463ee5c84d" + }, + { + "path": "src/app/api/demo/route.ts", + "bytes": 4491, + "sha256": "5f9f17acf083d42e6c74af48a75c82a253abaee97788bfa07c6d0e480caeaf70" + }, + { + "path": "src/app/robots.ts", + "bytes": 397, + "sha256": "6c1e263671da52c65da390bcbf38b2a11ec9c580a0072295cad11028e082900f" + }, + { + "path": "src/components/actions/ActionLink.module.css", + "bytes": 1250, + "sha256": "7aa5f13eb3a26877c3301056b4e05e30ef9433513bdfdbf2cde544708d7fa7c0" + }, + { + "path": "src/components/actions/ActionLink.tsx", + "bytes": 1963, + "sha256": "5c239401c7c16a7ed42818e664b8f8b6d1929f1d1d2ad26defd832a88372c9cc" + }, + { + "path": "src/components/actions/Button.module.css", + "bytes": 3018, + "sha256": "667e7b647fdec7030cda77a06d5f4509fc1ed941e2b68c65a6e656161708d4a2" + }, + { + "path": "src/components/actions/Button.tsx", + "bytes": 2720, + "sha256": "27933a21d5566700b9cb2dc99f68a53e05f965cae829191f0fe83d75679fc89c" + }, + { + "path": "src/components/app-shell/BrandLink.tsx", + "bytes": 684, + "sha256": "54c482a2e5be262941b943cf2ed123b61dbd4199993d225ec5d22be530b375bb" + }, + { + "path": "src/components/app-shell/Controls.module.css", + "bytes": 743, + "sha256": "fde735d74c28c3131a4c2c6b91146fd844e4af1af351d481033b32e2a8ec1a8c" + }, + { + "path": "src/components/app-shell/DisabledAction.tsx", + "bytes": 682, + "sha256": "4c8327532ccd967895c9ea03477b136eef7f47b169e04ecc728e3af80a152073" + }, + { + "path": "src/components/app-shell/HeaderNavigation.tsx", + "bytes": 1634, + "sha256": "ebfd217810ca31dbafd64ceeaaf8de45a89c6e2aa1d4806a66f2f25dd55e0188" + }, + { + "path": "src/components/app-shell/LocaleSelector.tsx", + "bytes": 1330, + "sha256": "bfcda377c8177aab6e2f5e17fc761dd77009e0310fd281f7dbc07a72f88c162d" + }, + { + "path": "src/components/app-shell/LocalizedLoading.tsx", + "bytes": 503, + "sha256": "b362aa5b94495c599c7cc22e0a3cfa04a29229b6c7f74dde71202f5027a831a5" + }, + { + "path": "src/components/app-shell/LocalizedNotFound.tsx", + "bytes": 794, + "sha256": "3b7a9c001bd3e9818c7bda6f25bc29c9df816d4ced1486542be2b31ccdc476e9" + }, + { + "path": "src/components/app-shell/MobileNavigation.tsx", + "bytes": 4188, + "sha256": "be0e5104d96f71c89354bf7de042f40d2cf740c756acf74cb11a0b16c89c17c0" + }, + { + "path": "src/components/app-shell/SiteFooter.module.css", + "bytes": 2260, + "sha256": "491af5e5b3137180ffec3833ff2d9e6bfe1d47cf7615a886034e1ff12b89cceb" + }, + { + "path": "src/components/app-shell/SiteFooter.tsx", + "bytes": 4999, + "sha256": "e50e289a87c9b9adc26931b5bec9382a9eaf176ce2abed5b4c1693b6cb64bfe0" + }, + { + "path": "src/components/app-shell/SiteHeader.module.css", + "bytes": 5197, + "sha256": "a0bd449a7fceb0837a35b09acc743750061e0c77ec0060e13cbd20a843fe509d" + }, + { + "path": "src/components/app-shell/SiteHeader.tsx", + "bytes": 2707, + "sha256": "a02bc01a005a2d796d981e3aab7181f881c9bb787cf3e30c04c8ccbbea986a38" + }, + { + "path": "src/components/app-shell/StateShell.module.css", + "bytes": 2014, + "sha256": "acdf7af0cd11250c411dd44291e36cc5053a195a07d3849c2ca9050f6524cf40" + }, + { + "path": "src/components/app-shell/StateShell.tsx", + "bytes": 1378, + "sha256": "633c5d35f024d6c1c7a7b5f2bc128d13ef35a25ac07820c7428dc871d5c01f50" + }, + { + "path": "src/components/app-shell/ThemeController.tsx", + "bytes": 1017, + "sha256": "e3e646ff02c7480a191d4700971ba03b947ddff769687af1f3769e11cd740ce9" + }, + { + "path": "src/components/app-shell/ThemeSelector.tsx", + "bytes": 2319, + "sha256": "04bb79e8b99006786e669ccae0a8d1a845efafceebe6b5d0ab43380a190d1b6f" + }, + { + "path": "src/components/controls/Accordion.module.css", + "bytes": 809, + "sha256": "5a0bf706ab23537146dfa6a03e76753d22987a6df2cab0ddc9a60094f7865ba6" + }, + { + "path": "src/components/controls/Accordion.tsx", + "bytes": 880, + "sha256": "0c26c34d4b7ed1f343101f5a7897806e4a42301181070074a3489668cd425ca3" + }, + { + "path": "src/components/controls/Pagination.module.css", + "bytes": 605, + "sha256": "cb6d2109fd8706e16090e38c0154380c7272c40b723899600d93bd7d44d4af47" + }, + { + "path": "src/components/controls/Pagination.tsx", + "bytes": 1423, + "sha256": "7ea4663bdb23f16c57d29d3503684bed127d7f0f09f68e10e061c3ec8f9255c4" + }, + { + "path": "src/components/controls/SegmentedControl.module.css", + "bytes": 742, + "sha256": "b03cd7de287c4bc182917391461023b103c298bc249b082eebeaaeda12dca041" + }, + { + "path": "src/components/controls/SegmentedControl.tsx", + "bytes": 977, + "sha256": "6fd779b2a0d7f2a8f9a376f595144b92f42b41bc4f520768c104be90085baaf6" + }, + { + "path": "src/components/controls/Tabs.module.css", + "bytes": 688, + "sha256": "2b09531d587bd42d8a45cb78b68ae3581f2ec4979a1d749781311a6a81dbc5b7" + }, + { + "path": "src/components/controls/Tabs.tsx", + "bytes": 3706, + "sha256": "a978deffdbb453dc3f15a149476fbcedc2a857c9e39d1677aa3dfc13423f42da" + }, + { + "path": "src/components/feedback/Alert.module.css", + "bytes": 701, + "sha256": "42437211c46949b798d0544e96983457d34ad17af5a251528a5000a393a7fd11" + }, + { + "path": "src/components/feedback/Alert.tsx", + "bytes": 1185, + "sha256": "743f79b9b1aec74db9d86655bd60d660e5ff8a2b9a2b446f744aa68a9aa401f1" + }, + { + "path": "src/components/feedback/Loading.module.css", + "bytes": 782, + "sha256": "2f8be2f2f54e1b1dae4307012ebc8d7e1b516f99241b99bcc0385632a5583717" + }, + { + "path": "src/components/feedback/Loading.tsx", + "bytes": 1046, + "sha256": "bf766131b06eff6f4bebd03a24839037a2583975256d535462d79b72f1f1214e" + }, + { + "path": "src/components/feedback/Progress.module.css", + "bytes": 298, + "sha256": "a959f3d0f793a16bd913edfbec2c744d037715fb8108dbd7d9f0a4aea2e57f27" + }, + { + "path": "src/components/feedback/Progress.tsx", + "bytes": 969, + "sha256": "a2ec6d0993ec49146170ecf655f23bbcdce7f944dc6b6ae4189676671e77bd08" + }, + { + "path": "src/components/feedback/StateMessage.module.css", + "bytes": 343, + "sha256": "90a4e7a10b9d39eeacd2b127c1c80d0550d3b364cc566667a59ccd6b2d6a436b" + }, + { + "path": "src/components/feedback/StateMessage.tsx", + "bytes": 729, + "sha256": "2f327960e793cefbf8bd501ef7948764390485708217d8f1934eb08c23260f5a" + }, + { + "path": "src/components/forms/ChoiceControls.module.css", + "bytes": 1780, + "sha256": "2ba09892007180658bcbe8621261f1508034398af16929df379684fcdb2850b9" + }, + { + "path": "src/components/forms/ChoiceControls.tsx", + "bytes": 1763, + "sha256": "ddee24498db928491fe82b4db2fa559a5c8b8867bf8d8d7ff1cbfa090218da4d" + }, + { + "path": "src/components/forms/ErrorSummary.module.css", + "bytes": 482, + "sha256": "581e9b4db50083165ec0d9f5e5ccc04d9d5c63696f387389f5a154e039873a87" + }, + { + "path": "src/components/forms/ErrorSummary.tsx", + "bytes": 801, + "sha256": "e5e876e863a894506d717e15953aee906bb54903d6f79df0d09a88e9f0f8108d" + }, + { + "path": "src/components/forms/FormField.module.css", + "bytes": 749, + "sha256": "7bb3eca2e81143d98fb6d6aa4da6cb15f6886ed8ad1885cc5ba83bd10155bdfd" + }, + { + "path": "src/components/forms/FormField.tsx", + "bytes": 1643, + "sha256": "a99559d7a5d4fcb1d442ef7401ae3bffb31f069b46d97855606111a84bbcc559" + }, + { + "path": "src/components/forms/TextInput.module.css", + "bytes": 942, + "sha256": "ebb94b50515bd443c97353b42b8414f1f8848c64e4ffeb1d0e10f517f6857a2b" + }, + { + "path": "src/components/forms/TextInput.tsx", + "bytes": 2571, + "sha256": "777d7acb6f8ad35c27c1c0401d29e02781bdfd2261951a9c3d2020f8976dfdb4" + }, + { + "path": "src/components/foundation/AccessibleIcon.tsx", + "bytes": 352, + "sha256": "cc68b314b3a704037460272f12a05e4185bfbcc08be62bf0facd0d1efa5a5f5c" + }, + { + "path": "src/components/foundation/BidiText.module.css", + "bytes": 35, + "sha256": "0d9480f398007b7e1395f25afd4ba982c6a5dcf299f796ee96fdc1302e5f8b06" + }, + { + "path": "src/components/foundation/BidiText.tsx", + "bytes": 581, + "sha256": "2ed6cb4a821ec1c345b532f51808045490ebaca935bfe93c4bde5fec9292d1f3" + }, + { + "path": "src/components/foundation/client-hooks.ts", + "bytes": 2387, + "sha256": "d4bd6fd5efdd4560d2e356447b24944ffb9ba8f96f57b82b63617923ec457e61" + }, + { + "path": "src/components/foundation/Icon.module.css", + "bytes": 371, + "sha256": "33b3daa50a01cfeb683ea1fa92831efb8d7fd08a7e150370027b88c99118cf4d" + }, + { + "path": "src/components/foundation/Icon.tsx", + "bytes": 3549, + "sha256": "65d3f672bb32bd84745d9f9afd1d1f006debf244aba9e4147c89b3346a4a8764" + }, + { + "path": "src/components/foundation/LiveRegion.module.css", + "bytes": 184, + "sha256": "f5793a73b271c20d10b389245651d7c79fae6417c29e55701e381c0025d20df0" + }, + { + "path": "src/components/foundation/LiveRegion.tsx", + "bytes": 403, + "sha256": "d64aad4af939e2696b955a0632b2869533409698ae3dffede57a18a776e64acf" + }, + { + "path": "src/components/foundation/StatusBadge.module.css", + "bytes": 799, + "sha256": "1f46642795f813e177956bbb25973238275b98b5febb311bb8e7f18597bb2fdb" + }, + { + "path": "src/components/foundation/StatusBadge.tsx", + "bytes": 677, + "sha256": "57eb1b5fdc93f40a3ce5599a4691e76a5976ec8a76d451e8c5008a68262a9706" + }, + { + "path": "src/components/foundation/VisuallyHidden.tsx", + "bytes": 409, + "sha256": "babb1e41cb3ee8691da2653446f8ea38ecce94bcf90645f797cd23f08152213d" + }, + { + "path": "src/components/integrations/DemoDialogHost.module.css", + "bytes": 1075, + "sha256": "f15803f7d41b1f1705a150070c5aaf81bc7c8b02f63256bedaa4d1ca830df074" + }, + { + "path": "src/components/integrations/DemoDialogHost.tsx", + "bytes": 15878, + "sha256": "bcf7b8324cf3a90b6300d3d3c41fd15c972181f1d9ec6f87c7755d11a31ec296" + }, + { + "path": "src/components/integrations/DemoTrigger.tsx", + "bytes": 1325, + "sha256": "52bf30616912131dc256dc1d0432574746f3937bbe1e447547ef020640c14e2e" + }, + { + "path": "src/components/layout/LayoutPrimitives.module.css", + "bytes": 1106, + "sha256": "4463342699789f2bc38703a7178b62138f10a255555347b692855ea07536dbcc" + }, + { + "path": "src/components/layout/LayoutPrimitives.tsx", + "bytes": 2161, + "sha256": "e3eceb28bcaec129f0324558fd2a13fbfe413615c16943cc691a2a993089de33" + }, + { + "path": "src/components/marketing/Comparison.module.css", + "bytes": 571, + "sha256": "60624d31af0a9fb00f7ebe7bb705d7e6287911133ccd993e6b192ba45da94aec" + }, + { + "path": "src/components/marketing/Comparison.tsx", + "bytes": 1540, + "sha256": "d61e9fbec9780b9252dc5653b3915291fa9c5fc9f58284664a53aa11718cc366" + }, + { + "path": "src/components/marketing/CTA.module.css", + "bytes": 695, + "sha256": "15f1bfe8ac1ce9af110c48985ac572b3369bfca946a02f9392b2adeed8a6eb14" + }, + { + "path": "src/components/marketing/CTA.tsx", + "bytes": 2041, + "sha256": "7e8d0f1e0476e792682131e3be2bbbed8e9f4311b9a161c5629cd186c7935d83" + }, + { + "path": "src/components/marketing/Evidence.module.css", + "bytes": 412, + "sha256": "a77743583735f99b9b30368987428585ef31f2aabd9c786529657036b82a21f3" + }, + { + "path": "src/components/marketing/Evidence.tsx", + "bytes": 2248, + "sha256": "9fd018f402ef8dc9c130d6a432f6874d74949bf06e2e4947fea62b41d86cec9c" + }, + { + "path": "src/components/marketing/FeatureCard.module.css", + "bytes": 348, + "sha256": "57c384aca1b2526e928463041164d522e69a69d065be274f6429464beb87136f" + }, + { + "path": "src/components/marketing/FeatureCard.tsx", + "bytes": 1444, + "sha256": "9c4bb352e1c4fffaa5566b2b5b190a2305b5935752205dee8b395a25ec9ba206" + }, + { + "path": "src/components/marketing/ProductPreview.module.css", + "bytes": 1272, + "sha256": "4901558b80324028252db79ff79ad7502d55554ca42d42b3b3e6ff4e4462a7dc" + }, + { + "path": "src/components/marketing/ProductPreview.tsx", + "bytes": 2137, + "sha256": "00dbcf972d8414cc79538a7552843ac93d28c97dec700d596d4a2571ea7f3c5c" + }, + { + "path": "src/components/marketing/SectionHeader.module.css", + "bytes": 216, + "sha256": "6f99ef1f489c765738189363fa8cce40b768db43be0645ac9532e670dd7fd31f" + }, + { + "path": "src/components/marketing/SectionHeader.tsx", + "bytes": 835, + "sha256": "8b9ab5d01fe69b25bd16574105feb74b9e70758df5a9daef32da5d29250760e9" + }, + { + "path": "src/components/marketing/SectionPatterns.module.css", + "bytes": 849, + "sha256": "3f27c9f58bb61032f3432b58fc83c20e619322e573a8460b36113b0116560027" + }, + { + "path": "src/components/marketing/SectionPatterns.tsx", + "bytes": 1004, + "sha256": "0ae2ee1c2a340db787e239a4222b9dd23eb8a688ff711497890570acd8b5eadf" + }, + { + "path": "src/components/marketing/Workflow.module.css", + "bytes": 967, + "sha256": "545620b59d472a2c696183a9e9827f3e7ed8682f462664eee1b6887313a60d56" + }, + { + "path": "src/components/marketing/Workflow.tsx", + "bytes": 1407, + "sha256": "2d64639b356b9f14e3250bff7489b78ee32eceb3e7c628cde5b8f5c68bfa8dce" + }, + { + "path": "src/components/media/MediaFrame.module.css", + "bytes": 634, + "sha256": "c59c885869c8f432c8047f926810b55a185d5f46e1b908a03ef12bc7ed8bf2b7" + }, + { + "path": "src/components/media/MediaFrame.tsx", + "bytes": 1266, + "sha256": "8ef160e29c45690e7dccc3abfd63126425b62cc56673c47a57e01daa00464bf3" + }, + { + "path": "src/components/navigation/Breadcrumbs.module.css", + "bytes": 314, + "sha256": "c981af1d7501fed7832714dfa480f6627928477ff954937c8849f0a9be280aca" + }, + { + "path": "src/components/navigation/Breadcrumbs.tsx", + "bytes": 1175, + "sha256": "359f1e615f25fc3e94c173409fc1946ff95a6fdb9209d86973c3ae96f20c014f" + }, + { + "path": "src/components/navigation/FooterLinkGroup.module.css", + "bytes": 181, + "sha256": "b2622a0cf021181427f219e5aa76a89fdb821240092725bae98282a70aedeb44" + }, + { + "path": "src/components/navigation/FooterLinkGroup.tsx", + "bytes": 775, + "sha256": "9363f1038f6a33840351a51d51374f02c6c1ef32a19cce009c166b141e3d3461" + }, + { + "path": "src/components/navigation/SectionNavigation.module.css", + "bytes": 409, + "sha256": "da941d8adf08ae0826651f3e801965025f4d958b982f3b22a2aa29315b204086" + }, + { + "path": "src/components/navigation/SectionNavigation.tsx", + "bytes": 759, + "sha256": "e86a7d478baa53d315685e79a62b2e8a50d8bbf87d8201f13ae6347844b5f847" + }, + { + "path": "src/components/overlays/Dialog.module.css", + "bytes": 1464, + "sha256": "d1d8402dd4cf4a2777d66d6d08a4859db3b841156c331a5784dd00428ed2ecc4" + }, + { + "path": "src/components/overlays/Dialog.tsx", + "bytes": 2721, + "sha256": "1e52fc4d7a96ee892b7b9c31e8d504831a468bce2b9df17ee576431146f49bf4" + }, + { + "path": "src/components/overlays/DropdownMenu.module.css", + "bytes": 899, + "sha256": "d0f6cab314861fca4f0db886dd9a8981361274503df1aaf123409731302ecdd2" + }, + { + "path": "src/components/overlays/DropdownMenu.tsx", + "bytes": 2776, + "sha256": "db44d077ddb5a05457f1a60cc33383e3fab4ecb6cf0729cef55b21e4dabb58e6" + }, + { + "path": "src/components/overlays/Tooltip.module.css", + "bytes": 1103, + "sha256": "650d232057f795a046e8a7d04109ddaffe10dbbe71ce8796661bc63bb2edf931" + }, + { + "path": "src/components/overlays/Tooltip.tsx", + "bytes": 470, + "sha256": "839d3d08ecc8712eed9f84b3d69cb7e0f43fe450c0454015b85c6d83045115e0" + }, + { + "path": "src/components/surfaces/Callout.module.css", + "bytes": 374, + "sha256": "2f8c824f873308c30bb4612360b30a8807f4718c5820da5068cda35a17809783" + }, + { + "path": "src/components/surfaces/Callout.tsx", + "bytes": 496, + "sha256": "6eff5ca0fa0471ec35463de3e6a632c390ce68685e6dc10f8ea7ba36cb52cec4" + }, + { + "path": "src/components/surfaces/Card.module.css", + "bytes": 977, + "sha256": "014884cdeb170b200f30176e71ac35a01d491048e37c12901063d31fb9ed04d1" + }, + { + "path": "src/components/surfaces/Card.tsx", + "bytes": 1034, + "sha256": "76f6e68536848df8955031f352bee4787d10f191bb486d483438559c2babb4ee" + }, + { + "path": "src/components/typography/Typography.module.css", + "bytes": 1393, + "sha256": "bc1e060c8cdaaf977b787dc1a9a11d08eca8ff3100945d47ca82180e828a47b6" + }, + { + "path": "src/components/typography/Typography.tsx", + "bytes": 1676, + "sha256": "80ec8b42765b90b6558486557cdd677e528f9507fa3bfd205b91cfb52422842c" + }, + { + "path": "src/content/development/component-lab.ts", + "bytes": 14891, + "sha256": "0d90fb8aaac23cd12664ac98d7277d3b32eaf19d19db65ff308c46d5c89cd9b3" + }, + { + "path": "src/content/homepage-model.ts", + "bytes": 7885, + "sha256": "41b10af10f4b9351e994d22302704c9c118db7b91a896c992fa3e4a6e1870bc8" + }, + { + "path": "src/content/locales/ar/homepage.json", + "bytes": 18727, + "sha256": "18ee401ff18c52c033bb0a21a4aea3adf0425094f0decda453edd2a0e6d69c8d" + }, + { + "path": "src/content/locales/ar/shell.json", + "bytes": 4917, + "sha256": "48360fff06aabe1079a7149fc420a3667d25dd2ae67ec38c60f8b02e4a13bb2d" + }, + { + "path": "src/content/locales/en/homepage.json", + "bytes": 13772, + "sha256": "fa2f5c3e05a84888791c84d8edf65a56e2254655c951851ed428e38fc14d3191" + }, + { + "path": "src/content/locales/en/shell.json", + "bytes": 3682, + "sha256": "359f2ca2d531eab3a7d07f98d78c7f17989e7dc6581c353816979efb1d0734ea" + }, + { + "path": "src/content/locales/fr/homepage.json", + "bytes": 15718, + "sha256": "0ae27d726c5df34f8845c08b302ae8cfe3927a21af7076b8f46abfbeeb116f23" + }, + { + "path": "src/content/locales/fr/shell.json", + "bytes": 4271, + "sha256": "24624347f923a5d166c7c19ee79e6a7fa4e083be994ce5ea48bae588f95e92af" + }, + { + "path": "src/contracts/phase9/analytics-contract.ts", + "bytes": 918, + "sha256": "d79b32503a5f8346816c647b8a7f45a62468b96f4fc9525d6d5147b5d2f2ec45" + }, + { + "path": "src/contracts/phase9/analytics-event-spec.csv", + "bytes": 1713, + "sha256": "1282ebca5b031f6267f8139033db437e30b62ac391d25823c8a4783b64151008" + }, + { + "path": "src/contracts/phase9/component-contracts.ts", + "bytes": 3041, + "sha256": "45fb0222d99308b2f28014572316b13c2d7308bc16b1bd02f63b6e2257148399" + }, + { + "path": "src/contracts/phase9/demo-form-contract.ts", + "bytes": 699, + "sha256": "073cf70224f93312d177f77abd7987704205628209e30c44824ae45f929ee59e" + }, + { + "path": "src/contracts/phase9/design-tokens.json", + "bytes": 3771, + "sha256": "470d7bc9d4a466cce4e51f0fdc21fe199ec5b0d4007f5063704c523ce1b9ef0c" + }, + { + "path": "src/contracts/phase9/performance-budgets.json", + "bytes": 815, + "sha256": "e1679ce45d8a1225c46c085c7533d3230a41279c32d0812de5c5f05cb55eefa8" + }, + { + "path": "src/contracts/phase9/route-manifest.json", + "bytes": 1433, + "sha256": "e08ac94ba1f3899bb02dfa934695f530d1089f9f03b0fadaa0feabd466ad8ec4" + }, + { + "path": "src/contracts/phase9/visual-regression-scenarios.json", + "bytes": 1209, + "sha256": "27d961c33c32775485475f7037b8d3bbd13f634b65fe2f59d6eea898860edf5f" + }, + { + "path": "src/lib/analytics/client.ts", + "bytes": 831, + "sha256": "582efdc793da2930e52df2b87bf3e48876d7e03b206062c867836a7d36532763" + }, + { + "path": "src/lib/analytics/events.ts", + "bytes": 2097, + "sha256": "cc98e599c7783c993362ca2bac420ff774c56cc006026648df8086ecc6118ebb" + }, + { + "path": "src/lib/components/classNames.ts", + "bytes": 135, + "sha256": "9ec04c6ee51488fbcfebcace04c9e1ea9de3fda7cbc69e233b0bce353ad77824" + }, + { + "path": "src/lib/demo/adapters/blocked.ts", + "bytes": 388, + "sha256": "ebed470f8546d729bc626e9c427315acb17f262a190871f02c9d6e9bfc4535e2" + }, + { + "path": "src/lib/demo/adapters/index.ts", + "bytes": 746, + "sha256": "fe6ecd9a1dcee482ede19d6319b462fbde7cebbe822bf85df8128aaca887752f" + }, + { + "path": "src/lib/demo/adapters/local.ts", + "bytes": 1403, + "sha256": "09f48c5e257dc51aa87932d39cf640f971520bf29105ccdc25030efde8cf34cf" + }, + { + "path": "src/lib/demo/adapters/types.ts", + "bytes": 709, + "sha256": "1935ebf701b5fa7b8e91f6871607e397d1d0fb4c228b3e990740e6238a3da350" + }, + { + "path": "src/lib/demo/idempotency.ts", + "bytes": 1191, + "sha256": "7be87b7e0a5993dc3258ba397eed2506adfca04ee65498d85588d566ec3569f7" + }, + { + "path": "src/lib/demo/redaction.ts", + "bytes": 867, + "sha256": "82fa6ba5a7056826374a5e6633db4245108a9bb6363fed22c3093ebddd3e3384" + }, + { + "path": "src/lib/demo/schema.ts", + "bytes": 2778, + "sha256": "87409564c90edd84807870ff420adb10d09512d6be105e0c8d3eb9159c858a47" + }, + { + "path": "src/lib/demo/service.ts", + "bytes": 2381, + "sha256": "aec47fa5858dce9ef1f73c0de1b4dfbe7141d3bc619ec0ed0ea0dbf4cf482907" + }, + { + "path": "src/lib/integrations/destinations.ts", + "bytes": 4461, + "sha256": "99ea9479cce8d5170a188e6696b87a3d58cabe257de4280d9c059a96c542829e" + }, + { + "path": "src/lib/integrations/environment.ts", + "bytes": 4053, + "sha256": "b0c164af55ce6e88f214b50a4de4e634cf242fb0e9ce12ea8857e999e4e4dc60" + }, + { + "path": "src/lib/integrations/feature-flags.ts", + "bytes": 770, + "sha256": "947f1f1dfd0686a94a1896ff6b7c81b607881e1a5c601afb4f6b2f6eb0e6c725" + }, + { + "path": "src/lib/localization/client-messages.ts", + "bytes": 499, + "sha256": "402d73487e9c57e7f68b2b91b77de8cae27027bac56ac344f310eacd0bb41bd3" + }, + { + "path": "src/lib/localization/client.ts", + "bytes": 593, + "sha256": "bc1ae4b418151cd7b0816b655bf09a4f640ac09540016468e32376594001eb04" + }, + { + "path": "src/lib/localization/config.ts", + "bytes": 4758, + "sha256": "5658aebdfbb912e86b20cef052f6f2784ce64ea89c82fa3d2c05a3a32ec03ed8" + }, + { + "path": "src/lib/localization/format.ts", + "bytes": 2327, + "sha256": "a8f9fbe9bdb5838a910e86897ed13ef9bbfdca6e86514e466bc6a212c236bbfc" + }, + { + "path": "src/lib/localization/messages.ts", + "bytes": 878, + "sha256": "9307df65a80b08e7e1ea7c4e16358fc5fcbde299a00810076bcb36d0a13f9ced" + }, + { + "path": "src/lib/localization/site-origin.ts", + "bytes": 771, + "sha256": "40400ce29fc4adbd9c4490b456968e41fc7596d77ac5bea1c65179e0e4e760ff" + }, + { + "path": "src/lib/metadata/build-metadata.ts", + "bytes": 1322, + "sha256": "3496f11871e635ea6622746de07d74de63a09e648bae9ade02f7c75f042cde7e" + }, + { + "path": "src/lib/security/content-type.ts", + "bytes": 385, + "sha256": "8179360d02d132a2d386a89523a470455977544b2286628cff4c60e50d71105a" + }, + { + "path": "src/lib/security/csp.ts", + "bytes": 830, + "sha256": "f9244e061cc397fbe8720a055e5415b6df34e6c74d0c439ae8d25054d1239c5e" + }, + { + "path": "src/lib/theme/bootstrap-script.ts", + "bytes": 755, + "sha256": "ad1ac642ca61e133f41a5e5b3c062f1b23046f24a58565c6baaacf8c9b261f12" + }, + { + "path": "src/lib/theme/client.ts", + "bytes": 1368, + "sha256": "8bdad550d093755a6f1a20f8b5b59b9d19e0dbd78dbf24c3f4eda5a6dec5811f" + }, + { + "path": "src/lib/theme/config.ts", + "bytes": 821, + "sha256": "c04cd00ce7838fc964d5bdbfaa4c2380f7cd774a9d754987946c97ee8849e60c" + }, + { + "path": "src/proxy.ts", + "bytes": 2625, + "sha256": "522ad1c3650646e652099d61b403075000b4d6e12272df381f5653dbd4745dea" + }, + { + "path": "src/styles/component-tokens.css", + "bytes": 5898, + "sha256": "70665f8912d1e45cbcd1a2674a5cb547395391dae053d0951da157ad88d7de51" + }, + { + "path": "src/styles/globals.css", + "bytes": 2472, + "sha256": "15c39da4ef19e6127bd7f40db21a98d7d2599463af1a13bbd2c3ce786a7ef385" + }, + { + "path": "src/styles/tokens.css", + "bytes": 3553, + "sha256": "99912762e078bfc78b4878fc46b8c7d03d90c073e9c236942a58d83f6585a1b9" + }, + { + "path": "tests/a11y/component-system.a11y.spec.ts", + "bytes": 422, + "sha256": "6324716ef093a4c61601721f36ef652fc40db10f8e93af67ba01ab880d266285" + }, + { + "path": "tests/a11y/homepage.a11y.spec.ts", + "bytes": 901, + "sha256": "b096866589cdc74dba4224cc4b8dd2af045ff33c04168d6e3de0a9f8b42152c8" + }, + { + "path": "tests/a11y/integrations/demo-workflow.a11y.spec.ts", + "bytes": 616, + "sha256": "3365258ce02878f7ec7ab3171e16a6989ba904d516d4c8ae818631706da00760" + }, + { + "path": "tests/a11y/shell.a11y.spec.ts", + "bytes": 781, + "sha256": "9f6299337a822d8e4f6783cbfbb3e5da02e42bcca99d8e4519d7f0193072b205" + }, + { + "path": "tests/browser/component-system.spec.ts", + "bytes": 1714, + "sha256": "09bd3833504f68a55952a69299601dbacb3aa3f9e42c3abf9ee4103ac5b0fd32" + }, + { + "path": "tests/browser/homepage.spec.ts", + "bytes": 2100, + "sha256": "a230acbefa587e81a5e35ef3b56fa6cb5b570190f2d661df6f80e522845267c9" + }, + { + "path": "tests/browser/integrations/demo-workflow.spec.ts", + "bytes": 3415, + "sha256": "8984e7581a5b2fd140c63e120f0ea7cf3373a151705f65e16cee424449e3fb06" + }, + { + "path": "tests/browser/navigation.spec.ts", + "bytes": 1120, + "sha256": "7b4aa8bcb7b5c2f09fe82f6c4a5405673e69d45fb5f0833cbe37ee1d237c4c7a" + }, + { + "path": "tests/browser/no-javascript.spec.ts", + "bytes": 568, + "sha256": "a57739c1d0c7c45960129256218a9e95b87ac80a17fc7dee8bd4c95295280fbc" + }, + { + "path": "tests/browser/responsive.spec.ts", + "bytes": 865, + "sha256": "1730baaf20abfe6c47b514a2290f083e28fedd639bc9663e79cddc3f8330eb97" + }, + { + "path": "tests/browser/shell.spec.ts", + "bytes": 2425, + "sha256": "bdd0ce3d9f5e53ff485c45a3f9442e28fb6157d08cb0eccf02268351e18202e6" + }, + { + "path": "tests/browser/text-expansion.spec.ts", + "bytes": 712, + "sha256": "27459e2864eb747d839966b2cb66f4f7527175c953deae9893116a6aa0cf9540" + }, + { + "path": "tests/browser/theme-csp.spec.ts", + "bytes": 2362, + "sha256": "7f9824a86fe70143ff380e82e51076b88a0e466af399ef8a5de4b88c5483d646" + }, + { + "path": "tests/fixtures/component-system/component-matrix.json", + "bytes": 453, + "sha256": "baf694a484a6d769bd9c534e030cf873852612fb60dfe82dc854ea893e92a5a6" + }, + { + "path": "tests/fixtures/foundation-matrix.json", + "bytes": 571, + "sha256": "b5487f1c3970b3413549c7b7500dfc4fb4541cf312ff86b570fa1de56d163ab3" + }, + { + "path": "tests/fixtures/README.md", + "bytes": 495, + "sha256": "e3dba7bdd085bbb1fa43a6b33a94e66641b4437cd01bcfaaaf9c329eee93d3ec" + }, + { + "path": "tests/integration/demo-service.test.ts", + "bytes": 3265, + "sha256": "58efc6f4cf8e5e47d0f961db554d8c9b70942662dbccb92301f02a955da689b4" + }, + { + "path": "tests/setup.ts", + "bytes": 43, + "sha256": "91a3c8962a0edcb956206a501d943fe99e1c78c6d4d8b5c9a948a3362c75978c" + }, + { + "path": "tests/types/component-contracts.test-d.tsx", + "bytes": 432, + "sha256": "3a639ef230284c29901abf6b5cc625a515f94853701a57a84b27ac4168352f98" + }, + { + "path": "tests/unit/components/actions.test.tsx", + "bytes": 1366, + "sha256": "891c69eab0e33883408ad5e07b302b2e59dfde1c6eab449f82f0573e4359a835" + }, + { + "path": "tests/unit/components/controls.test.tsx", + "bytes": 1299, + "sha256": "52b52f6603290d5c060e943966e0ba5ec7572f0a914ad295a781bd0657d08b63" + }, + { + "path": "tests/unit/components/evidence.test.tsx", + "bytes": 1276, + "sha256": "0d45214874c8810a57adfc6f5d3b83f9927fc4c9faa930e66d614b041f7e0305" + }, + { + "path": "tests/unit/components/forms.test.tsx", + "bytes": 1349, + "sha256": "71866e0245af2c6f4c8ef955000db91c796142f68f5235dfe22064d381b453f1" + }, + { + "path": "tests/unit/csp.test.ts", + "bytes": 969, + "sha256": "18e4aa4145976102239e92a9c147cc8f0b8442b1bce37b84888246b137280de9" + }, + { + "path": "tests/unit/format.test.ts", + "bytes": 1488, + "sha256": "e7bc5eb89fa3017739180208a1dcfb3f03f3cb3077997dfc7e6e03faa68a9ad1" + }, + { + "path": "tests/unit/homepage-content.test.ts", + "bytes": 1752, + "sha256": "3755d445f9420d2bd8044a712c2ff4dd16d562d93bbe4f5b76b4d8b838f0f803" + }, + { + "path": "tests/unit/integrations/analytics.test.ts", + "bytes": 1020, + "sha256": "2ab2f3e15a7f043b218f61b6ea62d345f214737fb02485d2cc50209f356b8574" + }, + { + "path": "tests/unit/integrations/content-type.test.ts", + "bytes": 570, + "sha256": "6c55b144602bae6ad9bfb9f09f2aa752dd46dc32e662aaa4642d045da22c7731" + }, + { + "path": "tests/unit/integrations/demo-schema.test.ts", + "bytes": 1527, + "sha256": "eafc7ebccdda7160ca9e4d2119c97a5a801f70462ccd9a186b12c2b6e57f3a05" + }, + { + "path": "tests/unit/integrations/destinations.test.ts", + "bytes": 1211, + "sha256": "5d2c512f707932aa5684c14d93032ca146f9069a5e3472961c237d00f99145e5" + }, + { + "path": "tests/unit/integrations/redaction.test.ts", + "bytes": 742, + "sha256": "d4d5e1f908fd2e433e9a45523d242eff7bad47f43fa400911d31587b47d84e21" + }, + { + "path": "tests/unit/localization.test.ts", + "bytes": 2155, + "sha256": "b2e65d904e9ee8018a837ba0c275287d98b44341b9bca65abdb754c09f897511" + }, + { + "path": "tests/unit/theme.test.ts", + "bytes": 734, + "sha256": "45f25fd23f69af3df199473053c47fe219c88fb36a58cffac20a125bdbd47433" + }, + { + "path": "tests/visual/component-system.visual.spec.ts", + "bytes": 899, + "sha256": "983ee872b9b7a1993ccaafb8c3ea2ee4fb82cf562a5f9e1521de29faa307c8e7" + }, + { + "path": "tests/visual/homepage.visual.spec.ts", + "bytes": 1336, + "sha256": "fe75876ca2073be31b0c5423b5f329dde0ea19fa065bae514bfb4758544de97f" + }, + { + "path": "tests/visual/integrations.visual.spec.ts", + "bytes": 984, + "sha256": "71896bfb083931ab8bf434dd85911cc50c82e854744b871ff31c1f3f4ad650a5" + }, + { + "path": "tests/visual/README.md", + "bytes": 525, + "sha256": "27327d51bda7fc0725a73f6ebb06db1cfa84abd3508985edbb0723da66d18667" + }, + { + "path": "tests/visual/shell.visual.spec.ts", + "bytes": 2273, + "sha256": "07bd6dd398cbab81176ea19741eb8737859bcacaa313a8c17308cd47f736ea5b" + }, + { + "path": "tsconfig.json", + "bytes": 1100, + "sha256": "f1e1e6ec6ae158e72060af04dd664d5ec9389656e8326f99b10a446bc9e31443" + }, + { + "path": "vitest.config.ts", + "bytes": 699, + "sha256": "c2ac8f10ad2894df28a93e3d2bba2c213f24b9a044db25307078648e010dc3d5" + }, + { + "path": "vitest.integration.config.ts", + "bytes": 319, + "sha256": "17e7ff31793ae0e69413c2c6372e02ebe1b8aff77e95a5d1344b9d08e6a2fa4a" + } + ] +} diff --git a/README.md b/README.md index e1affe7..0bf26c6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,124 @@ -# Rental-operations-platform +# RentalDriveGo Web -Run every rental operation from one connected platform. -Connect reservations, fleet availability, contracts, payments, and vehicle returns without forcing teams to reconcile fragmented tools. \ No newline at end of file +Multilingual public website and lead-capture boundary for RentalDriveGo, a SaaS operating platform for rental-car companies. + +This repository contains the Phase 15 release-readiness candidate. It includes the Phase 14 homepage and integration layer, Phase 15 hardening fixes, dependency-free validation, and a structured evidence package. It is **not approved for production release**. + +## Current release recommendation + +**Not ready for Phase 16.** + +The Phase 15 review fixed four repository defects and the current dependency-free validation passes, but the pinned clean installation and the dependency-backed, browser, assistive-technology, performance, deployment, and rollback gates were not executable in the supplied validation environment. Production business, legal, content, destination, vendor, credential, observability, and operational approvals also remain open. + +Do not convert a blocked test into a pass merely because a spreadsheet would look friendlier. That is how defects acquire release notes instead of fixes. + +## Implemented product scope + +- English, French, and Arabic locale-prefixed routes +- server-rendered `lang` and document-level LTR/RTL direction +- light, dark, and system themes with CSP-compatible pre-paint handling +- responsive public homepage and reusable component system +- localized demo dialog and client/server form validation +- `/api/demo` submission boundary with exact JSON media-type validation +- safe deterministic development and test adapters +- typed destination, environment, feature-flag, consent, analytics, and integration contracts +- privacy-safe analytics allowlists and redaction controls +- timeout, failure normalization, idempotency, duplicate, and abuse-control foundations +- localized metadata, canonical, reciprocal `hreflang`, Open Graph, robots, and pending-destination behavior +- unit, integration, browser, accessibility, visual, and failure-simulation test definitions +- Phase 15 defect, command, risk, release-gate, and evidence records + +The repository intentionally does not activate unapproved production CRM, scheduler, email, analytics, consent, login, pricing, legal, hosting, DNS, monitoring, or production credential configuration. + +## Required runtime + +- Node.js `24.17.0` +- pnpm `11.9.0` +- Next.js `16.2.9` +- React `19.2.7` + +Use the exact versions in `.node-version`, `.nvmrc`, `package.json`, and `pnpm-lock.yaml`. Do not rewrite the lockfile during release validation. + +## Clean setup + +```bash +corepack enable +corepack prepare pnpm@11.9.0 --activate +pnpm install --frozen-lockfile +cp .env.example .env.local +``` + +Development routes: + +- `/en` +- `/fr` +- `/ar` + +Root `/` redirects using the locale cookie, then `Accept-Language`, then English. + +## Required validation sequence + +Run the complete sequence on the pinned toolchain from a clean checkout: + +```bash +pnpm install --frozen-lockfile +pnpm validate +pnpm validate:phase15 +pnpm format:check +pnpm lint +pnpm typecheck +pnpm test:unit +pnpm test:integration +pnpm test:security +pnpm test:privacy +SITE_ORIGIN=https://approved-non-production.example \ +PUBLIC_RELEASE_APPROVED=false \ +pnpm build +pnpm test:browser +pnpm test:a11y +pnpm test:visual +pnpm test:e2e +pnpm audit --audit-level low +pnpm manifest:generate +pnpm validate:package +``` + +Browser, accessibility, visual, performance, deployment, rollback, and human review must use the matrices and evidence requirements under `docs/phase15`. Visual baselines require manual review; a stable screenshot can still be a stable defect. + +## Release safety + +`PUBLIC_RELEASE_APPROVED` defaults to `false`. While false, pages emit `noindex` and `robots.txt` disallows crawling. + +Before release: + +- close or explicitly approve every Critical and High release blocker through an accountable owner; +- complete pinned clean-install, build, unit, integration, browser, accessibility, visual, performance, deployment, rollback, and smoke evidence; +- approve final claims, copy, legal content, destinations, vendors, consent, analytics, credentials, assets, and operational ownership; +- rerun targeted Phase 15 regression after any Phase 16 change affecting components, routing, validation, data handling, consent, analytics, integrations, accessibility, RTL, theme, or performance-critical assets. + +## Phase 15 evidence + +Start here: + +- Implementation report: `docs/PHASE_15_IMPLEMENTATION_REPORT_v1.0.md` +- Final recommendation: `docs/phase15/FINAL_RELEASE_RECOMMENDATION_v1.0.md` +- Phase 16 handoff: `docs/PHASE_16_HANDOFF_v1.0.md` +- Command matrix: `docs/phase15/COMMAND_MATRIX_v1.0.csv` +- Defect register: `docs/phase15/DEFECT_REGISTER_v1.0.csv` +- Release-gate matrix: `docs/phase15/RELEASE_GATE_MATRIX_v1.0.csv` +- Risk-acceptance register: `docs/phase15/RISK_ACCEPTANCE_REGISTER_v1.0.csv` +- Updated cumulative issue register: `docs/IMPLEMENTATION_ISSUE_REGISTER_v1.5.csv` +- Updated decision log: `docs/DECISION_LOG_v15.0.md` +- Static audit evidence: `docs/quality/PHASE_15_STATIC_AUDIT_RESULTS_v1.0.md` +- File-change inventory: `docs/quality/PHASE_15_FILE_CHANGES_v1.0.txt` +- Package manifest: `PHASE_15_PACKAGE_MANIFEST_v1.0.json` + +Historical Phase 9 through Phase 14 records remain in `contracts` and `docs`. They are useful traceability inputs, not substitutes for current Phase 15 execution evidence. + +## Contribution rules + +See `CONTRIBUTING.md`. Do not modify immutable Phase 9 contracts, hide failures with broad suppressions, commit real lead data, or activate production integrations without the approvals and regression required by the Phase 16 handoff. + +## Phase 16 release status + +Phase 16 review status: **Launch aborted before deployment**. Dependency-free validation passed, but exact-toolchain, dependency-backed, browser, human, legal, operational, infrastructure, and production gates remain blocked. See `docs/PHASE_16_IMPLEMENTATION_AND_LAUNCH_REPORT_v1.0.md` and `docs/phase16/FINAL_LAUNCH_STATUS_v1.0.md`. diff --git a/docs/DECISION_LOG_v14.0.md b/docs/DECISION_LOG_v14.0.md new file mode 100644 index 0000000..30059ca --- /dev/null +++ b/docs/DECISION_LOG_v14.0.md @@ -0,0 +1,36 @@ +# RentalDriveGo Decision Log v14.0 + +Date: 2026-06-25 +Scope: Demo workflow, integration boundaries, analytics, consent, and destinations + +## D14-001: Use the approved dialog interaction with one shared host + +Status: Accepted. Header, mobile, hero, final CTA, and footer triggers open one localized native dialog. No separate conflicting form implementation was created. + +## D14-002: Keep production submission blocked + +Status: Accepted. The repository lacks an approved CRM, legal basis, consent text, retention policy, and operational owner. Production activation therefore fails environment validation. + +## D14-003: Provide a discard-only local adapter + +Status: Accepted. Development and explicit loopback tests exercise the complete client/server/adapter workflow without storing or transmitting a real lead. Success copy says exactly that. + +## D14-004: Preserve the Phase 9 form contract + +Status: Accepted. No speculative fields were added. Fleet-size values match the immutable contract rather than the older prototype labels. + +## D14-005: Coalesce transport retries by idempotency key + +Status: Accepted. The local coordinator stores only the key and normalized result for a bounded TTL. A distributed production mechanism remains vendor/architecture dependent. + +## D14-006: Disable analytics rather than select a vendor by vibes + +Status: Accepted. Approved Phase 9 event names are instrumented through a strict consent-gated test sink. No network provider, cookie, storage identifier, or personal data is used. + +## D14-007: Preserve unresolved destinations as explicit states + +Status: Accepted. Contact sales, product tour, login, support, cookie settings, pricing publication, and legal content remain blocked or placeholder states tied to issue IDs. + +## D14-008: Do not claim unexecuted validation + +Status: Accepted. Static Node validators may be executed. Package, TypeScript, unit, integration, browser, axe, visual, build, audit, and performance results are recorded only if actually run. diff --git a/docs/DECISION_LOG_v15.0.md b/docs/DECISION_LOG_v15.0.md new file mode 100644 index 0000000..6753208 --- /dev/null +++ b/docs/DECISION_LOG_v15.0.md @@ -0,0 +1,39 @@ +# RentalDriveGo Decision Log v15.0 + +## D15-001 — Evidence must remain distinguishable from authored coverage + +**Decision:** A test definition, historical Phase 14 result, or static source review is not current Phase 15 execution evidence. Dependency-backed, browser, assistive-technology, performance, deployment, and rollback gates remain blocked until run against the final Phase 15 manifest. + +**Reason:** The supplied archive has no installed dependencies or Git metadata, and the execution host cannot resolve the package registry. Calling those gates passed would be fiction with nicer formatting. + +## D15-002 — JSON media types are matched exactly + +**Decision:** The demo API accepts `application/json` with optional parameters and rejects prefix look-alikes such as `application/jsonp`. + +**Reason:** A security boundary should parse the media type, not reward strings that begin correctly and then wander off into nonsense. + +## D15-003 — Canonical visual baselines use pinned Chromium + +**Decision:** Snapshot suites are restricted to Chromium, while Firefox, WebKit, mobile Chrome, and mobile Safari remain functional and accessibility targets. + +**Reason:** Cross-engine screenshots are not interchangeable baselines. Rendering differences should be reviewed deliberately, not generated accidentally. + +## D15-004 — CI explicitly runs integration coverage + +**Decision:** CI runs the demo-service integration suite in addition to unit, static security/privacy, browser, accessibility, and visual slices. + +**Reason:** The primary conversion boundary cannot be protected solely by unit tests and optimistic intent. + +## D15-005 — No accepted release exceptions were created + +**Decision:** Critical and High unresolved gates remain blockers. No risk acceptance was inferred from prior work, local-only behavior, or the existence of test files. + +## D15-006 — Phase 15 recommendation is Not ready for Phase 16 + +**Decision:** The repository is **Not ready for Phase 16** because current clean-room installation, build, tests, browser/AT validation, performance, deployment rehearsal, rollback rehearsal, and multiple business/legal production gates remain unresolved. + +## D15-007 — Artifact identity uses the manifest until a real commit exists + +**Decision:** The Phase 15 package manifest and ZIP checksum identify this delivered artifact. Phase 16 must record a real source-control commit SHA before release-candidate freeze. + +**Reason:** The supplied ZIP contained no `.git` metadata. Inventing a commit identifier would be a particularly pointless form of confidence theater. diff --git a/docs/DECISION_LOG_v16.0.md b/docs/DECISION_LOG_v16.0.md new file mode 100644 index 0000000..ea64e15 --- /dev/null +++ b/docs/DECISION_LOG_v16.0.md @@ -0,0 +1,28 @@ +# Decision Log v16.0 + +## D16-001: Uphold Phase 15 no-go recommendation + +- Decision: Rejected for launch +- Date: 2026-06-25 +- Reason: 1 Critical and 21 High cumulative issues remain unresolved, with missing executable, human, business, legal, and production evidence. + +## D16-002: Preserve all optional production integrations as disabled + +- Decision: Approved with documented conditions +- Condition: Demo submission, CRM, scheduler, analytics, marketing consent, product tour, pricing destination, and login destination remain disabled until their explicit gates are approved. + +## D16-003: Do not fabricate approvals or production configuration + +- Decision: Approved +- Result: Every missing approval, credential, vendor, domain, owner, and live result is recorded as blocked pending evidence. + +## D16-004: Accept dependency-free validation as partial evidence only + +- Decision: Approved with documented conditions +- Evidence: 18 local commands passed under Node 22.16.0. +- Limitation: This does not satisfy the pinned Node 24.17.0 and pnpm 11.9.0 release gate or any dependency-backed/browser/manual/production gate. + +## D16-005: Abort launch before deployment + +- Decision: Approved +- Result: No deployment, DNS cutover, live lead submission, production vendor call, or production mutation was performed. diff --git a/docs/IMPLEMENTATION_ISSUE_REGISTER_v1.4.csv b/docs/IMPLEMENTATION_ISSUE_REGISTER_v1.4.csv new file mode 100644 index 0000000..a6beb0c --- /dev/null +++ b/docs/IMPLEMENTATION_ISSUE_REGISTER_v1.4.csv @@ -0,0 +1,43 @@ +Issue_ID,Severity,Area,Status,Code_path_or_control,Release_gate,Owner,Exit_criteria,Notes +P9-001,Critical,Participant acceptance,Inherited open,contracts/phase9/research; docs/IMPLEMENTATION_ISSUE_REGISTER_v1.0.csv,Before release,Research,"Run required pilot, core, and accessibility cohorts; fix/retest S0/S1 findings.",No production claim of usability acceptance. +P9-002,High,CRM integration,Inherited open,src/contracts/phase9/demo-form-contract.ts; no endpoint implemented,Before production integration,Sales Ops + Engineering,"Approve and integration-test endpoint, routing, duplicates, idempotency, retry, spam controls, monitoring, and ownership.",Demo submission remains unimplemented. +P9-003,High,Legal consent,Inherited open,No production form or legal copy implemented,Before production form,Legal,"Approve localized consent, privacy linkage, retention, and market requirements.",Suppressed rather than guessed. +P9-004,High,Analytics and consent,Inherited open,src/contracts/phase9/analytics-contract.ts; no vendor adapter,Before beta,Analytics + Legal,"Approve vendor, event authority, consent policy, retention, replay policy, and non-PII payloads.",Contract imported; collection disabled. +P9-005,High,Native linguistic review,Inherited open,"src/content/locales/{fr,ar}; CI locale parity",Before release,Content + Localization,"Native review of all visible copy, metadata, errors, and bidi samples.",Mechanical parity is not linguistic approval. +P9-006,High,Illustrative product preview,Inherited open,No preview shipped,Before release,Product + Design,Approve illustration or provide governed product capture.,Suppressed. +P9-007,High,Multi-location claim,Inherited open,scripts/validate-prohibited-content.mjs; visible shell only,Before beta,Product,Approve capability or revise/suppress affected copy.,No new claim introduced. +P9-008,High,Pricing model,Inherited open,No pricing route or component,Before pricing publication,Commercial,Approve public pricing and limits in writing.,Quote-only posture preserved by omission. +P9-009,High,Security evidence,Inherited open,No public security claims,Before claims publish,Security + Legal,"Provide scoped evidence, approvals, and expiry dates.","Security headers are implementation controls, not marketing claims." +P9-010,Medium,Framework selection,Resolved in Phase 10,docs/architecture/ADR-0001_REPOSITORY_FOUNDATION.md,Scaffold merge,Architecture,Architecture decision accepted and implemented.,"Next.js App Router SSR, strict TypeScript, CSS Modules, OCI target." +P9-011,Medium,Browser policy owner,Inherited open,.github/workflows/ci.yml; playwright.config.ts,Before beta,Product + Engineering,"Approve supported browser matrix, owner, telemetry, and exception/retirement process.","Configured matrix is a test baseline, not a policy claim." +P9-012,Medium,Product tour medium,Inherited open,No product tour implemented,Before release,Product + Marketing,Approve accessible localized dialog fallback or media/transcript.,Suppressed. +P9-013,Medium,Markets and formatting,Inherited open,src/lib/localization; no currency/phone market assumptions,Before regional campaign,Product + Legal,"Define markets, currency, timezone, phone, and jurisdiction independently of locale.",Locale is not treated as market. +P9-014,Medium,Login destination,Inherited open,No login link implemented,Before release,Product + Engineering,"Approve destination, security behavior, locale return path, and analytics.",Suppressed. +P9-015,Medium,Alternate sales contact,Inherited open,No secondary contact destination,Before release,Sales Ops,Provide approved contact route or approve suppression.,Placeholder address not imported into runtime. +P9-016,Medium,Customer evidence,Inherited open,"No logos, metrics, testimonials, or case studies",Optional post-launch,Marketing + Legal,Provide attributable evidence records and approvals.,Suppressed. +P9-017,Low,Exact dependency versions,Resolved in Phase 10,package.json; pnpm-lock.yaml; docs/DEPENDENCY_MANIFEST_v1.0.md,Scaffold,Engineering,"Exact versions pinned, audited, locked, and automated update review enabled.",No floating direct dependency ranges. +P10-001,High,Canonical production origin,Open,src/lib/localization/site-origin.ts; .env.example,Before production deployment,Product + Infrastructure,Approve public domain/origin and configure SITE_ORIGIN in production.,Build fails closed in production when missing. +P10-002,High,RentalDriveGo visual identity,Open,public/.gitkeep; docs/BRAND_MIGRATION_v1.0.md,Before public release,Product + Design,Approve and supply final accessible logo assets for light/dark contexts.,Old-name Phase 9 assets are retained only in immutable contracts and not shipped. +P10-003,Medium,Browser suite execution,Environment blocked locally,.github/workflows/ci.yml; tests/browser; tests/a11y; tests/visual,Before Phase 11 acceptance,Engineering + QA,Run configured Playwright matrix in unblocked CI; generate/review baselines; close all failures.,Local Chromium is administrator-blocked and browser download DNS failed. +P10-004,Low,Exact target runtime verification,Open verification,.github/workflows/ci.yml; Dockerfile; .node-version,Before scaffold merge,Engineering,Pass full quality and browser workflows on Node.js 24.17.0.,Local host exposes Node.js 22.16.0; target remains pinned to 24.17.0. +P11-001,High,Phase 11 browser verification,Environment blocked,tests/browser; tests/a11y; playwright.config.ts,Before Phase 11 acceptance,Engineering + QA,Install pinned dependencies and browsers in unblocked Node 24.17.0 CI; pass all functional and accessibility projects.,Static implementation is complete; execution evidence is not fabricated. +P11-002,High,Visual baseline generation and approval,Environment blocked,tests/visual; tests/visual/README.md,Before Phase 11 acceptance,Design + QA,Generate all Chromium snapshots with the pinned browser; review locale/theme/viewport/drawer/focus cases; commit approved baselines.,Scenario coverage exists but PNG baselines were not generated locally. +P11-003,Low,Exact Phase 11 target runtime verification,Open verification,package.json; .node-version; .github/workflows/ci.yml,Before Phase 11 merge,Engineering,"Run static, unit, build, package, and browser gates on Node 24.17.0 and pnpm 11.9.0.",Local host is Node 22.16.0 and could not download pnpm 11.9.0. +P11-004,Medium,Application-shell copy linguistic approval,Inherited open,src/content/locales/fr/shell.json; src/content/locales/ar/shell.json,Before release,Content + Localization,"Complete native French and Arabic review of Phase 11 shell, state, metadata, and pending-destination copy.",Mechanical parity passes; linguistic approval remains P9-005. +P12-001,High,Browser and accessibility execution,Environment blocked,tests/browser; tests/a11y; playwright.config.ts,Before Phase 12 acceptance,Engineering + QA,Run all 44 Chromium browser/accessibility scenarios and the approved cross-browser matrix in an environment where loopback navigation is not administrator-blocked; fix product failures.,Chromium launched locally but every loopback navigation was rejected with net::ERR_BLOCKED_BY_ADMINISTRATOR before application response. +P12-002,High,Visual regression baselines,Environment blocked,tests/visual; tests/fixtures/component-system/component-matrix.json,Before Phase 12 acceptance,Design + QA,Generate and review stable light/dark EN/FR/AR desktop/mobile/focus/error/long-content baselines with the pinned browser.,Visual scenarios are authored; image capture is blocked by the same Chromium loopback policy. +P12-003,Medium,Pinned runtime verification,Open verification,package.json; .node-version; .github/workflows/ci.yml,Before Phase 12 merge,Engineering,"Pass install, static, unit, build, browser, accessibility, visual, audit, and package gates on Node 24.17.0 and pnpm 11.9.0.",Source/static/unit/build checks passed under Node 22.16.0 with exact direct packages installed through npm fallback; target runtime remains unverified. +P12-004,Medium,Frozen installation and dependency audit,Environment blocked,pnpm-lock.yaml; package.json; docs/phase12/DEPENDENCY_CHANGE_REPORT_v1.0.md,Before Phase 12 merge,Engineering + Security,Complete pnpm install --frozen-lockfile and pnpm audit --audit-level low with registry access.,Registry DNS returned EAI_AGAIN. npm fallback enabled local checks but does not satisfy the frozen pnpm or audit gates. +P12-005,Medium,Manual assistive-technology and zoom QA,Open verification,docs/quality/PHASE_12_MANUAL_QA_RESULTS_v1.0.csv,Before Phase 12 acceptance,Accessibility + QA,"Complete keyboard, touch, screen-reader, 200/400 percent zoom, reduced-motion, forced-colors, locale, theme, and viewport manual matrix; attach evidence.","Static semantics, unit interactions, and server-rendered routes are verified; human browser and assistive-technology observations are not fabricated." +P13-001,High,Homepage browser accessibility and visual execution,Environment blocked,tests/browser/homepage.spec.ts; tests/a11y/homepage.a11y.spec.ts; tests/visual/homepage.visual.spec.ts,Before Phase 13 acceptance,Engineering + QA,"Run the authored homepage scenarios in unblocked pinned-browser CI; fix functional, axe, reflow, focus, and visual failures; approve baselines.",Local Chromium launches but rejects every loopback navigation with net::ERR_BLOCKED_BY_ADMINISTRATOR before application response. +P13-002,Medium,Phase 13 manual responsive and assistive-technology QA,Open verification,docs/quality/PHASE_13_MANUAL_QA_RESULTS_v1.0.csv,Before Phase 13 acceptance,Accessibility + QA,"Complete keyboard, touch, screen-reader, 200/400 percent zoom, reduced-motion, forced-colors, locale, theme, viewport, and content-expansion review; attach evidence.",Source and automated scenarios exist; human observations are not fabricated. +P13-003,Medium,Exact Phase 13 target runtime and package verification,Open verification,package.json; .node-version; pnpm-lock.yaml; .github/workflows/ci.yml,Before Phase 13 merge,Engineering + Security,"Pass frozen pnpm install, all validation suites, audit, build, and package verification on Node 24.17.0 and pnpm 11.9.0.",Available host is Node 22.16.0; npm fallback was used only to execute local checks. +P14-001,High,Production lead destination,Blocked,src/lib/demo/adapters; docs/phase14/EXTERNAL_SERVICE_INVENTORY_v1.0.csv,Before production demo,Sales Ops + Engineering,"Approve vendor, endpoint, authentication, scopes, mapping, duplicate policy, retries, sandbox, monitoring and ownership.",Local discard adapter is not a CRM. +P14-002,High,Legal form processing,Blocked,docs/phase14/CONSENT_MATRIX_v1.0.csv; production feature flag,Before production demo,Legal + Privacy,"Approve localized notice, legal basis, consent behavior, retention, deletion, recipients and transfer implications.",No final consent is invented. +P14-003,High,Analytics provider and consent,Blocked,src/lib/analytics; docs/phase14/ANALYTICS_EVENT_REGISTRY_v1.0.csv,Before analytics activation,Analytics + Legal,"Approve provider, consent category, storage, retention, region, DPA, replay policy and operational owner.",Test sink is disabled by default and has no network. +P14-004,High,Distributed idempotency and duplicate policy,Blocked,src/lib/demo/idempotency.ts,Before scaled production,Engineering + Sales Ops,Select durable store and approve duplicate semantics across instances and CRM records.,Process-local implementation is test-only. +P14-005,Medium,Observability and retention,Open,correlation IDs; no logging adapter,Before production operations,Engineering + Privacy,"Approve metrics, retention, redaction, alert thresholds and owners without lead content.",No raw logging is implemented. +P14-006,Medium,Scheduling service,Blocked,docs/phase14/EXTERNAL_SERVICE_INVENTORY_v1.0.csv,Before scheduler activation,Sales Ops + Product,"Approve provider, locale/timezone behavior, accessibility, fallback and confirmation semantics.",No fake availability. +P14-007,Medium,Email notifications,Blocked,docs/phase14/EXTERNAL_SERVICE_INVENTORY_v1.0.csv,Before email activation,Sales Ops + Engineering,"Approve provider, templates, sender identities, recipients, data minimization and delivery semantics.",No email is claimed or sent. +P14-008,High,Phase 14 browser/accessibility/visual execution,Environment blocked,tests/browser/integrations; tests/a11y/integrations; tests/visual/integrations.visual.spec.ts,Before Phase 14 acceptance,Engineering + QA + Accessibility,"Run pinned browser suites, fix failures, approve visual baselines and complete manual AT/zoom review.",Authored coverage is not observed evidence. +P14-009,Medium,"Pinned runtime, install, audit and build",Environment blocked,docs/quality/logs/phase14,Before Phase 14 merge,Engineering + Security,"Run Node 24.17.0 and pnpm 11.9.0 frozen install, all tests, build, audit, secret scan and package verification.","Node 22.16.0 npm fallback passed build and offline audit with zero reported vulnerabilities; exact Node 24.17.0, pnpm 11.9.0 frozen install, and pinned-browser execution remain unverified." diff --git a/docs/IMPLEMENTATION_ISSUE_REGISTER_v1.5.csv b/docs/IMPLEMENTATION_ISSUE_REGISTER_v1.5.csv new file mode 100644 index 0000000..7249e2f --- /dev/null +++ b/docs/IMPLEMENTATION_ISSUE_REGISTER_v1.5.csv @@ -0,0 +1,48 @@ +Issue_ID,Severity,Area,Status,Code_path_or_control,Release_gate,Owner,Exit_criteria,Notes +P9-001,Critical,Participant acceptance,Inherited open,contracts/phase9/research; docs/IMPLEMENTATION_ISSUE_REGISTER_v1.0.csv,Before release,Research,"Run required pilot, core, and accessibility cohorts; fix/retest S0/S1 findings.",No production claim of usability acceptance. +P9-002,High,CRM integration,Inherited open,src/contracts/phase9/demo-form-contract.ts; no endpoint implemented,Before production integration,Sales Ops + Engineering,"Approve and integration-test endpoint, routing, duplicates, idempotency, retry, spam controls, monitoring, and ownership.",Demo submission remains unimplemented. +P9-003,High,Legal consent,Inherited open,No production form or legal copy implemented,Before production form,Legal,"Approve localized consent, privacy linkage, retention, and market requirements.",Suppressed rather than guessed. +P9-004,High,Analytics and consent,Inherited open,src/contracts/phase9/analytics-contract.ts; no vendor adapter,Before beta,Analytics + Legal,"Approve vendor, event authority, consent policy, retention, replay policy, and non-PII payloads.",Contract imported; collection disabled. +P9-005,High,Native linguistic review,Inherited open,"src/content/locales/{fr,ar}; CI locale parity",Before release,Content + Localization,"Native review of all visible copy, metadata, errors, and bidi samples.",Mechanical parity is not linguistic approval. +P9-006,High,Illustrative product preview,Inherited open,No preview shipped,Before release,Product + Design,Approve illustration or provide governed product capture.,Suppressed. +P9-007,High,Multi-location claim,Inherited open,scripts/validate-prohibited-content.mjs; visible shell only,Before beta,Product,Approve capability or revise/suppress affected copy.,No new claim introduced. +P9-008,High,Pricing model,Inherited open,No pricing route or component,Before pricing publication,Commercial,Approve public pricing and limits in writing.,Quote-only posture preserved by omission. +P9-009,High,Security evidence,Inherited open,No public security claims,Before claims publish,Security + Legal,"Provide scoped evidence, approvals, and expiry dates.","Security headers are implementation controls, not marketing claims." +P9-010,Medium,Framework selection,Resolved in Phase 10,docs/architecture/ADR-0001_REPOSITORY_FOUNDATION.md,Scaffold merge,Architecture,Architecture decision accepted and implemented.,"Next.js App Router SSR, strict TypeScript, CSS Modules, OCI target." +P9-011,Medium,Browser policy owner,Inherited open,.github/workflows/ci.yml; playwright.config.ts,Before beta,Product + Engineering,"Approve supported browser matrix, owner, telemetry, and exception/retirement process.","Configured matrix is a test baseline, not a policy claim." +P9-012,Medium,Product tour medium,Inherited open,No product tour implemented,Before release,Product + Marketing,Approve accessible localized dialog fallback or media/transcript.,Suppressed. +P9-013,Medium,Markets and formatting,Inherited open,src/lib/localization; no currency/phone market assumptions,Before regional campaign,Product + Legal,"Define markets, currency, timezone, phone, and jurisdiction independently of locale.",Locale is not treated as market. +P9-014,Medium,Login destination,Inherited open,No login link implemented,Before release,Product + Engineering,"Approve destination, security behavior, locale return path, and analytics.",Suppressed. +P9-015,Medium,Alternate sales contact,Inherited open,No secondary contact destination,Before release,Sales Ops,Provide approved contact route or approve suppression.,Placeholder address not imported into runtime. +P9-016,Medium,Customer evidence,Inherited open,"No logos, metrics, testimonials, or case studies",Optional post-launch,Marketing + Legal,Provide attributable evidence records and approvals.,Suppressed. +P9-017,Low,Exact dependency versions,Resolved in Phase 10,package.json; pnpm-lock.yaml; docs/DEPENDENCY_MANIFEST_v1.0.md,Scaffold,Engineering,"Exact versions pinned, audited, locked, and automated update review enabled.",No floating direct dependency ranges. +P10-001,High,Canonical production origin,Open,src/lib/localization/site-origin.ts; .env.example,Before production deployment,Product + Infrastructure,Approve public domain/origin and configure SITE_ORIGIN in production.,Build fails closed in production when missing. +P10-002,High,RentalDriveGo visual identity,Open,public/.gitkeep; docs/BRAND_MIGRATION_v1.0.md,Before public release,Product + Design,Approve and supply final accessible logo assets for light/dark contexts.,Old-name Phase 9 assets are retained only in immutable contracts and not shipped. +P10-003,Medium,Browser suite execution,Environment blocked locally,.github/workflows/ci.yml; tests/browser; tests/a11y; tests/visual,Before Phase 11 acceptance,Engineering + QA,Run configured Playwright matrix in unblocked CI; generate/review baselines; close all failures.,Local Chromium is administrator-blocked and browser download DNS failed. +P10-004,Low,Exact target runtime verification,Open verification,.github/workflows/ci.yml; Dockerfile; .node-version,Before scaffold merge,Engineering,Pass full quality and browser workflows on Node.js 24.17.0.,Local host exposes Node.js 22.16.0; target remains pinned to 24.17.0. +P11-001,High,Phase 11 browser verification,Environment blocked,tests/browser; tests/a11y; playwright.config.ts,Before Phase 11 acceptance,Engineering + QA,Install pinned dependencies and browsers in unblocked Node 24.17.0 CI; pass all functional and accessibility projects.,Static implementation is complete; execution evidence is not fabricated. +P11-002,High,Visual baseline generation and approval,Environment blocked,tests/visual; tests/visual/README.md,Before Phase 11 acceptance,Design + QA,Generate all Chromium snapshots with the pinned browser; review locale/theme/viewport/drawer/focus cases; commit approved baselines.,Scenario coverage exists but PNG baselines were not generated locally. +P11-003,Low,Exact Phase 11 target runtime verification,Open verification,package.json; .node-version; .github/workflows/ci.yml,Before Phase 11 merge,Engineering,"Run static, unit, build, package, and browser gates on Node 24.17.0 and pnpm 11.9.0.",Local host is Node 22.16.0 and could not download pnpm 11.9.0. +P11-004,Medium,Application-shell copy linguistic approval,Inherited open,src/content/locales/fr/shell.json; src/content/locales/ar/shell.json,Before release,Content + Localization,"Complete native French and Arabic review of Phase 11 shell, state, metadata, and pending-destination copy.",Mechanical parity passes; linguistic approval remains P9-005. +P12-001,High,Browser and accessibility execution,Environment blocked,tests/browser; tests/a11y; playwright.config.ts,Before Phase 12 acceptance,Engineering + QA,Run all 44 Chromium browser/accessibility scenarios and the approved cross-browser matrix in an environment where loopback navigation is not administrator-blocked; fix product failures.,Chromium launched locally but every loopback navigation was rejected with net::ERR_BLOCKED_BY_ADMINISTRATOR before application response. +P12-002,High,Visual regression baselines,Environment blocked,tests/visual; tests/fixtures/component-system/component-matrix.json,Before Phase 12 acceptance,Design + QA,Generate and review stable light/dark EN/FR/AR desktop/mobile/focus/error/long-content baselines with the pinned browser.,Visual scenarios are authored; image capture is blocked by the same Chromium loopback policy. +P12-003,Medium,Pinned runtime verification,Open verification,package.json; .node-version; .github/workflows/ci.yml,Before Phase 12 merge,Engineering,"Pass install, static, unit, build, browser, accessibility, visual, audit, and package gates on Node 24.17.0 and pnpm 11.9.0.",Source/static/unit/build checks passed under Node 22.16.0 with exact direct packages installed through npm fallback; target runtime remains unverified. +P12-004,Medium,Frozen installation and dependency audit,Environment blocked,pnpm-lock.yaml; package.json; docs/phase12/DEPENDENCY_CHANGE_REPORT_v1.0.md,Before Phase 12 merge,Engineering + Security,Complete pnpm install --frozen-lockfile and pnpm audit --audit-level low with registry access.,Registry DNS returned EAI_AGAIN. npm fallback enabled local checks but does not satisfy the frozen pnpm or audit gates. +P12-005,Medium,Manual assistive-technology and zoom QA,Open verification,docs/quality/PHASE_12_MANUAL_QA_RESULTS_v1.0.csv,Before Phase 12 acceptance,Accessibility + QA,"Complete keyboard, touch, screen-reader, 200/400 percent zoom, reduced-motion, forced-colors, locale, theme, and viewport manual matrix; attach evidence.","Static semantics, unit interactions, and server-rendered routes are verified; human browser and assistive-technology observations are not fabricated." +P13-001,High,Homepage browser accessibility and visual execution,Environment blocked,tests/browser/homepage.spec.ts; tests/a11y/homepage.a11y.spec.ts; tests/visual/homepage.visual.spec.ts,Before Phase 13 acceptance,Engineering + QA,"Run the authored homepage scenarios in unblocked pinned-browser CI; fix functional, axe, reflow, focus, and visual failures; approve baselines.",Local Chromium launches but rejects every loopback navigation with net::ERR_BLOCKED_BY_ADMINISTRATOR before application response. +P13-002,Medium,Phase 13 manual responsive and assistive-technology QA,Open verification,docs/quality/PHASE_13_MANUAL_QA_RESULTS_v1.0.csv,Before Phase 13 acceptance,Accessibility + QA,"Complete keyboard, touch, screen-reader, 200/400 percent zoom, reduced-motion, forced-colors, locale, theme, viewport, and content-expansion review; attach evidence.",Source and automated scenarios exist; human observations are not fabricated. +P13-003,Medium,Exact Phase 13 target runtime and package verification,Open verification,package.json; .node-version; pnpm-lock.yaml; .github/workflows/ci.yml,Before Phase 13 merge,Engineering + Security,"Pass frozen pnpm install, all validation suites, audit, build, and package verification on Node 24.17.0 and pnpm 11.9.0.",Available host is Node 22.16.0; npm fallback was used only to execute local checks. +P14-001,High,Production lead destination,Blocked,src/lib/demo/adapters; docs/phase14/EXTERNAL_SERVICE_INVENTORY_v1.0.csv,Before production demo,Sales Ops + Engineering,"Approve vendor, endpoint, authentication, scopes, mapping, duplicate policy, retries, sandbox, monitoring and ownership.",Local discard adapter is not a CRM. +P14-002,High,Legal form processing,Blocked,docs/phase14/CONSENT_MATRIX_v1.0.csv; production feature flag,Before production demo,Legal + Privacy,"Approve localized notice, legal basis, consent behavior, retention, deletion, recipients and transfer implications.",No final consent is invented. +P14-003,High,Analytics provider and consent,Blocked,src/lib/analytics; docs/phase14/ANALYTICS_EVENT_REGISTRY_v1.0.csv,Before analytics activation,Analytics + Legal,"Approve provider, consent category, storage, retention, region, DPA, replay policy and operational owner.",Test sink is disabled by default and has no network. +P14-004,High,Distributed idempotency and duplicate policy,Blocked,src/lib/demo/idempotency.ts,Before scaled production,Engineering + Sales Ops,Select durable store and approve duplicate semantics across instances and CRM records.,Process-local implementation is test-only. +P14-005,Medium,Observability and retention,Open,correlation IDs; no logging adapter,Before production operations,Engineering + Privacy,"Approve metrics, retention, redaction, alert thresholds and owners without lead content.",No raw logging is implemented. +P14-006,Medium,Scheduling service,Blocked,docs/phase14/EXTERNAL_SERVICE_INVENTORY_v1.0.csv,Before scheduler activation,Sales Ops + Product,"Approve provider, locale/timezone behavior, accessibility, fallback and confirmation semantics.",No fake availability. +P14-007,Medium,Email notifications,Blocked,docs/phase14/EXTERNAL_SERVICE_INVENTORY_v1.0.csv,Before email activation,Sales Ops + Engineering,"Approve provider, templates, sender identities, recipients, data minimization and delivery semantics.",No email is claimed or sent. +P14-008,High,Phase 14 browser/accessibility/visual execution,Environment blocked,tests/browser/integrations; tests/a11y/integrations; tests/visual/integrations.visual.spec.ts,Before Phase 14 acceptance,Engineering + QA + Accessibility,"Run pinned browser suites, fix failures, approve visual baselines and complete manual AT/zoom review.",Authored coverage is not observed evidence. +P14-009,Medium,"Pinned runtime, install, audit and build",Environment blocked,docs/quality/logs/phase14,Before Phase 14 merge,Engineering + Security,"Run Node 24.17.0 and pnpm 11.9.0 frozen install, all tests, build, audit, secret scan and package verification.","Node 22.16.0 npm fallback passed build and offline audit with zero reported vulnerabilities; exact Node 24.17.0, pnpm 11.9.0 frozen install, and pinned-browser execution remain unverified." +P15-001,High,Release evidence structural integrity,Resolved in Phase 15,docs/IMPLEMENTATION_ISSUE_REGISTER_v1.4.csv; docs/quality/PHASE_14_MANUAL_QA_RESULTS_v1.0.csv; scripts/validate-phase15-readiness.mjs,Phase 15 evidence package,Engineering + QA,All repository CSV evidence parses with the declared header width and the regression validator passes.,Two malformed CSV rows were repaired and are now covered by automated validation. +P15-002,Medium,Demo API media-type validation,Resolved in Phase 15,src/lib/security/content-type.ts; src/app/api/demo/route.ts; tests/unit/integrations/content-type.test.ts,Before API release,Engineering + Security,Accept application/json with optional parameters and reject look-alike media types.,The prior prefix match accepted application/jsonp and similar values. +P15-003,Medium,Visual regression determinism,Resolved in Phase 15,tests/visual/component-system.visual.spec.ts; tests/visual/integrations.visual.spec.ts,Before visual baseline approval,Engineering + Design QA,Use the canonical theme storage key and restrict canonical snapshots to the pinned Chromium project.,The previous component test wrote an unused storage key and two suites attempted non-canonical browser snapshots. +P15-004,High,CI integration-test coverage,Resolved in Phase 15,.github/workflows/ci.yml; scripts/validate-phase15-readiness.mjs,Before merge,Engineering + QA,CI explicitly runs the demo-service integration suite and the security/privacy/browser/accessibility/visual command slices.,The Phase 14 workflow omitted the Vitest integration suite from CI. +P15-005,High,Current release-candidate final QA execution,Environment blocked,docs/phase15/COMMAND_MATRIX_v1.0.csv; docs/PHASE_15_IMPLEMENTATION_REPORT_v1.0.md,Before Phase 15 acceptance or Phase 16 release-candidate freeze,Engineering + QA + Accessibility + Security,"On the exact Node 24.17.0 and pnpm 11.9.0 toolchain, complete frozen installation, format, lint, typecheck, unit, integration, build, audit, browser, accessibility, visual, performance, deployment, rollback, and manual AT matrices for the final manifest.","The supplied sandbox has Node 22.16.0, no pnpm binary, no registry DNS, and no installed project dependencies. Static controls ran; dependency-backed and human/browser gates did not." diff --git a/docs/IMPLEMENTATION_ISSUE_REGISTER_v1.6.csv b/docs/IMPLEMENTATION_ISSUE_REGISTER_v1.6.csv new file mode 100644 index 0000000..50a587b --- /dev/null +++ b/docs/IMPLEMENTATION_ISSUE_REGISTER_v1.6.csv @@ -0,0 +1,48 @@ +Issue_ID,Severity,Area,Status,Code_path_or_control,Release_gate,Owner,Exit_criteria,Notes +P9-001,Critical,Participant acceptance,Inherited open,contracts/phase9/research; docs/IMPLEMENTATION_ISSUE_REGISTER_v1.0.csv,Before release,Research,"Run required pilot, core, and accessibility cohorts; fix/retest S0/S1 findings.",No production claim of usability acceptance. +P9-002,High,CRM integration,Inherited open,src/contracts/phase9/demo-form-contract.ts; no endpoint implemented,Before production integration,Sales Ops + Engineering,"Approve and integration-test endpoint, routing, duplicates, idempotency, retry, spam controls, monitoring, and ownership.",Demo submission remains unimplemented. +P9-003,High,Legal consent,Inherited open,No production form or legal copy implemented,Before production form,Legal,"Approve localized consent, privacy linkage, retention, and market requirements.",Suppressed rather than guessed. +P9-004,High,Analytics and consent,Inherited open,src/contracts/phase9/analytics-contract.ts; no vendor adapter,Before beta,Analytics + Legal,"Approve vendor, event authority, consent policy, retention, replay policy, and non-PII payloads.",Contract imported; collection disabled. +P9-005,High,Native linguistic review,Inherited open,"src/content/locales/{fr,ar}; CI locale parity",Before release,Content + Localization,"Native review of all visible copy, metadata, errors, and bidi samples.",Mechanical parity is not linguistic approval. +P9-006,High,Illustrative product preview,Inherited open,No preview shipped,Before release,Product + Design,Approve illustration or provide governed product capture.,Suppressed. +P9-007,High,Multi-location claim,Inherited open,scripts/validate-prohibited-content.mjs; visible shell only,Before beta,Product,Approve capability or revise/suppress affected copy.,No new claim introduced. +P9-008,High,Pricing model,Inherited open,No pricing route or component,Before pricing publication,Commercial,Approve public pricing and limits in writing.,Quote-only posture preserved by omission. +P9-009,High,Security evidence,Inherited open,No public security claims,Before claims publish,Security + Legal,"Provide scoped evidence, approvals, and expiry dates.","Security headers are implementation controls, not marketing claims." +P9-010,Medium,Framework selection,Resolved in Phase 10,docs/architecture/ADR-0001_REPOSITORY_FOUNDATION.md,Scaffold merge,Architecture,Architecture decision accepted and implemented.,"Next.js App Router SSR, strict TypeScript, CSS Modules, OCI target." +P9-011,Medium,Browser policy owner,Inherited open,.github/workflows/ci.yml; playwright.config.ts,Before beta,Product + Engineering,"Approve supported browser matrix, owner, telemetry, and exception/retirement process.","Configured matrix is a test baseline, not a policy claim." +P9-012,Medium,Product tour medium,Inherited open,No product tour implemented,Before release,Product + Marketing,Approve accessible localized dialog fallback or media/transcript.,Suppressed. +P9-013,Medium,Markets and formatting,Inherited open,src/lib/localization; no currency/phone market assumptions,Before regional campaign,Product + Legal,"Define markets, currency, timezone, phone, and jurisdiction independently of locale.",Locale is not treated as market. +P9-014,Medium,Login destination,Inherited open,No login link implemented,Before release,Product + Engineering,"Approve destination, security behavior, locale return path, and analytics.",Suppressed. +P9-015,Medium,Alternate sales contact,Inherited open,No secondary contact destination,Before release,Sales Ops,Provide approved contact route or approve suppression.,Placeholder address not imported into runtime. +P9-016,Medium,Customer evidence,Inherited open,"No logos, metrics, testimonials, or case studies",Optional post-launch,Marketing + Legal,Provide attributable evidence records and approvals.,Suppressed. +P9-017,Low,Exact dependency versions,Resolved in Phase 10,package.json; pnpm-lock.yaml; docs/DEPENDENCY_MANIFEST_v1.0.md,Scaffold,Engineering,"Exact versions pinned, audited, locked, and automated update review enabled.",No floating direct dependency ranges. +P10-001,High,Canonical production origin,Open,src/lib/localization/site-origin.ts; .env.example,Before production deployment,Product + Infrastructure,Approve public domain/origin and configure SITE_ORIGIN in production.,Build fails closed in production when missing. +P10-002,High,RentalDriveGo visual identity,Open,public/.gitkeep; docs/BRAND_MIGRATION_v1.0.md,Before public release,Product + Design,Approve and supply final accessible logo assets for light/dark contexts.,Old-name Phase 9 assets are retained only in immutable contracts and not shipped. +P10-003,Medium,Browser suite execution,Environment blocked locally,.github/workflows/ci.yml; tests/browser; tests/a11y; tests/visual,Before Phase 11 acceptance,Engineering + QA,Run configured Playwright matrix in unblocked CI; generate/review baselines; close all failures.,Local Chromium is administrator-blocked and browser download DNS failed. +P10-004,Low,Exact target runtime verification,Open verification,.github/workflows/ci.yml; Dockerfile; .node-version,Before scaffold merge,Engineering,Pass full quality and browser workflows on Node.js 24.17.0.,Local host exposes Node.js 22.16.0; target remains pinned to 24.17.0. +P11-001,High,Phase 11 browser verification,Environment blocked,tests/browser; tests/a11y; playwright.config.ts,Before Phase 11 acceptance,Engineering + QA,Install pinned dependencies and browsers in unblocked Node 24.17.0 CI; pass all functional and accessibility projects.,Static implementation is complete; execution evidence is not fabricated. +P11-002,High,Visual baseline generation and approval,Environment blocked,tests/visual; tests/visual/README.md,Before Phase 11 acceptance,Design + QA,Generate all Chromium snapshots with the pinned browser; review locale/theme/viewport/drawer/focus cases; commit approved baselines.,Scenario coverage exists but PNG baselines were not generated locally. +P11-003,Low,Exact Phase 11 target runtime verification,Open verification,package.json; .node-version; .github/workflows/ci.yml,Before Phase 11 merge,Engineering,"Run static, unit, build, package, and browser gates on Node 24.17.0 and pnpm 11.9.0.",Local host is Node 22.16.0 and could not download pnpm 11.9.0. +P11-004,Medium,Application-shell copy linguistic approval,Inherited open,src/content/locales/fr/shell.json; src/content/locales/ar/shell.json,Before release,Content + Localization,"Complete native French and Arabic review of Phase 11 shell, state, metadata, and pending-destination copy.",Mechanical parity passes; linguistic approval remains P9-005. +P12-001,High,Browser and accessibility execution,Environment blocked,tests/browser; tests/a11y; playwright.config.ts,Before Phase 12 acceptance,Engineering + QA,Run all 44 Chromium browser/accessibility scenarios and the approved cross-browser matrix in an environment where loopback navigation is not administrator-blocked; fix product failures.,Chromium launched locally but every loopback navigation was rejected with net::ERR_BLOCKED_BY_ADMINISTRATOR before application response. +P12-002,High,Visual regression baselines,Environment blocked,tests/visual; tests/fixtures/component-system/component-matrix.json,Before Phase 12 acceptance,Design + QA,Generate and review stable light/dark EN/FR/AR desktop/mobile/focus/error/long-content baselines with the pinned browser.,Visual scenarios are authored; image capture is blocked by the same Chromium loopback policy. +P12-003,Medium,Pinned runtime verification,Open verification,package.json; .node-version; .github/workflows/ci.yml,Before Phase 12 merge,Engineering,"Pass install, static, unit, build, browser, accessibility, visual, audit, and package gates on Node 24.17.0 and pnpm 11.9.0.",Source/static/unit/build checks passed under Node 22.16.0 with exact direct packages installed through npm fallback; target runtime remains unverified. +P12-004,Medium,Frozen installation and dependency audit,Environment blocked,pnpm-lock.yaml; package.json; docs/phase12/DEPENDENCY_CHANGE_REPORT_v1.0.md,Before Phase 12 merge,Engineering + Security,Complete pnpm install --frozen-lockfile and pnpm audit --audit-level low with registry access.,Registry DNS returned EAI_AGAIN. npm fallback enabled local checks but does not satisfy the frozen pnpm or audit gates. +P12-005,Medium,Manual assistive-technology and zoom QA,Open verification,docs/quality/PHASE_12_MANUAL_QA_RESULTS_v1.0.csv,Before Phase 12 acceptance,Accessibility + QA,"Complete keyboard, touch, screen-reader, 200/400 percent zoom, reduced-motion, forced-colors, locale, theme, and viewport manual matrix; attach evidence.","Static semantics, unit interactions, and server-rendered routes are verified; human browser and assistive-technology observations are not fabricated." +P13-001,High,Homepage browser accessibility and visual execution,Environment blocked,tests/browser/homepage.spec.ts; tests/a11y/homepage.a11y.spec.ts; tests/visual/homepage.visual.spec.ts,Before Phase 13 acceptance,Engineering + QA,"Run the authored homepage scenarios in unblocked pinned-browser CI; fix functional, axe, reflow, focus, and visual failures; approve baselines.",Local Chromium launches but rejects every loopback navigation with net::ERR_BLOCKED_BY_ADMINISTRATOR before application response. +P13-002,Medium,Phase 13 manual responsive and assistive-technology QA,Open verification,docs/quality/PHASE_13_MANUAL_QA_RESULTS_v1.0.csv,Before Phase 13 acceptance,Accessibility + QA,"Complete keyboard, touch, screen-reader, 200/400 percent zoom, reduced-motion, forced-colors, locale, theme, viewport, and content-expansion review; attach evidence.",Source and automated scenarios exist; human observations are not fabricated. +P13-003,Medium,Exact Phase 13 target runtime and package verification,Open verification,package.json; .node-version; pnpm-lock.yaml; .github/workflows/ci.yml,Before Phase 13 merge,Engineering + Security,"Pass frozen pnpm install, all validation suites, audit, build, and package verification on Node 24.17.0 and pnpm 11.9.0.",Available host is Node 22.16.0; npm fallback was used only to execute local checks. +P14-001,High,Production lead destination,Blocked,src/lib/demo/adapters; docs/phase14/EXTERNAL_SERVICE_INVENTORY_v1.0.csv,Before production demo,Sales Ops + Engineering,"Approve vendor, endpoint, authentication, scopes, mapping, duplicate policy, retries, sandbox, monitoring and ownership.",Local discard adapter is not a CRM. +P14-002,High,Legal form processing,Blocked,docs/phase14/CONSENT_MATRIX_v1.0.csv; production feature flag,Before production demo,Legal + Privacy,"Approve localized notice, legal basis, consent behavior, retention, deletion, recipients and transfer implications.",No final consent is invented. +P14-003,High,Analytics provider and consent,Blocked,src/lib/analytics; docs/phase14/ANALYTICS_EVENT_REGISTRY_v1.0.csv,Before analytics activation,Analytics + Legal,"Approve provider, consent category, storage, retention, region, DPA, replay policy and operational owner.",Test sink is disabled by default and has no network. +P14-004,High,Distributed idempotency and duplicate policy,Blocked,src/lib/demo/idempotency.ts,Before scaled production,Engineering + Sales Ops,Select durable store and approve duplicate semantics across instances and CRM records.,Process-local implementation is test-only. +P14-005,Medium,Observability and retention,Open,correlation IDs; no logging adapter,Before production operations,Engineering + Privacy,"Approve metrics, retention, redaction, alert thresholds and owners without lead content.",No raw logging is implemented. +P14-006,Medium,Scheduling service,Blocked,docs/phase14/EXTERNAL_SERVICE_INVENTORY_v1.0.csv,Before scheduler activation,Sales Ops + Product,"Approve provider, locale/timezone behavior, accessibility, fallback and confirmation semantics.",No fake availability. +P14-007,Medium,Email notifications,Blocked,docs/phase14/EXTERNAL_SERVICE_INVENTORY_v1.0.csv,Before email activation,Sales Ops + Engineering,"Approve provider, templates, sender identities, recipients, data minimization and delivery semantics.",No email is claimed or sent. +P14-008,High,Phase 14 browser/accessibility/visual execution,Environment blocked,tests/browser/integrations; tests/a11y/integrations; tests/visual/integrations.visual.spec.ts,Before Phase 14 acceptance,Engineering + QA + Accessibility,"Run pinned browser suites, fix failures, approve visual baselines and complete manual AT/zoom review.",Authored coverage is not observed evidence. +P14-009,Medium,"Pinned runtime, install, audit and build",Environment blocked,docs/quality/logs/phase14,Before Phase 14 merge,Engineering + Security,"Run Node 24.17.0 and pnpm 11.9.0 frozen install, all tests, build, audit, secret scan and package verification.","Node 22.16.0 npm fallback passed build and offline audit with zero reported vulnerabilities; exact Node 24.17.0, pnpm 11.9.0 frozen install, and pinned-browser execution remain unverified." +P15-001,High,Release evidence structural integrity,Resolved in Phase 15,docs/IMPLEMENTATION_ISSUE_REGISTER_v1.4.csv; docs/quality/PHASE_14_MANUAL_QA_RESULTS_v1.0.csv; scripts/validate-phase15-readiness.mjs,Phase 15 evidence package,Engineering + QA,All repository CSV evidence parses with the declared header width and the regression validator passes.,Two malformed CSV rows were repaired and are now covered by automated validation. +P15-002,Medium,Demo API media-type validation,Resolved in Phase 15,src/lib/security/content-type.ts; src/app/api/demo/route.ts; tests/unit/integrations/content-type.test.ts,Before API release,Engineering + Security,Accept application/json with optional parameters and reject look-alike media types.,The prior prefix match accepted application/jsonp and similar values. +P15-003,Medium,Visual regression determinism,Resolved in Phase 15,tests/visual/component-system.visual.spec.ts; tests/visual/integrations.visual.spec.ts,Before visual baseline approval,Engineering + Design QA,Use the canonical theme storage key and restrict canonical snapshots to the pinned Chromium project.,The previous component test wrote an unused storage key and two suites attempted non-canonical browser snapshots. +P15-004,High,CI integration-test coverage,Resolved in Phase 15,.github/workflows/ci.yml; scripts/validate-phase15-readiness.mjs,Before merge,Engineering + QA,CI explicitly runs the demo-service integration suite and the security/privacy/browser/accessibility/visual command slices.,The Phase 14 workflow omitted the Vitest integration suite from CI. +P15-005,High,Current release-candidate final QA execution,Environment and approval blocked,docs/phase15/COMMAND_MATRIX_v1.0.csv; docs/PHASE_15_IMPLEMENTATION_REPORT_v1.0.md,Before Phase 15 acceptance or Phase 16 release-candidate freeze,Engineering + QA + Accessibility + Security,"On the exact Node 24.17.0 and pnpm 11.9.0 toolchain, complete frozen installation, format, lint, typecheck, unit, integration, build, audit, browser, accessibility, visual, performance, deployment, rollback, and manual AT matrices for the final manifest.","The supplied sandbox has Node 22.16.0, no pnpm binary, no registry DNS, and no installed project dependencies. Static controls ran; dependency-backed and human/browser gates did not. Phase 16 dependency-free validators and static audit passed, but the exact runtime, frozen install, dependency-backed/browser/manual/production evidence and approvals remain unavailable." diff --git a/docs/PHASE_14_IMPLEMENTATION_REPORT_v1.0.md b/docs/PHASE_14_IMPLEMENTATION_REPORT_v1.0.md new file mode 100644 index 0000000..059b6e0 --- /dev/null +++ b/docs/PHASE_14_IMPLEMENTATION_REPORT_v1.0.md @@ -0,0 +1,191 @@ +# Phase 14 Implementation Report + +## 1. Executive summary + +Phase 14 converts the Phase 13 homepage demo calls to action into one controlled, localized dialog workflow backed by strict client and server validation, a POST-only API boundary, typed adapters, bounded timeout and idempotency handling, explicit destination and feature-flag registries, privacy-safe event contracts, deterministic test adapters, and release gates. + +No production CRM, scheduler, email, consent, analytics, legal, login, tour, pricing, or support destination was invented. The safe local adapter discards submissions and is unavailable in ordinary production configuration. Production remains blocked by P14-001 through P14-009. Static validation, format, lint, strict type checking, 39 unit tests, 4 integration tests, coverage thresholds, dependency audit, secret scan, production build, standalone HTTP serving, API fail-closed behavior, and package validation pass in the available Node 22.16.0/npm fallback environment. Browser, axe, visual, and manual acceptance remain blocked by the host browser policy and human-review requirements. + +## 2. Authoritative inputs reviewed + +Phase 13 repository artifacts, handoff, implementation report, decision log, issue register, package manifest, homepage action/destination/event inventories, content and evidence rules, responsive/RTL/theme/accessibility/performance reports, CI documentation, and the earlier Phase 9 through Phase 12 contracts were reviewed. The Phase 9 demo form contract remains immutable. + +## 3. Phase 13 baseline validation + +The baseline installed from the provided archive. Existing static validators, formatting, linting, type checking, unit coverage, and production build were preserved. Phase 13 browser constraints remained reproducible: Chromium launches but loopback page navigation is rejected with `net::ERR_BLOCKED_BY_ADMINISTRATOR`. + +## 4. Integration architecture + +The implemented path is `homepage trigger → shared localized dialog → client schema → POST /api/demo → server schema and request controls → idempotency coordinator → typed destination adapter → normalized result → localized status → consent-gated allowlisted event`. Details are in `docs/phase14/INTEGRATION_ARCHITECTURE_v1.0.md`. + +## 5. Destination registry + +`src/lib/integrations/destinations.ts` centralizes status, kind, locale, issue, and feature-flag metadata. Only the internal demo dialog can become locally active. Unknown external destinations remain blocked or placeholders and never degrade to guessed links. + +## 6. Demo workflow + +Header, mobile header, hero, final CTA, and footer triggers open one native dialog host. Locale, direction, theme inheritance, focus containment/return, Escape behavior, and source attribution are preserved. The dialog uses no third-party embed and supports delayed hydration by leaving unavailable actions non-navigable before activation. + +## 7. Form contract + +The exact Phase 9 fields are implemented: full name, work email, company, approved fleet-size enum, optional market, preferred language, optional message, idempotency key, and approved source. No phone, consent, marketing, lead-score, or speculative enrichment field was added. See `docs/phase14/DEMO_FORM_CONTRACT_v1.0.md`. + +## 8. Client validation + +Zod-based validation trims and bounds content, applies practical email validation, rejects invalid enums, preserves correctable input, renders field and summary errors, avoids placeholder-only labels, and uses localized complete messages. Controls use native labels and autocomplete semantics where appropriate. + +## 9. Server validation + +The API repeats authoritative strict validation, rejects unknown fields, normalizes whitespace and email case, bounds all values, validates source and locale fields, rejects malformed JSON and oversized requests, and never trusts client-required state. + +## 10. Submission API + +`POST /api/demo` requires JSON, the approved request marker, a same-origin request in production, and a body no larger than 16 KiB. Unsupported methods return 405. Responses are normalized and no-store, include privacy-safe correlation identifiers on failure, and expose neither stack traces nor vendor bodies. + +## 11. CRM or lead-destination integration + +No vendor is approved. A typed `LeadDestinationAdapter` boundary and blocked production adapter are present. The development adapter discards data and returns an explicit local-only result. P14-001 blocks production activation. + +## 12. Scheduling integration + +No scheduler is approved or implemented. The adapter inventory and release gate preserve P14-006. No availability, booking confirmation, URL, locale support, or accessibility claim is fabricated. + +## 13. Email integration + +No email provider, template, sender, recipient, or delivery behavior is approved. No email is sent or claimed. P14-007 remains blocked. + +## 14. Consent implementation + +Distinct privacy acknowledgment, marketing opt-in, analytics consent, and necessary processing are documented in the consent matrix. Because approved legal text and basis are absent, no speculative checkbox is added and optional analytics remains disabled. P14-002 and P14-003 block activation. + +## 15. Analytics integration + +The provider-neutral client accepts only registered non-personal events after an explicit runtime consent marker. Its production mode is disabled; its test mode writes bounded metadata only to an in-memory window sink. It uses no cookies, browser storage, network request, user ID, or form value. + +## 16. Analytics event contract + +Approved event names and allowed properties are defined in `src/lib/analytics/events.ts` and `docs/phase14/ANALYTICS_EVENT_REGISTRY_v1.0.csv`. Runtime validation rejects unknown names, properties, and values. Success is emitted only after adapter acceptance. + +## 17. Campaign attribution + +No campaign persistence or forwarding was approved. The workflow does not store arbitrary query parameters, forward them to adapters, or include them in analytics. Campaign support remains excluded until a bounded policy is supplied. + +## 18. Duplicate and idempotency handling + +The client disables repeat submission while pending. The server coalesces matching in-flight and recently completed requests by UUID idempotency key for a bounded TTL. Only the key and normalized result are retained. A distributed store and business duplicate policy remain blocked by P14-004. + +## 19. Abuse controls + +The API enforces request marker, origin policy, content type, request size, strict fields, and a honeypot. It avoids inaccessible CAPTCHA and fingerprinting. Rate limits and distributed abuse policy require approved infrastructure and privacy review before production. + +## 20. Success experience + +Confirmed local-adapter acceptance produces an accessible localized status and clearly states that no real lead was sent. The flow does not claim an email or meeting. It keeps personal data out of the URL and prevents an immediate duplicate request. + +## 21. Failure and degraded states + +Localized validation, configuration, duplicate, timeout, integration, abuse, and unexpected-failure mappings are implemented. Retryability is explicit, input remains available after correctable failure, retries are bounded, and technical/vendor details are suppressed. + +## 22. Environment management + +Environment variables are parsed centrally, documented in `.env.example`, and inventoried. Server-only values stay server-side. Production demo activation rejects local mode unless the explicit loopback-only test escape is set. Missing approval fails closed. + +## 23. Feature flags + +Typed safe-default flags cover demo, CRM, scheduler, analytics, marketing consent, tour, pricing, and login states. Disabled destinations render intentional unavailable behavior. Flags do not substitute for decisions. + +## 24. Security review + +Origin checks, request markers, strict schemas, size limits, content-type checks, timeout, idempotency, non-reflected errors, no raw logging, existing CSP, and secret separation are implemented. Distributed rate limiting, durable replay controls, vendor scopes, webhook verification, and production CORS depend on the selected architecture. See the security report. + +## 25. Privacy review + +The data-flow inventory documents every field, purpose, processing point, recipient, storage behavior, consent status, and open owner. No form body is logged; no field enters analytics, URLs, snapshots, or browser persistence; the local adapter discards input. Retention, deletion, legal basis, recipients, and transfer rules remain blocked. + +## 26. Accessibility validation + +The form uses native controls, programmatic labels, descriptions, error summary, live status, keyboard dialog behavior, focus return, visible focus, non-color errors, paste-friendly inputs, and no time-limited interaction. Authored axe tests exist for EN/FR/AR, but observed browser execution is blocked and manual AT review remains open. + +## 27. Localization validation + +Complete form, validation, status, retry, and local-only messages exist in English, French, and formal Modern Standard Arabic. Translation parity validators pass. Native linguistic approval remains inherited from earlier open issues. + +## 28. RTL validation + +Arabic remains document-level RTL. Logical CSS, separate mixed-direction email values, logical icon placement, dialog reading order, and no physical left/right integration styling are enforced statically. Browser and screen-reader observation remains blocked. + +## 29. Theme validation + +The dialog consumes semantic tokens and inherits light, dark, and system behavior. No integration-specific raw palette is introduced. Authored light/dark visual cases remain unexecuted because browser loopback is blocked. + +## 30. Responsive validation + +The form uses content-driven sizing, a bounded viewport dialog, logical spacing, compact action stacking, and overflow control. Mobile browser scenarios are authored; 200/400-percent zoom and touch review require unblocked manual QA. + +## 31. Unit-test results + +Thirteen files and 39 tests pass. Coverage is 92.4% statements, 86.04% branches, 95.45% functions, and 92.64% lines for the configured source set. + +## 32. Integration-test results + +One integration file and four service tests pass, covering success, normalized adapter failure, timeout, and idempotent coalescing. + +## 33. End-to-end test results + +Five new Chromium workflow scenarios plus the inherited browser suite are authored. Execution reaches the browser but all local navigation is blocked by the host with `net::ERR_BLOCKED_BY_ADMINISTRATOR`; these are environment-blocked, not application failures or passes. + +## 34. Security-test results + +Static security validation passes for origin, content type, size, timeout, idempotency, and no-raw-log controls. High-confidence secret-pattern scanning passes. The production API smoke test rejects a structurally valid lead with HTTP 503 and `lead_destination_not_approved`. + +## 35. Privacy-test results + +Static privacy validation and unit tests pass for no browser persistence, URL leakage, unconsented analytics, event allowlists, and sensitive-key redaction. Browser privacy observation remains blocked by the host policy. + +## 36. Visual-regression results + +Five Phase 14 EN/FR/AR light/dark visual scenarios are authored. No baseline is approved because Chromium cannot navigate to the loopback server in this environment. Failure screenshots show the administrative block page and are not product baselines. + +## 37. Manual QA results + +The manual matrix is present but remains `Not run` for keyboard, pointer, touch, screen reader, zoom, reduced motion, forced colors, locales, themes, viewports, network transitions, and failure simulations. Human observations are not fabricated. + +## 38. Observability + +Failures use generated correlation IDs containing no personal data. Result categories are bounded. No provider, remote log sink, alert, or retention schedule is activated. P14-005 requires operational approval. + +## 39. Performance and bundle impact + +No runtime dependency or vendor SDK was added. The standalone tree is approximately 36.4 MB and static assets approximately 1.52 MB in the available build. Optional integrations contribute zero bytes. Lighthouse and interaction timing remain blocked by browser policy. See the performance report and bundle inventory log. + +## 40. Dependency changes + +No dependency was added. `npm audit --offline --audit-level=low` reports zero vulnerabilities against the available lock/cache. Authoritative frozen pnpm installation on Node 24.17.0 remains required. + +## 41. Deviations from approved specifications + +A dedicated route was not invented; the existing approved dialog pattern was used. CRM, scheduling, email, consent text, analytics provider, attribution persistence, and distributed rate limiting are represented by blocked boundaries rather than fake integrations. The local adapter is a safe development implementation, not production completion. + +## 42. Open issues and release blockers + +P14-001 through P14-009 cover vendor selection, legal processing, analytics consent, distributed idempotency, observability, scheduler, email, browser/manual validation, and pinned environment verification. Inherited P9 through P13 issues remain authoritative. + +## 43. Files added, changed, and removed + +Source, test, documentation, validation, and configuration additions are listed in `docs/quality/PHASE_14_FILE_CHANGES_v1.0.txt`. No authoritative contract file was removed or rewritten. + +## 44. Commands required to install, validate, test, build, and run + +Use Node 24.17.0 and pnpm 11.9.0 in release CI. Commands are documented in README, the Phase 15 handoff, and `docs/quality/PHASE_14_COMMAND_LOG_v1.0.txt`. The available host used an explicitly recorded npm offline fallback. + +## 45. Production configuration requirements + +Production requires approved `SITE_ORIGIN`, enabled public demo flag, non-local submission mode, typed vendor credentials and mappings, legal/consent approval, retention/deletion policy, distributed idempotency/rate limits, monitoring, and resolved legal/alternative destinations. Test-scenario and local-test flags must be false. + +## 46. Rollback considerations + +Disable `NEXT_PUBLIC_DEMO_ENABLED` to revert all demo triggers to unavailable behavior without removing the homepage. Do not roll back schema, redaction, or destination controls while leaving submission active. Vendor adapters must support independent disablement and fail closed. + +## 47. Phase 15 readiness assessment + +Phase 15 can execute final automated QA and resilience validation without restructuring the integration boundary. It cannot declare production readiness until P14 blockers and inherited acceptance gates are resolved. The repository is structurally ready for vendor adapters once authoritative decisions arrive. diff --git a/docs/PHASE_15_HANDOFF_v1.0.md b/docs/PHASE_15_HANDOFF_v1.0.md new file mode 100644 index 0000000..f614af6 --- /dev/null +++ b/docs/PHASE_15_HANDOFF_v1.0.md @@ -0,0 +1,119 @@ +# Phase 15 Handoff: Final Automated QA, Accessibility, Performance, Resilience, and Visual Validation + +## Handoff status + +Phase 14 implements the controlled demo workflow and vendor-neutral integration boundary. Static checks, unit/integration tests, coverage, build, standalone HTTP smoke checks, audit, secret scan, and fail-closed production behavior pass in the available fallback environment. Production services remain intentionally blocked. Browser, axe, visual, and manual QA remain unobserved because local Chromium navigation is administratively blocked. + +## Read first + +1. `docs/PHASE_14_IMPLEMENTATION_REPORT_v1.0.md` +2. `docs/phase14/INTEGRATION_ARCHITECTURE_v1.0.md` +3. `docs/phase14/DEMO_FORM_CONTRACT_v1.0.md` +4. `docs/phase14/DESTINATION_REGISTRY_v1.0.csv` +5. `docs/phase14/INTEGRATION_TRACEABILITY_MATRIX_v1.0.csv` +6. `docs/phase14/DATA_FLOW_INVENTORY_v1.0.csv` +7. `docs/phase14/CONSENT_MATRIX_v1.0.csv` +8. `docs/phase14/ANALYTICS_EVENT_REGISTRY_v1.0.csv` +9. `docs/phase14/EXTERNAL_SERVICE_INVENTORY_v1.0.csv` +10. `docs/phase14/ENVIRONMENT_VARIABLE_INVENTORY_v1.0.csv` +11. `docs/phase14/FEATURE_FLAG_INVENTORY_v1.0.csv` +12. `docs/phase14/RELEASE_GATE_MATRIX_v1.0.csv` +13. `docs/IMPLEMENTATION_ISSUE_REGISTER_v1.4.csv` +14. `docs/DECISION_LOG_v14.0.md` +15. `PHASE_14_PACKAGE_MANIFEST_v1.0.json` + +## Route and destination inventory + +Runtime routes are `/{locale}`, `/{locale}/{approved-slug}`, `/{locale}/component-lab`, `/api/demo`, `/_not-found`, and `/robots.txt`. The destination registry is authoritative. Do not convert blocked login, pricing, product-tour, legal, support, cookie-settings, or sales destinations into links without approved URLs and locale behavior. + +## Form and integration architecture + +The immutable Phase 9 form contract and its Zod implementation are authoritative. UI code must call the API boundary, never vendor SDKs. Server orchestration selects typed adapters, applies timeout/idempotency, and returns normalized results. The local adapter discards data and is not a production destination. + +## Adapter and external-service inventory + +Implemented adapters: local discard and blocked production. Not implemented: CRM, scheduler, email, analytics network provider, consent manager, webhook, and durable idempotency/rate-limit store. Add each behind an explicit interface only after vendor, authentication, scope, mapping, duplicate, retry, privacy, and owner decisions are approved. + +## Environment and feature flags + +Use `.env.example` and the Phase 14 inventories. Production must fail closed when critical values are missing. `DEMO_LOCAL_TEST_MODE` is permitted only for explicit loopback production-like tests. `DEMO_TEST_SCENARIOS_ENABLED` must remain false in production. + +## Data flow and consent + +No field may be logged, placed in URLs, analytics, browser storage, screenshots, or monitoring labels. Legal basis, privacy notice, retention, deletion, recipients, cross-border implications, marketing consent, analytics consent, and withdrawal remain blocked. Do not improvise checkbox text. + +## Analytics registry + +Only allowlisted event names and properties may be emitted. No personal data, form values, free text, company name, email, or identifiers are permitted. The current sink has no network and is disabled by default. A provider requires a separate approved adapter and consent/loading decision. + +## Security and privacy controls + +Preserve strict schemas, body-size and content-type limits, request marker, same-origin policy, timeout, idempotency, no-store responses, non-reflected error codes, CSP, redaction, and server-only secrets. Before production add architecture-approved distributed rate limiting, durable idempotency, operational metrics, vendor least privilege, and webhook verification where applicable. + +## Success and failure inventory + +The authoritative states are initial, submitting, local success, validation, configuration, duplicate, timeout, integration, abuse, and unexpected failure. Never claim CRM acceptance, email delivery, or meeting booking without provider confirmation. + +## Test adapters and failure simulation + +Use fictional `.test` emails and deterministic scenarios: success, duplicate, timeout, integration error, validation rejection, and blocked configuration. Automated tests must never contact production systems. The test-scenario header is accepted only outside production. + +## Required browser matrix + +Run EN, FR, and AR in Chromium, Firefox, WebKit, mobile Chrome, and mobile Safari. Cover 1440, 1024, 768, 390, and 320 widths; light, dark, system; mobile drawer; form initial/focus/error/loading/success/failure; long French and Arabic; Arabic RTL; back/refresh/resubmit; slow/offline/timeout transitions. + +## Accessibility matrix + +Run axe plus keyboard-only, screen-reader, 200/400-percent zoom, reduced motion, forced colors, touch target, focus trap/return, error announcement, success announcement, and Arabic reading-order review. Record browser, OS, assistive technology, locale, theme, viewport, steps, result, evidence, and issue. + +## Visual-regression matrix + +Approve deterministic baselines for the Phase 14 integration states in EN/FR/AR light/dark desktop/mobile. Do not accept screenshots of the administrative browser block. Keep fictional content and stable fonts/animations. + +## Performance and bundle budgets + +No vendor SDK is currently permitted. Any new integration must be lazy-loaded, consent-gated where required, and measured against Phase 14 bundle inventory. Record route JS, third-party requests, main-thread cost, submission latency, timeout behavior, and interaction responsiveness. Reject vendors that require disabling CSP without review. + +## Release gates + +The release-gate matrix and P14-001 through P14-009 are authoritative. A working local happy path does not satisfy production readiness. Critical gates include approved lead destination, legal processing, consent, retention/deletion, production URLs, distributed duplicate controls, browser/accessibility validation, and pinned runtime verification. + +## Files Phase 15 may modify + +Tests, deterministic fixtures, visual baselines, quality reports, browser configuration, non-breaking accessibility fixes, bounded performance fixes, validation scripts, issue records, decision records, and package manifest. + +## Files Phase 15 must not modify without an architecture decision + +Phase 9 contracts, public form fields, adapter interfaces, destination meanings, consent semantics, analytics event names, production feature defaults, token/theme/localization foundations, CSP weakening, package manager/runtime pins, or vendor selection. + +## Required validation commands + +```bash +pnpm install --frozen-lockfile +pnpm validate +pnpm format:check +pnpm lint +pnpm typecheck +pnpm test:unit +pnpm test:integration +pnpm test:browser +pnpm test:a11y +pnpm test:visual +pnpm test:e2e +pnpm test:security +pnpm test:privacy +SITE_ORIGIN=https://approved.example PUBLIC_RELEASE_APPROVED=false pnpm build +pnpm audit --audit-level low +pnpm manifest:generate +pnpm validate:package +``` + +Run on Node 24.17.0, pnpm 11.9.0, unblocked pinned browsers, and a production-like isolated environment. Record exit code, duration, counts, warnings, and evidence for every command. + +## Rollback and resilience instructions + +Exercise CRM timeout, rejection, duplicate, partial acceptance, network interruption, adapter configuration failure, scheduler unavailability, analytics denial, and repeated transport. Verify bounded retries and no duplicate external record. Roll back by disabling the public demo flag and vendor-specific server flag while preserving destination and schema controls. + +## Phase 15 definition of done + +All static, unit, integration, browser, accessibility, security, privacy, visual, performance, destination, consent, and failure-simulation gates run in the pinned environment; approved baselines and manual evidence exist; no personal data leaks; production services remain blocked unless all business/legal/vendor decisions are supplied; every remaining issue has owner, severity, evidence, and release condition; Phase 16 receives only explicit content/business approvals rather than hidden engineering assumptions. diff --git a/docs/PHASE_15_IMPLEMENTATION_REPORT_v1.0.md b/docs/PHASE_15_IMPLEMENTATION_REPORT_v1.0.md new file mode 100644 index 0000000..98b883a --- /dev/null +++ b/docs/PHASE_15_IMPLEMENTATION_REPORT_v1.0.md @@ -0,0 +1,191 @@ +# Phase 15 Implementation Report + +**Date:** 2026-06-25 + +## 1. Executive summary + +Phase 15 found and fixed four repository defects: corrupted release-evidence CSV rows, loose JSON media-type matching, nondeterministic visual-test setup, and missing CI integration coverage. Dependency-free validation passes. Final acceptance is blocked because the pinned clean install and all dependency-backed/browser/human/production-like gates could not run. + +## 2. Authoritative inputs reviewed + +The Phase 15 prompt, complete Phase 14 repository, Phase 14 handoff, implementation report, decision log, issue register, manifest, route/destination/form/integration/data-flow/consent/analytics/security/privacy/performance/release-gate records, tests, CI, README, and inherited Phase 9 through Phase 13 contracts were reviewed. + +## 3. Test environment + +Observed: Debian GNU/Linux 13, Node v22.16.0, npm 10.9.2, Corepack 0.32.0, Python 3.13.5, Chromium 144.0.7559.96. Required: Node 24.17.0 and pnpm 11.9.0. The supplied ZIP contained no `.git` directory. + +## 4. Clean-room baseline + +Fresh extraction and Phase 14 manifest verification passed. Corepack could not fetch pnpm because registry DNS is unavailable; frozen install did not run. + +## 5. Repository integrity + +Baseline static audit found 4 High and 7 Medium findings. After remediation, the same audit reports zero findings. Final artifact integrity is governed by the Phase 15 manifest. + +## 6. Static analysis + +Sixteen dependency-free validators pass. JavaScript/non-JSX TypeScript syntax and the Python audit script pass. Prettier, ESLint, strict TypeScript, dead-code, dependency/license, and bundle-secret tooling are blocked. + +## 7. Unit testing + +Current Vitest suite not run. A media-type regression test was authored and eight dependency-free assertions pass. Historical Phase 14 unit evidence is stale for this release candidate. + +## 8. Integration testing + +Current integration suite not run. CI omission was fixed. Historical Phase 14 integration evidence is stale. + +## 9. End-to-end testing + +Authored scenarios exist; no current browser execution. + +## 10. Cross-browser testing + +Configured projects cover Chromium, Firefox, WebKit, mobile Chrome, and mobile Safari; no current results. + +## 11. Device and viewport testing + +Required widths are represented in tests; rendered validation blocked. + +## 12. Zoom and reflow + +No current 200/400 percent or OS scaling evidence. + +## 13. Automated accessibility + +Axe suites authored; not executed. + +## 14. Keyboard accessibility + +Static semantics reviewed; manual keyboard flow not run. + +## 15. Screen-reader testing + +NVDA, VoiceOver, and TalkBack not run. No announcement transcript was invented. + +## 16. WCAG 2.2 AA assessment + +Criterion-to-evidence matrix produced. Many criteria have static evidence only; conformance is not established. + +## 17. Localization QA + +Catalog key parity passes. Native French and Arabic approval remains open. + +## 18. RTL QA + +Document direction and logical CSS controls pass; Arabic end-to-end and AT review blocked. + +## 19. Theme QA + +Theme foundations pass static checks; no-flash, system changes, contrast, and forced-colors browser evidence blocked. Visual key defect fixed. + +## 20. Visual regression + +Canonical Chromium setup fixed. No baselines generated or approved. + +## 21. Design fidelity + +Composition/token validators pass; rendered design comparison not performed. + +## 22. Performance + +Approved budgets exist; no final build or browser metrics. + +## 23. Bundle analysis + +No new runtime dependency added; final chunks and client boundaries not measured. + +## 24. Image and font performance + +No production public assets added; final images/fonts/network behavior unmeasured. + +## 25. Security validation + +Static request, schema, timeout, idempotency, CSP, redaction, and fail-closed controls pass. Content-type boundary hardened. Dynamic/dependency/vendor/rate-limit evidence blocked. + +## 26. Privacy validation + +Static no-PII controls pass. Legal basis, recipients, retention, deletion, transfers, and runtime vendor/log evidence blocked. + +## 27. Consent validation + +Optional processing remains disabled; complete consent lifecycle not implemented or tested. + +## 28. Analytics validation + +Strict non-PII allowlist passes static review; provider and real consent gating not approved. + +## 29. Destination validation + +Registry and routes pass static checks; most production destinations remain blocked or placeholder. + +## 30. Failure simulation + +Deterministic scenarios authored; current runtime execution blocked. + +## 31. Idempotency and duplicate handling + +Process-local design reviewed; durable cross-instance policy remains blocked. + +## 32. Abuse-control validation + +Body size, marker, origin, schema, content type, and honeypot controls present; distributed rate limits absent. + +## 33. Deployment rehearsal + +Not run for Phase 15. + +## 34. Rollback rehearsal + +Feature-flag strategy documented; not rehearsed. + +## 35. Observability validation + +Correlation/redaction foundations exist; monitoring, alerts, retention, and dashboards absent. + +## 36. Content and evidence review + +Prohibited-content controls pass; final claims, evidence, assets, copy, and legal approvals remain open. + +## 37. SEO and metadata + +Static foundations pass; production-domain and rendered crawl evidence blocked. + +## 38. Browser history and navigation + +No PII URL construction found; final browser history matrix not run. + +## 39. Defect summary + +Four defects fixed: two High and two Medium. One High Phase 15 acceptance blocker remains open. + +## 40. Retest summary + +Targeted static/dependency-free retests pass. Full regression is blocked. + +## 41. Release-gate assessment + +Three static gates pass. All executable, browser/human, performance, deployment, and production approval gates remain blocked/open. + +## 42. Accepted exceptions + +None. + +## 43. Remaining risks + +Cumulative unresolved register: Critical 1, High 21, Medium 17, Low 2. + +## 44. Files added, changed, and removed + +Source changes harden content type; tests and CI are corrected; Phase 15 validators, reports, registers, and manifest are added. No authoritative Phase 9 contract was modified. File inventory is in `docs/quality/PHASE_15_FILE_CHANGES_v1.0.txt`. + +## 45. Exact commands required to reproduce validation + +See `docs/phase15/COMMAND_MATRIX_v1.0.csv` and the Phase 16 handoff. Blocked commands must be run exactly on the pinned toolchain. + +## 46. Final release recommendation + +**Not ready for Phase 16.** See `docs/phase15/FINAL_RELEASE_RECOMMENDATION_v1.0.md`. + +## 47. Phase 16 readiness assessment + +Phase 16 may review blockers and prepare approvals, but must not freeze or deploy a release candidate until P15-005 and all Critical/High release gates are closed or explicitly approved by accountable owners. No exception is currently accepted. diff --git a/docs/PHASE_16_HANDOFF_v1.0.md b/docs/PHASE_16_HANDOFF_v1.0.md new file mode 100644 index 0000000..e0ef9d0 --- /dev/null +++ b/docs/PHASE_16_HANDOFF_v1.0.md @@ -0,0 +1,65 @@ +# Phase 16 Handoff: Final Content Approval and Deployment Preparation + +## Handoff status + +Phase 15 recommendation: **Not ready for Phase 16**. This handoff exists to make the remaining work explicit, not to imply release approval. + +## Artifact identity + +- Supplied archive had no Git metadata; final validated commit identifier is **unavailable**. +- Use `PHASE_15_PACKAGE_MANIFEST_v1.0.json` and the delivered ZIP checksum to identify this artifact. +- Phase 16 must commit the exact package and record the immutable commit SHA before release-candidate freeze. + +## Evidence package + +Review `docs/PHASE_15_IMPLEMENTATION_REPORT_v1.0.md`, `docs/phase15/FINAL_RELEASE_RECOMMENDATION_v1.0.md`, `docs/phase15/DEFECT_REGISTER_v1.0.csv`, `docs/phase15/RELEASE_GATE_MATRIX_v1.0.csv`, `docs/phase15/RISK_ACCEPTANCE_REGISTER_v1.0.csv`, `docs/phase15/COMMAND_MATRIX_v1.0.csv`, and all Phase 15 reports. + +## Production configuration inventory + +Authoritative inventories remain `.env.example` and the Phase 14 environment, feature-flag, destination, external-service, data-flow, consent, and analytics registries. Production defaults remain blocked. No production credential is included. + +## Required engineering validation before freeze + +1. Run Node 24.17.0 and pnpm 11.9.0. +2. Run `pnpm install --frozen-lockfile`. +3. Run `pnpm validate`, `pnpm validate:package`, `pnpm format:check`, `pnpm lint`, `pnpm typecheck`, `pnpm test:unit`, `pnpm test:integration`, `pnpm test:security`, `pnpm test:privacy`, and the production build. +4. Install pinned Playwright browsers and run browser, accessibility, and visual suites. +5. Complete manual keyboard, screen-reader, zoom/reflow, forced-colors, reduced-motion, Arabic RTL, and mobile device matrices. +6. Measure performance and bundles against the approved budgets. +7. Rehearse production-like deployment and rollback. +8. Close all Critical/High defects and retest Medium defects. + +## Required business and operational approvals + +- Final EN/FR/AR copy and native linguistic review +- Claims, evidence, customer logos, testimonials, and product captures +- Legal/privacy/consent text, legal basis, retention, deletion, recipients, and transfers +- Analytics provider, event approval, consent category, DPA, region, retention, and owner +- CRM lead destination, mapping, authentication, duplicate/retry policy, sandbox, monitoring, and owner +- Scheduler and email decisions if enabled +- Production origin, DNS, hosting, cache/security headers, redirects, robots, canonical, and hreflang +- Final logo, social assets, hero/product assets, and performance approval +- Production secrets through an approved secret manager with least privilege and rotation +- Launch owner matrix, launch-day checklist, incident/rollback authority, and post-launch monitoring + +## Launch-day checklist + +Freeze the approved commit and manifest; verify environment and secret inventory; deploy with production integrations disabled until each gate is approved; run localized route, demo, headers, metadata, analytics/consent, privacy, accessibility, performance, and destination smoke checks; confirm monitoring; record go/no-go decision. + +## Post-launch smoke and monitoring checklist + +Verify EN/FR/AR pages, light/dark/system, mobile/desktop, demo acceptance semantics, no duplicate leads, no PII in URLs/logs/analytics, CRM/scheduler latency, errors/timeouts/rate limits, consent withdrawal, security headers, canonical/hreflang/robots, Core Web Vitals, and rollback triggers. + +## Files Phase 16 may modify + +Approved copy/resources, final governed assets, production environment templates without secrets, approved destination/provider adapters, deployment configuration, launch documentation, and targeted tests/evidence. + +## Files Phase 16 must not modify without reopening QA + +Phase 9 contracts, component behavior, page structure, validation/schema, data flow, consent semantics, analytics event names/properties, integration interfaces, accessibility behavior, RTL/theme/routing foundations, CSP/security controls, or performance-critical loading behavior. + +Any change in those areas requires targeted Phase 15 regression and updated evidence before release. + +## Definition of done for release + +A real commit SHA and manifest identify the candidate; all required commands pass; browser/AT/visual/performance/deployment/rollback evidence is approved; no unresolved Critical or High defect remains without accountable written exception; all production business/legal/operational gates are approved; post-deployment smoke checks pass; monitoring and rollback owners are active. diff --git a/docs/PHASE_16_IMPLEMENTATION_AND_LAUNCH_REPORT_v1.0.md b/docs/PHASE_16_IMPLEMENTATION_AND_LAUNCH_REPORT_v1.0.md new file mode 100644 index 0000000..7508d64 --- /dev/null +++ b/docs/PHASE_16_IMPLEMENTATION_AND_LAUNCH_REPORT_v1.0.md @@ -0,0 +1,241 @@ +# Phase 16 Final Implementation and Launch Report + +## 1. Executive summary + +Launch was rejected and aborted before deployment. 18 dependency-free checks passed, but the exact runtime, dependency-backed, browser, human, business, legal, operational, infrastructure, and production evidence is missing. + +## 2. Phase 15 release recommendation + +The Phase 15 recommendation of not ready was upheld without reinterpretation. + +## 3. Final blocker disposition + +Four Phase 15 defects remain resolved; aggregate blocker P15-005 remains open. Cumulative issue counts remain Critical 1, High 21, Medium 17, Low 2. + +## 4. Final release-gate status + +3 gates are approved from static evidence; 29 are blocked pending evidence. + +## 5. Accepted exceptions + +None. + +## 6. Product approval + +Blocked pending named product approver and final artifact. + +## 7. Content approval + +Blocked pending final approved EN/FR/AR copy and metadata. + +## 8. Claims and evidence approval + +Blocked. Research-only or pending evidence must remain suppressed. + +## 9. Customer evidence approval + +Blocked. No written customer permission was supplied. + +## 10. Legal approval + +Blocked. No approved terms, legal entity record, or localized legal text was supplied. + +## 11. Privacy approval + +Blocked. No approved policy, basis, recipients, retention, deletion, request process, or transfer disclosure was supplied. + +## 12. Consent approval + +Blocked. No approved consent categories, version, storage, withdrawal, or provider was supplied. + +## 13. Analytics approval + +Blocked. The current sink remains disabled and network-free. + +## 14. Localization approval + +Static parity passed; human approval blocked. + +## 15. Arabic approval + +Static RTL and logical CSS passed; native MSA and screen-reader review blocked. + +## 16. French approval + +Static parity passed; native linguistic review blocked. + +## 17. Accessibility approval + +Blocked pending browser automation and human keyboard, screen-reader, zoom, reflow, forced-colors, reduced-motion, mobile, and Arabic review. + +## 18. Security approval + +Static controls passed; dependency audit and live production checks blocked. + +## 19. CRM and scheduler approval + +Blocked. Vendors, accounts, credentials, mappings, duplicate rules, calendars, fallbacks, and owners are absent. + +## 20. Asset approval + +Blocked pending governed final brand and media assets. + +## 21. Production architecture + +Not supplied. + +## 22. Production configuration + +Safe defaults are documented; actual production values are absent. + +## 23. Secret management + +No production secrets were supplied or stored. Provisioning, scope, rotation, and revocation remain blocked. + +## 24. Domain and DNS + +Not supplied. + +## 25. TLS + +Not executed. + +## 26. Security headers + +Static configuration only; production responses unavailable. + +## 27. CDN and caching + +Not supplied or tested. + +## 28. Search-engine configuration + +Static foundations passed; live behavior unavailable. + +## 29. Email readiness + +Not configured and disabled. + +## 30. Observability + +Not configured for production. + +## 31. Incident response + +No named owners or channel. + +## 32. Rollback readiness + +No platform target or rehearsal. + +## 33. Release-candidate freeze + +No approved candidate frozen. + +## 34. Targeted regression + +18 dependency-free checks passed; all dependency-backed, browser, human, and production checks blocked. + +## 35. Pre-launch validation + +Rejected due missing production target and approvals. + +## 36. Launch authorization + +Rejected. + +## 37. Deployment + +Not executed. + +## 38. DNS cutover + +Not executed. + +## 39. Production smoke tests + +Not executed. + +## 40. Controlled live submission + +Not executed. + +## 41. Live consent validation + +Not executed. + +## 42. Live analytics validation + +Not executed. + +## 43. Live CRM and scheduler validation + +Not executed. + +## 44. Live accessibility checks + +Not executed. + +## 45. Live localization and RTL checks + +Not executed. + +## 46. Live performance + +Not executed. + +## 47. Live security + +Not executed. + +## 48. Live privacy + +Not executed. + +## 49. Monitoring window + +Not executed. + +## 50. Incidents and hotfixes + +None because no deployment occurred. + +## 51. Rollback decision + +Not applicable; launch was stopped before deployment. + +## 52. Post-deployment verification + +Not executed. + +## 53. SEO verification + +Not executed on a live domain. + +## 54. Operational handoff + +Not completed. + +## 55. Deferred work + +41 unresolved items are listed in the deferred-work register. + +## 56. Final launch status + +Launch aborted before deployment. + +## 57. Files and configuration changed + +Added Phase 16 governance, evidence, reports, validators, manifest support, decision log, and updated issue register. Application runtime behavior and production feature flags were not enabled. + +## 58. Exact commands and platform actions + +Recorded in COMMAND_AND_PLATFORM_ACTION_MATRIX_v1.0.csv and docs/quality/phase16-command-logs. + +## 59. Final risks + +Primary risks remain unobserved executable behavior, inaccessible or broken browser flows, unlawful data processing, incorrect lead destinations, absent operations, and unknown production infrastructure. + +## 60. Next review date + +After all Critical and High gates have named owners, evidence, and approvals. No arbitrary date was invented. diff --git a/docs/PHASE_17_OPERATIONS_HANDOFF_v1.0.md b/docs/PHASE_17_OPERATIONS_HANDOFF_v1.0.md new file mode 100644 index 0000000..e1212c7 --- /dev/null +++ b/docs/PHASE_17_OPERATIONS_HANDOFF_v1.0.md @@ -0,0 +1,5 @@ +# Post-Phase-16 Operations Handoff + +Phase 16 did not authorize or execute launch. The next work item is not feature expansion. It is closure of every Critical and High release gate, followed by exact-toolchain QA, human accessibility/localization review, production configuration approval, release-candidate freeze, deployment rehearsal, formal authorization, controlled launch, and live monitoring. + +All optional integrations and destinations must remain disabled until their approvals are recorded. Use `docs/phase16/FINAL_RELEASE_GATE_MATRIX_v1.0.csv`, `docs/phase16/DEFERRED_WORK_REGISTER_v1.0.csv`, and `docs/phase16/COMMAND_AND_PLATFORM_ACTION_MATRIX_v1.0.csv` as the controlling worklists. diff --git a/docs/phase14/ANALYTICS_EVENT_REGISTRY_v1.0.csv b/docs/phase14/ANALYTICS_EVENT_REGISTRY_v1.0.csv new file mode 100644 index 0000000..9a88127 --- /dev/null +++ b/docs/phase14/ANALYTICS_EVENT_REGISTRY_v1.0.csv @@ -0,0 +1,7 @@ +Event,Purpose,Trigger,Allowed_properties,Personal_data,Consent_category,Environment,Implementation_status +demo_open,CTA discovery,dialog opens,routeId; locale; direction; resolvedTheme; source,No,analytics,test sink only,instrumented; disabled +demo_validation_error,Validation friction,client validation fails,routeId; locale; direction; resolvedTheme; source; errorCount,No,analytics,test sink only,instrumented; disabled +demo_submit_attempt,Funnel attempt,validated submit,routeId; locale; direction; resolvedTheme; source,No,analytics,test sink only,instrumented; disabled +demo_submit_success,Confirmed completion,adapter acceptance,routeId; locale; direction; resolvedTheme; source,No,analytics,test sink only,instrumented; disabled +demo_submit_failure,Failure category,normalized failure,routeId; locale; direction; resolvedTheme; source; errorCode,No,analytics,test sink only,instrumented; disabled +demo_close,Dialog abandonment,user closes,routeId; locale; direction; resolvedTheme; source; reason,No,analytics,test sink only,instrumented; disabled diff --git a/docs/phase14/COMPONENT_VARIANT_UPDATE_v1.0.md b/docs/phase14/COMPONENT_VARIANT_UPDATE_v1.0.md new file mode 100644 index 0000000..b6c6e1d --- /dev/null +++ b/docs/phase14/COMPONENT_VARIANT_UPDATE_v1.0.md @@ -0,0 +1,8 @@ +# Phase 14 Component Variant Update + +Two backward-compatible component changes support the integration flow: + +1. `TextInput` now forwards its native input ref so a dialog can place initial focus on the first field and restore the approved error-focus pattern. +2. `CTA` accepts optional `primaryNode` and `secondaryNode` slots while retaining its existing action-object API. This permits a semantic button trigger for the native demo dialog without turning a button action into a fake navigation link. + +No visual token, component family, or existing prop behavior was removed. diff --git a/docs/phase14/CONSENT_MATRIX_v1.0.csv b/docs/phase14/CONSENT_MATRIX_v1.0.csv new file mode 100644 index 0000000..d5988d4 --- /dev/null +++ b/docs/phase14/CONSENT_MATRIX_v1.0.csv @@ -0,0 +1,6 @@ +Purpose,Required_for_local_flow,Required_for_production,Current_behavior,Decision_owner,Blocker +Necessary demo processing,Payload discarded,Legal basis/notice required,Production disabled,Legal,P9-003 +Privacy acknowledgment,No final acknowledgment,Pending decision,Operational local notice only,Legal,P9-003 +Marketing opt-in,No,Optional if approved; never preselected,Not rendered/transmitted,Legal + Marketing,P9-003 +Analytics consent,Injected test consent only,Pending policy,Disabled; test sink gated,Legal + Analytics,P9-004 +Advertising consent,No,No approved use,No advertising code,Legal + Marketing,P9-004 diff --git a/docs/phase14/DATA_FLOW_INVENTORY_v1.0.csv b/docs/phase14/DATA_FLOW_INVENTORY_v1.0.csv new file mode 100644 index 0000000..f458528 --- /dev/null +++ b/docs/phase14/DATA_FLOW_INVENTORY_v1.0.csv @@ -0,0 +1,11 @@ +Field,Purpose,Required,Source,Browser_processing,Server_processing,External_recipients,Storage_location,Retention,Deletion_path,Consent_or_legal_basis,Logging,Analytics,Owner,Open_issue +fullName,Identify requester,Yes,User form/current locale,DOM memory only; client validation,strict validation and normalization,None,None,Request lifetime only,Automatic discard,Unapproved for production,Prohibited,Prohibited,Sales Ops + Legal,P9-002; P9-003 +workEmail,Follow-up address,Yes,User form/current locale,DOM memory only; client validation,lowercase and practical validation,None,None,Request lifetime only,Automatic discard,Unapproved for production,Prohibited,Prohibited,Sales Ops + Legal,P9-002; P9-003 +company,Qualify organization,Yes,User form/current locale,DOM memory only; client validation,strict validation and normalization,None,None,Request lifetime only,Automatic discard,Unapproved for production,Prohibited,Prohibited,Sales Ops,P9-002 +fleetSize,Approved qualification,Yes,User form/current locale,DOM memory only; client validation,enum validation,None,None,Request lifetime only,Automatic discard,Unapproved for production,Prohibited,Prohibited,Sales Ops,P9-002 +market,Optional market context,No,User form/current locale,DOM memory only; client validation,trim and length limit,None,None,Request lifetime only,Automatic discard,Unapproved for production,Prohibited,Prohibited,Sales Ops + Legal,P9-013 +preferredLanguage,Demo language preference,No,User form/current locale,DOM memory only; client validation,enum validation,None,None,Request lifetime only,Automatic discard,Unapproved for production,Prohibited,Prohibited,Sales Ops,P9-002 +message,Optional demo focus,No,User form/current locale,DOM memory only; client validation,trim and 1000-character limit,None,None,Request lifetime only,Automatic discard,Unapproved for production,Prohibited,Prohibited,Sales Ops + Legal,P9-002; P9-003 +idempotencyKey,Transport deduplication,Yes,Browser UUID,memory only,bounded local result coalescing,None,process memory,900 seconds default,TTL/process restart,Necessary technical processing; production policy pending,Not logged,Prohibited,Engineering,P14-004 +source,CTA entry point,Yes,Application allowlist,event detail,enum validation,None,None,request lifetime,automatic,Operational context,Category only if approved,Allowlisted after consent,Product + Analytics,P9-004 +correlationId,Privacy-safe error correlation,Generated,Server UUID,failure response only,generated per attempt,None,None currently,None,automatic,Necessary diagnostics,Allowed without payload if observability approved,Prohibited,Engineering,P14-005 diff --git a/docs/phase14/DEMO_FORM_CONTRACT_v1.0.md b/docs/phase14/DEMO_FORM_CONTRACT_v1.0.md new file mode 100644 index 0000000..59c02e6 --- /dev/null +++ b/docs/phase14/DEMO_FORM_CONTRACT_v1.0.md @@ -0,0 +1,25 @@ +# Phase 14 Demo Form Contract + +## Approved business fields + +The implementation preserves the Phase 9 contract exactly: `fullName`, `workEmail`, `company`, `fleetSize`, optional `market`, optional `preferredLanguage`, optional `message`, `idempotencyKey`, and `source`. No phone, job title, location count, revenue, marketing profile, or lead-scoring field was added. + +Fleet-size values are `1-9`, `10-24`, `25-49`, `50-99`, `100-249`, and `250+`. + +## Transport envelope + +The JSON submission body contains an approved lead object and a separate non-business guard object. The guard contains an empty honeypot and the form-open timestamp. Both objects reject unknown fields. The timestamp is not treated as authoritative identity or anti-fraud evidence. + +## Validation + +Client validation improves correction. The same strict Zod schema is executed on the server. Text is trimmed, repeated whitespace is collapsed, email casing is normalized, lengths are bounded, enum values are allowlisted, and unknown fields are rejected. Email validation is deliberately practical rather than a theatrical reenactment of the entire email RFC. + +## State machine + +`idle → validating → submitting → success | recoverable_error | terminal_error` + +A pending submission disables repeat activation. The same idempotency key is retained for a retry after a recoverable transport failure. Success is rendered only after adapter acceptance. + +## Privacy and consent boundary + +The local adapter discards the payload and does not create a lead. The operational notice states this explicitly. Final privacy notice, legal basis, acknowledgment, marketing opt-in, retention, and deletion behavior remain blocked by P9-003. Production submission cannot be enabled by the shipped configuration. diff --git a/docs/phase14/DESTINATION_REGISTRY_v1.0.csv b/docs/phase14/DESTINATION_REGISTRY_v1.0.csv new file mode 100644 index 0000000..922e264 --- /dev/null +++ b/docs/phase14/DESTINATION_REGISTRY_v1.0.csv @@ -0,0 +1,11 @@ +Key,Kind,Status_production,Status_local,Locale_behavior,Target,Issue,Release_rule,Notes +book-demo,modal/form,blocked,active,EN/FR/AR,Local discard adapter only,P9-002; P9-003,"Approved destination, legal text, retention and deletion policy",Local success states no external lead was created. +contact-sales,external-url,blocked,blocked,EN/FR/AR,None,P9-015,Approved sales destination,No guessed email or URL. +product-tour,modal/media,blocked,blocked,EN/FR/AR,None,P9-012,"Approved medium, captions, transcript and embed policy",No embed loaded. +pricing,internal intent,placeholder,placeholder,Localized homepage section,#pricing,P9-008,Commercial approval,No public prices or checkout. +login,external-url,blocked,blocked,EN/FR/AR,None,P9-014,Approved origin and redirect policy,Authentication excluded. +privacy,internal-route,placeholder,placeholder,Localized route,privacy placeholder,P9-003,Approved localized legal copy,Not final policy. +terms,internal-route,placeholder,placeholder,Localized route,terms placeholder,P9-003,Approved localized legal copy,Not final terms. +accessibility,internal-route,placeholder,placeholder,Localized route,accessibility placeholder,P13-002,Manual review and approved statement,Non-indexable placeholder. +cookie-settings,modal,blocked,blocked,EN/FR/AR,None,P9-004,Approved consent categories and withdrawal mechanism,Analytics disabled. +support,external-url,blocked,blocked,EN/FR/AR,None,P9-015,Approved support destination,No placeholder contact data. diff --git a/docs/phase14/ENVIRONMENT_VARIABLE_INVENTORY_v1.0.csv b/docs/phase14/ENVIRONMENT_VARIABLE_INVENTORY_v1.0.csv new file mode 100644 index 0000000..493f0bd --- /dev/null +++ b/docs/phase14/ENVIRONMENT_VARIABLE_INVENTORY_v1.0.csv @@ -0,0 +1,9 @@ +Variable,Purpose,Visibility,Environments,Validation,Default,Secret,Owner,Rotation,Missing_behavior +SITE_ORIGIN,Canonical/allowed origin,server,production/test,absolute URL,none,No,Infrastructure,domain change,existing production gate +NEXT_PUBLIC_DEMO_ENABLED,Expose demo trigger,public,all,boolean,false,No,Product + Engineering,n/a,production disabled +DEMO_SUBMISSION_MODE,blocked/local adapter,server,all,enum,local non-production; blocked production,No,Engineering,n/a,safe inferred default +DEMO_REQUEST_TIMEOUT_MS,Bound adapter call,server,all,250-15000 integer,4000,No,Engineering,n/a,4000 +DEMO_IDEMPOTENCY_TTL_SECONDS,Local coalescing TTL,server,all,60-86400 integer,900,No,Engineering,n/a,900 +DEMO_TEST_SCENARIOS_ENABLED,Deterministic failures,server,test,boolean,false,No,QA,n/a,disabled +DEMO_LOCAL_TEST_MODE,Loopback production-like test escape,server,local test,boolean plus loopback SITE_ORIGIN,false,No,QA + Engineering,n/a,production local mode rejected +NEXT_PUBLIC_ANALYTICS_MODE,disabled/test sink,public,test,enum,disabled,No,Analytics + Engineering,n/a,disabled diff --git a/docs/phase14/EXTERNAL_SERVICE_INVENTORY_v1.0.csv b/docs/phase14/EXTERNAL_SERVICE_INVENTORY_v1.0.csv new file mode 100644 index 0000000..836a909 --- /dev/null +++ b/docs/phase14/EXTERNAL_SERVICE_INVENTORY_v1.0.csv @@ -0,0 +1,6 @@ +Service_type,Vendor,Status,Authentication,Endpoint,Data_sent,Timeout,Retry,Idempotency,Owner,Blocker +CRM/lead destination,Unapproved,Blocked,Unknown,None,None,4-second boundary,No blind retry,Local coalescing; vendor semantics pending,Sales Ops + Engineering,P9-002 +Scheduling,Unapproved,Blocked,Unknown,None,None,n/a,n/a,n/a,Sales Ops,P14-006 +Email,Unapproved,Blocked,Unknown,None,None,n/a,n/a,n/a,Sales Ops + Engineering,P14-007 +Analytics,Unapproved,Blocked,Unknown,None,None,n/a,n/a,provider pending,Analytics + Legal,P9-004 +Consent management,Unapproved,Blocked,Unknown,None,None,n/a,n/a,n/a,Legal + Product,P9-003; P9-004 diff --git a/docs/phase14/FEATURE_FLAG_INVENTORY_v1.0.csv b/docs/phase14/FEATURE_FLAG_INVENTORY_v1.0.csv new file mode 100644 index 0000000..ed7d99a --- /dev/null +++ b/docs/phase14/FEATURE_FLAG_INVENTORY_v1.0.csv @@ -0,0 +1,9 @@ +Flag,Default_production,Default_development,Owner,Disabled_behavior,Enablement_requirements +demoSubmissionEnabled,false,true with local discard,Product + Engineering,non-navigable localized reason,"CRM, legal, privacy, operations and QA approval" +crmIntegrationEnabled,false,false,Sales Ops + Engineering,blocked adapter,P9-002 +schedulerEnabled,false,false,Sales Ops,no scheduler,approved provider and accessibility review +analyticsEnabled,false,false,Analytics + Legal,no delivery/network/storage,P9-004 +marketingConsentEnabled,false,false,Legal,not rendered/transmitted,approved text and withdrawal flow +productTourEnabled,false,false,Product + Marketing,non-navigable,P9-012 +pricingDestinationEnabled,false,false,Commercial,informational section only,P9-008 +loginDestinationEnabled,false,false,Product + Engineering,non-navigable,P9-014 diff --git a/docs/phase14/INTEGRATION_ARCHITECTURE_v1.0.md b/docs/phase14/INTEGRATION_ARCHITECTURE_v1.0.md new file mode 100644 index 0000000..11d9259 --- /dev/null +++ b/docs/phase14/INTEGRATION_ARCHITECTURE_v1.0.md @@ -0,0 +1,23 @@ +# Phase 14 Integration Architecture + +```text +Approved CTA trigger +→ localized native dialog +→ shared client/server schema +→ POST /api/demo +→ request marker + origin + content type + size checks +→ strict server validation and normalization +→ honeypot check +→ idempotency coordinator +→ bounded adapter orchestration +→ local-discard or blocked adapter +→ normalized result +→ localized success/failure state +→ consent-gated, allowlisted test analytics sink +``` + +UI code never imports a vendor SDK. The lead adapter interface is the only external-service boundary. The shipping repository contains no CRM, scheduler, email, consent, or analytics network client because none is approved. + +The local adapter is deterministic, server-side, non-production, and discard-only. Production environment validation rejects local adapter activation except for an explicit loopback-only production-like browser test runtime. That escape requires `DEMO_LOCAL_TEST_MODE=true` and a `localhost` or `127.0.0.1` `SITE_ORIGIN`. + +The native dialog does not create browser history. Back navigation therefore remains unchanged. Locale and theme are inherited from the document. Closing is blocked while submission is pending, and focus returns to the initiating control. diff --git a/docs/phase14/INTEGRATION_TRACEABILITY_MATRIX_v1.0.csv b/docs/phase14/INTEGRATION_TRACEABILITY_MATRIX_v1.0.csv new file mode 100644 index 0000000..da8a5a1 --- /dev/null +++ b/docs/phase14/INTEGRATION_TRACEABILITY_MATRIX_v1.0.csv @@ -0,0 +1,6 @@ +Capability,Entry_points,Source_specifications,Data_fields,Consent_requirements,Adapter,External_destination,Analytics_events,Tests,Security_controls,Privacy_controls,Open_issues,Status +Demo presentation,header; mobile header; hero; final CTA; footer,Phase 9 demo contract; Phase 14 prompt,approved DemoRequest,Final legal text blocked,DemoDialogHost,none,demo_open; demo_close,schema; browser EN/FR/AR; axe; visual,native dialog; focus return,no storage or URL PII,P9-003; P14-002,partially-implemented +Submission API,POST /api/demo,Phase 9 contract; server authority rules,DemoRequest plus guard envelope,Production disabled,submission service,local discard only,none server-side,schema; integration; security/privacy validators,origin; request marker; content type; 16 KiB; strict schema; timeout; idempotency,no raw logging or body echo,P9-002; P9-003; P14-001,partially-implemented +Lead destination,submission service,typed adapter boundary,approved DemoLead,Production blocked,LocalLeadDestinationAdapter; BlockedLeadDestinationAdapter,none,success/failure client events,adapter and orchestration,server-only selection; timeout,local adapter discards payload,P9-002; P14-001,blocked +Analytics,demo lifecycle,Phase 9 analytics spec,allowlisted non-PII context,analytics consent required,disabled/test sink,none,demo_open; validation; attempt; success; failure; close,contract; browser no-PII; privacy validator,strict event schema,consent gate; no network/storage,P9-004; P14-003,blocked +Destinations,homepage/header/footer,Phase 13 policy; Phase 14 registry,none,n/a,typed registry,none approved,none activated,destination unit and validator,no external URL/open redirect,no arbitrary query forwarding,P9-008; P9-012; P9-014; P9-015,partially-implemented diff --git a/docs/phase14/PERFORMANCE_AND_BUNDLE_REPORT_v1.0.md b/docs/phase14/PERFORMANCE_AND_BUNDLE_REPORT_v1.0.md new file mode 100644 index 0000000..cca53f4 --- /dev/null +++ b/docs/phase14/PERFORMANCE_AND_BUNDLE_REPORT_v1.0.md @@ -0,0 +1,9 @@ +# Phase 14 Performance and Bundle Report + +Phase 14 adds no third-party runtime dependency and no vendor SDK. The new client code consists of the demo trigger, localized dialog/form state, shared Zod schema in the client bundle, and a disabled analytics test adapter. Scheduler, CRM, consent-manager, email, and network analytics libraries contribute zero bytes because they are not approved or implemented. + +The dialog host is mounted once per locale layout. External code is never loaded. The primary CTA remains responsive when integrations are blocked. Submission latency is bounded by a configurable four-second default timeout. + +The optimized build completed in 29 seconds on the available Node 22.16.0 host. The generated standalone tree measured 36,391,835 bytes and `.next/static` measured 1,524,329 bytes. These numbers include framework/runtime files and are an inventory, not a Phase 13 delta. The exact file list is recorded in `docs/quality/logs/phase14/bundle-inventory.log`. + +Lighthouse, main-thread cost, interaction responsiveness, and browser timing were not measured because system Chromium rejects loopback navigation with `net::ERR_BLOCKED_BY_ADMINISTRATOR`. Those results remain Phase 15 gates rather than decorative estimates. diff --git a/docs/phase14/PRIVACY_REVIEW_REPORT_v1.0.md b/docs/phase14/PRIVACY_REVIEW_REPORT_v1.0.md new file mode 100644 index 0000000..f8ba817 --- /dev/null +++ b/docs/phase14/PRIVACY_REVIEW_REPORT_v1.0.md @@ -0,0 +1,9 @@ +# Phase 14 Privacy Review + +The approved lead fields are processed only in the browser DOM, the server request, and the discard-only local adapter. They are not written to URLs, query strings, browser storage, logs, analytics, snapshots, or external systems. + +The analytics contract accepts only route, locale, direction, resolved theme, source, bounded step/error categories, and bounded counts. The shipping adapter is disabled. Its test sink requires an explicit in-page consent marker and sends no network request. + +The data-flow inventory records purpose, source, processing, recipient, storage, retention, deletion, consent status, logging status, owner, and blocker for every field. Production collection remains blocked because legal basis, privacy notice, retention, deletion, recipients, residency, and cross-border transfer decisions are absent. + +No final consent checkbox is rendered. This is intentional: presenting invented legal consent would not become lawful merely because the checkbox is attractively spaced. diff --git a/docs/phase14/RELEASE_GATE_MATRIX_v1.0.csv b/docs/phase14/RELEASE_GATE_MATRIX_v1.0.csv new file mode 100644 index 0000000..4526b88 --- /dev/null +++ b/docs/phase14/RELEASE_GATE_MATRIX_v1.0.csv @@ -0,0 +1,11 @@ +Gate,Severity,Status,Evidence,Owner,Exit_criteria +Approved CRM/lead destination,High,Blocked,EXTERNAL_SERVICE_INVENTORY_v1.0.csv,Sales Ops + Engineering,"Exit P9-002 with vendor, credentials, mapping, duplicate/retry policy and sandbox tests." +Approved legal/privacy/consent,High,Blocked,CONSENT_MATRIX_v1.0.csv,Legal,"Exit P9-003 with localized text, legal basis, retention and deletion." +Approved analytics provider/consent,High,Blocked,ANALYTICS_EVENT_REGISTRY_v1.0.csv,Analytics + Legal,Exit P9-004 and prove consent gating/no PII. +Production demo enablement,High,Blocked by validator,src/lib/integrations/environment.ts,Product + Engineering,Approved production adapter and legal decisions. +Security review,High,Partial,SECURITY_REVIEW_REPORT_v1.0.md,Security + Engineering,Dynamic CSRF/replay/dependency/CSP review in pinned CI. +Privacy review,High,Partial,PRIVACY_REVIEW_REPORT_v1.0.md,Legal + Privacy,"Approve data flow, recipients, retention, deletion and transfers." +Browser/accessibility/visual execution,High,Environment blocked,Authored Phase 14 suites,QA + Accessibility,Run in unblocked pinned-browser CI and approve baselines. +Native FR/AR review,High,Open,Mechanical locale parity only,Localization,Native review all form/status/error copy. +Exact runtime/install/audit,Medium,Environment blocked,Phase 14 command logs,Engineering + Security,"Node 24.17.0, pnpm 11.9.0 frozen install and audit." +Alternate sales contact,Medium,Blocked,DESTINATION_REGISTRY_v1.0.csv,Sales Ops,Approved fallback destination. diff --git a/docs/phase14/SECURITY_REVIEW_REPORT_v1.0.md b/docs/phase14/SECURITY_REVIEW_REPORT_v1.0.md new file mode 100644 index 0000000..9ed9607 --- /dev/null +++ b/docs/phase14/SECURITY_REVIEW_REPORT_v1.0.md @@ -0,0 +1,25 @@ +# Phase 14 Security Review + +## Implemented controls + +- Strict allowlisted request and guard schemas with unknown-field rejection. +- POST-only route handler with JSON content-type enforcement. +- 16 KiB declared and measured request-size limits. +- Same-origin or approved-origin validation. +- Custom request marker to force non-simple cross-origin requests through browser preflight. +- Server-side enum, length, locale, source, and UUID validation. +- HTML rendering remains React-escaped; external errors are never rendered. +- Adapter calls are bounded by `AbortController` timeout. +- Duplicate transport is coalesced by idempotency key. +- Production secrets have no public environment variable. +- Local/test adapters are blocked in deployed production configuration. +- No raw request body, form value, vendor response, or stack trace is logged or returned. +- No external URL or redirect destination is active. + +## Deliberately unresolved + +A production-grade distributed idempotency store, rate limiting, retry policy, CRM authentication, webhook verification, replay policy, vendor scopes, email-header defense, scheduler origin policy, and operational alerting depend on the selected service and architecture. They remain release gates rather than fake generic implementations. + +## Residual risk + +The local in-memory idempotency coordinator is process-local and exists only to test the boundary. It is not suitable for horizontally scaled production. The honeypot is proportionate for local testing but is not a complete abuse control. Dynamic security testing, dependency audit, browser CSP validation, and penetration review remain open because dependencies and browsers could not be executed in this environment. diff --git a/docs/phase14/SUCCESS_FAILURE_STATE_INVENTORY_v1.0.csv b/docs/phase14/SUCCESS_FAILURE_STATE_INVENTORY_v1.0.csv new file mode 100644 index 0000000..19105ff --- /dev/null +++ b/docs/phase14/SUCCESS_FAILURE_STATE_INVENTORY_v1.0.csv @@ -0,0 +1,10 @@ +State,User_message,Input_preserved,Retryable,Focus_or_announcement,Production_status +client validation,localized summary/field errors,Yes,After correction,alert then first invalid,Implemented +server validation,localized-safe mapped codes,Yes,After correction,summary/invalid field,Implemented +submitting,localized busy label,Yes,Duplicate disabled,aria-busy/polite status,Implemented +local success,states no real sales request,Cleared only on new request,n/a,polite success section,Non-production only +timeout,localized retry guidance,Yes,Yes,form summary,Implemented +integration failure,generic; no vendor detail,Yes,Normalized policy,form summary,Implemented +configuration blocked,approval incomplete,Yes,No,summary/disabled trigger,Implemented +duplicate transport,same in-flight/result response,Yes,No duplicate,single result,Local boundary only +abuse/honeypot,non-revealing rejection,Not promised,No,form summary,Implemented diff --git a/docs/phase15/ABUSE_CONTROL_REPORT_v1.0.md b/docs/phase15/ABUSE_CONTROL_REPORT_v1.0.md new file mode 100644 index 0000000..c0badbc --- /dev/null +++ b/docs/phase15/ABUSE_CONTROL_REPORT_v1.0.md @@ -0,0 +1,22 @@ +# Phase 15 Abuse-control Report + +**Date:** 2026-06-25 +**Status:** Partial static controls; production gate blocked + +## Summary + +The API enforces a 16 KiB body limit, request marker, origin check, strict schema, content type, and honeypot. No distributed rate limit or approved CAPTCHA/accessibility alternative exists. + +## Executed evidence + +- Static API controls pass. +- Exact content type defect fixed. + +## Unexecuted or blocked evidence + +- Rapid requests, oversized/malformed payloads, origins, scripted submissions, slow assistive-technology users, international formats, threshold behavior. +- Distributed rate limiting and operational monitoring. + +## Release disposition + +Production submission remains blocked. diff --git a/docs/phase15/ANALYTICS_VALIDATION_REPORT_v1.0.md b/docs/phase15/ANALYTICS_VALIDATION_REPORT_v1.0.md new file mode 100644 index 0000000..710f41c --- /dev/null +++ b/docs/phase15/ANALYTICS_VALIDATION_REPORT_v1.0.md @@ -0,0 +1,21 @@ +# Phase 15 Analytics Validation Report + +**Date:** 2026-06-25 +**Status:** Static contract passed; provider/runtime blocked + +## Summary + +The allowlisted event schema permits only route, locale, direction, resolved theme, source, step, error code/count, and reason values. The current sink has no network and requires test consent. + +## Executed evidence + +- Analytics/privacy validators pass. +- Forbidden payload keys include name, email, company, message, phone, field value, and server response. + +## Unexecuted or blocked evidence + +- Provider, consent gating in real browser, duplicate hydration events, route changes, captured event evidence, retention, region, DPA. + +## Release disposition + +Analytics must remain disabled. diff --git a/docs/phase15/AUTOMATED_ACCESSIBILITY_REPORT_v1.0.md b/docs/phase15/AUTOMATED_ACCESSIBILITY_REPORT_v1.0.md new file mode 100644 index 0000000..0764644 --- /dev/null +++ b/docs/phase15/AUTOMATED_ACCESSIBILITY_REPORT_v1.0.md @@ -0,0 +1,21 @@ +# Phase 15 Automated Accessibility Report + +**Date:** 2026-06-25 +**Status:** Blocked + +## Summary + +Axe suites are authored for shell, homepage, component system, and demo workflow. They could not execute on the final Phase 15 tree. + +## Executed evidence + +- A11y source scenarios inspected. +- Static semantic controls and WCAG matrix prepared. + +## Unexecuted or blocked evidence + +- Axe results for EN/FR/AR, themes, mobile, form states, dialogs, FAQ, scheduler, forced colors. + +## Release disposition + +No automated accessibility pass is claimed. diff --git a/docs/phase15/BROWSER_HISTORY_REPORT_v1.0.md b/docs/phase15/BROWSER_HISTORY_REPORT_v1.0.md new file mode 100644 index 0000000..4a1321f --- /dev/null +++ b/docs/phase15/BROWSER_HISTORY_REPORT_v1.0.md @@ -0,0 +1,21 @@ +# Phase 15 Browser History and Navigation Report + +**Date:** 2026-06-25 +**Status:** Blocked + +## Summary + +Source avoids form values in URLs and keeps the demo in a dialog on the localized homepage. Direct entry, locale/theme changes, back/forward, refresh, success, resubmit, deep links, and external return were not executed. + +## Executed evidence + +- Static privacy audit finds no form-value URL construction. +- Authored browser scenarios include success URL checks. + +## Unexecuted or blocked evidence + +- Complete back/forward/refresh/modal/scheduler/hash/redirect history matrix and focus restoration. + +## Release disposition + +History behavior is unverified on the final candidate. diff --git a/docs/phase15/BUNDLE_ANALYSIS_REPORT_v1.0.md b/docs/phase15/BUNDLE_ANALYSIS_REPORT_v1.0.md new file mode 100644 index 0000000..ed0294c --- /dev/null +++ b/docs/phase15/BUNDLE_ANALYSIS_REPORT_v1.0.md @@ -0,0 +1,21 @@ +# Phase 15 Bundle Analysis Report + +**Date:** 2026-06-25 +**Status:** Blocked for final build + +## Summary + +Source review confirms no new runtime dependency was added and the content-type helper is server-side. Final route chunks and client boundaries could not be measured. + +## Executed evidence + +- Direct dependency pins and lockfile contract pass. +- No vendor SDK, consent manager, scheduler, email, or analytics network package is present. + +## Unexecuted or blocked evidence + +- Production route bundle sizes, duplicate packages/locales/icons, source maps, tree shaking, dynamic imports, and client secret inspection. + +## Release disposition + +Bundle approval requires the final production build. diff --git a/docs/phase15/CLEAN_ROOM_BASELINE_REPORT_v1.0.md b/docs/phase15/CLEAN_ROOM_BASELINE_REPORT_v1.0.md new file mode 100644 index 0000000..589e861 --- /dev/null +++ b/docs/phase15/CLEAN_ROOM_BASELINE_REPORT_v1.0.md @@ -0,0 +1,24 @@ +# Phase 15 Clean-room Baseline Report + +**Date:** 2026-06-25 +**Status:** Blocked / failed acceptance + +## Summary + +The supplied ZIP was extracted into a fresh directory and its Phase 14 manifest verified 466 files. The exact Phase 15 clean install could not begin because the host does not provide the pinned Node/pnpm toolchain and cannot resolve the package registry. + +## Executed evidence + +- Fresh archive manifest passed (C15-001). +- ZIP SHA-256 and lockfile SHA-256 are recorded in the implementation report. +- No dependency or lockfile update was performed. + +## Unexecuted or blocked evidence + +- Node 24.17.0 is not installed; observed Node is 22.16.0. +- pnpm 11.9.0 activation failed because registry DNS is unavailable. +- Frozen install and every dependency-backed command are blocked. + +## Release disposition + +This gate fails Phase 15 acceptance. A connected clean runner using the pinned versions must rerun the complete matrix. diff --git a/docs/phase15/COMMAND_MATRIX_v1.0.csv b/docs/phase15/COMMAND_MATRIX_v1.0.csv new file mode 100644 index 0000000..8e5dbc4 --- /dev/null +++ b/docs/phase15/COMMAND_MATRIX_v1.0.csv @@ -0,0 +1,27 @@ +ID,Command,Environment,Status,Exit_code,Duration_seconds,Test_count,Pass_count,Failure_count,Skipped_count,Warning_count,Evidence_path,Related_defects,Notes +C15-001,node scripts/validate-phase14-manifest.mjs,Fresh extraction of supplied Phase 14 ZIP; Node 22.16.0,Passed,0,0.22,466 files,466,0,0,0,docs/quality/phase15-command-logs/02-phase14-manifest-baseline.log,,Verified the supplied archive before Phase 15 modifications. +C15-002,corepack prepare pnpm@11.9.0 --activate,Debian 13; Node 22.16.0; Corepack 0.32.0; registry DNS unavailable,Blocked,1,0.17,1,0,1,0,0,docs/quality/PHASE_15_TOOLCHAIN_SETUP.log,P14-009; P15-005,Could not download the pinned package manager. +C15-003,pnpm install --frozen-lockfile,Required Node 24.17.0 and pnpm 11.9.0,Not executed - prerequisite blocked,,,,,,,,docs/quality/PHASE_15_TOOLCHAIN_SETUP.log,P14-009; P15-005,No pnpm binary and no registry DNS. No dependency update was attempted. +C15-004,node scripts/run-validations.mjs,Current Phase 15 tree; Node 22.16.0; no installed packages required,Passed,0,1.52,16 validators,16,0,0,0,docs/quality/phase15-command-logs/10-final-validations.log,P15-001; P15-002; P15-003; P15-004,Repository-native dependency-free validators. +C15-005,python3 scripts/phase15-static-audit.py --root /mnt/data/phase14_baseline,Fresh Phase 14 extraction; Python 3.13.5,Failed as expected - baseline findings,1,1.37,467 files,,11 findings,0,0,docs/quality/PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.json,P15-001; P15-002; P15-003; P15-004,Found 4 High and 7 Medium defects before fixes. +C15-006,python3 scripts/phase15-static-audit.py,Current Phase 15 tree; Python 3.13.5,Passed,0,1.38,544 files,544,0,0,0,docs/quality/phase15-command-logs/13-final-static-audit.log,P15-001; P15-002; P15-003; P15-004,No findings under the same audit after remediation. +C15-007,node --experimental-strip-types media-type behavior assertions,Node 22.16.0,Passed with runtime warnings,0,1.37,8 assertions,8,0,0,2,docs/quality/phase15-command-logs/08-content-type-behavior.log,P15-002,Warnings concern experimental type stripping and do not affect the assertions. +C15-008,node --check scripts; node --experimental-strip-types --check TypeScript; python3 -m py_compile audit,Node 22.16.0; Python 3.13.5,Passed,0,6.76,99 files,99,0,0,0,docs/quality/phase15-command-logs/09-syntax-check.log,,"33 JavaScript modules, 64 TypeScript modules, and two Python scripts." +C15-009,pnpm format:check,Exact pinned toolchain and installed dependencies required,Not executed - clean install blocked,,,,,,,,docs/quality/PHASE_15_TOOLCHAIN_SETUP.log,P15-005,Formatting validation +C15-010,pnpm lint,Exact pinned toolchain and installed dependencies required,Not executed - clean install blocked,,,,,,,,docs/quality/PHASE_15_TOOLCHAIN_SETUP.log,P15-005,ESLint +C15-011,pnpm typecheck,Exact pinned toolchain and installed dependencies required,Not executed - clean install blocked,,,,,,,,docs/quality/PHASE_15_TOOLCHAIN_SETUP.log,P15-005,Next type generation and strict TypeScript +C15-012,pnpm test:unit,Exact pinned toolchain and installed dependencies required,Not executed - clean install blocked,,,,,,,,docs/quality/PHASE_15_TOOLCHAIN_SETUP.log,P15-005,Unit tests and coverage +C15-013,pnpm test:integration,Exact pinned toolchain and installed dependencies required,Not executed - clean install blocked,,,,,,,,docs/quality/PHASE_15_TOOLCHAIN_SETUP.log,P15-005,Integration tests +C15-014,pnpm test:browser,Exact pinned toolchain and installed dependencies required,Not executed - clean install blocked,,,,,,,,docs/quality/PHASE_15_TOOLCHAIN_SETUP.log,P15-005,Functional browser tests +C15-015,pnpm test:a11y,Exact pinned toolchain and installed dependencies required,Not executed - clean install blocked,,,,,,,,docs/quality/PHASE_15_TOOLCHAIN_SETUP.log,P15-005,Automated accessibility tests +C15-016,pnpm test:visual,Exact pinned toolchain and installed dependencies required,Not executed - clean install blocked,,,,,,,,docs/quality/PHASE_15_TOOLCHAIN_SETUP.log,P15-005,Visual-regression tests +C15-017,pnpm test:e2e,Exact pinned toolchain and installed dependencies required,Not executed - clean install blocked,,,,,,,,docs/quality/PHASE_15_TOOLCHAIN_SETUP.log,P15-005,Aggregate Playwright tests +C15-018,pnpm test:security,Exact pinned toolchain and installed dependencies required,Not executed - clean install blocked,,,,,,,,docs/quality/PHASE_15_TOOLCHAIN_SETUP.log,P15-005,Package-script security validation; underlying static validator ran through C15-004 +C15-019,pnpm test:privacy,Exact pinned toolchain and installed dependencies required,Not executed - clean install blocked,,,,,,,,docs/quality/PHASE_15_TOOLCHAIN_SETUP.log,P15-005,Package-script privacy validation; underlying static validator ran through C15-004 +C15-020,SITE_ORIGIN=https://approved.example PUBLIC_RELEASE_APPROVED=false pnpm build,Exact pinned toolchain and installed dependencies required,Not executed - clean install blocked,,,,,,,,docs/quality/PHASE_15_TOOLCHAIN_SETUP.log,P15-005,Production build +C15-021,pnpm audit --audit-level low,Exact pinned toolchain and installed dependencies required,Not executed - clean install blocked,,,,,,,,docs/quality/PHASE_15_TOOLCHAIN_SETUP.log,P15-005,Registry-backed dependency audit +C15-022,pnpm exec playwright install --with-deps chromium firefox webkit,Exact pinned toolchain and installed dependencies required,Not executed - clean install blocked,,,,,,,,docs/quality/PHASE_15_TOOLCHAIN_SETUP.log,P15-005,Pinned browser installation +C15-023,Performance audit commands,Exact pinned toolchain and installed dependencies required,Not executed - clean install blocked,,,,,,,,docs/quality/PHASE_15_TOOLCHAIN_SETUP.log,P15-005,Lighthouse/Web Vitals and route timing +C15-024,Production-like deployment and smoke commands,Exact pinned toolchain and installed dependencies required,Not executed - clean install blocked,,,,,,,,docs/quality/PHASE_15_TOOLCHAIN_SETUP.log,P15-005,Deployment rehearsal +C15-025,Rollback platform commands,Exact pinned toolchain and installed dependencies required,Not executed - clean install blocked,,,,,,,,docs/quality/PHASE_15_TOOLCHAIN_SETUP.log,P15-005,Rollback rehearsal +C15-026,node scripts/generate-phase15-manifest.mjs && node scripts/validate-phase15-manifest.mjs,Final Phase 15 repository; Node 22.16.0; dependency-free,Passed,0,0.52,548 files,548,0,0,0,docs/quality/phase15-command-logs/12-phase15-package-manifest.log,,The validation log is explicitly excluded from its own manifest to avoid a self-referential checksum. diff --git a/docs/phase15/CONSENT_VALIDATION_REPORT_v1.0.md b/docs/phase15/CONSENT_VALIDATION_REPORT_v1.0.md new file mode 100644 index 0000000..d0268a5 --- /dev/null +++ b/docs/phase15/CONSENT_VALIDATION_REPORT_v1.0.md @@ -0,0 +1,23 @@ +# Phase 15 Consent Validation Report + +**Date:** 2026-06-25 +**Status:** Blocked by product/legal decisions + +## Summary + +Analytics is disabled by default and optional marketing consent is not implemented. This prevents premature vendor loading but does not constitute a complete consent system. + +## Executed evidence + +- Static environment defaults prohibit production analytics. +- Test analytics requires an explicit test-only document flag. +- Consent matrix reviewed. + +## Unexecuted or blocked evidence + +- No-choice, necessary-only, accept/reject, withdrawal, returning visitor, locale change, consent version, vendor failure, delayed JavaScript. +- Localized approved legal language and storage mechanism. + +## Release disposition + +No consent-compliance claim is permitted. diff --git a/docs/phase15/CONTENT_EVIDENCE_REVIEW_v1.0.md b/docs/phase15/CONTENT_EVIDENCE_REVIEW_v1.0.md new file mode 100644 index 0000000..7f62100 --- /dev/null +++ b/docs/phase15/CONTENT_EVIDENCE_REVIEW_v1.0.md @@ -0,0 +1,22 @@ +# Phase 15 Content and Evidence Review + +**Date:** 2026-06-25 +**Status:** Static prohibited-content controls passed; approvals blocked + +## Summary + +Runtime validation finds no TODO/TBD/lorem, invented metrics, fake quotes, guessed external destinations, or research-only backdoor. Public claims and assets still require accountable approval. + +## Executed evidence + +- Prohibited-content validator passes. +- No production image/logo/customer evidence asset is present. +- Pending legal and unsupported destinations remain gated. + +## Unexecuted or blocked evidence + +- Native linguistic approval, claims, customer logos/testimonials, security/compliance statements, pricing, screenshots, contact details, legal content. + +## Release disposition + +Content is structurally safe but not final-approved. diff --git a/docs/phase15/CROSS_BROWSER_TEST_REPORT_v1.0.md b/docs/phase15/CROSS_BROWSER_TEST_REPORT_v1.0.md new file mode 100644 index 0000000..bc4ed4e --- /dev/null +++ b/docs/phase15/CROSS_BROWSER_TEST_REPORT_v1.0.md @@ -0,0 +1,22 @@ +# Phase 15 Cross-browser Test Report + +**Date:** 2026-06-25 +**Status:** Blocked + +## Summary + +The configured matrix includes Chromium, Firefox, WebKit, mobile Chrome, and mobile Safari. No current application run was possible. + +## Executed evidence + +- Playwright project configuration statically reviewed. +- Canonical visual snapshots are now Chromium-only; other engines remain functional targets. + +## Unexecuted or blocked evidence + +- Browser installation in the pinned environment. +- Functional results by browser/version/OS/device/locale/theme/viewport. + +## Release disposition + +No browser support claim is approved from configuration alone. diff --git a/docs/phase15/DEFECT_REGISTER_v1.0.csv b/docs/phase15/DEFECT_REGISTER_v1.0.csv new file mode 100644 index 0000000..03ddc27 --- /dev/null +++ b/docs/phase15/DEFECT_REGISTER_v1.0.csv @@ -0,0 +1,6 @@ +ID,Summary,Severity,User_impact,Business_impact,Security_impact,Privacy_impact,Accessibility_impact,Affected_locale,Affected_theme,Affected_browser,Affected_viewport,Reproduction_steps,Expected_behavior,Actual_behavior,Evidence,Owner,Status,Release_disposition,Resolution_commit,Retest_result +P15-001,Two release-evidence CSV files had inconsistent column counts,High,Indirect; evidence could be misread or fields shifted,Release decisions could use corrupted issue or QA records,None direct,None direct,None direct,All,All,All,All,Parse all repository CSV files with a standards-compliant CSV reader,Every row matches the header width,P14-009 had 11 fields instead of 9; P14-M10 had 10 instead of 11,PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.json,Engineering + QA,Resolved,Fixed in Phase 15,Unavailable; supplied archive had no Git metadata,All CSV files parse; C15-004 and C15-006 pass +P15-002,Demo API accepted JSON look-alike media types by prefix,Medium,Malformed clients could reach JSON parsing instead of receiving 415,Ambiguous API contract and weaker request validation,Broader-than-documented content-type acceptance,No direct data exposure identified,None,All,All,All clients,N/A,Send Content-Type application/jsonp,415 unsupported_content_type,Prefix check treated it as JSON,PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.json,Engineering + Security,Resolved,Fixed in Phase 15,Unavailable; supplied archive had no Git metadata,Eight dependency-free assertions pass; Vitest regression authored but not run +P15-003,Visual tests used a stale theme key and inconsistent snapshot project scope,Medium,Dark-mode regressions could be recorded under the wrong theme,Unreliable visual approval evidence,None,None,Theme contrast regressions could be missed,EN/FR/AR,Dark/system,All Playwright projects,Configured visual matrix,Inspect component-system visual setup and run snapshots outside Chromium,Canonical theme key; canonical Chromium snapshots only,Unused storage key and non-canonical project execution,PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.json,Engineering + Design QA,Resolved,Fixed; browser retest still blocked,Unavailable; supplied archive had no Git metadata,Static regression validator passes; browser snapshots not executed +P15-004,CI omitted the demo-service integration test suite,High,Server-side conversion failures could merge undetected,Primary lead workflow lacked CI integration protection,Adapter error/timeout/idempotency regressions could escape CI,Boundary regressions could escape CI,None direct,All,All,Server boundary,N/A,Inspect Phase 14 CI quality job,CI runs pnpm test:integration,Only unit and Playwright suites were configured,PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.json,Engineering + QA,Resolved,CI command added; execution pending connected CI,Unavailable; supplied archive had no Git metadata,Phase 15 validator confirms command presence; integration suite not locally executed +P15-005,"Final Phase 15 dependency-backed, browser, performance, deployment, rollback, and manual QA evidence is incomplete",High,"Accessibility, browser, performance, and conversion defects may remain undiscovered",Release readiness cannot be established,Dependency and dynamic security checks are stale or absent,Runtime analytics/consent behavior lacks current browser evidence,"Manual WCAG, keyboard, screen-reader, zoom, and reflow evidence absent",EN/FR/AR,Light/dark/system,Chromium/Firefox/WebKit/mobile engines,1440/1024/768/390/320 and zoom states,Attempt pinned toolchain activation and frozen install,Exact toolchain installs and all Phase 15 gates execute,"Host has Node 22.16.0, no pnpm, no registry DNS, and no project dependencies",PHASE_15_TOOLCHAIN_SETUP.log; COMMAND_MATRIX_v1.0.csv,Engineering + QA + Accessibility + Security,Open - environment blocked,Blocks Phase 15 acceptance and Phase 16 readiness,N/A,Not retested; requires connected pinned CI and human QA diff --git a/docs/phase15/DEPLOYMENT_REHEARSAL_REPORT_v1.0.md b/docs/phase15/DEPLOYMENT_REHEARSAL_REPORT_v1.0.md new file mode 100644 index 0000000..d282fbf --- /dev/null +++ b/docs/phase15/DEPLOYMENT_REHEARSAL_REPORT_v1.0.md @@ -0,0 +1,21 @@ +# Phase 15 Deployment Rehearsal Report + +**Date:** 2026-06-25 +**Status:** Not run + +## Summary + +No production-like deployment was built or started from the Phase 15 manifest. Historical Phase 14 standalone HTTP evidence is retained but stale after code and CI changes. + +## Executed evidence + +- Dockerfile and CI deployment build path statically reviewed. +- Production environment defaults fail closed. + +## Unexecuted or blocked evidence + +- Clean build, assets, headers, redirects, metadata, robots, health/startup failure, flags, observability, no test adapter, exact commands and timing. + +## Release disposition + +Deployment gate blocks release. diff --git a/docs/phase15/DESIGN_FIDELITY_REPORT_v1.0.md b/docs/phase15/DESIGN_FIDELITY_REPORT_v1.0.md new file mode 100644 index 0000000..4d4bf02 --- /dev/null +++ b/docs/phase15/DESIGN_FIDELITY_REPORT_v1.0.md @@ -0,0 +1,21 @@ +# Phase 15 Design Fidelity Report + +**Date:** 2026-06-25 +**Status:** Blocked for visual comparison + +## Summary + +Section order and component composition validators pass, but no rendered comparison against Phase 7 production designs was performed. + +## Executed evidence + +- Homepage composition and content-model validators pass. +- Design-token immutability and semantic color controls pass. + +## Unexecuted or blocked evidence + +- Typography, spacing, alignment, media scale, responsive adaptation, themes, RTL, focus, loading, error, and success visual comparison. + +## Release disposition + +Design fidelity is unverified, not failed. diff --git a/docs/phase15/DESTINATION_BROKEN_LINK_REPORT_v1.0.md b/docs/phase15/DESTINATION_BROKEN_LINK_REPORT_v1.0.md new file mode 100644 index 0000000..f0350d9 --- /dev/null +++ b/docs/phase15/DESTINATION_BROKEN_LINK_REPORT_v1.0.md @@ -0,0 +1,23 @@ +# Phase 15 Destination and Broken-link Report + +**Date:** 2026-06-25 +**Status:** Static registry passed; external destinations blocked + +## Summary + +The route and destination validators pass. Demo is local-only; contact sales, product tour, login, cookie settings, and support are blocked; pricing/legal/accessibility routes are placeholders. + +## Executed evidence + +- Five route IDs have complete locale/hash/query/hreflang contracts. +- No unapproved runtime external URL was found. +- Destination registry is explicit. + +## Unexecuted or blocked evidence + +- Rendered broken-link crawl of generated routes. +- Production URLs, redirects, status codes, canonical/hreflang, external security behavior. + +## Release disposition + +Blocked destinations must not be activated until approved. diff --git a/docs/phase15/DEVICE_VIEWPORT_REPORT_v1.0.md b/docs/phase15/DEVICE_VIEWPORT_REPORT_v1.0.md new file mode 100644 index 0000000..14cd46d --- /dev/null +++ b/docs/phase15/DEVICE_VIEWPORT_REPORT_v1.0.md @@ -0,0 +1,21 @@ +# Phase 15 Device and Viewport Report + +**Date:** 2026-06-25 +**Status:** Blocked for rendered validation + +## Summary + +Responsive CSS and authored tests cover the required widths, but no final rendered matrix was observed. + +## Executed evidence + +- Logical CSS validator passes across 47 CSS files. +- Authored scenarios include 1440, 1024, 768, 390, and 320 widths. + +## Unexecuted or blocked evidence + +- Horizontal overflow, clipping, focus visibility, touch targets, safe areas, reduced height, and mobile landscape checks. + +## Release disposition + +Responsive implementation remains unaccepted until browser evidence is attached. diff --git a/docs/phase15/END_TO_END_TEST_REPORT_v1.0.md b/docs/phase15/END_TO_END_TEST_REPORT_v1.0.md new file mode 100644 index 0000000..c73be76 --- /dev/null +++ b/docs/phase15/END_TO_END_TEST_REPORT_v1.0.md @@ -0,0 +1,22 @@ +# Phase 15 End-to-End Test Report + +**Date:** 2026-06-25 +**Status:** Blocked + +## Summary + +The repository contains authored Playwright flows for locale pages, navigation, the demo workflow, responsive states, no-JavaScript behavior, accessibility, and visual checks. No current Phase 15 browser flow executed. + +## Executed evidence + +- Scenario source was inspected. +- CI now invokes browser, accessibility, and visual slices explicitly. + +## Unexecuted or blocked evidence + +- All 50 required Phase 15 end-to-end scenarios. +- Success, validation, timeout, duplicate, history, offline, and dependency-failure browser evidence. + +## Release disposition + +High release blocker P15-005 remains open. diff --git a/docs/phase15/FAILURE_SIMULATION_REPORT_v1.0.md b/docs/phase15/FAILURE_SIMULATION_REPORT_v1.0.md new file mode 100644 index 0000000..ffc5228 --- /dev/null +++ b/docs/phase15/FAILURE_SIMULATION_REPORT_v1.0.md @@ -0,0 +1,21 @@ +# Phase 15 Failure Simulation Report + +**Date:** 2026-06-25 +**Status:** Blocked for current execution + +## Summary + +Deterministic scenarios exist for success, duplicate, timeout, integration error, validation, and blocked configuration. Current browser/server simulations did not run. + +## Executed evidence + +- Source adapters and scenario guards reviewed. +- Test scenarios remain disabled in production. + +## Unexecuted or blocked evidence + +- CRM/scheduler/analytics/consent/email/DNS/network/slow/partial/rate-limit/storage/script/CSP/offline failures. + +## Release disposition + +Authored scenarios are not observed resilience evidence. diff --git a/docs/phase15/FINAL_RELEASE_RECOMMENDATION_v1.0.md b/docs/phase15/FINAL_RELEASE_RECOMMENDATION_v1.0.md new file mode 100644 index 0000000..0d90f48 --- /dev/null +++ b/docs/phase15/FINAL_RELEASE_RECOMMENDATION_v1.0.md @@ -0,0 +1,38 @@ +# Phase 15 Final Release Recommendation + +## Recommendation + +**Not ready for Phase 16** + +The repository has materially better static controls than the supplied Phase 14 baseline, but final QA is not complete. The exact clean installation, production build, dependency audit, unit/integration regression, cross-browser flows, automated accessibility, manual keyboard/screen-reader/zoom review, visual baselines, performance budgets, deployment rehearsal, and rollback rehearsal have not been executed against the final Phase 15 manifest. + +## Defect and issue counts + +- Critical unresolved: **1** +- High unresolved: **21** +- Medium unresolved: **17** +- Low unresolved: **2** +- Phase 15 defects resolved: **4** +- Accepted exceptions: **0** + +The cumulative counts include inherited business, research, legal, localization, design, integration, operations, and verification issues. The Phase 15 defect register contains one open High aggregate acceptance blocker, P15-005. + +## Failed or blocked release gates + +The blocked gates include exact runtime/frozen install, final package-backed checks, current unit/integration/build, dependency/license audit, browser/accessibility/visual/manual matrices, performance and bundle measurement, production-like deployment, rollback, CRM, legal/privacy consent, analytics approval, distributed idempotency/rate limiting, native localization review, participant acceptance research, production origin, final brand assets, destinations, and a real commit identifier. + +## Required Phase 16 approvals + +Phase 16 must not begin release-candidate freeze until engineering QA closes P15-005. Business/legal work still required includes final copy, claims/evidence, customer assets, legal/privacy text, analytics and consent, CRM/scheduler operations, production destinations, domain/hosting, credentials, launch ownership, and final assets. + +## Required remediation before production + +1. Commit the Phase 15 repository and record the SHA. +2. Run the complete command matrix on Node 24.17.0 and pnpm 11.9.0 from a frozen clean install. +3. Fix and retest every resulting Critical, High, and Medium defect. +4. Complete browser, accessibility, localization/RTL, theme, responsive, visual, performance, deployment, rollback, and observability evidence. +5. Resolve or formally approve every production business/legal gate. No Critical or High exception currently exists. + +## Overall risk statement + +Static source integrity is improved and production integrations remain safely disabled. Release risk is nevertheless **unacceptably high** because the final executable artifact has not been built or observed in browsers and assistive technologies, and the production data-processing and destination decisions are unresolved. diff --git a/docs/phase15/IDEMPOTENCY_DUPLICATE_REPORT_v1.0.md b/docs/phase15/IDEMPOTENCY_DUPLICATE_REPORT_v1.0.md new file mode 100644 index 0000000..cb77f15 --- /dev/null +++ b/docs/phase15/IDEMPOTENCY_DUPLICATE_REPORT_v1.0.md @@ -0,0 +1,22 @@ +# Phase 15 Idempotency and Duplicate Report + +**Date:** 2026-06-25 +**Status:** Local static design reviewed; production gate blocked + +## Summary + +The current process-local store coalesces repeated keys, caches non-retryable results, removes retryable failures, and contains no personal data in keys. It is explicitly test/local only. + +## Executed evidence + +- Historical Phase 14 integration test covered repeated transport. +- Source review confirms retryable failures release the key. + +## Unexecuted or blocked evidence + +- Current integration/browser retry execution. +- Distributed durable store, late vendor success, cross-instance duplicate policy, legitimate later request policy. + +## Release disposition + +P14-004 blocks scaled production. diff --git a/docs/phase15/IMAGE_FONT_PERFORMANCE_REPORT_v1.0.md b/docs/phase15/IMAGE_FONT_PERFORMANCE_REPORT_v1.0.md new file mode 100644 index 0000000..2d209d9 --- /dev/null +++ b/docs/phase15/IMAGE_FONT_PERFORMANCE_REPORT_v1.0.md @@ -0,0 +1,21 @@ +# Phase 15 Image and Font Performance Report + +**Date:** 2026-06-25 +**Status:** Blocked for rendered/network measurement + +## Summary + +The public directory contains no production visual assets. Inter and Noto Sans Arabic remain package dependencies. No network waterfall or font-layout measurement ran. + +## Executed evidence + +- Asset inventory confirms no unapproved logo, screenshot, hero image, or social image was added. +- Arabic font is separately represented in dependency and token foundations. + +## Unexecuted or blocked evidence + +- Final logo/social/hero assets, responsive sizes, compression, preload policy, Arabic font payload, CLS, cache headers. + +## Release disposition + +Final asset approval and performance measurement remain Phase 16 gates after QA rerun. diff --git a/docs/phase15/INTEGRATION_TEST_REPORT_v1.0.md b/docs/phase15/INTEGRATION_TEST_REPORT_v1.0.md new file mode 100644 index 0000000..2fd801e --- /dev/null +++ b/docs/phase15/INTEGRATION_TEST_REPORT_v1.0.md @@ -0,0 +1,23 @@ +# Phase 15 Integration Test Report + +**Date:** 2026-06-25 +**Status:** Blocked for current release candidate + +## Summary + +Phase 14 recorded four passing demo-service integration tests. Phase 15 discovered that CI did not execute this suite and corrected the workflow, but the final suite could not run locally. + +## Executed evidence + +- CI now contains `pnpm test:integration`. +- Static validator confirms the integration gate remains configured. +- Historical Phase 14 integration tests cover success, idempotent transport, normalized failure, and timeout. + +## Unexecuted or blocked evidence + +- Current Vitest integration execution. +- Production/sandbox CRM, scheduler, email, and durable idempotency integrations do not exist. + +## Release disposition + +The integration gate is blocked until connected CI executes the suite and approved vendor adapters exist. diff --git a/docs/phase15/KEYBOARD_ACCESSIBILITY_REPORT_v1.0.md b/docs/phase15/KEYBOARD_ACCESSIBILITY_REPORT_v1.0.md new file mode 100644 index 0000000..0375307 --- /dev/null +++ b/docs/phase15/KEYBOARD_ACCESSIBILITY_REPORT_v1.0.md @@ -0,0 +1,21 @@ +# Phase 15 Keyboard Accessibility Report + +**Date:** 2026-06-25 +**Status:** Not run + +## Summary + +Native controls, native dialog, focus-return references, skip navigation, form error links, and visible-focus styles are present in source. Keyboard-only behavior was not manually observed. + +## Executed evidence + +- Source-level focus and semantic review. +- Manual test matrix created. + +## Unexecuted or blocked evidence + +- Complete pointer-free path including mobile navigation, form errors, consent, dialogs, success, and recovery. + +## Release disposition + +Manual keyboard acceptance is a High blocker. diff --git a/docs/phase15/LOCALIZATION_QA_REPORT_v1.0.md b/docs/phase15/LOCALIZATION_QA_REPORT_v1.0.md new file mode 100644 index 0000000..a60fb24 --- /dev/null +++ b/docs/phase15/LOCALIZATION_QA_REPORT_v1.0.md @@ -0,0 +1,24 @@ +# Phase 15 Localization QA Report + +**Date:** 2026-06-25 +**Status:** Static parity passed; linguistic approval blocked + +## Summary + +English, French, and Arabic catalogs have exact key parity and valid direction metadata. Native linguistic review remains open. + +## Executed evidence + +- Locale validator passes. +- Metadata/route parity validator passes. +- No non-reserved personal-data fixture or runtime implementation key was found by the audit. + +## Unexecuted or blocked evidence + +- Native French review. +- Native formal Modern Standard Arabic review. +- External vendor localization because vendors are not selected. + +## Release disposition + +Mechanical parity is not translation approval; P9-005 remains High. diff --git a/docs/phase15/MANUAL_TEST_MATRIX_v1.0.csv b/docs/phase15/MANUAL_TEST_MATRIX_v1.0.csv new file mode 100644 index 0000000..edc5e0c --- /dev/null +++ b/docs/phase15/MANUAL_TEST_MATRIX_v1.0.csv @@ -0,0 +1,9 @@ +ID,Area,Platform_or_AT,Locale,Theme,Viewport_or_zoom,Status,Evidence,Blocking_issue +M15-001,Keyboard-only primary demo flow,Desktop browser,en/fr/ar,light/dark,1440/390,Not run,Authored Playwright and component semantics only,P15-005 +M15-002,NVDA flow,NVDA + Firefox/Chrome on Windows,en/ar,light/dark,desktop,Not run,None; human AT required,P15-005 +M15-003,VoiceOver macOS,VoiceOver + Safari,en/ar,light/dark,desktop,Not run,None; human AT required,P15-005 +M15-004,VoiceOver iOS,VoiceOver + Mobile Safari,en/ar,system,390-class device,Not run,None; physical/device lab required,P15-005 +M15-005,TalkBack Android,TalkBack + Chrome,en/ar,system,390-class device,Not run,None; device/emulator required,P15-005 +M15-006,200% and 400% zoom/reflow,Desktop browsers,en/fr/ar,light/dark,200%/400%,Not run,Responsive source and tests authored only,P15-005 +M15-007,Forced colors and reduced motion,Windows forced colors; reduced-motion media,en/fr/ar,all,desktop/mobile,Not run,CSS controls present; human review absent,P15-005 +M15-008,Arabic reading and focus order,Browser + Arabic screen reader review,ar,light/dark,1440/390/320,Not run,Logical CSS validator passes; human review absent,P15-005 diff --git a/docs/phase15/OBSERVABILITY_VALIDATION_REPORT_v1.0.md b/docs/phase15/OBSERVABILITY_VALIDATION_REPORT_v1.0.md new file mode 100644 index 0000000..e7001f7 --- /dev/null +++ b/docs/phase15/OBSERVABILITY_VALIDATION_REPORT_v1.0.md @@ -0,0 +1,21 @@ +# Phase 15 Observability Validation Report + +**Date:** 2026-06-25 +**Status:** Blocked + +## Summary + +Correlation identifiers are non-sensitive and raw form logging is absent. No production logging, metrics, dashboards, alert thresholds, retention, or environment separation is implemented. + +## Executed evidence + +- Static no-raw-log controls pass. +- Redaction helper and correlation IDs reviewed. + +## Unexecuted or blocked evidence + +- Submission/failure/vendor latency/rate-limit/duplicate/config/client/server/build/deployment metrics and alerts. + +## Release disposition + +P14-005 blocks production operations. diff --git a/docs/phase15/PERFORMANCE_REPORT_v1.0.md b/docs/phase15/PERFORMANCE_REPORT_v1.0.md new file mode 100644 index 0000000..ef36246 --- /dev/null +++ b/docs/phase15/PERFORMANCE_REPORT_v1.0.md @@ -0,0 +1,22 @@ +# Phase 15 Performance Report + +**Date:** 2026-06-25 +**Status:** Blocked + +## Summary + +Approved budgets exist for LCP, INP, CLS, TTFB, transfer sizes, fonts, media, and third-party requests. No final production build or browser timing was available. + +## Executed evidence + +- Budget contract inspected: LCP 2500 ms, INP 200 ms, CLS 0.1, TTFB 800 ms maximums. +- No approved vendor SDK or third-party runtime was added. + +## Unexecuted or blocked evidence + +- Cold/warm desktop/mobile measurements in EN and AR. +- LCP asset, main-thread, hydration, form latency, scheduler latency, failure response, and third-party request measurement. + +## Release disposition + +Performance gate is blocked; historical Phase 14 build inventory is not a Phase 15 measurement. diff --git a/docs/phase15/PRIVACY_VALIDATION_REPORT_v1.0.md b/docs/phase15/PRIVACY_VALIDATION_REPORT_v1.0.md new file mode 100644 index 0000000..7732eea --- /dev/null +++ b/docs/phase15/PRIVACY_VALIDATION_REPORT_v1.0.md @@ -0,0 +1,23 @@ +# Phase 15 Privacy Validation Report + +**Date:** 2026-06-25 +**Status:** Static controls passed; legal and runtime approval blocked + +## Summary + +Static checks find no personal data in analytics contracts, URLs, runtime logs, fixtures outside reserved domains, or browser persistence paths for form values. No production processing destination exists. + +## Executed evidence + +- Privacy validator passes. +- Audit finds only reserved `.test`/`.invalid` email fixtures. +- Analytics context remains strict and excludes form fields. + +## Unexecuted or blocked evidence + +- Runtime browser capture, logs, monitoring, vendor payloads, retention, deletion, recipients, transfers, staging separation. +- Legal/privacy approval. + +## Release disposition + +P14-002 and related legal gates block production. diff --git a/docs/phase15/RELEASE_GATE_MATRIX_v1.0.csv b/docs/phase15/RELEASE_GATE_MATRIX_v1.0.csv new file mode 100644 index 0000000..d7c8ca7 --- /dev/null +++ b/docs/phase15/RELEASE_GATE_MATRIX_v1.0.csv @@ -0,0 +1,21 @@ +Gate,Severity,Status,Evidence,Owner,Exit_criteria,Accepted_exception +Supplied Phase 14 package integrity,High,Passed,C15-001,Engineering,Manifest validates fresh extraction,No +Phase 15 static validators,High,Passed,C15-004,Engineering + QA,All dependency-free validators pass,No +Repository integrity and secret/PII fixture audit,High,Passed,C15-006,Engineering + Security + Privacy,Zero Critical/High/Medium findings,No +Exact Node 24.17.0 and pnpm 11.9.0 frozen install,High,Blocked,C15-002; C15-003,Engineering + Security,Connected clean environment completes frozen install,No +"Format, lint, strict typecheck, unit, integration, and production build on final manifest",High,Blocked,C15-009 through C15-020,Engineering + QA,All commands exit zero on final manifest,No +Dependency and license audit,High,Blocked,C15-021,Security + Legal,Registry-backed audit and configured license check pass,No +Cross-browser functional execution,High,Blocked,C15-014; P14-008,QA,"Chromium, Firefox, WebKit, mobile Chrome, mobile Safari pass",No +Automated accessibility execution,High,Blocked,C15-015; P14-008,Accessibility + QA,Axe matrix passes with reviewed exceptions,No +"Manual keyboard, screen-reader, zoom, reflow, forced-colors, and RTL review",High,Blocked,MANUAL_TEST_MATRIX_v1.0.csv,Accessibility + QA + Localization,Human matrix completed with evidence,No +Visual-regression baseline generation and approval,High,Blocked,C15-016; VISUAL_REGRESSION_REPORT_v1.0.md,Design + QA,Pinned Chromium baselines generated and all diffs reviewed,No +Performance and bundle budgets,High,Blocked,PERFORMANCE_REPORT_v1.0.md; BUNDLE_ANALYSIS_REPORT_v1.0.md,Engineering,Final build measured against approved budgets,No +Production-like deployment and rollback rehearsal,High,Blocked,DEPLOYMENT_REHEARSAL_REPORT_v1.0.md; ROLLBACK_REHEARSAL_REPORT_v1.0.md,Infrastructure + Engineering,Documented rehearsal succeeds and is timed,No +Approved CRM/lead destination,High,Blocked,P14-001,Sales Ops + Engineering,"Approved vendor, credentials, mapping, retries, duplicates, sandbox, monitoring",No +Approved legal/privacy/form processing,High,Blocked,P14-002,Legal + Privacy,"Localized notice, legal basis, consent, retention, deletion, recipients, transfers approved",No +Approved analytics provider and consent,High,Blocked,P14-003,Analytics + Legal,"Provider, DPA, consent, region, retention, event policy approved",No +Distributed idempotency and abuse controls,High,Blocked,P14-004; P9-002,Engineering + Sales Ops,"Durable store, rate limit, duplicate policy, monitoring validated",No +Native French and Arabic review,High,Open,P9-005,Localization + Content,Native reviewers approve all visible and metadata strings,No +Participant and accessibility acceptance research,Critical,Blocked,P9-001,Research + Product,Required cohorts completed; S0/S1 findings fixed and retested,No +"Canonical domain, brand assets, and public destinations",High,Blocked,P10-001; P10-002; destination registry,Product + Infrastructure + Design,"Approved production origin, logo, legal, login, sales, support, tour, pricing destinations",No +Final source-control commit identity,Medium,Blocked,Supplied ZIP contains no .git metadata,Engineering,Commit final manifest and record immutable SHA,No diff --git a/docs/phase15/REPOSITORY_INTEGRITY_AUDIT_v1.0.md b/docs/phase15/REPOSITORY_INTEGRITY_AUDIT_v1.0.md new file mode 100644 index 0000000..5ceca8f --- /dev/null +++ b/docs/phase15/REPOSITORY_INTEGRITY_AUDIT_v1.0.md @@ -0,0 +1,23 @@ +# Phase 15 Repository Integrity Audit + +**Date:** 2026-06-25 +**Status:** Passed for static package integrity + +## Summary + +The baseline manifest passed before changes. The Phase 15 audit checks JSON/CSV structure, symlinks, generated files, secret patterns, reserved test email domains, runtime URLs, dependency pinning, and release-control invariants. + +## Executed evidence + +- Baseline manifest: 466 files verified. +- Baseline audit exposed 4 High and 7 Medium findings. +- Current audit reports zero findings under the same controls. + +## Unexecuted or blocked evidence + +- Final package manifest validation occurs after all reports are generated. +- Git commit history was not supplied and cannot be audited. + +## Release disposition + +Static repository integrity is acceptable, but it does not replace build, dependency, browser, or human QA evidence. diff --git a/docs/phase15/RETEST_REPORT_v1.0.md b/docs/phase15/RETEST_REPORT_v1.0.md new file mode 100644 index 0000000..4e50cfa --- /dev/null +++ b/docs/phase15/RETEST_REPORT_v1.0.md @@ -0,0 +1,24 @@ +# Phase 15 Retest Report + +**Date:** 2026-06-25 +**Status:** Static retest passed; full regression blocked + +## Summary + +All four remediated Phase 15 defects pass targeted static or dependency-free retests. Browser and package-backed nearby regressions were not executable. + +## Executed evidence + +- P15-001: CSV structure passes. +- P15-002: exact media-type assertions and validator pass. +- P15-003: canonical theme key and Chromium scope validator pass. +- P15-004: CI integration command validator passes. + +## Unexecuted or blocked evidence + +- Prettier/ESLint/typecheck/unit/integration/build. +- Browser visual/theme/form regression. + +## Release disposition + +Resolved defects remain conditionally closed until the final connected CI run. diff --git a/docs/phase15/RISK_ACCEPTANCE_REGISTER_v1.0.csv b/docs/phase15/RISK_ACCEPTANCE_REGISTER_v1.0.csv new file mode 100644 index 0000000..7a77c7a --- /dev/null +++ b/docs/phase15/RISK_ACCEPTANCE_REGISTER_v1.0.csv @@ -0,0 +1 @@ +ID,Gate,Risk,User_impact,Business_impact,Mitigation,Owner,Approver,Expiration,Required_follow_up diff --git a/docs/phase15/RISK_ACCEPTANCE_SUMMARY_v1.0.md b/docs/phase15/RISK_ACCEPTANCE_SUMMARY_v1.0.md new file mode 100644 index 0000000..185affe --- /dev/null +++ b/docs/phase15/RISK_ACCEPTANCE_SUMMARY_v1.0.md @@ -0,0 +1,3 @@ +# Phase 15 Risk Acceptance Summary + +No accepted exceptions were created. `RISK_ACCEPTANCE_REGISTER_v1.0.csv` intentionally contains only its header. diff --git a/docs/phase15/ROLLBACK_REHEARSAL_REPORT_v1.0.md b/docs/phase15/ROLLBACK_REHEARSAL_REPORT_v1.0.md new file mode 100644 index 0000000..20e8b6d --- /dev/null +++ b/docs/phase15/ROLLBACK_REHEARSAL_REPORT_v1.0.md @@ -0,0 +1,20 @@ +# Phase 15 Rollback Rehearsal Report + +**Date:** 2026-06-25 +**Status:** Documented concept; not rehearsed + +## Summary + +The public demo and analytics can be disabled through existing flags, and production defaults are blocked. No platform rollback was executed. + +## Executed evidence + +- Feature-flag inventory and Phase 14 rollback guidance reviewed. + +## Unexecuted or blocked evidence + +- Restore previous release, disable CRM/scheduler/analytics independently, verify no resend, stale secret handling, fallback UX, timing, owner confirmation. + +## Release disposition + +Rollback readiness is unproven. diff --git a/docs/phase15/RTL_QA_REPORT_v1.0.md b/docs/phase15/RTL_QA_REPORT_v1.0.md new file mode 100644 index 0000000..a80de65 --- /dev/null +++ b/docs/phase15/RTL_QA_REPORT_v1.0.md @@ -0,0 +1,22 @@ +# Phase 15 RTL QA Report + +**Date:** 2026-06-25 +**Status:** Static controls passed; end-to-end review blocked + +## Summary + +The Arabic locale is configured for server-rendered RTL and the CSS validator reports 47 files using logical declarations. Native visual, focus-order, screen-reader, mixed-direction, and scheduler checks did not run. + +## Executed evidence + +- Locale direction metadata passes. +- Logical CSS validation passes. +- Bidi primitives and LTR treatment for email/tel/url values are present. + +## Unexecuted or blocked evidence + +- Rendered header, hero, workflow, forms, error summaries, dialogs, footer, animation, and 320px overflow review. + +## Release disposition + +Arabic RTL is not accepted from text alignment alone. diff --git a/docs/phase15/SCREEN_READER_REPORT_v1.0.md b/docs/phase15/SCREEN_READER_REPORT_v1.0.md new file mode 100644 index 0000000..edbc1cd --- /dev/null +++ b/docs/phase15/SCREEN_READER_REPORT_v1.0.md @@ -0,0 +1,22 @@ +# Phase 15 Screen-reader Report + +**Date:** 2026-06-25 +**Status:** Not run + +## Summary + +No NVDA, VoiceOver, or TalkBack session was performed. The report intentionally contains no invented announcements. + +## Executed evidence + +- Screen-reader combinations and required flows are listed in MANUAL_TEST_MATRIX_v1.0.csv. +- Static language, direction, labels, status regions, and dialog relationships reviewed. + +## Unexecuted or blocked evidence + +- Actual announcement transcripts for English and Arabic. +- Focus movement, error/status announcements, mixed-direction values, and mobile AT behavior. + +## Release disposition + +Screen-reader acceptance is blocked. diff --git a/docs/phase15/SECURITY_VALIDATION_REPORT_v1.0.md b/docs/phase15/SECURITY_VALIDATION_REPORT_v1.0.md new file mode 100644 index 0000000..44bdc09 --- /dev/null +++ b/docs/phase15/SECURITY_VALIDATION_REPORT_v1.0.md @@ -0,0 +1,23 @@ +# Phase 15 Security Validation Report + +**Date:** 2026-06-25 +**Status:** Static controls passed; dynamic and dependency checks blocked + +## Summary + +Static review confirms request marker, same-origin check, exact JSON content type, body limit, strict schema, honeypot, bounded timeout, idempotency, normalized errors, no-store responses, CSP, and server-only environment controls. The prefix media-type defect was fixed. + +## Executed evidence + +- Phase 14 security validator passes through C15-004. +- Secret-pattern and runtime URL audit passes. +- Exact content-type behavior assertions pass. + +## Unexecuted or blocked evidence + +- Registry vulnerability/license audit. +- Dynamic CSRF, origin, replay, malformed input, CSP, headers, rate limit, webhook, and vendor credential testing on final build. + +## Release disposition + +Security is not production-approved. Rate limiting, durable idempotency, vendors, and dynamic evidence remain blockers. diff --git a/docs/phase15/SEO_METADATA_REVIEW_v1.0.md b/docs/phase15/SEO_METADATA_REVIEW_v1.0.md new file mode 100644 index 0000000..d1f2fd9 --- /dev/null +++ b/docs/phase15/SEO_METADATA_REVIEW_v1.0.md @@ -0,0 +1,22 @@ +# Phase 15 SEO and Metadata Review + +**Date:** 2026-06-25 +**Status:** Static foundation passed; rendered validation blocked + +## Summary + +Localized metadata, canonical, hreflang, Open Graph, Twitter, robots, and non-indexable placeholder controls pass static validation. + +## Executed evidence + +- Metadata validator passes. +- Five route IDs have complete locale alternates. +- Public release defaults to noindex. + +## Unexecuted or blocked evidence + +- Production origin, rendered status codes/redirects, sitemap if implemented, social assets, final metadata copy, crawl. + +## Release disposition + +SEO release approval awaits production domain, assets, build, and crawl evidence. diff --git a/docs/phase15/STATIC_ANALYSIS_REPORT_v1.0.md b/docs/phase15/STATIC_ANALYSIS_REPORT_v1.0.md new file mode 100644 index 0000000..6860da8 --- /dev/null +++ b/docs/phase15/STATIC_ANALYSIS_REPORT_v1.0.md @@ -0,0 +1,24 @@ +# Phase 15 Static Analysis Report + +**Date:** 2026-06-25 +**Status:** Partially passed + +## Summary + +All dependency-free repository validators and the Phase 15 audit pass after four defects were repaired. Package-backed formatting, ESLint, strict TypeScript, dead-code tooling, dependency/license analysis, and client-bundle inspection could not run on the final tree. + +## Executed evidence + +- 16 repository validators pass. +- 33 JavaScript and 64 TypeScript modules plus two Python scripts pass syntax checks. +- JSON/CSV, secret, URL, PII-fixture, direct-dependency, visual-control, and CI-control audit passes. + +## Unexecuted or blocked evidence + +- Prettier check, ESLint, strict typecheck, dead-code and unused-dependency tools. +- Registry-backed audit and license validation. +- Production client-bundle secret inspection. + +## Release disposition + +Static source controls pass; the overall static-analysis gate remains blocked until package-backed checks run. diff --git a/docs/phase15/THEME_QA_REPORT_v1.0.md b/docs/phase15/THEME_QA_REPORT_v1.0.md new file mode 100644 index 0000000..e1a0e03 --- /dev/null +++ b/docs/phase15/THEME_QA_REPORT_v1.0.md @@ -0,0 +1,22 @@ +# Phase 15 Theme QA Report + +**Date:** 2026-06-25 +**Status:** Static controls passed; browser verification blocked + +## Summary + +Light, dark, and system foundations, nonce pre-paint bootstrap, persistence, and CSS fallback are present. A stale visual-test storage key was fixed. + +## Executed evidence + +- Theme validators pass. +- Canonical visual setup now uses `hpc.theme.preference`. +- Semantic token controls pass. + +## Unexecuted or blocked evidence + +- No-flash behavior, OS theme changes, delayed JavaScript, disabled JavaScript, contrast, embeds, and forced-colors states. + +## Release disposition + +Theme acceptance remains blocked pending rendered evidence. diff --git a/docs/phase15/UNIT_TEST_REPORT_v1.0.md b/docs/phase15/UNIT_TEST_REPORT_v1.0.md new file mode 100644 index 0000000..611f310 --- /dev/null +++ b/docs/phase15/UNIT_TEST_REPORT_v1.0.md @@ -0,0 +1,22 @@ +# Phase 15 Unit Test Report + +**Date:** 2026-06-25 +**Status:** Blocked for current release candidate + +## Summary + +A Vitest regression test was added for exact JSON media-type handling. The current unit suite could not execute because dependencies are unavailable. Phase 14 recorded 39 passing unit tests, but that result predates Phase 15 code changes. + +## Executed evidence + +- Eight dependency-free assertions validate the new media-type helper. +- Phase 14 historical result: 39 passed, 0 failed, with recorded coverage. + +## Unexecuted or blocked evidence + +- Current `pnpm test:unit` and coverage thresholds. +- Current React/component and Zod-dependent tests. + +## Release disposition + +Do not use the Phase 14 unit result as current release evidence. Rerun on the final manifest. diff --git a/docs/phase15/VISUAL_REGRESSION_REPORT_v1.0.md b/docs/phase15/VISUAL_REGRESSION_REPORT_v1.0.md new file mode 100644 index 0000000..4e7a89b --- /dev/null +++ b/docs/phase15/VISUAL_REGRESSION_REPORT_v1.0.md @@ -0,0 +1,22 @@ +# Phase 15 Visual Regression Report + +**Date:** 2026-06-25 +**Status:** Blocked + +## Summary + +No approved PNG baselines exist. Phase 15 corrected snapshot determinism but did not generate or approve product images. + +## Executed evidence + +- Snapshot suites now use canonical Chromium scope. +- Component-system test now writes the actual theme storage key. + +## Unexecuted or blocked evidence + +- Baseline generation in pinned Chromium. +- Manual diff classification for locales, themes, viewports, interaction states, focus, reduced motion, forced colors. + +## Release disposition + +Updating baselines is prohibited until the application executes and reviewers inspect every diff. diff --git a/docs/phase15/WCAG_2_2_AA_EVIDENCE_MATRIX_v1.0.csv b/docs/phase15/WCAG_2_2_AA_EVIDENCE_MATRIX_v1.0.csv new file mode 100644 index 0000000..767e963 --- /dev/null +++ b/docs/phase15/WCAG_2_2_AA_EVIDENCE_MATRIX_v1.0.csv @@ -0,0 +1,37 @@ +Criterion,Level,Applicability,Status,Evidence,Remaining_validation,Related_issue +1.1.1 Non-text Content,A,Applicable,Static evidence only,MediaFrame requires alt; icon primitives support accessible names,Browser and screen-reader inspection of every rendered media state,P15-005 +1.3.1 Info and Relationships,A,Applicable,Static evidence only,"Semantic landmarks, labels, fieldsets, headings, native dialog",Manual screen-reader verification,P15-005 +1.3.2 Meaningful Sequence,A,Applicable,Static evidence only,DOM order and logical CSS reviewed,EN/FR/AR screen-reader and keyboard order,P15-005 +1.3.3 Sensory Characteristics,A,Applicable,Static evidence only,Instructions do not rely solely on position,Rendered content review,P15-005 +1.4.1 Use of Color,A,Applicable,Static evidence only,Status text/icons accompany semantic color tokens,Manual light/dark/forced-colors review,P15-005 +1.4.3 Contrast Minimum,AA,Applicable,Blocked,Token intent exists,Measured contrast in all states/themes required,P15-005 +1.4.4 Resize Text,AA,Applicable,Blocked,Responsive typography authored,200% browser verification required,P15-005 +1.4.10 Reflow,AA,Applicable,Blocked,320px responsive scenarios authored,400% and narrow viewport execution required,P15-005 +1.4.11 Non-text Contrast,AA,Applicable,Blocked,Focus and border tokens exist,Rendered measurement required,P15-005 +1.4.12 Text Spacing,AA,Applicable,Blocked,Content-driven dimensions used,Text-spacing override test required,P15-005 +1.4.13 Content on Hover or Focus,AA,Applicable,Static evidence only,Tooltip component defined,Keyboard/pointer dismissal and persistence review,P15-005 +2.1.1 Keyboard,A,Applicable,Blocked,Native controls and keyboard tests authored,Full keyboard-only flow required,P15-005 +2.1.2 No Keyboard Trap,A,Applicable,Blocked,Native dialog used,Manual modal/drawer trap and escape review,P15-005 +2.2.1 Timing Adjustable,A,Limited,Static evidence only,No user-facing session timer; bounded server timeout preserves form,Slow completion and retry review,P15-005 +2.2.2 Pause Stop Hide,A,Applicable,Static evidence only,No autoplay media; reduced-motion styles exist,Rendered animation review,P15-005 +2.3.1 Three Flashes,A,Applicable,Static evidence only,No flashing content identified in source,Visual confirmation,P15-005 +2.4.1 Bypass Blocks,A,Applicable,Static evidence only,Skip navigation validator and shell tests authored,Keyboard confirmation,P15-005 +2.4.2 Page Titled,A,Applicable,Static evidence only,Localized metadata builder validator passes,Rendered route title verification,P15-005 +2.4.3 Focus Order,A,Applicable,Blocked,Logical DOM order and native controls,Manual all-state focus order,P15-005 +2.4.4 Link Purpose,A,Applicable,Static evidence only,Destination registry and localized labels,Rendered route review,P15-005 +2.4.6 Headings and Labels,AA,Applicable,Static evidence only,Structured headings and explicit form labels,Screen-reader review,P15-005 +2.4.7 Focus Visible,AA,Applicable,Blocked,Focus tokens/styles exist,Rendered keyboard review in themes/forced colors,P15-005 +2.4.11 Focus Not Obscured Minimum,AA,Applicable,Blocked,Sticky shell and dialog CSS reviewed,Viewport/zoom execution required,P15-005 +2.5.7 Dragging Movements,AA,Applicable,Static evidence only,No drag-only control identified,Rendered interaction inventory confirmation,P15-005 +2.5.8 Target Size Minimum,AA,Applicable,Blocked,Component sizing tokens exist,Measured desktop/mobile targets required,P15-005 +3.1.1 Language of Page,A,Applicable,Static evidence only,Server-rendered lang and dir validators pass,Rendered HTML verification,P15-005 +3.1.2 Language of Parts,AA,Applicable,Static evidence only,Bidi and localized content primitives exist,Foreign-language option pronunciation review,P15-005 +3.2.1 On Focus,A,Applicable,Static evidence only,No focus-triggered navigation identified,Manual interaction review,P15-005 +3.2.2 On Input,A,Applicable,Static evidence only,Locale/theme actions are explicit controls,Manual form and selector review,P15-005 +3.2.3 Consistent Navigation,AA,Applicable,Static evidence only,Shared shell components,Cross-route rendered comparison,P15-005 +3.3.1 Error Identification,A,Applicable,Static evidence only,"Error summary, field errors, aria-invalid",Screen-reader announcement review,P15-005 +3.3.2 Labels or Instructions,A,Applicable,Static evidence only,Required/optional labels and supporting text,Rendered/AT review,P15-005 +3.3.3 Error Suggestion,AA,Applicable,Static evidence only,Localized actionable validation messages,Manual flow review,P15-005 +3.3.4 Error Prevention,AA,Applicable,Static evidence only,No irreversible legal/financial transaction; duplicate controls present,Business policy review,P14-004 +4.1.2 Name Role Value,A,Applicable,Static evidence only,Native controls and explicit labels; ARIA in composites,Automated and screen-reader execution,P15-005 +4.1.3 Status Messages,AA,Applicable,Static evidence only,"LiveRegion, role=alert, success aria-live",Actual announcement capture required,P15-005 diff --git a/docs/phase15/ZOOM_REFLOW_REPORT_v1.0.md b/docs/phase15/ZOOM_REFLOW_REPORT_v1.0.md new file mode 100644 index 0000000..69bfdd2 --- /dev/null +++ b/docs/phase15/ZOOM_REFLOW_REPORT_v1.0.md @@ -0,0 +1,23 @@ +# Phase 15 Zoom and Reflow Report + +**Date:** 2026-06-25 +**Status:** Blocked + +## Summary + +Source uses content-driven dimensions and logical properties, and text-expansion scenarios exist. Actual 200%/400% zoom, OS text scaling, French expansion, Arabic expansion, and pseudolocalization were not run. + +## Executed evidence + +- Static logical CSS checks pass. +- Manual matrix identifies required zoom and AT combinations. + +## Unexecuted or blocked evidence + +- 200% and 400% browser zoom. +- Text-spacing overrides and OS scaling. +- Dialog/error-summary focus visibility at zoom. + +## Release disposition + +WCAG reflow and resize criteria are not verified. diff --git a/docs/phase16/ACCESSIBILITY_APPROVAL_RECORD_v1.0.csv b/docs/phase16/ACCESSIBILITY_APPROVAL_RECORD_v1.0.csv new file mode 100644 index 0000000..56b6319 --- /dev/null +++ b/docs/phase16/ACCESSIBILITY_APPROVAL_RECORD_v1.0.csv @@ -0,0 +1,2 @@ +Scope,Artifact_version,Approver,Role,Decision,Date,Conditions,Expiration_or_review_date,Evidence +Accessibility: WCAG 2.2 AA automated and manual production evidence,Phase 15 repository / Phase 16 review v1.0,Unassigned,Accessibility,Blocked pending evidence,2026-06-25,Explicit human approval and final governed artifact required,Before launch,No signed or explicitly recorded approval supplied diff --git a/docs/phase16/ANALYTICS_APPROVAL_RECORD_v1.0.csv b/docs/phase16/ANALYTICS_APPROVAL_RECORD_v1.0.csv new file mode 100644 index 0000000..0e32bb9 --- /dev/null +++ b/docs/phase16/ANALYTICS_APPROVAL_RECORD_v1.0.csv @@ -0,0 +1,2 @@ +Scope,Artifact_version,Approver,Role,Decision,Date,Conditions,Expiration_or_review_date,Evidence +"Analytics: Provider, event registry, consent category, retention, region, and ownership",Phase 15 repository / Phase 16 review v1.0,Unassigned,Analytics,Blocked pending evidence,2026-06-25,Explicit human approval and final governed artifact required,Before launch,No signed or explicitly recorded approval supplied diff --git a/docs/phase16/ARABIC_APPROVAL_RECORD_v1.0.csv b/docs/phase16/ARABIC_APPROVAL_RECORD_v1.0.csv new file mode 100644 index 0000000..14af46c --- /dev/null +++ b/docs/phase16/ARABIC_APPROVAL_RECORD_v1.0.csv @@ -0,0 +1,2 @@ +Scope,Artifact_version,Approver,Role,Decision,Date,Conditions,Expiration_or_review_date,Evidence +"Arabic: Formal Modern Standard Arabic, RTL, bidi, terminology, and reading order",Phase 15 repository / Phase 16 review v1.0,Unassigned,Arabic,Blocked pending evidence,2026-06-25,Explicit human approval and final governed artifact required,Before launch,No signed or explicitly recorded approval supplied diff --git a/docs/phase16/ASSET_APPROVAL_RECORD_v1.0.csv b/docs/phase16/ASSET_APPROVAL_RECORD_v1.0.csv new file mode 100644 index 0000000..50c3b09 --- /dev/null +++ b/docs/phase16/ASSET_APPROVAL_RECORD_v1.0.csv @@ -0,0 +1,2 @@ +Scope,Artifact_version,Approver,Role,Decision,Date,Conditions,Expiration_or_review_date,Evidence +"Assets: Logo, icons, hero, previews, customer media, social images, and fonts",Phase 15 repository / Phase 16 review v1.0,Unassigned,Assets,Blocked pending evidence,2026-06-25,Explicit human approval and final governed artifact required,Before launch,No signed or explicitly recorded approval supplied diff --git a/docs/phase16/CDN_CACHING_VALIDATION_REPORT_v1.0.md b/docs/phase16/CDN_CACHING_VALIDATION_REPORT_v1.0.md new file mode 100644 index 0000000..aa905e9 --- /dev/null +++ b/docs/phase16/CDN_CACHING_VALIDATION_REPORT_v1.0.md @@ -0,0 +1,11 @@ +# CDN and Caching Validation Report + +## Decision + +**Blocked pending evidence** + +Not executed. No CDN or deployment endpoint was supplied. Locale cache isolation, HTML policy, immutable assets, purge behavior, rollback compatibility, and sensitive-response caching remain blocked. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/phase16/COMMAND_AND_PLATFORM_ACTION_MATRIX_v1.0.csv b/docs/phase16/COMMAND_AND_PLATFORM_ACTION_MATRIX_v1.0.csv new file mode 100644 index 0000000..daf30e7 --- /dev/null +++ b/docs/phase16/COMMAND_AND_PLATFORM_ACTION_MATRIX_v1.0.csv @@ -0,0 +1,38 @@ +Action,Command_or_platform_action,Environment,Operator,Start_time,End_time,Exit_code_or_result,Test_count,Pass_count,Failure_count,Skipped_count,Warning_count,Evidence_path,Related_issue,Release_impact,Status +Clean dependency installation,corepack prepare pnpm@11.9.0 --activate; pnpm install --frozen-lockfile,Local sandbox / production where stated,Automated review agent or unassigned production operator,2026-06-25T23:56:10+00:00,2026-06-25T23:56:10+00:00,1,Not reported,Not reported,Not reported,Not reported,Not reported,docs/quality/phase16-command-logs/11-corepack-prepare-pnpm.log,P15-005 or applicable inherited gate,Corepack registry download failed; pnpm unavailable,Attempted / blocked +Formatting validation,pnpm format:check,Local sandbox / production where stated,Automated review agent or unassigned production operator,Not started,Not started,Not executed,Not reported,Not reported,Not reported,Not reported,Not reported,None,P15-005 or applicable inherited gate,Dependencies and pnpm unavailable,Blocked +Linting,pnpm lint,Local sandbox / production where stated,Automated review agent or unassigned production operator,Not started,Not started,Not executed,Not reported,Not reported,Not reported,Not reported,Not reported,None,P15-005 or applicable inherited gate,Dependencies and pnpm unavailable,Blocked +Strict type checking,pnpm typecheck,Local sandbox / production where stated,Automated review agent or unassigned production operator,Not started,Not started,Not executed,Not reported,Not reported,Not reported,Not reported,Not reported,None,P15-005 or applicable inherited gate,Dependencies and pnpm unavailable,Blocked +Token validation,node scripts/validate-tokens.mjs,Local sandbox / production where stated,Automated review agent or unassigned production operator,2026-06-25T23:56:10+00:00,2026-06-25T23:56:10+00:00,0,Not reported,Not reported,Not reported,Not reported,Not reported,docs/quality/phase16-command-logs/14-token-validation.log,P15-005 or applicable inherited gate,Dependency-free command executed,Passed +Locale validation,node scripts/validate-locales.mjs,Local sandbox / production where stated,Automated review agent or unassigned production operator,2026-06-25T23:56:10+00:00,2026-06-25T23:56:10+00:00,0,Not reported,Not reported,Not reported,Not reported,Not reported,docs/quality/phase16-command-logs/15-locale-validation.log,P15-005 or applicable inherited gate,Dependency-free command executed,Passed +Route validation,node scripts/validate-routes.mjs,Local sandbox / production where stated,Automated review agent or unassigned production operator,2026-06-25T23:56:10+00:00,2026-06-25T23:56:10+00:00,0,Not reported,Not reported,Not reported,Not reported,Not reported,docs/quality/phase16-command-logs/16-route-validation.log,P15-005 or applicable inherited gate,Dependency-free command executed,Passed +Destination validation,node scripts/validate-phase14-integrations.mjs,Local sandbox / production where stated,Automated review agent or unassigned production operator,2026-06-25T23:56:10+00:00,2026-06-25T23:56:10+00:00,0,Not reported,Not reported,Not reported,Not reported,Not reported,docs/quality/phase16-command-logs/05-phase14-integrations.log,P15-005 or applicable inherited gate,Static destination controls executed,Passed +RTL validation,node scripts/validate-css-logical.mjs,Local sandbox / production where stated,Automated review agent or unassigned production operator,2026-06-25T23:56:10+00:00,2026-06-25T23:56:10+00:00,0,Not reported,Not reported,Not reported,Not reported,Not reported,docs/quality/phase16-command-logs/17-css-rtl-validation.log,P15-005 or applicable inherited gate,Static logical CSS validation executed,Passed +Content validation,node scripts/validate-prohibited-content.mjs,Local sandbox / production where stated,Automated review agent or unassigned production operator,2026-06-25T23:56:10+00:00,2026-06-25T23:56:10+00:00,0,Not reported,Not reported,Not reported,Not reported,Not reported,docs/quality/phase16-command-logs/18-content-claims-validation.log,P15-005 or applicable inherited gate,Static prohibited-content validation executed,Passed +Evidence validation,node scripts/validate-phase15-readiness.mjs,Local sandbox / production where stated,Automated review agent or unassigned production operator,2026-06-25T23:56:10+00:00,2026-06-25T23:56:10+00:00,0,Not reported,Not reported,Not reported,Not reported,Not reported,docs/quality/phase16-command-logs/03-phase15-readiness.log,P15-005 or applicable inherited gate,Phase 15 evidence structure validated,Passed +Environment validation,node scripts/validate-phase14-environment.mjs,Local sandbox / production where stated,Automated review agent or unassigned production operator,2026-06-25T23:56:10+00:00,2026-06-25T23:56:10+00:00,0,Not reported,Not reported,Not reported,Not reported,Not reported,docs/quality/phase16-command-logs/06-phase14-environment.log,P15-005 or applicable inherited gate,Safe defaults validated; production values absent,Passed +Consent validation,node scripts/validate-phase14-privacy.mjs,Local sandbox / production where stated,Automated review agent or unassigned production operator,2026-06-25T23:56:10+00:00,2026-06-25T23:56:10+00:00,0,Not reported,Not reported,Not reported,Not reported,Not reported,docs/quality/phase16-command-logs/08-phase14-privacy.log,P15-005 or applicable inherited gate,Static disabled/gating controls only,Passed +Analytics validation,node scripts/validate-phase14-privacy.mjs,Local sandbox / production where stated,Automated review agent or unassigned production operator,2026-06-25T23:56:10+00:00,2026-06-25T23:56:10+00:00,0,Not reported,Not reported,Not reported,Not reported,Not reported,docs/quality/phase16-command-logs/08-phase14-privacy.log,P15-005 or applicable inherited gate,Static allowlist/no-PII controls only,Passed +Secret scanning,python3 scripts/phase15-static-audit.py ...,Local sandbox / production where stated,Automated review agent or unassigned production operator,2026-06-25T23:56:10+00:00,2026-06-25T23:56:10+00:00,0,Not reported,Not reported,Not reported,Not reported,Not reported,docs/quality/phase16-command-logs/04-static-audit.log,P15-005 or applicable inherited gate,Zero findings in static audit,Passed +Unit tests,pnpm test:unit,Local sandbox / production where stated,Automated review agent or unassigned production operator,Not started,Not started,Not executed,Not reported,Not reported,Not reported,Not reported,Not reported,None,P15-005 or applicable inherited gate,Dependencies and pnpm unavailable,Blocked +Integration tests,pnpm test:integration,Local sandbox / production where stated,Automated review agent or unassigned production operator,Not started,Not started,Not executed,Not reported,Not reported,Not reported,Not reported,Not reported,None,P15-005 or applicable inherited gate,Dependencies and pnpm unavailable,Blocked +Targeted end-to-end tests,pnpm test:e2e,Local sandbox / production where stated,Automated review agent or unassigned production operator,Not started,Not started,Not executed,Not reported,Not reported,Not reported,Not reported,Not reported,None,P15-005 or applicable inherited gate,Dependencies and browsers unavailable,Blocked +Accessibility tests,pnpm test:a11y,Local sandbox / production where stated,Automated review agent or unassigned production operator,Not started,Not started,Not executed,Not reported,Not reported,Not reported,Not reported,Not reported,None,P15-005 or applicable inherited gate,Dependencies and browsers unavailable,Blocked +Visual-regression tests,pnpm test:visual,Local sandbox / production where stated,Automated review agent or unassigned production operator,Not started,Not started,Not executed,Not reported,Not reported,Not reported,Not reported,Not reported,None,P15-005 or applicable inherited gate,Dependencies and browsers unavailable,Blocked +Security checks,node scripts/validate-phase14-security.mjs,Local sandbox / production where stated,Automated review agent or unassigned production operator,2026-06-25T23:56:10+00:00,2026-06-25T23:56:10+00:00,0,Not reported,Not reported,Not reported,Not reported,Not reported,docs/quality/phase16-command-logs/07-phase14-security.log,P15-005 or applicable inherited gate,Static source security checks executed,Passed +Privacy checks,node scripts/validate-phase14-privacy.mjs,Local sandbox / production where stated,Automated review agent or unassigned production operator,2026-06-25T23:56:10+00:00,2026-06-25T23:56:10+00:00,0,Not reported,Not reported,Not reported,Not reported,Not reported,docs/quality/phase16-command-logs/08-phase14-privacy.log,P15-005 or applicable inherited gate,Static source privacy checks executed,Passed +Broken-link checks,Production crawler or approved equivalent,Local sandbox / production where stated,Automated review agent or unassigned production operator,Not started,Not started,Not executed,Not reported,Not reported,Not reported,Not reported,Not reported,None,P15-005 or applicable inherited gate,No live domain and destinations are unapproved,Blocked +Production build,pnpm build,Local sandbox / production where stated,Automated review agent or unassigned production operator,Not started,Not started,Not executed,Not reported,Not reported,Not reported,Not reported,Not reported,None,P15-005 or applicable inherited gate,"Dependencies, exact runtime, and required production origin unavailable",Blocked +Bundle validation,Production build analyzer,Local sandbox / production where stated,Automated review agent or unassigned production operator,Not started,Not started,Not executed,Not reported,Not reported,Not reported,Not reported,Not reported,None,P15-005 or applicable inherited gate,No production build,Blocked +Performance checks,Approved synthetic and field tools,Local sandbox / production where stated,Automated review agent or unassigned production operator,Not started,Not started,Not executed,Not reported,Not reported,Not reported,Not reported,Not reported,None,P15-005 or applicable inherited gate,"No build, browsers, or live endpoint",Blocked +Deployment,Approved hosting action,Local sandbox / production where stated,Automated review agent or unassigned production operator,Not started,Not started,Not executed,Not reported,Not reported,Not reported,Not reported,Not reported,None,P15-005 or applicable inherited gate,Launch authorization rejected,Not executed +DNS validation,dig/nslookup and provider record review,Local sandbox / production where stated,Automated review agent or unassigned production operator,Not started,Not started,Not executed,Not reported,Not reported,Not reported,Not reported,Not reported,None,P15-005 or applicable inherited gate,No approved domain or DNS records,Not executed +TLS validation,openssl/curl/browser validation,Local sandbox / production where stated,Automated review agent or unassigned production operator,Not started,Not started,Not executed,Not reported,Not reported,Not reported,Not reported,Not reported,None,P15-005 or applicable inherited gate,No production hostname,Not executed +Security-header validation,curl/browser production response review,Local sandbox / production where stated,Automated review agent or unassigned production operator,Not started,Not started,Not executed,Not reported,Not reported,Not reported,Not reported,Not reported,None,P15-005 or applicable inherited gate,No production endpoint,Not executed +Production smoke tests,Approved production smoke matrix,Local sandbox / production where stated,Automated review agent or unassigned production operator,Not started,Not started,Not executed,Not reported,Not reported,Not reported,Not reported,Not reported,None,P15-005 or applicable inherited gate,No deployment,Not executed +Live integration test,Controlled production submission,Local sandbox / production where stated,Automated review agent or unassigned production operator,Not started,Not started,Not executed,Not reported,Not reported,Not reported,Not reported,Not reported,None,P15-005 or applicable inherited gate,No authorization or production vendors,Not executed +Live analytics test,Controlled non-sensitive events,Local sandbox / production where stated,Automated review agent or unassigned production operator,Not started,Not started,Not executed,Not reported,Not reported,Not reported,Not reported,Not reported,None,P15-005 or applicable inherited gate,No provider or authorization,Not executed +Live consent test,Production consent matrix,Local sandbox / production where stated,Automated review agent or unassigned production operator,Not started,Not started,Not executed,Not reported,Not reported,Not reported,Not reported,Not reported,None,P15-005 or applicable inherited gate,No approved consent setup,Not executed +Post-deployment performance test,Production performance tooling,Local sandbox / production where stated,Automated review agent or unassigned production operator,Not started,Not started,Not executed,Not reported,Not reported,Not reported,Not reported,Not reported,None,P15-005 or applicable inherited gate,No deployment,Not executed +Rollback rehearsal or execution,Approved platform rollback action,Local sandbox / production where stated,Automated review agent or unassigned production operator,Not started,Not started,Not executed,Not reported,Not reported,Not reported,Not reported,Not reported,None,P15-005 or applicable inherited gate,No platform or release candidate,Not executed +Final smoke tests,Post-monitoring smoke matrix,Local sandbox / production where stated,Automated review agent or unassigned production operator,Not started,Not started,Not executed,Not reported,Not reported,Not reported,Not reported,Not reported,None,P15-005 or applicable inherited gate,No deployment or monitoring window,Not executed diff --git a/docs/phase16/COMPLETE_LAUNCH_RECORD_v1.0.md b/docs/phase16/COMPLETE_LAUNCH_RECORD_v1.0.md new file mode 100644 index 0000000..ec04e46 --- /dev/null +++ b/docs/phase16/COMPLETE_LAUNCH_RECORD_v1.0.md @@ -0,0 +1,31 @@ +# Complete Launch Record + +## Identity + +- Input archive: `RentalDriveGo_Phase15_Repository_v1.0.zip` +- Input SHA-256: `e3a0773b9783a551ef96e9ec8acc61ba53a4200e9be24509c260099522ac1d5b` +- Phase 16 review timestamp: 2026-06-25T23:56:10+00:00 +- Source commit: unavailable +- Approved release candidate: none +- Production release identifier: none + +## Decision and execution + +- Launch authorization: Rejected +- Deployment: Not executed +- DNS cutover: Not executed +- Controlled live submission: Not executed +- Live consent/analytics/CRM/scheduler validation: Not executed +- Production accessibility/localization/performance/security/privacy checks: Not executed +- Monitoring window: Not executed +- Incidents: none, because no launch occurred +- Hotfixes: none +- Rollback: not applicable + +## Evidence completed + +The Phase 16 evidence package contains the successful dependency-free command logs, the static audit, gate and approval records, explicit blocked reports, updated issue and decision records, and package checksums. + +## Final status + +**Launch aborted before deployment.** diff --git a/docs/phase16/CONSENT_APPROVAL_RECORD_v1.0.csv b/docs/phase16/CONSENT_APPROVAL_RECORD_v1.0.csv new file mode 100644 index 0000000..962b531 --- /dev/null +++ b/docs/phase16/CONSENT_APPROVAL_RECORD_v1.0.csv @@ -0,0 +1,2 @@ +Scope,Artifact_version,Approver,Role,Decision,Date,Conditions,Expiration_or_review_date,Evidence +"Consent: Categories, defaults, storage, withdrawal, versions, and vendor gating",Phase 15 repository / Phase 16 review v1.0,Unassigned,Consent,Blocked pending evidence,2026-06-25,Explicit human approval and final governed artifact required,Before launch,No signed or explicitly recorded approval supplied diff --git a/docs/phase16/CONTROLLED_LIVE_SUBMISSION_REPORT_v1.0.md b/docs/phase16/CONTROLLED_LIVE_SUBMISSION_REPORT_v1.0.md new file mode 100644 index 0000000..62cd0ab --- /dev/null +++ b/docs/phase16/CONTROLLED_LIVE_SUBMISSION_REPORT_v1.0.md @@ -0,0 +1,11 @@ +# Controlled Live Submission Report + +## Decision + +**Blocked pending evidence** + +Not executed. Launch authorization was rejected and no approved production CRM, scheduler, email path, test identity policy, or production endpoint was supplied. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/phase16/CRM_OPERATIONAL_APPROVAL_v1.0.csv b/docs/phase16/CRM_OPERATIONAL_APPROVAL_v1.0.csv new file mode 100644 index 0000000..c5f6de3 --- /dev/null +++ b/docs/phase16/CRM_OPERATIONAL_APPROVAL_v1.0.csv @@ -0,0 +1,2 @@ +Scope,Artifact_version,Approver,Role,Decision,Date,Conditions,Expiration_or_review_date,Evidence +"CRM operations: Production account, credentials, mapping, duplicate handling, routing, and support",Phase 15 repository / Phase 16 review v1.0,Unassigned,CRM operations,Blocked pending evidence,2026-06-25,Explicit human approval and final governed artifact required,Before launch,No signed or explicitly recorded approval supplied diff --git a/docs/phase16/CUSTOMER_EVIDENCE_APPROVAL_RECORD_v1.0.csv b/docs/phase16/CUSTOMER_EVIDENCE_APPROVAL_RECORD_v1.0.csv new file mode 100644 index 0000000..04fc139 --- /dev/null +++ b/docs/phase16/CUSTOMER_EVIDENCE_APPROVAL_RECORD_v1.0.csv @@ -0,0 +1,2 @@ +Scope,Artifact_version,Approver,Role,Decision,Date,Conditions,Expiration_or_review_date,Evidence +"Customer evidence: Logos, testimonials, names, roles, images, and case-study excerpts",Phase 15 repository / Phase 16 review v1.0,Unassigned,Customer evidence,Blocked pending evidence,2026-06-25,Explicit human approval and final governed artifact required,Before launch,No signed or explicitly recorded approval supplied diff --git a/docs/phase16/DEFERRED_WORK_REGISTER_v1.0.csv b/docs/phase16/DEFERRED_WORK_REGISTER_v1.0.csv new file mode 100644 index 0000000..5b364e3 --- /dev/null +++ b/docs/phase16/DEFERRED_WORK_REGISTER_v1.0.csv @@ -0,0 +1,42 @@ +ID,Description,Reason_deferred,Severity,User_impact,Business_impact,Security_impact,Privacy_impact,Accessibility_impact,Owner,Target_date,Release_dependency,Monitoring_requirement,Exit_criteria +P9-001,Participant acceptance,Inherited open,Critical,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Research,Before launch,Yes,Track gate status; no production monitoring substitute,"Run required pilot, core, and accessibility cohorts; fix/retest S0/S1 findings." +P9-002,CRM integration,Inherited open,High,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Sales Ops + Engineering,Before launch,Yes,Track gate status; no production monitoring substitute,"Approve and integration-test endpoint, routing, duplicates, idempotency, retry, spam controls, monitoring, and ownership." +P9-003,Legal consent,Inherited open,High,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Legal,Before launch,Yes,Track gate status; no production monitoring substitute,"Approve localized consent, privacy linkage, retention, and market requirements." +P9-004,Analytics and consent,Inherited open,High,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Analytics + Legal,Before launch,Yes,Track gate status; no production monitoring substitute,"Approve vendor, event authority, consent policy, retention, replay policy, and non-PII payloads." +P9-005,Native linguistic review,Inherited open,High,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Content + Localization,Before launch,Yes,Track gate status; no production monitoring substitute,"Native review of all visible copy, metadata, errors, and bidi samples." +P9-006,Illustrative product preview,Inherited open,High,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Product + Design,Before launch,Yes,Track gate status; no production monitoring substitute,Approve illustration or provide governed product capture. +P9-007,Multi-location claim,Inherited open,High,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Product,Before launch,Yes,Track gate status; no production monitoring substitute,Approve capability or revise/suppress affected copy. +P9-008,Pricing model,Inherited open,High,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Commercial,Before launch,Yes,Track gate status; no production monitoring substitute,Approve public pricing and limits in writing. +P9-009,Security evidence,Inherited open,High,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Security + Legal,Before launch,Yes,Track gate status; no production monitoring substitute,"Provide scoped evidence, approvals, and expiry dates." +P9-011,Browser policy owner,Inherited open,Medium,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Product + Engineering,Unscheduled,Conditional,Track gate status; no production monitoring substitute,"Approve supported browser matrix, owner, telemetry, and exception/retirement process." +P9-012,Product tour medium,Inherited open,Medium,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Product + Marketing,Unscheduled,Conditional,Track gate status; no production monitoring substitute,Approve accessible localized dialog fallback or media/transcript. +P9-013,Markets and formatting,Inherited open,Medium,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Product + Legal,Unscheduled,Conditional,Track gate status; no production monitoring substitute,"Define markets, currency, timezone, phone, and jurisdiction independently of locale." +P9-014,Login destination,Inherited open,Medium,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Product + Engineering,Unscheduled,Conditional,Track gate status; no production monitoring substitute,"Approve destination, security behavior, locale return path, and analytics." +P9-015,Alternate sales contact,Inherited open,Medium,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Sales Ops,Unscheduled,Conditional,Track gate status; no production monitoring substitute,Provide approved contact route or approve suppression. +P9-016,Customer evidence,Inherited open,Medium,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Marketing + Legal,Unscheduled,Conditional,Track gate status; no production monitoring substitute,Provide attributable evidence records and approvals. +P10-001,Canonical production origin,Open,High,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Product + Infrastructure,Before launch,Yes,Track gate status; no production monitoring substitute,Approve public domain/origin and configure SITE_ORIGIN in production. +P10-002,RentalDriveGo visual identity,Open,High,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Product + Design,Before launch,Yes,Track gate status; no production monitoring substitute,Approve and supply final accessible logo assets for light/dark contexts. +P10-003,Browser suite execution,Environment blocked locally,Medium,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Engineering + QA,Unscheduled,Conditional,Track gate status; no production monitoring substitute,Run configured Playwright matrix in unblocked CI; generate/review baselines; close all failures. +P10-004,Exact target runtime verification,Open verification,Low,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Engineering,Unscheduled,Conditional,Track gate status; no production monitoring substitute,Pass full quality and browser workflows on Node.js 24.17.0. +P11-001,Phase 11 browser verification,Environment blocked,High,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Engineering + QA,Before launch,Yes,Track gate status; no production monitoring substitute,Install pinned dependencies and browsers in unblocked Node 24.17.0 CI; pass all functional and accessibility projects. +P11-002,Visual baseline generation and approval,Environment blocked,High,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Design + QA,Before launch,Yes,Track gate status; no production monitoring substitute,Generate all Chromium snapshots with the pinned browser; review locale/theme/viewport/drawer/focus cases; commit approved baselines. +P11-003,Exact Phase 11 target runtime verification,Open verification,Low,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Engineering,Unscheduled,Conditional,Track gate status; no production monitoring substitute,"Run static, unit, build, package, and browser gates on Node 24.17.0 and pnpm 11.9.0." +P11-004,Application-shell copy linguistic approval,Inherited open,Medium,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Content + Localization,Unscheduled,Conditional,Track gate status; no production monitoring substitute,"Complete native French and Arabic review of Phase 11 shell, state, metadata, and pending-destination copy." +P12-001,Browser and accessibility execution,Environment blocked,High,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Engineering + QA,Before launch,Yes,Track gate status; no production monitoring substitute,Run all 44 Chromium browser/accessibility scenarios and the approved cross-browser matrix in an environment where loopback navigation is not administrator-blocked; fix product failures. +P12-002,Visual regression baselines,Environment blocked,High,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Design + QA,Before launch,Yes,Track gate status; no production monitoring substitute,Generate and review stable light/dark EN/FR/AR desktop/mobile/focus/error/long-content baselines with the pinned browser. +P12-003,Pinned runtime verification,Open verification,Medium,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Engineering,Unscheduled,Conditional,Track gate status; no production monitoring substitute,"Pass install, static, unit, build, browser, accessibility, visual, audit, and package gates on Node 24.17.0 and pnpm 11.9.0." +P12-004,Frozen installation and dependency audit,Environment blocked,Medium,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Engineering + Security,Unscheduled,Conditional,Track gate status; no production monitoring substitute,Complete pnpm install --frozen-lockfile and pnpm audit --audit-level low with registry access. +P12-005,Manual assistive-technology and zoom QA,Open verification,Medium,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Accessibility + QA,Unscheduled,Conditional,Track gate status; no production monitoring substitute,"Complete keyboard, touch, screen-reader, 200/400 percent zoom, reduced-motion, forced-colors, locale, theme, and viewport manual matrix; attach evidence." +P13-001,Homepage browser accessibility and visual execution,Environment blocked,High,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Engineering + QA,Before launch,Yes,Track gate status; no production monitoring substitute,"Run the authored homepage scenarios in unblocked pinned-browser CI; fix functional, axe, reflow, focus, and visual failures; approve baselines." +P13-002,Phase 13 manual responsive and assistive-technology QA,Open verification,Medium,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Accessibility + QA,Unscheduled,Conditional,Track gate status; no production monitoring substitute,"Complete keyboard, touch, screen-reader, 200/400 percent zoom, reduced-motion, forced-colors, locale, theme, viewport, and content-expansion review; attach evidence." +P13-003,Exact Phase 13 target runtime and package verification,Open verification,Medium,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Engineering + Security,Unscheduled,Conditional,Track gate status; no production monitoring substitute,"Pass frozen pnpm install, all validation suites, audit, build, and package verification on Node 24.17.0 and pnpm 11.9.0." +P14-001,Production lead destination,Blocked,High,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Sales Ops + Engineering,Before launch,Yes,Track gate status; no production monitoring substitute,"Approve vendor, endpoint, authentication, scopes, mapping, duplicate policy, retries, sandbox, monitoring and ownership." +P14-002,Legal form processing,Blocked,High,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Legal + Privacy,Before launch,Yes,Track gate status; no production monitoring substitute,"Approve localized notice, legal basis, consent behavior, retention, deletion, recipients and transfer implications." +P14-003,Analytics provider and consent,Blocked,High,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Analytics + Legal,Before launch,Yes,Track gate status; no production monitoring substitute,"Approve provider, consent category, storage, retention, region, DPA, replay policy and operational owner." +P14-004,Distributed idempotency and duplicate policy,Blocked,High,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Engineering + Sales Ops,Before launch,Yes,Track gate status; no production monitoring substitute,Select durable store and approve duplicate semantics across instances and CRM records. +P14-005,Observability and retention,Open,Medium,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Engineering + Privacy,Unscheduled,Conditional,Track gate status; no production monitoring substitute,"Approve metrics, retention, redaction, alert thresholds and owners without lead content." +P14-006,Scheduling service,Blocked,Medium,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Sales Ops + Product,Unscheduled,Conditional,Track gate status; no production monitoring substitute,"Approve provider, locale/timezone behavior, accessibility, fallback and confirmation semantics." +P14-007,Email notifications,Blocked,Medium,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Sales Ops + Engineering,Unscheduled,Conditional,Track gate status; no production monitoring substitute,"Approve provider, templates, sender identities, recipients, data minimization and delivery semantics." +P14-008,Phase 14 browser/accessibility/visual execution,Environment blocked,High,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Engineering + QA + Accessibility,Before launch,Yes,Track gate status; no production monitoring substitute,"Run pinned browser suites, fix failures, approve visual baselines and complete manual AT/zoom review." +P14-009,"Pinned runtime, install, audit and build",Environment blocked,Medium,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Engineering + Security,Unscheduled,Conditional,Track gate status; no production monitoring substitute,"Run Node 24.17.0 and pnpm 11.9.0 frozen install, all tests, build, audit, secret scan and package verification." +P15-005,Current release-candidate final QA execution,Environment blocked,High,Potential impact; see source issue and exit criteria,Release or quality risk remains unresolved,Review required where the issue affects security or integrations,Review required where the issue affects data processing,"Review required where the issue affects UI, locale, browser, or assistive technology",Engineering + QA + Accessibility + Security,Before launch,Yes,Track gate status; no production monitoring substitute,"On the exact Node 24.17.0 and pnpm 11.9.0 toolchain, complete frozen installation, format, lint, typecheck, unit, integration, build, audit, browser, accessibility, visual, performance, deployment, rollback, and manual AT matrices for the final manifest." diff --git a/docs/phase16/DEPLOYMENT_LOG_v1.0.csv b/docs/phase16/DEPLOYMENT_LOG_v1.0.csv new file mode 100644 index 0000000..1a8ef62 --- /dev/null +++ b/docs/phase16/DEPLOYMENT_LOG_v1.0.csv @@ -0,0 +1,2 @@ +Start_time,End_time,Release_candidate,Action,Environment,Operator,Output,Warnings,Exit_status,URL,Rollback_target,Decision +Not started,Not started,None approved,No deployment action executed,Production,None,Launch authorization rejected,"No approved production domain, hosting account, CRM, scheduler, analytics provider, consent provider, legal/privacy text, production credentials, named approvers, or launch window was supplied. The local environment is Node 22.16.0 with no pnpm binary or registry access, while the repository requires Node 24.17.0 and pnpm 11.9.0.",Not executed,Not supplied,Not supplied,Rejected diff --git a/docs/phase16/DNS_CUTOVER_LOG_v1.0.csv b/docs/phase16/DNS_CUTOVER_LOG_v1.0.csv new file mode 100644 index 0000000..6dfa9ee --- /dev/null +++ b/docs/phase16/DNS_CUTOVER_LOG_v1.0.csv @@ -0,0 +1,2 @@ +Time,Action,Previous_value,New_value,Operator,Propagation_result,TLS_result,Rollback_value,Decision +Not started,No DNS change executed,Not supplied,Not supplied,None,Not executed,Not executed,Not supplied,Not applicable diff --git a/docs/phase16/DOMAIN_DNS_PLAN_v1.0.md b/docs/phase16/DOMAIN_DNS_PLAN_v1.0.md new file mode 100644 index 0000000..009ac71 --- /dev/null +++ b/docs/phase16/DOMAIN_DNS_PLAN_v1.0.md @@ -0,0 +1,11 @@ +# Domain and DNS Plan + +## Decision + +**Blocked pending evidence** + +No primary domain, DNS provider, record set, TTL plan, canonical host, `www` policy, or rollback values were supplied. DNS cutover is prohibited until these are approved and captured. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/phase16/EMAIL_SENDER_DOMAIN_READINESS_REPORT_v1.0.md b/docs/phase16/EMAIL_SENDER_DOMAIN_READINESS_REPORT_v1.0.md new file mode 100644 index 0000000..1f6adf4 --- /dev/null +++ b/docs/phase16/EMAIL_SENDER_DOMAIN_READINESS_REPORT_v1.0.md @@ -0,0 +1,11 @@ +# Email Sender-domain Readiness Report + +## Decision + +**Blocked pending evidence** + +Not applicable to the current disabled release state and blocked for any future enablement. No provider, sender domain, SPF, DKIM, DMARC, approved templates, suppression behavior, bounce handling, or owner was supplied. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/phase16/FEATURE_FLAG_RELEASE_STATE_v1.0.csv b/docs/phase16/FEATURE_FLAG_RELEASE_STATE_v1.0.csv new file mode 100644 index 0000000..9edf81f --- /dev/null +++ b/docs/phase16/FEATURE_FLAG_RELEASE_STATE_v1.0.csv @@ -0,0 +1,9 @@ +Flag,Release_state,Production_default,Owner_role,Named_owner,Disabled_behavior,Enablement_requirements,Decision,Condition +demoSubmissionEnabled,false / disabled,false,Product + Engineering,Unassigned,non-navigable localized reason,"CRM, legal, privacy, operations and QA approval",Approved with documented conditions,Must remain disabled until every listed requirement is approved +crmIntegrationEnabled,false / disabled,false,Sales Ops + Engineering,Unassigned,blocked adapter,P9-002,Approved with documented conditions,Must remain disabled until every listed requirement is approved +schedulerEnabled,false / disabled,false,Sales Ops,Unassigned,no scheduler,approved provider and accessibility review,Approved with documented conditions,Must remain disabled until every listed requirement is approved +analyticsEnabled,false / disabled,false,Analytics + Legal,Unassigned,no delivery/network/storage,P9-004,Approved with documented conditions,Must remain disabled until every listed requirement is approved +marketingConsentEnabled,false / disabled,false,Legal,Unassigned,not rendered/transmitted,approved text and withdrawal flow,Approved with documented conditions,Must remain disabled until every listed requirement is approved +productTourEnabled,false / disabled,false,Product + Marketing,Unassigned,non-navigable,P9-012,Approved with documented conditions,Must remain disabled until every listed requirement is approved +pricingDestinationEnabled,false / disabled,false,Commercial,Unassigned,informational section only,P9-008,Approved with documented conditions,Must remain disabled until every listed requirement is approved +loginDestinationEnabled,false / disabled,false,Product + Engineering,Unassigned,non-navigable,P9-014,Approved with documented conditions,Must remain disabled until every listed requirement is approved diff --git a/docs/phase16/FINAL_ACCEPTED_EXCEPTION_REGISTER_v1.0.csv b/docs/phase16/FINAL_ACCEPTED_EXCEPTION_REGISTER_v1.0.csv new file mode 100644 index 0000000..5dad5f2 --- /dev/null +++ b/docs/phase16/FINAL_ACCEPTED_EXCEPTION_REGISTER_v1.0.csv @@ -0,0 +1,2 @@ +Exception_ID,Scope,Decision,Risk,Owner,Deadline,Monitoring,Mitigation,Approver,Date +NONE,No exceptions accepted,Not applicable,None accepted,Unassigned,Not applicable,Not applicable,Launch withheld instead of accepting risk,Not applicable,2026-06-25 diff --git a/docs/phase16/FINAL_CLAIM_EVIDENCE_APPROVAL_RECORD_v1.0.csv b/docs/phase16/FINAL_CLAIM_EVIDENCE_APPROVAL_RECORD_v1.0.csv new file mode 100644 index 0000000..e484790 --- /dev/null +++ b/docs/phase16/FINAL_CLAIM_EVIDENCE_APPROVAL_RECORD_v1.0.csv @@ -0,0 +1,2 @@ +Scope,Artifact_version,Approver,Role,Decision,Date,Conditions,Expiration_or_review_date,Evidence +"Claims and evidence: All claims, metrics, security statements, and integration statements",Phase 15 repository / Phase 16 review v1.0,Unassigned,Claims and evidence,Blocked pending evidence,2026-06-25,Explicit human approval and final governed artifact required,Before launch,No signed or explicitly recorded approval supplied diff --git a/docs/phase16/FINAL_CONTENT_APPROVAL_RECORD_v1.0.csv b/docs/phase16/FINAL_CONTENT_APPROVAL_RECORD_v1.0.csv new file mode 100644 index 0000000..bc79ee3 --- /dev/null +++ b/docs/phase16/FINAL_CONTENT_APPROVAL_RECORD_v1.0.csv @@ -0,0 +1,2 @@ +Scope,Artifact_version,Approver,Role,Decision,Date,Conditions,Expiration_or_review_date,Evidence +"Marketing content: All public copy, metadata, forms, messages, and email templates",Phase 15 repository / Phase 16 review v1.0,Unassigned,Marketing content,Blocked pending evidence,2026-06-25,Explicit human approval and final governed artifact required,Before launch,No signed or explicitly recorded approval supplied diff --git a/docs/phase16/FINAL_DEFECT_DISPOSITION_REPORT_v1.0.csv b/docs/phase16/FINAL_DEFECT_DISPOSITION_REPORT_v1.0.csv new file mode 100644 index 0000000..63c6581 --- /dev/null +++ b/docs/phase16/FINAL_DEFECT_DISPOSITION_REPORT_v1.0.csv @@ -0,0 +1,6 @@ +ID,Severity,Status,Disposition,Owner,Retest_result,Phase16_result +P15-001,High,Resolved,Fixed in Phase 15,Engineering + QA,All CSV files parse; C15-004 and C15-006 pass,Static retest passed +P15-002,Medium,Resolved,Fixed in Phase 15,Engineering + Security,Eight dependency-free assertions pass; Vitest regression authored but not run,Static retest passed +P15-003,Medium,Resolved,Fixed; browser retest still blocked,Engineering + Design QA,Static regression validator passes; browser snapshots not executed,Static retest passed +P15-004,High,Resolved,CI command added; execution pending connected CI,Engineering + QA,Phase 15 validator confirms command presence; integration suite not locally executed,Static retest passed +P15-005,High,Open - environment blocked,"Block launch; dependency-backed, browser, human, production, and operational evidence remains incomplete.",Engineering + QA + Accessibility + Security,Not retested; requires connected pinned CI and human QA,Partially retested; remains blocked diff --git a/docs/phase16/FINAL_DEFECT_DISPOSITION_REPORT_v1.0.md b/docs/phase16/FINAL_DEFECT_DISPOSITION_REPORT_v1.0.md new file mode 100644 index 0000000..7786d7a --- /dev/null +++ b/docs/phase16/FINAL_DEFECT_DISPOSITION_REPORT_v1.0.md @@ -0,0 +1,5 @@ +# Final Defect Disposition Report + +The companion CSV records every Phase 15 defect. `P15-001` through `P15-004` remain resolved. `P15-005` remains an open High release blocker because the exact frozen install, dependency-backed test matrix, browser and assistive-technology evidence, performance evidence, production rehearsal, rollback rehearsal, and approvals are incomplete. + +No Critical or High risk exception was accepted. Launch was rejected rather than laundering missing evidence into a cheerful status label. diff --git a/docs/phase16/FINAL_LAUNCH_STATUS_v1.0.md b/docs/phase16/FINAL_LAUNCH_STATUS_v1.0.md new file mode 100644 index 0000000..7754d59 --- /dev/null +++ b/docs/phase16/FINAL_LAUNCH_STATUS_v1.0.md @@ -0,0 +1,19 @@ +# Final Launch Status + +## Status + +**Launch aborted before deployment** + +- Critical unresolved cumulative issues: **1** +- High unresolved cumulative issues: **21** +- Medium unresolved cumulative issues: **17** +- Low unresolved cumulative issues: **2** +- Phase 16 failed or blocked gates: **29** +- Open incidents: **0** +- Accepted conditions or exceptions: **0** +- Deployment: **Not executed** +- Public release: **Withheld** +- Accountable launch owner: **Unassigned** +- Next review date: **After all Critical and High gates have evidence and named approval; no calendar date is defensible yet** + +Static source controls passed, but production readiness did not. A website that cannot legally process a form, route a lead, prove accessibility, or identify its production domain is not a launch candidate. It is a well-organized folder with ambitions. diff --git a/docs/phase16/FINAL_POST_DEPLOYMENT_SMOKE_TEST_REPORT_v1.0.md b/docs/phase16/FINAL_POST_DEPLOYMENT_SMOKE_TEST_REPORT_v1.0.md new file mode 100644 index 0000000..6cd1761 --- /dev/null +++ b/docs/phase16/FINAL_POST_DEPLOYMENT_SMOKE_TEST_REPORT_v1.0.md @@ -0,0 +1,11 @@ +# Final Post-deployment Smoke-test Report + +## Decision + +**Blocked pending evidence** + +Not executed. There was no deployment, DNS cutover, hotfix, or rollback. No production status can be inferred from static source checks. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/phase16/FINAL_RELEASE_GATE_MATRIX_v1.0.csv b/docs/phase16/FINAL_RELEASE_GATE_MATRIX_v1.0.csv new file mode 100644 index 0000000..1c2fc51 --- /dev/null +++ b/docs/phase16/FINAL_RELEASE_GATE_MATRIX_v1.0.csv @@ -0,0 +1,33 @@ +Gate,Severity,Phase15_status,Phase16_decision,Evidence,Accountable_role,Named_owner,Condition_or_exit_criteria,Risk,Deadline,Monitoring_requirement,Rollback_or_mitigation,Accepted_exception +Supplied Phase 14 package integrity,High,Passed,Approved,C15-001,Engineering,Unassigned,Manifest validates fresh extraction,Controlled,Before launch,Gate review,Withhold launch,No +Phase 15 static validators,High,Passed,Approved,C15-004,Engineering + QA,Unassigned,All dependency-free validators pass,Controlled,Before launch,Gate review,Withhold launch,No +Repository integrity and secret/PII fixture audit,High,Passed,Approved,C15-006,Engineering + Security + Privacy,Unassigned,Zero Critical/High/Medium findings,Controlled,Before launch,Gate review,Withhold launch,No +Exact Node 24.17.0 and pnpm 11.9.0 frozen install,High,Blocked,Blocked pending evidence,C15-002; C15-003,Engineering + Security,Unassigned,Connected clean environment completes frozen install,Release readiness cannot be established,Before launch,Gate review,Withhold launch,No +"Format, lint, strict typecheck, unit, integration, and production build on final manifest",High,Blocked,Blocked pending evidence,C15-009 through C15-020,Engineering + QA,Unassigned,All commands exit zero on final manifest,Release readiness cannot be established,Before launch,Gate review,Withhold launch,No +Dependency and license audit,High,Blocked,Blocked pending evidence,C15-021,Security + Legal,Unassigned,Registry-backed audit and configured license check pass,Release readiness cannot be established,Before launch,Gate review,Withhold launch,No +Cross-browser functional execution,High,Blocked,Blocked pending evidence,C15-014; P14-008,QA,Unassigned,"Chromium, Firefox, WebKit, mobile Chrome, mobile Safari pass",Release readiness cannot be established,Before launch,Gate review,Withhold launch,No +Automated accessibility execution,High,Blocked,Blocked pending evidence,C15-015; P14-008,Accessibility + QA,Unassigned,Axe matrix passes with reviewed exceptions,Release readiness cannot be established,Before launch,Gate review,Withhold launch,No +"Manual keyboard, screen-reader, zoom, reflow, forced-colors, and RTL review",High,Blocked,Blocked pending evidence,MANUAL_TEST_MATRIX_v1.0.csv,Accessibility + QA + Localization,Unassigned,Human matrix completed with evidence,Release readiness cannot be established,Before launch,Gate review,Withhold launch,No +Visual-regression baseline generation and approval,High,Blocked,Blocked pending evidence,C15-016; VISUAL_REGRESSION_REPORT_v1.0.md,Design + QA,Unassigned,Pinned Chromium baselines generated and all diffs reviewed,Release readiness cannot be established,Before launch,Gate review,Withhold launch,No +Performance and bundle budgets,High,Blocked,Blocked pending evidence,PERFORMANCE_REPORT_v1.0.md; BUNDLE_ANALYSIS_REPORT_v1.0.md,Engineering,Unassigned,Final build measured against approved budgets,Release readiness cannot be established,Before launch,Gate review,Withhold launch,No +Production-like deployment and rollback rehearsal,High,Blocked,Blocked pending evidence,DEPLOYMENT_REHEARSAL_REPORT_v1.0.md; ROLLBACK_REHEARSAL_REPORT_v1.0.md,Infrastructure + Engineering,Unassigned,Documented rehearsal succeeds and is timed,Release readiness cannot be established,Before launch,Gate review,Withhold launch,No +Approved CRM/lead destination,High,Blocked,Blocked pending evidence,P14-001,Sales Ops + Engineering,Unassigned,"Approved vendor, credentials, mapping, retries, duplicates, sandbox, monitoring",Release readiness cannot be established,Before launch,Gate review,Withhold launch,No +Approved legal/privacy/form processing,High,Blocked,Blocked pending evidence,P14-002,Legal + Privacy,Unassigned,"Localized notice, legal basis, consent, retention, deletion, recipients, transfers approved",Release readiness cannot be established,Before launch,Gate review,Withhold launch,No +Approved analytics provider and consent,High,Blocked,Blocked pending evidence,P14-003,Analytics + Legal,Unassigned,"Provider, DPA, consent, region, retention, event policy approved",Release readiness cannot be established,Before launch,Gate review,Withhold launch,No +Distributed idempotency and abuse controls,High,Blocked,Blocked pending evidence,P14-004; P9-002,Engineering + Sales Ops,Unassigned,"Durable store, rate limit, duplicate policy, monitoring validated",Release readiness cannot be established,Before launch,Gate review,Withhold launch,No +Native French and Arabic review,High,Open,Blocked pending evidence,P9-005,Localization + Content,Unassigned,Native reviewers approve all visible and metadata strings,Release readiness cannot be established,Before launch,Gate review,Withhold launch,No +Participant and accessibility acceptance research,Critical,Blocked,Blocked pending evidence,P9-001,Research + Product,Unassigned,Required cohorts completed; S0/S1 findings fixed and retested,Release readiness cannot be established,Before launch,Gate review,Withhold launch,No +"Canonical domain, brand assets, and public destinations",High,Blocked,Blocked pending evidence,P10-001; P10-002; destination registry,Product + Infrastructure + Design,Unassigned,"Approved production origin, logo, legal, login, sales, support, tour, pricing destinations",Release readiness cannot be established,Before launch,Gate review,Withhold launch,No +Final source-control commit identity,Medium,Blocked,Blocked pending evidence,Supplied ZIP contains no .git metadata,Engineering,Unassigned,Commit final manifest and record immutable SHA,Release readiness cannot be established,Before launch,Gate review,Withhold launch,No +Final product approval,High,Not evaluated,Blocked pending evidence,No approved artifact supplied,See Phase 16 role matrix,Unassigned,Named accountable owner and explicit approval/evidence required,"Uncontrolled production, legal, operational, or user harm",Before launch,Gate review,Withhold launch,No +Final content approval,High,Not evaluated,Blocked pending evidence,No approved artifact supplied,See Phase 16 role matrix,Unassigned,Named accountable owner and explicit approval/evidence required,"Uncontrolled production, legal, operational, or user harm",Before launch,Gate review,Withhold launch,No +Claims and customer evidence approval,High,Not evaluated,Blocked pending evidence,No approved artifact supplied,See Phase 16 role matrix,Unassigned,Named accountable owner and explicit approval/evidence required,"Uncontrolled production, legal, operational, or user harm",Before launch,Gate review,Withhold launch,No +Legal and privacy approval,High,Not evaluated,Blocked pending evidence,No approved artifact supplied,See Phase 16 role matrix,Unassigned,Named accountable owner and explicit approval/evidence required,"Uncontrolled production, legal, operational, or user harm",Before launch,Gate review,Withhold launch,No +Consent approval,High,Not evaluated,Blocked pending evidence,No approved artifact supplied,See Phase 16 role matrix,Unassigned,Named accountable owner and explicit approval/evidence required,"Uncontrolled production, legal, operational, or user harm",Before launch,Gate review,Withhold launch,No +Production analytics approval,High,Not evaluated,Blocked pending evidence,No approved artifact supplied,See Phase 16 role matrix,Unassigned,Named accountable owner and explicit approval/evidence required,"Uncontrolled production, legal, operational, or user harm",Before launch,Gate review,Withhold launch,No +CRM and scheduler operational approval,High,Not evaluated,Blocked pending evidence,No approved artifact supplied,See Phase 16 role matrix,Unassigned,Named accountable owner and explicit approval/evidence required,"Uncontrolled production, legal, operational, or user harm",Before launch,Gate review,Withhold launch,No +Production infrastructure and credentials,High,Not evaluated,Blocked pending evidence,No approved artifact supplied,See Phase 16 role matrix,Unassigned,Named accountable owner and explicit approval/evidence required,"Uncontrolled production, legal, operational, or user harm",Before launch,Gate review,Withhold launch,No +Launch owner matrix,High,Not evaluated,Blocked pending evidence,No approved artifact supplied,See Phase 16 role matrix,Unassigned,Named accountable owner and explicit approval/evidence required,"Uncontrolled production, legal, operational, or user harm",Before launch,Gate review,Withhold launch,No +Launch authorization,High,Not evaluated,Blocked pending evidence,No approved artifact supplied,See Phase 16 role matrix,Unassigned,Named accountable owner and explicit approval/evidence required,"Uncontrolled production, legal, operational, or user harm",Before launch,Gate review,Withhold launch,No +Production deployment and live verification,High,Not evaluated,Blocked pending evidence,No approved artifact supplied,See Phase 16 role matrix,Unassigned,Named accountable owner and explicit approval/evidence required,"Uncontrolled production, legal, operational, or user harm",Before launch,Gate review,Withhold launch,No +Post-launch monitoring completion,High,Not evaluated,Blocked pending evidence,No approved artifact supplied,See Phase 16 role matrix,Unassigned,Named accountable owner and explicit approval/evidence required,"Uncontrolled production, legal, operational, or user harm",Before launch,Gate review,Withhold launch,No diff --git a/docs/phase16/FRENCH_APPROVAL_RECORD_v1.0.csv b/docs/phase16/FRENCH_APPROVAL_RECORD_v1.0.csv new file mode 100644 index 0000000..85edd86 --- /dev/null +++ b/docs/phase16/FRENCH_APPROVAL_RECORD_v1.0.csv @@ -0,0 +1,2 @@ +Scope,Artifact_version,Approver,Role,Decision,Date,Conditions,Expiration_or_review_date,Evidence +"French: Native French tone, grammar, terminology, and layout expansion",Phase 15 repository / Phase 16 review v1.0,Unassigned,French,Blocked pending evidence,2026-06-25,Explicit human approval and final governed artifact required,Before launch,No signed or explicitly recorded approval supplied diff --git a/docs/phase16/FROZEN_RELEASE_CANDIDATE_RECORD_v1.0.md b/docs/phase16/FROZEN_RELEASE_CANDIDATE_RECORD_v1.0.md new file mode 100644 index 0000000..5c361a5 --- /dev/null +++ b/docs/phase16/FROZEN_RELEASE_CANDIDATE_RECORD_v1.0.md @@ -0,0 +1,20 @@ +# Frozen Release-candidate Record + +## Decision + +**Blocked pending evidence. No approved release candidate was frozen.** + +- Source artifact: `RentalDriveGo_Phase15_Repository_v1.0.zip` +- Source archive SHA-256: `e3a0773b9783a551ef96e9ec8acc61ba53a4200e9be24509c260099522ac1d5b` +- Source Git commit: unavailable because the supplied archive contains no `.git` metadata +- Required runtime: Node 24.17.0 +- Available runtime: Node 22.16.0 +- Required package manager: pnpm 11.9.0 +- Available package manager: unavailable; Corepack download failed without registry access +- Production configuration version: unavailable +- Consent version: unavailable +- Policy version: unavailable +- Approved asset version: unavailable +- Approvers: unassigned + +The Phase 16 package manifest identifies the generated review artifact, but it is not a launch-approved production release candidate. diff --git a/docs/phase16/HOTFIX_RECORD_v1.0.csv b/docs/phase16/HOTFIX_RECORD_v1.0.csv new file mode 100644 index 0000000..5a2e619 --- /dev/null +++ b/docs/phase16/HOTFIX_RECORD_v1.0.csv @@ -0,0 +1,2 @@ +Hotfix_ID,Issue,Owner,Review,Tests,Release_identifier,Rollback_capability,Status +NONE,No deployment occurred,Not applicable,Not applicable,Not applicable,None,Not applicable,Not applicable diff --git a/docs/phase16/INCIDENT_RESPONSE_PLAN_v1.0.md b/docs/phase16/INCIDENT_RESPONSE_PLAN_v1.0.md new file mode 100644 index 0000000..c0b47b7 --- /dev/null +++ b/docs/phase16/INCIDENT_RESPONSE_PLAN_v1.0.md @@ -0,0 +1,11 @@ +# Incident-response Plan + +## Decision + +**Blocked pending evidence** + +Launch cannot proceed until named incident commander, technical lead, product lead, privacy/security/legal contacts, vendor contacts, communication channel, severity model, escalation path, and rollback authority are recorded. Current named owners are unassigned. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/phase16/LAUNCH_AUTHORIZATION_RECORD_v1.0.md b/docs/phase16/LAUNCH_AUTHORIZATION_RECORD_v1.0.md new file mode 100644 index 0000000..8f93853 --- /dev/null +++ b/docs/phase16/LAUNCH_AUTHORIZATION_RECORD_v1.0.md @@ -0,0 +1,23 @@ +# Launch Authorization Record + +## Decision + +**Rejected** + +- Decision time: 2026-06-25T23:56:10+00:00 +- Proposed release candidate: none approved +- Launch window: none approved +- Cumulative unresolved issues: Critical 1, High 21, Medium 17, Low 2 +- Accepted exceptions: 0 +- Launch owner: unassigned +- Rollback owner: unassigned +- Approvers: none supplied + +## Reasons + +1. Phase 15 explicitly recommends not ready for Phase 16 release freeze. +2. Exact runtime, frozen installation, dependency-backed tests, browser/AT/visual/performance evidence, production build, deployment rehearsal, and rollback rehearsal are incomplete. +3. Product, content, claims, customer evidence, legal, privacy, consent, analytics, localization, accessibility, security, CRM, scheduler, assets, infrastructure, credentials, and operational approvals are absent. +4. No production domain, hosting target, DNS, TLS endpoint, service destinations, monitoring, incident owners, or launch window exists in the supplied evidence. + +No deployment or DNS cutover is authorized. diff --git a/docs/phase16/LAUNCH_MONITORING_REPORT_v1.0.md b/docs/phase16/LAUNCH_MONITORING_REPORT_v1.0.md new file mode 100644 index 0000000..5a76d85 --- /dev/null +++ b/docs/phase16/LAUNCH_MONITORING_REPORT_v1.0.md @@ -0,0 +1,11 @@ +# Launch Monitoring Report + +## Decision + +**Blocked pending evidence** + +Not executed because deployment and public release did not occur. Availability, errors, submissions, CRM/scheduler/email behavior, consent, analytics, Core Web Vitals, locales, Arabic, security, and privacy metrics have no production data or named owners. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/phase16/LAUNCH_OWNER_MATRIX_v1.0.csv b/docs/phase16/LAUNCH_OWNER_MATRIX_v1.0.csv new file mode 100644 index 0000000..75ece58 --- /dev/null +++ b/docs/phase16/LAUNCH_OWNER_MATRIX_v1.0.csv @@ -0,0 +1,24 @@ +Role,Named_person,Status,Required_before_launch +Executive launch approval,Unassigned,Blocked pending evidence,Yes +Product approval,Unassigned,Blocked pending evidence,Yes +Engineering release,Unassigned,Blocked pending evidence,Yes +Frontend implementation,Unassigned,Blocked pending evidence,Yes +Infrastructure or hosting,Unassigned,Blocked pending evidence,Yes +DNS and domain management,Unassigned,Blocked pending evidence,Yes +Security,Unassigned,Blocked pending evidence,Yes +Privacy,Unassigned,Blocked pending evidence,Yes +Legal,Unassigned,Blocked pending evidence,Yes +Marketing content,Unassigned,Blocked pending evidence,Yes +Localization,Unassigned,Blocked pending evidence,Yes +Arabic language review,Unassigned,Blocked pending evidence,Yes +French language review,Unassigned,Blocked pending evidence,Yes +Accessibility,Unassigned,Blocked pending evidence,Yes +CRM operations,Unassigned,Blocked pending evidence,Yes +Scheduling operations,Unassigned,Blocked pending evidence,Yes +Analytics,Unassigned,Blocked pending evidence,Yes +Consent management,Unassigned,Blocked pending evidence,Yes +Sales operations,Unassigned,Blocked pending evidence,Yes +Customer support,Unassigned,Blocked pending evidence,Yes +Incident response,Unassigned,Blocked pending evidence,Yes +Rollback authority,Unassigned,Blocked pending evidence,Yes +Post-launch monitoring,Unassigned,Blocked pending evidence,Yes diff --git a/docs/phase16/LEGAL_APPROVAL_RECORD_v1.0.csv b/docs/phase16/LEGAL_APPROVAL_RECORD_v1.0.csv new file mode 100644 index 0000000..c65b893 --- /dev/null +++ b/docs/phase16/LEGAL_APPROVAL_RECORD_v1.0.csv @@ -0,0 +1,2 @@ +Scope,Artifact_version,Approver,Role,Decision,Date,Conditions,Expiration_or_review_date,Evidence +"Legal: Terms, legal entity details, disclosures, and legal links",Phase 15 repository / Phase 16 review v1.0,Unassigned,Legal,Blocked pending evidence,2026-06-25,Explicit human approval and final governed artifact required,Before launch,No signed or explicitly recorded approval supplied diff --git a/docs/phase16/LIVE_ACCESSIBILITY_SPOT_CHECK_REPORT_v1.0.md b/docs/phase16/LIVE_ACCESSIBILITY_SPOT_CHECK_REPORT_v1.0.md new file mode 100644 index 0000000..1b61f20 --- /dev/null +++ b/docs/phase16/LIVE_ACCESSIBILITY_SPOT_CHECK_REPORT_v1.0.md @@ -0,0 +1,11 @@ +# Live Accessibility Spot-check Report + +## Decision + +**Blocked pending evidence** + +Not executed because no live production endpoint exists. Repository-level accessibility controls and authored tests remain present, but browser, keyboard, screen-reader, zoom, reflow, forced-colors, reduced-motion, Arabic reading-order, and third-party checks remain blocked. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/phase16/LIVE_ANALYTICS_VALIDATION_REPORT_v1.0.md b/docs/phase16/LIVE_ANALYTICS_VALIDATION_REPORT_v1.0.md new file mode 100644 index 0000000..3cd7cab --- /dev/null +++ b/docs/phase16/LIVE_ANALYTICS_VALIDATION_REPORT_v1.0.md @@ -0,0 +1,11 @@ +# Live Analytics Validation Report + +## Decision + +**Blocked pending evidence** + +Not executed. No approved provider, production property, DPA, consent category, retention policy, region, or accountable owner was supplied. The current analytics sink is disabled and performs no network delivery. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/phase16/LIVE_CONSENT_VALIDATION_REPORT_v1.0.md b/docs/phase16/LIVE_CONSENT_VALIDATION_REPORT_v1.0.md new file mode 100644 index 0000000..79d4e65 --- /dev/null +++ b/docs/phase16/LIVE_CONSENT_VALIDATION_REPORT_v1.0.md @@ -0,0 +1,11 @@ +# Live Consent Validation Report + +## Decision + +**Blocked pending evidence** + +Not executed. No approved consent provider, production endpoint, legal text, consent version, categories, or withdrawal mechanism was supplied. Optional analytics remains disabled. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/phase16/LIVE_CRM_SCHEDULER_VALIDATION_REPORT_v1.0.md b/docs/phase16/LIVE_CRM_SCHEDULER_VALIDATION_REPORT_v1.0.md new file mode 100644 index 0000000..d94b0c5 --- /dev/null +++ b/docs/phase16/LIVE_CRM_SCHEDULER_VALIDATION_REPORT_v1.0.md @@ -0,0 +1,11 @@ +# Live CRM and Scheduler Validation Report + +## Decision + +**Blocked pending evidence** + +Not executed. CRM and scheduler vendors, accounts, credentials, endpoints, mappings, duplicate policies, meeting types, calendars, timezones, locale behavior, fallbacks, and owners are unapproved. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/phase16/LIVE_LOCALIZATION_RTL_REPORT_v1.0.md b/docs/phase16/LIVE_LOCALIZATION_RTL_REPORT_v1.0.md new file mode 100644 index 0000000..b737c3b --- /dev/null +++ b/docs/phase16/LIVE_LOCALIZATION_RTL_REPORT_v1.0.md @@ -0,0 +1,11 @@ +# Live Localization and RTL Report + +## Decision + +**Blocked pending evidence** + +Static locale parity, direction metadata, routes, and logical CSS checks passed. Native French and Arabic approval and live cache, form, error, consent, legal, scheduler, metadata, and mixed-direction checks were not executed. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/phase16/LIVE_PERFORMANCE_REPORT_v1.0.md b/docs/phase16/LIVE_PERFORMANCE_REPORT_v1.0.md new file mode 100644 index 0000000..bbe8930 --- /dev/null +++ b/docs/phase16/LIVE_PERFORMANCE_REPORT_v1.0.md @@ -0,0 +1,11 @@ +# Live Performance Report + +## Decision + +**Blocked pending evidence** + +Not executed. Dependencies and browsers could not be installed and no production endpoint or CDN was supplied. LCP, CLS, INP, response time, fonts, third parties, cache effectiveness, and submission latency remain unmeasured. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/phase16/LIVE_PRIVACY_REPORT_v1.0.md b/docs/phase16/LIVE_PRIVACY_REPORT_v1.0.md new file mode 100644 index 0000000..0b13947 --- /dev/null +++ b/docs/phase16/LIVE_PRIVACY_REPORT_v1.0.md @@ -0,0 +1,11 @@ +# Live Privacy Report + +## Decision + +**Blocked pending evidence** + +Static controls reject personal data in URLs, analytics, logs, and browser persistence. Production recipients, policies, consent gating, storage, environment separation, data requests, deletion, and runtime error reporting remain unverified. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/phase16/LIVE_SECURITY_REPORT_v1.0.md b/docs/phase16/LIVE_SECURITY_REPORT_v1.0.md new file mode 100644 index 0000000..6ede94b --- /dev/null +++ b/docs/phase16/LIVE_SECURITY_REPORT_v1.0.md @@ -0,0 +1,11 @@ +# Live Security Report + +## Decision + +**Blocked pending evidence** + +Static API, privacy, environment, and secret-scan controls passed. Production TLS, headers, CSP behavior, CORS, methods, errors, source maps, debug mode, staging endpoints, secrets, mixed content, and caching were not tested. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/phase16/LOCALIZATION_APPROVAL_RECORD_v1.0.csv b/docs/phase16/LOCALIZATION_APPROVAL_RECORD_v1.0.csv new file mode 100644 index 0000000..33306e7 --- /dev/null +++ b/docs/phase16/LOCALIZATION_APPROVAL_RECORD_v1.0.csv @@ -0,0 +1,2 @@ +Scope,Artifact_version,Approver,Role,Decision,Date,Conditions,Expiration_or_review_date,Evidence +"Localization: English, French, and Arabic visible copy, metadata, forms, and errors",Phase 15 repository / Phase 16 review v1.0,Unassigned,Localization,Blocked pending evidence,2026-06-25,Explicit human approval and final governed artifact required,Before launch,No signed or explicitly recorded approval supplied diff --git a/docs/phase16/OBSERVABILITY_CONFIGURATION_REPORT_v1.0.md b/docs/phase16/OBSERVABILITY_CONFIGURATION_REPORT_v1.0.md new file mode 100644 index 0000000..04a2186 --- /dev/null +++ b/docs/phase16/OBSERVABILITY_CONFIGURATION_REPORT_v1.0.md @@ -0,0 +1,11 @@ +# Observability Configuration Report + +## Decision + +**Blocked pending evidence** + +Blocked. No production log, metric, trace, error-monitoring, dashboard, alert route, threshold, recipient, retention, or redaction configuration was supplied. Static source controls prohibit raw personal data, but runtime observability has not been proven. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/phase16/OPERATIONAL_HANDOFF_v1.0.md b/docs/phase16/OPERATIONAL_HANDOFF_v1.0.md new file mode 100644 index 0000000..8b5669c --- /dev/null +++ b/docs/phase16/OPERATIONAL_HANDOFF_v1.0.md @@ -0,0 +1,11 @@ +# Operational Handoff + +## Decision + +**Blocked pending evidence** + +Not completed. Named owners for submissions, CRM, scheduler, analytics, consent, legal, localization, accessibility, security, hosting, DNS, content, customer evidence, incidents, hotfixes, and future releases are required before launch. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/phase16/PHASE_15_RECOMMENDATION_REVIEW_v1.0.md b/docs/phase16/PHASE_15_RECOMMENDATION_REVIEW_v1.0.md new file mode 100644 index 0000000..21ca43e --- /dev/null +++ b/docs/phase16/PHASE_15_RECOMMENDATION_REVIEW_v1.0.md @@ -0,0 +1,21 @@ +# Phase 15 Recommendation Review + +## Decision + +**Phase 15 recommendation upheld: Not ready for production launch.** + +The Phase 15 evidence reports 1 unresolved Critical, 21 unresolved High, 17 unresolved Medium, and 2 unresolved Low cumulative issues. The Phase 15 defect register has four resolved findings and one open High aggregate acceptance blocker, `P15-005`. + +## Verification performed in Phase 16 + +- Verified the supplied Phase 15 manifest before modification. +- Executed 18 dependency-free repository, contract, localization, route, RTL, content, integration, environment, security, privacy, metadata, and static-audit commands successfully. +- Confirmed zero static secret-scan findings in the final source tree at the time of review. +- Attempted to provision pnpm 11.9.0 through Corepack; the registry request failed because the environment has no package-registry access. +- Confirmed the available runtime is Node 22.16.0 rather than the required Node 24.17.0. + +## Result + +The engineering evidence gap is reduced but not closed. Dependency-backed tests, browsers, accessibility automation, visual baselines, performance measurement, production build, deployment rehearsal, rollback rehearsal, and human review remain unexecuted. Business, legal, operational, and infrastructure approvals remain absent. + +Input archive SHA-256: `e3a0773b9783a551ef96e9ec8acc61ba53a4200e9be24509c260099522ac1d5b`. diff --git a/docs/phase16/POST_LAUNCH_CONTENT_EVIDENCE_VERIFICATION_v1.0.md b/docs/phase16/POST_LAUNCH_CONTENT_EVIDENCE_VERIFICATION_v1.0.md new file mode 100644 index 0000000..8bb0d0f --- /dev/null +++ b/docs/phase16/POST_LAUNCH_CONTENT_EVIDENCE_VERIFICATION_v1.0.md @@ -0,0 +1,11 @@ +# Post-launch Content and Evidence Verification + +## Decision + +**Blocked pending evidence** + +Not executed because no live site was released. Public copy, claims, customer evidence, logos, legal text, destinations, and assets remain subject to approval. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/phase16/POST_LAUNCH_SEO_REPORT_v1.0.md b/docs/phase16/POST_LAUNCH_SEO_REPORT_v1.0.md new file mode 100644 index 0000000..a7fb858 --- /dev/null +++ b/docs/phase16/POST_LAUNCH_SEO_REPORT_v1.0.md @@ -0,0 +1,11 @@ +# Post-launch SEO Report + +## Decision + +**Blocked pending evidence** + +Not executed because no production domain was supplied or released. Repository metadata foundations passed static validation only. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/phase16/PRELAUNCH_PRODUCTION_VALIDATION_REPORT_v1.0.md b/docs/phase16/PRELAUNCH_PRODUCTION_VALIDATION_REPORT_v1.0.md new file mode 100644 index 0000000..38576dd --- /dev/null +++ b/docs/phase16/PRELAUNCH_PRODUCTION_VALIDATION_REPORT_v1.0.md @@ -0,0 +1,11 @@ +# Pre-launch Production Validation Report + +## Decision + +**Blocked pending evidence** + +Rejected. Correct production project, region, domain, secrets, feature flags, destinations, CRM, scheduler, analytics, consent, legal links, email sender, logging, alerts, caches, headers, access controls, and rollback target could not be verified. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/phase16/PRIVACY_APPROVAL_RECORD_v1.0.csv b/docs/phase16/PRIVACY_APPROVAL_RECORD_v1.0.csv new file mode 100644 index 0000000..877bc59 --- /dev/null +++ b/docs/phase16/PRIVACY_APPROVAL_RECORD_v1.0.csv @@ -0,0 +1,2 @@ +Scope,Artifact_version,Approver,Role,Decision,Date,Conditions,Expiration_or_review_date,Evidence +"Privacy: Privacy policy, recipients, retention, deletion, requests, and transfers",Phase 15 repository / Phase 16 review v1.0,Unassigned,Privacy,Blocked pending evidence,2026-06-25,Explicit human approval and final governed artifact required,Before launch,No signed or explicitly recorded approval supplied diff --git a/docs/phase16/PRODUCTION_ENVIRONMENT_VARIABLE_INVENTORY_v1.0.csv b/docs/phase16/PRODUCTION_ENVIRONMENT_VARIABLE_INVENTORY_v1.0.csv new file mode 100644 index 0000000..1bc9514 --- /dev/null +++ b/docs/phase16/PRODUCTION_ENVIRONMENT_VARIABLE_INVENTORY_v1.0.csv @@ -0,0 +1,9 @@ +Name,Purpose,Visibility,Secret_status,Required_or_optional,Production_value_owner,Production_value,Validation_rule,Rotation_policy,Missing_value_behavior,Related_feature_flag,Related_external_service,Exposure_risk,Status +SITE_ORIGIN,Canonical/allowed origin,server,No,Required when feature enabled,Infrastructure,Not supplied,absolute URL,domain change,existing production gate,See feature flag inventory,Demo/analytics as applicable,High if a server secret is later added; current inventory contains no secret values,Blocked pending production values +NEXT_PUBLIC_DEMO_ENABLED,Expose demo trigger,public,No,Required when feature enabled,Product + Engineering,Not supplied,boolean,n/a,production disabled,See feature flag inventory,Demo/analytics as applicable,High if a server secret is later added; current inventory contains no secret values,Blocked pending production values +DEMO_SUBMISSION_MODE,blocked/local adapter,server,No,Required when feature enabled,Engineering,Not supplied,enum,n/a,safe inferred default,See feature flag inventory,Demo/analytics as applicable,High if a server secret is later added; current inventory contains no secret values,Blocked pending production values +DEMO_REQUEST_TIMEOUT_MS,Bound adapter call,server,No,Optional with safe default,Engineering,Not supplied,250-15000 integer,n/a,4000,See feature flag inventory,Demo/analytics as applicable,High if a server secret is later added; current inventory contains no secret values,Blocked pending production values +DEMO_IDEMPOTENCY_TTL_SECONDS,Local coalescing TTL,server,No,Required when feature enabled,Engineering,Not supplied,60-86400 integer,n/a,900,See feature flag inventory,Demo/analytics as applicable,High if a server secret is later added; current inventory contains no secret values,Blocked pending production values +DEMO_TEST_SCENARIOS_ENABLED,Deterministic failures,server,No,Required when feature enabled,QA,Not supplied,boolean,n/a,disabled,See feature flag inventory,Demo/analytics as applicable,High if a server secret is later added; current inventory contains no secret values,Blocked pending production values +DEMO_LOCAL_TEST_MODE,Loopback production-like test escape,server,No,Required when feature enabled,QA + Engineering,Not supplied,boolean plus loopback SITE_ORIGIN,n/a,production local mode rejected,See feature flag inventory,Demo/analytics as applicable,High if a server secret is later added; current inventory contains no secret values,Blocked pending production values +NEXT_PUBLIC_ANALYTICS_MODE,disabled/test sink,public,No,Required when feature enabled,Analytics + Engineering,Not supplied,enum,n/a,disabled,See feature flag inventory,Demo/analytics as applicable,High if a server secret is later added; current inventory contains no secret values,Blocked pending production values diff --git a/docs/phase16/PRODUCTION_INFRASTRUCTURE_INVENTORY_v1.0.csv b/docs/phase16/PRODUCTION_INFRASTRUCTURE_INVENTORY_v1.0.csv new file mode 100644 index 0000000..059cf19 --- /dev/null +++ b/docs/phase16/PRODUCTION_INFRASTRUCTURE_INVENTORY_v1.0.csv @@ -0,0 +1,25 @@ +Component,Approved_value,Status,Accountable_role,Named_owner,Evidence,Release_impact +Hosting provider,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch +Hosting project/account,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch +Region,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch +Runtime,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch +Build environment,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch +Deployment target,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch +CDN,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch +Primary domain,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch +DNS provider,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch +TLS provider,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch +WAF/edge security,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch +Object storage,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch +Serverless/backend functions,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch +Log destination,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch +Error monitoring,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch +Analytics destination,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch +CRM destination,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch +Scheduler destination,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch +Email destination,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch +Consent provider,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch +Secret manager,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch +Backup mechanism,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch +Rollback mechanism,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch +Health-check endpoint,Not supplied,Blocked pending evidence,Infrastructure or relevant service owner,Unassigned,No production configuration supplied,Blocks launch diff --git a/docs/phase16/PRODUCTION_SMOKE_TEST_REPORT_v1.0.csv b/docs/phase16/PRODUCTION_SMOKE_TEST_REPORT_v1.0.csv new file mode 100644 index 0000000..e02205e --- /dev/null +++ b/docs/phase16/PRODUCTION_SMOKE_TEST_REPORT_v1.0.csv @@ -0,0 +1,33 @@ +Check,Status,Evidence,Reason,Release_impact +Primary domain loads,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +HTTPS,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +HTTP redirect,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +English homepage,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +French homepage,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Arabic homepage,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Light theme,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Dark theme,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +System theme,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Locale switch,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Theme switch,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Header navigation,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Mobile navigation,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Hero CTA,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Final CTA,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Demo form opens,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Form validation,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Consent controls,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Legal links,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Product tour,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Pricing destination,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Login destination,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Contact sales,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Analytics gating,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Client errors,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Images and fonts,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Arabic RTL,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Horizontal overflow,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Security headers,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Canonical and hreflang,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Robots behavior,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification +Observability health signal,Not executed,None,No authorized production deployment or endpoint,Blocks launch verification diff --git a/docs/phase16/ROLLBACK_DECISION_RECORD_v1.0.md b/docs/phase16/ROLLBACK_DECISION_RECORD_v1.0.md new file mode 100644 index 0000000..1ce5dba --- /dev/null +++ b/docs/phase16/ROLLBACK_DECISION_RECORD_v1.0.md @@ -0,0 +1,7 @@ +# Rollback Decision Record + +## Decision + +**Not applicable** + +No deployment or public release occurred. Rollback criteria were not entered. The correct control was to reject launch before production mutation. diff --git a/docs/phase16/ROLLBACK_PLAN_v1.0.md b/docs/phase16/ROLLBACK_PLAN_v1.0.md new file mode 100644 index 0000000..33ede69 --- /dev/null +++ b/docs/phase16/ROLLBACK_PLAN_v1.0.md @@ -0,0 +1,11 @@ +# Rollback Plan + +## Decision + +**Blocked pending evidence** + +The prior Phase 15 rollback evidence remains a plan, not an executed rehearsal on an approved production-like target. No hosting platform, prior release identifier, rollback command, DNS fallback, data-reconciliation process, or rollback authority was supplied. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/phase16/SCHEDULER_OPERATIONAL_APPROVAL_v1.0.csv b/docs/phase16/SCHEDULER_OPERATIONAL_APPROVAL_v1.0.csv new file mode 100644 index 0000000..4bba8cd --- /dev/null +++ b/docs/phase16/SCHEDULER_OPERATIONAL_APPROVAL_v1.0.csv @@ -0,0 +1,2 @@ +Scope,Artifact_version,Approver,Role,Decision,Date,Conditions,Expiration_or_review_date,Evidence +"Scheduling operations: Production account, meeting type, calendar, timezone, locale, and fallback",Phase 15 repository / Phase 16 review v1.0,Unassigned,Scheduling operations,Blocked pending evidence,2026-06-25,Explicit human approval and final governed artifact required,Before launch,No signed or explicitly recorded approval supplied diff --git a/docs/phase16/SEARCH_ENGINE_CONFIGURATION_REPORT_v1.0.md b/docs/phase16/SEARCH_ENGINE_CONFIGURATION_REPORT_v1.0.md new file mode 100644 index 0000000..e953db4 --- /dev/null +++ b/docs/phase16/SEARCH_ENGINE_CONFIGURATION_REPORT_v1.0.md @@ -0,0 +1,11 @@ +# Search-engine Configuration Report + +## Decision + +**Blocked pending evidence** + +Static metadata, canonical, hreflang, and robots foundations passed repository validation. Production indexability, sitemap responses, redirects, status codes, structured data, social previews, and staging isolation remain unverified without a live domain. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/phase16/SECRET_PROVISIONING_RECORD_v1.0.csv b/docs/phase16/SECRET_PROVISIONING_RECORD_v1.0.csv new file mode 100644 index 0000000..cbf4e9c --- /dev/null +++ b/docs/phase16/SECRET_PROVISIONING_RECORD_v1.0.csv @@ -0,0 +1,11 @@ +Credential,Value_recorded,Environment,Least_privilege_verified,Scopes_verified,Rotation_owner,Expiration,Audit_logging,Revocation_path,Backup_owner,Client_bundle_check,Decision,Evidence +CRM credential,No,Production,No,No,Unassigned,Unknown,Unknown,Unknown,Unassigned,Static source scan passed; no production credentials exist to inspect,Blocked pending evidence,No credential supplied; no secret value stored in repository +Scheduler credential,No,Production,No,No,Unassigned,Unknown,Unknown,Unknown,Unassigned,Static source scan passed; no production credentials exist to inspect,Blocked pending evidence,No credential supplied; no secret value stored in repository +Email provider credential,No,Production,No,No,Unassigned,Unknown,Unknown,Unknown,Unassigned,Static source scan passed; no production credentials exist to inspect,Blocked pending evidence,No credential supplied; no secret value stored in repository +Analytics credential or property identifier,No,Production,No,No,Unassigned,Unknown,Unknown,Unknown,Unassigned,Static source scan passed; no production credentials exist to inspect,Blocked pending evidence,No credential supplied; no secret value stored in repository +Consent provider credential,No,Production,No,No,Unassigned,Unknown,Unknown,Unknown,Unassigned,Static source scan passed; no production credentials exist to inspect,Blocked pending evidence,No credential supplied; no secret value stored in repository +Hosting/deployment credential,No,Production,No,No,Unassigned,Unknown,Unknown,Unknown,Unassigned,Static source scan passed; no production credentials exist to inspect,Blocked pending evidence,No credential supplied; no secret value stored in repository +DNS credential,No,Production,No,No,Unassigned,Unknown,Unknown,Unknown,Unassigned,Static source scan passed; no production credentials exist to inspect,Blocked pending evidence,No credential supplied; no secret value stored in repository +TLS/edge credential,No,Production,No,No,Unassigned,Unknown,Unknown,Unknown,Unassigned,Static source scan passed; no production credentials exist to inspect,Blocked pending evidence,No credential supplied; no secret value stored in repository +Error-monitoring credential,No,Production,No,No,Unassigned,Unknown,Unknown,Unknown,Unassigned,Static source scan passed; no production credentials exist to inspect,Blocked pending evidence,No credential supplied; no secret value stored in repository +Secret manager access,No,Production,No,No,Unassigned,Unknown,Unknown,Unknown,Unassigned,Static source scan passed; no production credentials exist to inspect,Blocked pending evidence,No credential supplied; no secret value stored in repository diff --git a/docs/phase16/SECURITY_APPROVAL_RECORD_v1.0.csv b/docs/phase16/SECURITY_APPROVAL_RECORD_v1.0.csv new file mode 100644 index 0000000..3715be5 --- /dev/null +++ b/docs/phase16/SECURITY_APPROVAL_RECORD_v1.0.csv @@ -0,0 +1,2 @@ +Scope,Artifact_version,Approver,Role,Decision,Date,Conditions,Expiration_or_review_date,Evidence +"Security: Dependency, runtime, headers, secrets, production, and incident controls",Phase 15 repository / Phase 16 review v1.0,Unassigned,Security,Blocked pending evidence,2026-06-25,Explicit human approval and final governed artifact required,Before launch,No signed or explicitly recorded approval supplied diff --git a/docs/phase16/SECURITY_HEADER_VALIDATION_REPORT_v1.0.md b/docs/phase16/SECURITY_HEADER_VALIDATION_REPORT_v1.0.md new file mode 100644 index 0000000..2cd5412 --- /dev/null +++ b/docs/phase16/SECURITY_HEADER_VALIDATION_REPORT_v1.0.md @@ -0,0 +1,11 @@ +# Security Header Validation Report + +## Decision + +**Blocked pending evidence** + +Static source controls for CSP and related headers passed. Real production responses were not available, so CSP, Referrer-Policy, Permissions-Policy, framing controls, HSTS, CORS, cache headers, and error-page headers remain unverified. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/phase16/TARGETED_REGRESSION_REPORT_v1.0.md b/docs/phase16/TARGETED_REGRESSION_REPORT_v1.0.md new file mode 100644 index 0000000..d864632 --- /dev/null +++ b/docs/phase16/TARGETED_REGRESSION_REPORT_v1.0.md @@ -0,0 +1,13 @@ +# Targeted Regression Report + +## Executed + +18 dependency-free commands passed. They covered package integrity, immutable contracts, exact dependencies declared in the lockfile, locale parity, routes, semantic tokens, logical CSS, prohibited content, metadata, components, homepage composition, integrations, environment defaults, API security controls, privacy controls, Phase 15 readiness checks, syntax, and static repository/secret scanning. + +## Blocked + +Frozen dependency installation, formatting, linting, strict type checking, unit tests, integration tests, production build, dependency/license audit, Playwright browser tests, axe tests, visual regression, performance measurement, deployment rehearsal, rollback rehearsal, manual assistive-technology review, native linguistic review, and all production validation. + +## Conclusion + +Static regressions were not found. Executable and human regression remains incomplete, so `P15-005` stays open and launch remains blocked. diff --git a/docs/phase16/TLS_VALIDATION_REPORT_v1.0.md b/docs/phase16/TLS_VALIDATION_REPORT_v1.0.md new file mode 100644 index 0000000..75e7bef --- /dev/null +++ b/docs/phase16/TLS_VALIDATION_REPORT_v1.0.md @@ -0,0 +1,11 @@ +# TLS Validation Report + +## Decision + +**Blocked pending evidence** + +Not executed. No production hostname or endpoint exists in the supplied evidence. Certificate issuer, hostname coverage, chain, validity, renewal, HTTPS redirect, HSTS, and mixed-content checks remain blocked. + +## Release impact + +Launch remains withheld. No exception is accepted. diff --git a/docs/quality/PHASE_14_COMMAND_LOG_v1.0.txt b/docs/quality/PHASE_14_COMMAND_LOG_v1.0.txt new file mode 100644 index 0000000..385a3d4 --- /dev/null +++ b/docs/quality/PHASE_14_COMMAND_LOG_v1.0.txt @@ -0,0 +1,43 @@ +Phase 14 command summary +Date: 2026-06-25 +Observed runtime: Node 22.16.0 +Authoritative runtime still required: Node 24.17.0 / pnpm 11.9.0 + +1. npm install --offline --engine-strict=false --ignore-scripts --no-audit --no-fund + Exit: 0. Fallback execution only; does not replace frozen pnpm release gate. +2. npm run validate + Exit: 0. Phase 9-14 static validators passed. +3. npm run format:check + Exit: 0. +4. npm run lint + Exit: 0, zero warnings. +5. npm run typecheck + Exit: 0 after deterministic Next route-type generation and stale development-type cleanup. +6. npm run test:unit + Exit: 0. 13 files, 39 tests. Coverage: statements 92.4%, branches 86.04%, functions 95.45%, lines 92.64%. +7. npm run test:integration + Exit: 0. 1 file, 4 tests. +8. npm run test:security + Exit: 0. +9. npm run test:privacy + Exit: 0. +10. SITE_ORIGIN=http://127.0.0.1:3000 PUBLIC_RELEASE_APPROVED=false npm run build + Exit: 0. Optimized build and standalone preparation completed in 29 seconds. +11. Standalone HTTP smoke + GET /en: 200. GET /api/demo: 405. Valid production POST /api/demo: 503 lead_destination_not_approved. +12. npm audit --offline --audit-level=low + Exit: 0. Zero reported vulnerabilities in the available npm lock/cache. +13. High-confidence source secret-pattern scan + Exit: 0. No matches. +14. Playwright Chromium Phase 14 browser workflow + Exit: 1, environment-blocked. Five scenarios rejected before application response by net::ERR_BLOCKED_BY_ADMINISTRATOR. +15. Playwright Chromium Phase 14 axe workflow + Exit: 1, environment-blocked. Three scenarios rejected by the same policy. +16. Playwright Chromium Phase 14 visual workflow + Exit: 1, environment-blocked. Five scenarios rejected by the same policy; no baseline approved. +17. npm run manifest:generate + Exit: 0. Final manifest generated for the assembled repository. +18. npm run validate:package + Exit: 0. Manifest verified with no missing, changed, unsafe, duplicate, or extra files. + +Detailed stdout, exit codes, and durations are under docs/quality/logs/phase14/. diff --git a/docs/quality/PHASE_14_FILE_CHANGES_v1.0.txt b/docs/quality/PHASE_14_FILE_CHANGES_v1.0.txt new file mode 100644 index 0000000..605a7a2 --- /dev/null +++ b/docs/quality/PHASE_14_FILE_CHANGES_v1.0.txt @@ -0,0 +1,137 @@ +Phase 14 file changes relative to the delivered Phase 13 repository +Generated: 2026-06-25 + +ADDED (107) +docs/DECISION_LOG_v14.0.md +docs/IMPLEMENTATION_ISSUE_REGISTER_v1.4.csv +docs/PHASE_14_IMPLEMENTATION_REPORT_v1.0.md +docs/PHASE_15_HANDOFF_v1.0.md +docs/phase14/ANALYTICS_EVENT_REGISTRY_v1.0.csv +docs/phase14/COMPONENT_VARIANT_UPDATE_v1.0.md +docs/phase14/CONSENT_MATRIX_v1.0.csv +docs/phase14/DATA_FLOW_INVENTORY_v1.0.csv +docs/phase14/DEMO_FORM_CONTRACT_v1.0.md +docs/phase14/DESTINATION_REGISTRY_v1.0.csv +docs/phase14/ENVIRONMENT_VARIABLE_INVENTORY_v1.0.csv +docs/phase14/EXTERNAL_SERVICE_INVENTORY_v1.0.csv +docs/phase14/FEATURE_FLAG_INVENTORY_v1.0.csv +docs/phase14/INTEGRATION_ARCHITECTURE_v1.0.md +docs/phase14/INTEGRATION_TRACEABILITY_MATRIX_v1.0.csv +docs/phase14/PERFORMANCE_AND_BUNDLE_REPORT_v1.0.md +docs/phase14/PRIVACY_REVIEW_REPORT_v1.0.md +docs/phase14/RELEASE_GATE_MATRIX_v1.0.csv +docs/phase14/SECURITY_REVIEW_REPORT_v1.0.md +docs/phase14/SUCCESS_FAILURE_STATE_INVENTORY_v1.0.csv +docs/quality/PHASE_14_COMMAND_LOG_v1.0.txt +docs/quality/PHASE_14_FILE_CHANGES_v1.0.txt +docs/quality/PHASE_14_HTTP_ROUTE_RESULTS_v1.0.json +docs/quality/PHASE_14_MANUAL_QA_RESULTS_v1.0.csv +docs/quality/PHASE_14_VALIDATION_RESULTS_v1.0.json +docs/quality/PHASE_14_VALIDATION_RESULTS_v1.0.md +docs/quality/PHASE_14_VISUAL_REGRESSION_RESULTS_v1.0.json +docs/quality/logs/phase14/a11y-integration-chromium.log +docs/quality/logs/phase14/browser-integration-chromium.log +docs/quality/logs/phase14/bundle-inventory.log +docs/quality/logs/phase14/dependency-audit.log +docs/quality/logs/phase14/format-check-initial.duration +docs/quality/logs/phase14/format-check-initial.exit +docs/quality/logs/phase14/format-check-initial.log +docs/quality/logs/phase14/format-check.duration +docs/quality/logs/phase14/format-check.exit +docs/quality/logs/phase14/format-check.log +docs/quality/logs/phase14/format-write.exit +docs/quality/logs/phase14/format-write.log +docs/quality/logs/phase14/integration-tests.log +docs/quality/logs/phase14/lint-initial.duration +docs/quality/logs/phase14/lint-initial.exit +docs/quality/logs/phase14/lint-initial.log +docs/quality/logs/phase14/lint.duration +docs/quality/logs/phase14/lint.exit +docs/quality/logs/phase14/lint.log +docs/quality/logs/phase14/next-typegen.exit +docs/quality/logs/phase14/next-typegen.log +docs/quality/logs/phase14/npm-install-baseline.exit +docs/quality/logs/phase14/npm-install-baseline.log +docs/quality/logs/phase14/npm-install-fallback.log +docs/quality/logs/phase14/npm-install-offline.duration +docs/quality/logs/phase14/npm-install-offline.exit +docs/quality/logs/phase14/npm-install-offline.log +docs/quality/logs/phase14/phase14-environment.log +docs/quality/logs/phase14/phase14-integrations.log +docs/quality/logs/phase14/phase14-privacy.log +docs/quality/logs/phase14/phase14-security.log +docs/quality/logs/phase14/playwright-inventory.log +docs/quality/logs/phase14/production-build.log +docs/quality/logs/phase14/secret-scan.log +docs/quality/logs/phase14/static-validations.duration +docs/quality/logs/phase14/static-validations.exit +docs/quality/logs/phase14/static-validations.log +docs/quality/logs/phase14/typecheck-initial.duration +docs/quality/logs/phase14/typecheck-initial.exit +docs/quality/logs/phase14/typecheck-initial.log +docs/quality/logs/phase14/typecheck.duration +docs/quality/logs/phase14/typecheck.exit +docs/quality/logs/phase14/typecheck.log +docs/quality/logs/phase14/unit-initial.log +docs/quality/logs/phase14/unit-tests-coverage.log +docs/quality/logs/phase14/unit.log +docs/quality/logs/phase14/visual-integration-chromium.log +scripts/generate-phase14-manifest.mjs +scripts/prepare-typecheck.mjs +scripts/validate-phase14-environment.mjs +scripts/validate-phase14-integrations.mjs +scripts/validate-phase14-manifest.mjs +scripts/validate-phase14-privacy.mjs +scripts/validate-phase14-security.mjs +src/app/api/demo/route.ts +src/components/integrations/DemoDialogHost.module.css +src/components/integrations/DemoDialogHost.tsx +src/components/integrations/DemoTrigger.tsx +src/lib/analytics/client.ts +src/lib/analytics/events.ts +src/lib/demo/adapters/blocked.ts +src/lib/demo/adapters/index.ts +src/lib/demo/adapters/local.ts +src/lib/demo/adapters/types.ts +src/lib/demo/idempotency.ts +src/lib/demo/redaction.ts +src/lib/demo/schema.ts +src/lib/demo/service.ts +src/lib/integrations/destinations.ts +src/lib/integrations/environment.ts +src/lib/integrations/feature-flags.ts +tests/a11y/integrations/demo-workflow.a11y.spec.ts +tests/browser/integrations/demo-workflow.spec.ts +tests/integration/demo-service.test.ts +tests/unit/integrations/analytics.test.ts +tests/unit/integrations/demo-schema.test.ts +tests/unit/integrations/destinations.test.ts +tests/unit/integrations/redaction.test.ts +tests/visual/integrations.visual.spec.ts +vitest.integration.config.ts + +CHANGED (21) +.env.example +CONTRIBUTING.md +README.md +package.json +playwright.config.ts +scripts/run-checks.mjs +scripts/run-validations.mjs +src/app/[locale]/layout.tsx +src/app/[locale]/page.tsx +src/components/app-shell/MobileNavigation.tsx +src/components/app-shell/SiteFooter.tsx +src/components/app-shell/SiteHeader.module.css +src/components/app-shell/SiteHeader.tsx +src/components/forms/FormField.tsx +src/components/forms/TextInput.tsx +src/components/marketing/CTA.tsx +src/content/locales/ar/homepage.json +src/content/locales/en/homepage.json +src/content/locales/fr/homepage.json +tests/browser/homepage.spec.ts +tsconfig.json + +DELETED (0) +(none) diff --git a/docs/quality/PHASE_14_HTTP_ROUTE_RESULTS_v1.0.json b/docs/quality/PHASE_14_HTTP_ROUTE_RESULTS_v1.0.json new file mode 100644 index 0000000..fee0cc3 --- /dev/null +++ b/docs/quality/PHASE_14_HTTP_ROUTE_RESULTS_v1.0.json @@ -0,0 +1,32 @@ +{ + "date": "2026-06-25", + "environment": { + "node": "22.16.0", + "package_execution": "npm fallback", + "server": "Next.js standalone production server", + "origin": "http://127.0.0.1:3000" + }, + "checks": [ + { + "method": "GET", + "path": "/en", + "status": 200, + "result": "pass", + "evidence": "Localized title and security headers returned" + }, + { + "method": "GET", + "path": "/api/demo", + "status": 405, + "result": "pass", + "evidence": "Unsupported method rejected" + }, + { + "method": "POST", + "path": "/api/demo", + "status": 503, + "result": "pass", + "evidence": "Structurally valid fictional request failed closed with lead_destination_not_approved" + } + ] +} diff --git a/docs/quality/PHASE_14_MANUAL_QA_RESULTS_v1.0.csv b/docs/quality/PHASE_14_MANUAL_QA_RESULTS_v1.0.csv new file mode 100644 index 0000000..4913491 --- /dev/null +++ b/docs/quality/PHASE_14_MANUAL_QA_RESULTS_v1.0.csv @@ -0,0 +1,11 @@ +id,area,environment,locale,theme,viewport,input_or_assistive_technology,expected,status,evidence,issue +P14-M01,Hero demo CTA,Unblocked pinned browser,en,light,1440x900,Keyboard,Dialog opens and focus enters title or first field,Not run,Requires human browser observation,P14-008 +P14-M02,Header and final CTA,Unblocked pinned browser,fr,dark,1024x768,Keyboard and pointer,All sources open the same localized workflow,Not run,Requires human browser observation,P14-008 +P14-M03,Arabic form order,Unblocked pinned browser,ar,light,390x844,Screen reader and touch,Logical RTL order and mixed-direction values remain readable,Not run,Requires Arabic AT observation,P14-008 +P14-M04,Validation summary,Unblocked pinned browser,en,system,768x1024,Keyboard and screen reader,Summary is announced and errors are connected to controls,Not run,Requires human AT observation,P14-008 +P14-M05,Zoom and reflow,Unblocked pinned browser,fr,light,320 CSS px equivalent,200 and 400 percent zoom,No page horizontal overflow and actions remain operable,Not run,Requires manual zoom review,P14-008 +P14-M06,Forced colors and reduced motion,Unblocked pinned browser,en,dark,1440x900,Windows forced colors and reduced motion,Focus and statuses remain perceivable,Not run,Requires platform review,P14-008 +P14-M07,Timeout and retry,Production-like test adapter,en,light,390x844,Slow network simulation,Retryable failure preserves input and retry is bounded,Not run,Requires browser network control,P14-008 +P14-M08,Offline transition,Production-like test adapter,ar,dark,390x844,Offline simulation,Failure is localized and no false success appears,Not run,Requires browser network control,P14-008 +P14-M09,Success refresh and back,Production-like test adapter,en,light,1440x900,Browser history,No accidental duplicate request or personal data in URL,Not run,Requires browser history observation,P14-008 +P14-M10,Production blocked state,Standalone server,en,light,n/a,Command-line HTTP,Valid request is rejected until destination approval,Pass,HTTP 503 with lead_destination_not_approved in production smoke test,none diff --git a/docs/quality/PHASE_14_VALIDATION_RESULTS_v1.0.json b/docs/quality/PHASE_14_VALIDATION_RESULTS_v1.0.json new file mode 100644 index 0000000..8670bc7 --- /dev/null +++ b/docs/quality/PHASE_14_VALIDATION_RESULTS_v1.0.json @@ -0,0 +1,139 @@ +{ + "date": "2026-06-25", + "runtime": { + "observed_node": "22.16.0", + "required_node": "24.17.0", + "observed_package_path": "npm offline fallback", + "required_package_manager": "pnpm 11.9.0" + }, + "results": [ + { + "name": "Phase 9-14 static validation", + "status": "pass", + "evidence": "docs/quality/logs/phase14/static-validations.log" + }, + { + "name": "Formatting", + "status": "pass", + "exit_code": 0, + "evidence": "docs/quality/logs/phase14/format-check.log" + }, + { + "name": "Lint", + "status": "pass", + "exit_code": 0, + "evidence": "docs/quality/logs/phase14/lint.log" + }, + { + "name": "Strict TypeScript", + "status": "pass", + "exit_code": 0, + "evidence": "docs/quality/logs/phase14/typecheck.log" + }, + { + "name": "Unit tests", + "status": "pass", + "files": 13, + "passed": 39, + "failed": 0, + "coverage": { + "statements": 92.4, + "branches": 86.04, + "functions": 95.45, + "lines": 92.64 + }, + "evidence": "docs/quality/logs/phase14/unit-tests-coverage.log" + }, + { + "name": "Integration tests", + "status": "pass", + "files": 1, + "passed": 4, + "failed": 0, + "evidence": "docs/quality/logs/phase14/integration-tests.log" + }, + { + "name": "Security static tests", + "status": "pass", + "evidence": "docs/quality/logs/phase14/phase14-security.log" + }, + { + "name": "Privacy static tests", + "status": "pass", + "evidence": "docs/quality/logs/phase14/phase14-privacy.log" + }, + { + "name": "Environment validation", + "status": "pass", + "evidence": "docs/quality/logs/phase14/phase14-environment.log" + }, + { + "name": "Integration structure validation", + "status": "pass", + "evidence": "docs/quality/logs/phase14/phase14-integrations.log" + }, + { + "name": "Production build", + "status": "pass", + "exit_code": 0, + "duration_seconds": 29, + "evidence": "docs/quality/logs/phase14/production-build.log" + }, + { + "name": "Standalone HTTP smoke", + "status": "pass", + "evidence": "docs/quality/PHASE_14_HTTP_ROUTE_RESULTS_v1.0.json" + }, + { + "name": "Dependency audit", + "status": "pass", + "vulnerabilities": 0, + "note": "npm offline fallback; frozen pnpm audit still required", + "evidence": "docs/quality/logs/phase14/dependency-audit.log" + }, + { + "name": "Secret scan", + "status": "pass", + "evidence": "docs/quality/logs/phase14/secret-scan.log" + }, + { + "name": "Browser integration", + "status": "environment-blocked", + "attempted": 5, + "passed": 0, + "reason": "net::ERR_BLOCKED_BY_ADMINISTRATOR", + "evidence": "docs/quality/logs/phase14/browser-integration-chromium.log" + }, + { + "name": "Accessibility browser", + "status": "environment-blocked", + "attempted": 3, + "passed": 0, + "reason": "net::ERR_BLOCKED_BY_ADMINISTRATOR", + "evidence": "docs/quality/logs/phase14/a11y-integration-chromium.log" + }, + { + "name": "Visual regression", + "status": "environment-blocked", + "attempted": 5, + "passed": 0, + "reason": "net::ERR_BLOCKED_BY_ADMINISTRATOR", + "evidence": "docs/quality/logs/phase14/visual-integration-chromium.log" + }, + { + "name": "Manual QA", + "status": "not-run", + "evidence": "docs/quality/PHASE_14_MANUAL_QA_RESULTS_v1.0.csv" + }, + { + "name": "Pinned runtime and frozen install", + "status": "environment-blocked", + "issue": "P14-009" + }, + { + "name": "Package manifest", + "status": "pass", + "evidence": "PHASE_14_PACKAGE_MANIFEST_v1.0.json" + } + ] +} diff --git a/docs/quality/PHASE_14_VALIDATION_RESULTS_v1.0.md b/docs/quality/PHASE_14_VALIDATION_RESULTS_v1.0.md new file mode 100644 index 0000000..564a5bb --- /dev/null +++ b/docs/quality/PHASE_14_VALIDATION_RESULTS_v1.0.md @@ -0,0 +1,27 @@ +# Phase 14 Validation Results + +Date: 2026-06-25 + +## Passed in the available environment + +- Phase 9 through Phase 14 static validators. +- Prettier and ESLint with zero warnings. +- Strict TypeScript after deterministic Next route-type generation. +- 39 unit tests across 13 files with 92.4% statement, 86.04% branch, 95.45% function, and 92.64% line coverage. +- Four integration tests covering success, normalized failure, timeout, and idempotency coalescing. +- Phase 14 security, privacy, environment, destination, form, and analytics validators. +- Optimized Next.js production build and standalone preparation. +- Direct HTTP 200 for `/en`, 405 for unsupported API GET, and fail-closed 503 for a valid production demo POST without an approved destination. +- Offline npm dependency audit with zero reported vulnerabilities. +- High-confidence source secret-pattern scan. +- Phase 14 package manifest generation and verification. + +## Environment-blocked or not run + +- Browser workflow: five scenarios attempted, all blocked before application response by system Chromium `net::ERR_BLOCKED_BY_ADMINISTRATOR`. +- Axe accessibility: three locale scenarios attempted, same browser policy block. +- Visual regression: five scenarios attempted, same browser policy block; no product baseline accepted. +- Manual keyboard, touch, screen-reader, zoom, reduced-motion, forced-colors, theme, locale, viewport, slow-network, offline, and history review. +- Exact Node 24.17.0 and pnpm 11.9.0 frozen installation and audit. + +These constraints remain release gates. An authored test is not an observed pass merely because the code looks emotionally prepared for success. diff --git a/docs/quality/PHASE_14_VISUAL_REGRESSION_RESULTS_v1.0.json b/docs/quality/PHASE_14_VISUAL_REGRESSION_RESULTS_v1.0.json new file mode 100644 index 0000000..2f6c08d --- /dev/null +++ b/docs/quality/PHASE_14_VISUAL_REGRESSION_RESULTS_v1.0.json @@ -0,0 +1,12 @@ +{ + "date": "2026-06-25", + "status": "environment-blocked", + "browser": "system Chromium", + "reason": "net::ERR_BLOCKED_BY_ADMINISTRATOR on loopback navigation before application response", + "authored_scenarios": 5, + "executed_scenarios": 5, + "product_baselines_approved": 0, + "notes": "Failure screenshots represent the administrative block page and must not be accepted as product baselines.", + "evidence": "docs/quality/logs/phase14/visual-integration-chromium.log", + "issue": "P14-008" +} diff --git a/docs/quality/PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.json b/docs/quality/PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.json new file mode 100644 index 0000000..a91ae2b --- /dev/null +++ b/docs/quality/PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.json @@ -0,0 +1,199 @@ +{ + "audit": "Phase 15 dependency-free static repository audit", + "finding_counts": { + "High": 4, + "Medium": 7 + }, + "findings": [ + { + "code": "ci_integration_suite_omitted", + "message": "CI does not execute the demo-service integration suite.", + "path": ".github/workflows/ci.yml", + "severity": "High" + }, + { + "code": "issue_register_overflow", + "message": "One or more issue-register rows contain overflow columns.", + "path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.4.csv", + "severity": "High" + }, + { + "code": "malformed_csv", + "line": 43, + "message": "Expected 9 columns, found 11.", + "path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.4.csv", + "severity": "High" + }, + { + "code": "malformed_csv", + "line": 11, + "message": "Expected 11 columns, found 10.", + "path": "docs/quality/PHASE_14_MANUAL_QA_RESULTS_v1.0.csv", + "severity": "High" + }, + { + "code": "loose_content_type_match", + "message": "JSON API still uses a prefix media-type check.", + "path": "src/", + "severity": "Medium" + }, + { + "code": "content_type_helper_not_used", + "message": "Demo API does not use exact JSON media-type validation.", + "path": "src/app/api/demo/route.ts", + "severity": "Medium" + }, + { + "code": "missing_exact_content_type_control", + "message": "Exact application/json media-type helper is absent.", + "path": "src/lib/security/content-type.ts", + "severity": "Medium" + }, + { + "code": "stale_theme_storage_key", + "message": "Visual test writes a storage key the application never reads.", + "path": "tests/visual/component-system.visual.spec.ts", + "severity": "Medium" + }, + { + "code": "theme_storage_key_missing", + "message": "Visual test does not use the canonical theme storage key.", + "path": "tests/visual/component-system.visual.spec.ts", + "severity": "Medium" + }, + { + "code": "visual_project_scope", + "message": "Canonical snapshot test is not restricted to Chromium.", + "path": "tests/visual/component-system.visual.spec.ts", + "severity": "Medium" + }, + { + "code": "visual_project_scope", + "message": "Canonical integration snapshots are not restricted to Chromium.", + "path": "tests/visual/integrations.visual.spec.ts", + "severity": "Medium" + } + ], + "metrics": { + "csv_files_parsed": 44, + "direct_dependencies_exact": true, + "direct_dependency_count": 25, + "email_fixture_hits": [ + { + "address": "avery@example.test", + "line": 21, + "path": "tests/integration/demo-service.test.ts" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 6, + "path": "tests/unit/integrations/demo-schema.test.ts" + }, + { + "address": "ada@example.test", + "line": 22, + "path": "tests/unit/integrations/demo-schema.test.ts" + }, + { + "address": "person@example.test", + "line": 20, + "path": "tests/unit/integrations/analytics.test.ts" + }, + { + "address": "person@example.test", + "line": 9, + "path": "tests/unit/integrations/redaction.test.ts" + }, + { + "address": "avery@example.test", + "line": 36, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "avery@example.test", + "line": 53, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "private@example.test", + "line": 66, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "name@fictional.invalid", + "line": 47, + "path": "src/content/development/component-lab.ts" + }, + { + "address": "nom@fictif.invalid", + "line": 158, + "path": "src/content/development/component-lab.ts" + }, + { + "address": "name@fictional.invalid", + "line": 281, + "path": "src/content/development/component-lab.ts" + } + ], + "file_count": 467, + "issue_register_path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.4.csv", + "issue_register_rows": 42, + "json_files_parsed": 41, + "release_gate_path": "docs/phase14/RELEASE_GATE_MATRIX_v1.0.csv", + "release_gate_status_counts": { + "Blocked": 4, + "Blocked by validator": 1, + "Environment blocked": 2, + "Open": 1, + "Partial": 2 + }, + "runtime_url_hits": [ + { + "line": 2, + "path": ".env.example", + "url": "https://your-approved-domain.example" + }, + { + "line": 6, + "path": "src/lib/localization/site-origin.ts", + "url": "http://localhost:3000" + }, + { + "line": 2, + "path": "src/contracts/phase9/design-tokens.json", + "url": "https://design-tokens.github.io/community-group/format/" + } + ], + "secret_scan_files": 378, + "suffix_counts": { + ".css": 48, + ".csv": 44, + ".duration": 8, + ".example": 1, + ".exit": 20, + ".js": 1, + ".json": 41, + ".log": 45, + ".md": 57, + ".mjs": 33, + ".png": 6, + ".svg": 2, + ".ts": 74, + ".tsx": 66, + ".txt": 8, + ".yaml": 2, + ".yml": 2, + "": 9 + }, + "total_bytes": 2182586, + "unresolved_issue_counts": { + "Critical": 1, + "High": 20, + "Low": 2, + "Medium": 17 + } + }, + "passed": false, + "root": "/mnt/data/phase14_baseline", + "schema_version": "1.0" +} diff --git a/docs/quality/PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.md b/docs/quality/PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.md new file mode 100644 index 0000000..54afdef --- /dev/null +++ b/docs/quality/PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.md @@ -0,0 +1,148 @@ +# Phase 15 Static Repository Audit + +- Result: **FAIL** +- Files inspected: 467 +- JSON files parsed: 41 +- CSV files parsed: 44 +- Secret-scan files: 378 +- Findings: {"High": 4, "Medium": 7} + +## Findings + +| Severity | Code | Path | Line | Finding | +|---|---|---|---:|---| +| High | `ci_integration_suite_omitted` | `.github/workflows/ci.yml` | | CI does not execute the demo-service integration suite. | +| High | `issue_register_overflow` | `docs/IMPLEMENTATION_ISSUE_REGISTER_v1.4.csv` | | One or more issue-register rows contain overflow columns. | +| High | `malformed_csv` | `docs/IMPLEMENTATION_ISSUE_REGISTER_v1.4.csv` | 43 | Expected 9 columns, found 11. | +| High | `malformed_csv` | `docs/quality/PHASE_14_MANUAL_QA_RESULTS_v1.0.csv` | 11 | Expected 11 columns, found 10. | +| Medium | `loose_content_type_match` | `src/` | | JSON API still uses a prefix media-type check. | +| Medium | `content_type_helper_not_used` | `src/app/api/demo/route.ts` | | Demo API does not use exact JSON media-type validation. | +| Medium | `missing_exact_content_type_control` | `src/lib/security/content-type.ts` | | Exact application/json media-type helper is absent. | +| Medium | `stale_theme_storage_key` | `tests/visual/component-system.visual.spec.ts` | | Visual test writes a storage key the application never reads. | +| Medium | `theme_storage_key_missing` | `tests/visual/component-system.visual.spec.ts` | | Visual test does not use the canonical theme storage key. | +| Medium | `visual_project_scope` | `tests/visual/component-system.visual.spec.ts` | | Canonical snapshot test is not restricted to Chromium. | +| Medium | `visual_project_scope` | `tests/visual/integrations.visual.spec.ts` | | Canonical integration snapshots are not restricted to Chromium. | + +## Metrics + +```json +{ + "csv_files_parsed": 44, + "direct_dependencies_exact": true, + "direct_dependency_count": 25, + "email_fixture_hits": [ + { + "address": "avery@example.test", + "line": 21, + "path": "tests/integration/demo-service.test.ts" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 6, + "path": "tests/unit/integrations/demo-schema.test.ts" + }, + { + "address": "ada@example.test", + "line": 22, + "path": "tests/unit/integrations/demo-schema.test.ts" + }, + { + "address": "person@example.test", + "line": 20, + "path": "tests/unit/integrations/analytics.test.ts" + }, + { + "address": "person@example.test", + "line": 9, + "path": "tests/unit/integrations/redaction.test.ts" + }, + { + "address": "avery@example.test", + "line": 36, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "avery@example.test", + "line": 53, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "private@example.test", + "line": 66, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "name@fictional.invalid", + "line": 47, + "path": "src/content/development/component-lab.ts" + }, + { + "address": "nom@fictif.invalid", + "line": 158, + "path": "src/content/development/component-lab.ts" + }, + { + "address": "name@fictional.invalid", + "line": 281, + "path": "src/content/development/component-lab.ts" + } + ], + "file_count": 467, + "issue_register_path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.4.csv", + "issue_register_rows": 42, + "json_files_parsed": 41, + "release_gate_path": "docs/phase14/RELEASE_GATE_MATRIX_v1.0.csv", + "release_gate_status_counts": { + "Blocked": 4, + "Blocked by validator": 1, + "Environment blocked": 2, + "Open": 1, + "Partial": 2 + }, + "runtime_url_hits": [ + { + "line": 2, + "path": ".env.example", + "url": "https://your-approved-domain.example" + }, + { + "line": 6, + "path": "src/lib/localization/site-origin.ts", + "url": "http://localhost:3000" + }, + { + "line": 2, + "path": "src/contracts/phase9/design-tokens.json", + "url": "https://design-tokens.github.io/community-group/format/" + } + ], + "secret_scan_files": 378, + "suffix_counts": { + ".css": 48, + ".csv": 44, + ".duration": 8, + ".example": 1, + ".exit": 20, + ".js": 1, + ".json": 41, + ".log": 45, + ".md": 57, + ".mjs": 33, + ".png": 6, + ".svg": 2, + ".ts": 74, + ".tsx": 66, + ".txt": 8, + ".yaml": 2, + ".yml": 2, + "": 9 + }, + "total_bytes": 2182586, + "unresolved_issue_counts": { + "Critical": 1, + "High": 20, + "Low": 2, + "Medium": 17 + } +} +``` diff --git a/docs/quality/PHASE_15_COMMAND_LOG_v1.0.txt b/docs/quality/PHASE_15_COMMAND_LOG_v1.0.txt new file mode 100644 index 0000000..0ada915 --- /dev/null +++ b/docs/quality/PHASE_15_COMMAND_LOG_v1.0.txt @@ -0,0 +1,185 @@ +Phase 15 Command Log +Date: 2026-06-25 + +================================================================================ +FILE: docs/quality/phase15-command-logs/01-validate.json +================================================================================ +{"command":"node scripts/run-validations.mjs","exit_code":0,"wall_seconds":1,"log":"docs/quality/phase15-command-logs/01-validate.log"} + +================================================================================ +FILE: docs/quality/phase15-command-logs/01-validate.log +================================================================================ +PASS: Phase 9 contract package is immutable and 61 payload checksums match. +PASS: Pinned Node 24.17.0, pnpm 11.9.0, and 25 exact direct dependency versions match the lockfile. +PASS: English, French, and Arabic catalogs have exact key parity and valid direction metadata. +PASS: 5 route IDs have complete locale, runtime, hash, query, and hreflang contracts. +PASS: Phase 9 semantic tokens are unchanged and application styles contain no raw palette colors. +PASS: Phase 11 component tokens, theme fallback, and application-shell foundations are present. +PASS: 47 CSS files use direction-safe logical declarations. +PASS: Runtime source contains no placeholder destination, simulated submission, or research-only backdoor. +PASS: Localized canonical, hreflang, Open Graph, social, and robots foundations are present. +PASS: 60 inventory entries and 96 component source files satisfy Phase 12 static controls. +PASS: Phase 13 homepage composition, content model, destination gates, and test artifacts satisfy static controls. +PASS: Phase 14 integration structure, form contract, destinations, and locale resources are present. +PASS: Phase 14 environment inventory is explicit and defaults production integrations to blocked. +PASS: Phase 14 API boundary includes origin, content-type, size, timeout, idempotency, and no-raw-log controls. +PASS: Phase 14 privacy controls prevent browser persistence, URL leakage, and unconsented analytics. + +DURATION_SECONDS=1.37 +MAX_RSS_KB=140148 +EXIT_CODE=0 + +================================================================================ +FILE: docs/quality/phase15-command-logs/02-phase14-manifest-baseline.log +================================================================================ +PASS: Phase 14 package manifest verifies 466 repository files with no extras. + +DURATION_SECONDS=0.22 +MAX_RSS_KB=128988 +EXIT_CODE=0 + +================================================================================ +FILE: docs/quality/phase15-command-logs/02-phase14-manifest.log +================================================================================ +ERROR: docs/quality/PHASE_15_TOOLCHAIN_SETUP.log: unlisted repository file. +ERROR: docs/quality/phase15-command-logs/01-validate.json: unlisted repository file. +ERROR: docs/quality/phase15-command-logs/01-validate.log: unlisted repository file. +ERROR: docs/quality/phase15-command-logs/02-phase14-manifest.log: unlisted repository file. +Command exited with non-zero status 1 + +DURATION_SECONDS=0.24 +MAX_RSS_KB=135248 +EXIT_CODE=1 + +================================================================================ +FILE: docs/quality/phase15-command-logs/03-syntax-check.log +================================================================================ +COMMAND: node --check all JavaScript modules and node --experimental-strip-types --check all non-JSX TypeScript +NODE: v22.16.0 +PASS: checked 33 JavaScript modules, 69 TypeScript modules, and the Phase 15 Python audit script. + +================================================================================ +FILE: docs/quality/phase15-command-logs/04-baseline-static-audit.log +================================================================================ +$ python3 scripts/phase15-static-audit.py --root /mnt/data/phase14_baseline +{"files": 467, "finding_counts": {"High": 4, "Medium": 7}, "passed": false} +Command exited with non-zero status 1 +elapsed_seconds=1.37 exit_code=1 + +================================================================================ +FILE: docs/quality/phase15-command-logs/05-current-static-audit.log +================================================================================ +{"files": 485, "finding_counts": {}, "passed": true} + +EXIT_CODE=0 + +================================================================================ +FILE: docs/quality/phase15-command-logs/06-current-validations.exit +================================================================================ +0 + +================================================================================ +FILE: docs/quality/phase15-command-logs/06-current-validations.log +================================================================================ +PASS: Phase 9 contract package is immutable and 61 payload checksums match. +PASS: Pinned Node 24.17.0, pnpm 11.9.0, and 25 exact direct dependency versions match the lockfile. +PASS: English, French, and Arabic catalogs have exact key parity and valid direction metadata. +PASS: 5 route IDs have complete locale, runtime, hash, query, and hreflang contracts. +PASS: Phase 9 semantic tokens are unchanged and application styles contain no raw palette colors. +PASS: Phase 11 component tokens, theme fallback, and application-shell foundations are present. +PASS: 47 CSS files use direction-safe logical declarations. +PASS: Runtime source contains no placeholder destination, simulated submission, or research-only backdoor. +PASS: Localized canonical, hreflang, Open Graph, social, and robots foundations are present. +PASS: 60 inventory entries and 96 component source files satisfy Phase 12 static controls. +PASS: Phase 13 homepage composition, content model, destination gates, and test artifacts satisfy static controls. +PASS: Phase 14 integration structure, form contract, destinations, and locale resources are present. +PASS: Phase 14 environment inventory is explicit and defaults production integrations to blocked. +PASS: Phase 14 API boundary includes origin, content-type, size, timeout, idempotency, and no-raw-log controls. +PASS: Phase 14 privacy controls prevent browser persistence, URL leakage, and unconsented analytics. +PASS: Phase 15 evidence CSVs, exact media-type control, deterministic visual setup, and CI test gates are present. + +DURATION_SECONDS=1.78 +MAX_RSS_KB=139192 +EXIT_CODE=0 + +================================================================================ +FILE: docs/quality/phase15-command-logs/07-current-static-audit.exit +================================================================================ +0 + +================================================================================ +FILE: docs/quality/phase15-command-logs/07-current-static-audit.log +================================================================================ +{"files": 488, "finding_counts": {}, "passed": true} + +DURATION_SECONDS=1.79 +MAX_RSS_KB=308700 +EXIT_CODE=0 + +================================================================================ +FILE: docs/quality/phase15-command-logs/08-content-type-behavior.exit +================================================================================ +0 + +================================================================================ +FILE: docs/quality/phase15-command-logs/08-content-type-behavior.log +================================================================================ +PASS: exact application/json media-type validation; 8 assertions. +(node:13288) ExperimentalWarning: Type Stripping is an experimental feature and might change at any time +(Use `node --trace-warnings ...` to show where the warning was created) +(node:13288) [MODULE_TYPELESS_PACKAGE_JSON] Warning: Module type of file:///mnt/data/phase15_work/src/lib/security/content-type.ts is not specified and it doesn't parse as CommonJS. +Reparsing as ES module because module syntax was detected. This incurs a performance overhead. +To eliminate this warning, add "type": "module" to /mnt/data/phase15_work/package.json. + +DURATION_SECONDS=1.37 +EXIT_CODE=0 + +================================================================================ +FILE: docs/quality/phase15-command-logs/09-syntax-check.exit +================================================================================ +0 + +================================================================================ +FILE: docs/quality/phase15-command-logs/09-syntax-check.log +================================================================================ +PASS: checked 33 JavaScript modules, 64 TypeScript modules, and 2 Python scripts. + +DURATION_SECONDS=6.76 +EXIT_CODE=0 + +================================================================================ +FILE: docs/quality/phase15-command-logs/10-final-validations.log +================================================================================ +$ node scripts/run-validations.mjs +PASS: Phase 9 contract package is immutable and 61 payload checksums match. +PASS: Pinned Node 24.17.0, pnpm 11.9.0, and 25 exact direct dependency versions match the lockfile. +PASS: English, French, and Arabic catalogs have exact key parity and valid direction metadata. +PASS: 5 route IDs have complete locale, runtime, hash, query, and hreflang contracts. +PASS: Phase 9 semantic tokens are unchanged and application styles contain no raw palette colors. +PASS: Phase 11 component tokens, theme fallback, and application-shell foundations are present. +PASS: 47 CSS files use direction-safe logical declarations. +PASS: Runtime source contains no placeholder destination, simulated submission, or research-only backdoor. +PASS: Localized canonical, hreflang, Open Graph, social, and robots foundations are present. +PASS: 60 inventory entries and 96 component source files satisfy Phase 12 static controls. +PASS: Phase 13 homepage composition, content model, destination gates, and test artifacts satisfy static controls. +PASS: Phase 14 integration structure, form contract, destinations, and locale resources are present. +PASS: Phase 14 environment inventory is explicit and defaults production integrations to blocked. +PASS: Phase 14 API boundary includes origin, content-type, size, timeout, idempotency, and no-raw-log controls. +PASS: Phase 14 privacy controls prevent browser persistence, URL leakage, and unconsented analytics. +PASS: Phase 15 evidence CSVs, exact media-type control, deterministic visual setup, and CI test gates are present. +elapsed_seconds=1.52 exit_code=0 + +================================================================================ +FILE: docs/quality/phase15-command-logs/11-final-static-audit-pre-report.log +================================================================================ +$ python3 scripts/phase15-static-audit.py +{"files": 544, "finding_counts": {}, "passed": true} +elapsed_seconds=1.46 exit_code=0 + +================================================================================ +FILE: docs/quality/phase15-command-logs/13-final-static-audit.log +================================================================================ +$ python3 scripts/phase15-static-audit.py +{"files": 544, "finding_counts": {}, "passed": true} +elapsed_seconds=1.38 exit_code=0 + diff --git a/docs/quality/PHASE_15_FILE_CHANGES_v1.0.txt b/docs/quality/PHASE_15_FILE_CHANGES_v1.0.txt new file mode 100644 index 0000000..9053c5f --- /dev/null +++ b/docs/quality/PHASE_15_FILE_CHANGES_v1.0.txt @@ -0,0 +1,114 @@ +Phase 15 File Changes +Date: 2026-06-25 +Baseline: supplied Phase 14 repository ZIP after manifest verification +Current: final Phase 15 release-readiness tree before package-manifest generation + +Baseline files: 467 +Current files: 547 +Added: 80 +Changed: 11 +Removed: 0 +Unchanged: 456 + +ADDED ++ docs/DECISION_LOG_v15.0.md | bytes=2592 | sha256=c59ef94dbf9cee22b762acdb7fbe13ea77b14eba2bb12a15196a50a7d4e38f41 ++ docs/IMPLEMENTATION_ISSUE_REGISTER_v1.5.csv | bytes=15395 | sha256=818eda19723bd1aafe4359831d3f9547e4c6fd545d6ae08313c0a6e5e413dc3f ++ docs/PHASE_15_IMPLEMENTATION_REPORT_v1.0.md | bytes=6822 | sha256=b9fa26b635b70eba3e414f553f9def60916535bcc4f2eb9da482231aef28c1d5 ++ docs/PHASE_16_HANDOFF_v1.0.md | bytes=4583 | sha256=de5d8f974eecf517f61a6b7f7c3f394518efa26cd41771cb57305365e20fa83e ++ docs/phase15/ABUSE_CONTROL_REPORT_v1.0.md | bytes=718 | sha256=d56f05fba3ce6670b2fc833f0da3eb6cf7643bb82b61b2fa68f057f211a1ed0e ++ docs/phase15/ANALYTICS_VALIDATION_REPORT_v1.0.md | bytes=725 | sha256=2e24b9e1dc7ebcc424bff217d308d73f169ceb2fee8a54ecefdb2ab9d94f9bfe ++ docs/phase15/AUTOMATED_ACCESSIBILITY_REPORT_v1.0.md | bytes=545 | sha256=1647ac95ffc1c8ec3df901dafaf7954166b9bad7fb0c147eb3acfe9020befec2 ++ docs/phase15/BROWSER_HISTORY_REPORT_v1.0.md | bytes=684 | sha256=b33b65266826d986bf90164e3ab01bb80c61049c7679b189968d201e06c0511f ++ docs/phase15/BUNDLE_ANALYSIS_REPORT_v1.0.md | bytes=698 | sha256=245d4a1f9fd5d91eb1b2941676c9eef390426f27aade7b24e2366951f03e079e ++ docs/phase15/CLEAN_ROOM_BASELINE_REPORT_v1.0.md | bytes=939 | sha256=61423268ab8f5a75decb112f0cb4a62b7b3b3954bf6a7ca11cf688c569910e4d ++ docs/phase15/COMMAND_MATRIX_v1.0.csv | bytes=6523 | sha256=eaeaaca0e3b7b74a4768ca6303486eae273e6bad575f5c3b41b61bb8c63e4700 ++ docs/phase15/CONSENT_VALIDATION_REPORT_v1.0.md | bytes=774 | sha256=f1a9eb92eb164532f82000a4655a7310fa9103f9140529cc5f7eb12b74a5c795 ++ docs/phase15/CONTENT_EVIDENCE_REVIEW_v1.0.md | bytes=794 | sha256=e7f1c8350fc3cedec81e089a2b076fab4de740d2bb003171f42ad35d343e04f5 ++ docs/phase15/CROSS_BROWSER_TEST_REPORT_v1.0.md | bytes=646 | sha256=ed06fa73e138f99131882ffbce8340c6b61d727396a38ed37eb40e70526dd539 ++ docs/phase15/DEFECT_REGISTER_v1.0.csv | bytes=3919 | sha256=8906ccb503e5ea62b8d7fa74f60e188d7ffedf61dc866462895d0616cea8f212 ++ docs/phase15/DEPLOYMENT_REHEARSAL_REPORT_v1.0.md | bytes=646 | sha256=3d4c41f057091efb3034ca56fe9f1e3625777e86d7c4168c627c02180dcb9202 ++ docs/phase15/DESIGN_FIDELITY_REPORT_v1.0.md | bytes=631 | sha256=32e63d3665f3fda5095424402e88a98f30816b0c4e82a6ee297150dee6a5be4e ++ docs/phase15/DESTINATION_BROKEN_LINK_REPORT_v1.0.md | bytes=781 | sha256=ce69dd34db9e9587495b1f82c68173506ddde20410a70458b37f561590fd1289 ++ docs/phase15/DEVICE_VIEWPORT_REPORT_v1.0.md | bytes=630 | sha256=e6e9287808a3279b45782c69f9cf6de5229f80ece51b0ca5fadf7ac800183789 ++ docs/phase15/END_TO_END_TEST_REPORT_v1.0.md | bytes=692 | sha256=d58adbb88000647a6b8a921e1f1902c17c0cda892cbe137d9b5964b68f22d13d ++ docs/phase15/FAILURE_SIMULATION_REPORT_v1.0.md | bytes=635 | sha256=f2e5cea8b80ad0369c07d31b795885ffa885e6e9360881c1f7ceac758ea093ed ++ docs/phase15/FINAL_RELEASE_RECOMMENDATION_v1.0.md | bytes=2743 | sha256=08209591849ce8663423e3eb5eef1c5309e80c087c7b8a7dfc8d68bd71a8839b ++ docs/phase15/IDEMPOTENCY_DUPLICATE_REPORT_v1.0.md | bytes=744 | sha256=ed5478b42914d736866b4e4916337f698a5fb309455868f1f958d01d0f5415fc ++ docs/phase15/IMAGE_FONT_PERFORMANCE_REPORT_v1.0.md | bytes=770 | sha256=b28fb2b989f8a3457ae5c48433fbb3f27337d24fea00db8be451b52f461f1e45 ++ docs/phase15/INTEGRATION_TEST_REPORT_v1.0.md | bytes=858 | sha256=c51b4629b42f4175840f822717153fff72f311b53c638de3227761afb51e8bbb ++ docs/phase15/KEYBOARD_ACCESSIBILITY_REPORT_v1.0.md | bytes=602 | sha256=fd7dcca8715f727326e5a7fdd49532f95c58ef092a2374def637717ee6755504 ++ docs/phase15/LOCALIZATION_QA_REPORT_v1.0.md | bytes=712 | sha256=93f20fe6b0f5a064c5a3a0f9f7b2e8483f30feafb06bdf789a0e0b73c3761deb ++ docs/phase15/MANUAL_TEST_MATRIX_v1.0.csv | bytes=1196 | sha256=d953be08010beb84b68e701b534a7c91cbe550cb73c29cc5aeb86ac9c523ca4b ++ docs/phase15/OBSERVABILITY_VALIDATION_REPORT_v1.0.md | bytes=610 | sha256=5c42216a452694bfc6b1ef015a6fc4ff6ea9da261810f64212e676dd40a60c50 ++ docs/phase15/PERFORMANCE_REPORT_v1.0.md | bytes=753 | sha256=aa6d44c92788e5f81910ad04609e81bec6d3afa2ef689eb335b30fa25d94bde4 ++ docs/phase15/PRIVACY_VALIDATION_REPORT_v1.0.md | bytes=789 | sha256=8e04998010b052f041f88639fc695df4f3f31576feb248bbbe0604e066fb25bc ++ docs/phase15/RELEASE_GATE_MATRIX_v1.0.csv | bytes=3258 | sha256=9d7254919043b08c3e3e60574bc8825817d4e6ec08f48a97e8194fa020b5571e ++ docs/phase15/REPOSITORY_INTEGRITY_AUDIT_v1.0.md | bytes=850 | sha256=f88c5d2aac92dc1d1c569d5f69b1fbab4e9d170ff1fbdacdd9ad29dda0b6deb5 ++ docs/phase15/RETEST_REPORT_v1.0.md | bytes=738 | sha256=dff702ec540e9046da64800f168ca818b2de2c638a85c684c42dc2097cf8193a ++ docs/phase15/RISK_ACCEPTANCE_REGISTER_v1.0.csv | bytes=98 | sha256=51359ece589175db561b8e857c14ed1ee36594d2921b7f1e37d7981d5d544d8d ++ docs/phase15/RISK_ACCEPTANCE_SUMMARY_v1.0.md | bytes=149 | sha256=fa52be6a049910986cc528696d96067ac2784c7641dd19c1665c67cd431f6439 ++ docs/phase15/ROLLBACK_REHEARSAL_REPORT_v1.0.md | bytes=601 | sha256=3af1fbd033a14f2a2a36d9eb334fd447396c631f8cf92de69a12944ee464e2dd ++ docs/phase15/RTL_QA_REPORT_v1.0.md | bytes=736 | sha256=26b4a61e973451e319dd50658bd1a7234f264b3abd701a2107ede1a64a425a09 ++ docs/phase15/SCREEN_READER_REPORT_v1.0.md | bytes=658 | sha256=59e983f4e89a449bf982a53753f59d77f941800ca4a4303c6ae111ed0f0f80c1 ++ docs/phase15/SECURITY_VALIDATION_REPORT_v1.0.md | bytes=943 | sha256=3653103c7eb52420143056f8ba40c86023fd742b39a52177c9cbc0ce414a3309 ++ docs/phase15/SEO_METADATA_REVIEW_v1.0.md | bytes=675 | sha256=e7a475200c09a016e6500c7417a0fb9d713899aace20b2814e0e134f2d76dd0a ++ docs/phase15/STATIC_ANALYSIS_REPORT_v1.0.md | bytes=961 | sha256=13a392beacefd2fe814e3eb91504d2d27b19c029ff48169cd43f5f0d8ab2c385 ++ docs/phase15/THEME_QA_REPORT_v1.0.md | bytes=662 | sha256=031e26a400ae401cf92956913e5a5125d2e3db35532d8c03eff1ae480941b292 ++ docs/phase15/UNIT_TEST_REPORT_v1.0.md | bytes=781 | sha256=080982bbf26c06c7bee39bcbac2bd7abee7f543e3d4a7441b29cf3a5cdf033e1 ++ docs/phase15/VISUAL_REGRESSION_REPORT_v1.0.md | bytes=674 | sha256=fe2d467b20c387f879023db4e806a1a31072bca546741b7a3e540011e04a7086 ++ docs/phase15/WCAG_2_2_AA_EVIDENCE_MATRIX_v1.0.csv | bytes=5049 | sha256=26b7a86b005dc3014da833a27eec5b0bda0135cd5c4942a55714162ff4c7569f ++ docs/phase15/ZOOM_REFLOW_REPORT_v1.0.md | bytes=652 | sha256=2e4d188a04af2d50d8804bcb6b702691e9e06b6de98607d3a455fd480b19a7de ++ docs/quality/PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.json | bytes=5595 | sha256=4cf636fd2a163700b666f0a04946b453dd22c4a4b43bc03bb420c3760a37353d ++ docs/quality/PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.md | bytes=4606 | sha256=0f3fb7ce9257fadfb7819143ad6a840ab1b6a5a848d0a8e3b19972e430cb0bab ++ docs/quality/PHASE_15_COMMAND_LOG_v1.0.txt | bytes=11190 | sha256=b92aea4d16329cc54aab02e2dd035275425d3703a7e17703aa31f3224f78a484 ++ docs/quality/PHASE_15_STATIC_AUDIT_RESULTS_v1.0.json | bytes=3211 | sha256=ef3216e76c58a1656f68cae7d6a792a0da6ea5e63465bf3879c610ab235b3158 ++ docs/quality/PHASE_15_STATIC_AUDIT_RESULTS_v1.0.md | bytes=3065 | sha256=595afc2c185c9d091ca952325b37a268b357478a23467ea920e4945f86b6ab9a ++ docs/quality/PHASE_15_TOOLCHAIN_SETUP.log | bytes=1554 | sha256=313029491c83cc00c9abf5e8ab63db6bd350c9bb94d5e2b80415fd716091db64 ++ docs/quality/PHASE_15_VALIDATION_RESULTS_v1.0.json | bytes=2479 | sha256=ae6fd775d5d6a67406b59296796ea3f904b79a78cc24a33f85cf2b4b87067008 ++ docs/quality/PHASE_15_VALIDATION_RESULTS_v1.0.md | bytes=1515 | sha256=1c50f03fbeee648e398f51499b9348245cb2b85edfad9e21f5eb14415454d7c9 ++ docs/quality/phase15-command-logs/01-validate.json | bytes=136 | sha256=690ec5e56e1c2d1260bbda500aae6935eec51c7e1c957ac8043d3b5eacf8fe45 ++ docs/quality/phase15-command-logs/01-validate.log | bytes=1482 | sha256=a8702ea1ad801f38a464f52e1961f4d0301082499f928e38290e8c9a3ad0a38c ++ docs/quality/phase15-command-logs/02-phase14-manifest-baseline.log | bytes=131 | sha256=e1bc16ca75ee3f5fc063bee211ed1aebebff3365039c0c0558817467c4e4e13d ++ docs/quality/phase15-command-logs/02-phase14-manifest.log | bytes=428 | sha256=d304fc1d9d340a8af6588bc023099451663d47d300c4787aff5a30e693cd4ec4 ++ docs/quality/phase15-command-logs/03-syntax-check.log | bytes=225 | sha256=99246276d42a08b275fc645efc9f84a762534bd51b3f88888676fcba28d54744 ++ docs/quality/phase15-command-logs/04-baseline-static-audit.log | bytes=223 | sha256=09c63142e71f71f0f0f5c652902a32b0a1cbd1908e9eadf5830ff71659643905 ++ docs/quality/phase15-command-logs/05-current-static-audit.log | bytes=66 | sha256=8785c8611db8a489da6792f6377236f4c9b9c1a0f5ac5636986e206c03b6f36c ++ docs/quality/phase15-command-logs/06-current-validations.exit | bytes=2 | sha256=9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa ++ docs/quality/phase15-command-logs/06-current-validations.log | bytes=1597 | sha256=2d44d3eea802e5b8f17b9c9eb01c1280276e7cb30a3617f9226bf552af18922e ++ docs/quality/phase15-command-logs/07-current-static-audit.exit | bytes=2 | sha256=9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa ++ docs/quality/phase15-command-logs/07-current-static-audit.log | bytes=106 | sha256=175b57f0a4b5dd6f7293d8534050b6cefbd98c899a2fb686b8d4d9f5c6917f0c ++ docs/quality/phase15-command-logs/08-content-type-behavior.exit | bytes=2 | sha256=9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa ++ docs/quality/phase15-command-logs/08-content-type-behavior.log | bytes=643 | sha256=2e1077c48d47f02ae73c2ee7b9006b1ef887faae6b6eb04be673d5f395825ab4 ++ docs/quality/phase15-command-logs/09-syntax-check.exit | bytes=2 | sha256=9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa ++ docs/quality/phase15-command-logs/09-syntax-check.log | bytes=117 | sha256=0ef5177d69f49bdbf89a8b9a6bcef2110728108969453dcc36f27a0b1ce83161 ++ docs/quality/phase15-command-logs/10-final-validations.log | bytes=1612 | sha256=a48348ed8aaa988ad1c267603e272725d5be2d057ed4915868c871a0678a1935 ++ docs/quality/phase15-command-logs/11-final-static-audit-pre-report.log | bytes=128 | sha256=c806167d316db60d36fb6069f03ce47c623d43ce6710c77fb6b03ccc7144e1c5 ++ docs/quality/phase15-command-logs/13-final-static-audit.log | bytes=128 | sha256=f0bdbb5e1d170a394eec143cb960a8ba62355edfcbe5fa5bc10cbe39565d876c ++ scripts/generate-phase15-manifest.mjs | bytes=1889 | sha256=483f9b1222368fe9bd255d5d4b07d1f8ea6898b575c0e07a13c5f693ef70f932 ++ scripts/generate-phase15-reports.py | bytes=67112 | sha256=23bba1a926c5696ee9c02a3a6861f931426e452ea803d757f81d79c5dd83a1e8 ++ scripts/phase15-static-audit.py | bytes=17442 | sha256=9a72263a697c17e157432dab091a2f30cc0fa2a6019cb5e521c9af57e949ac5a ++ scripts/validate-phase15-manifest.mjs | bytes=2673 | sha256=129ea44a368c82e130c803156cf8096342438545571accd1ed700cd768bdf5a4 ++ scripts/validate-phase15-readiness.mjs | bytes=3472 | sha256=6764887cce0b291f6e210492a41ec515369d5146802e6fb0fdd5a6906d42e792 ++ src/lib/security/content-type.ts | bytes=385 | sha256=8179360d02d132a2d386a89523a470455977544b2286628cff4c60e50d71105a ++ tests/unit/integrations/content-type.test.ts | bytes=570 | sha256=6c55b144602bae6ad9bfb9f09f2aa752dd46dc32e662aaa4642d045da22c7731 + +CHANGED +~ .dockerignore | before_bytes=97 | before_sha256=d78b037a836881c2d63f074d525b8027b2ecb06fefe3af4d5356327ec01dc5e1 | after_bytes=116 | after_sha256=f5c4f2a6bb5aee2eab9e3c5f838dba58c97bf62ef432bdc181778cf4a167e78c +~ .github/workflows/ci.yml | before_bytes=1739 | before_sha256=c3d1671011688d7ebc4be9f38265e82b290b1aefc9ddd237c1d82fafd3e765f4 | after_bytes=1967 | after_sha256=1f539bcae4f26429b959690339a57ad8abd200fed149a2ee786ed6b27f769bb3 +~ .gitignore | before_bytes=135 | before_sha256=01c7cded7467134f023106b85684e3ce5df721149fc3ff4af5e02ef79541bb14 | after_bytes=155 | after_sha256=7a502eb52bc55e5be5e971624211c692f279d7c8d85e1b89a5abc3e2e5c7c9d5 +~ README.md | before_bytes=4499 | before_sha256=af6addc1b409a534512759c6495a1112ac0895c0d1b5589025fa6355ce2b1c10 | after_bytes=5544 | after_sha256=6c65fce47358960186dc639f267b3d18c97d9eb56325772c5318a088fafa5915 +~ docs/IMPLEMENTATION_ISSUE_REGISTER_v1.4.csv | before_bytes=13058 | before_sha256=cd2fb58000d337c6abf5ae767a848472e71488a7cd2abda1e0a89d50bdce7a35 | after_bytes=13060 | after_sha256=fea9c6bbe4db7a72b5f58a9dcffd215514915e3eae79941b104e195b1ec42bd2 +~ docs/quality/PHASE_14_MANUAL_QA_RESULTS_v1.0.csv | before_bytes=2082 | before_sha256=3c65888853cd8e1c1b04cffb9cf851916a6db7fd29e93af7b2cc5d90faf084cc | after_bytes=2086 | after_sha256=e7a3c123fa363bc18d6f4f150e34a4ec0f47836f0cdc60e4a6ac4d02a6961a6f +~ package.json | before_bytes=3716 | before_sha256=a00be27528360c8e7efb11c4084b14a00aac7c5414552a4fc97beb40f7a96a9a | after_bytes=3975 | after_sha256=e894298ee2078480a3a14e5582f5972cb64a2890ca0022f8085ce634351ec4e2 +~ scripts/run-validations.mjs | before_bytes=754 | before_sha256=a36eff2467b22be74c46579f4193d40b779474cd90f401ebc8fc93ab843ec540 | after_bytes=790 | after_sha256=5a443dbb37ebeffacd32c214b94ac6d2c316fc6bf16e19c0719b608345a8aa6a +~ src/app/api/demo/route.ts | before_bytes=4458 | before_sha256=08f6b254967a69f551988a3d6ced3ee388b53746d26100c5c53094422a6910fd | after_bytes=4491 | after_sha256=5f9f17acf083d42e6c74af48a75c82a253abaee97788bfa07c6d0e480caeaf70 +~ tests/visual/component-system.visual.spec.ts | before_bytes=799 | before_sha256=60a3ca791efaacf0ca1b38209edfdfe95105740e25228f781ddf771134b82e18 | after_bytes=899 | after_sha256=983ee872b9b7a1993ccaafb8c3ea2ee4fb82cf562a5f9e1521de29faa307c8e7 +~ tests/visual/integrations.visual.spec.ts | before_bytes=884 | before_sha256=0928c78c3c3fee8053861d5db88c1f946a80c22a6649f61869bdcfadc2bc7ea9 | after_bytes=984 | after_sha256=71896bfb083931ab8bf434dd85911cc50c82e854744b871ff31c1f3f4ad650a5 + +REMOVED +(none) + +Notes +- Immutable Phase 9 contracts were not modified. +- Generated caches and dependency/build outputs are excluded. +- This inventory, the Phase 15 package manifest, and its self-validation log are excluded to avoid self-referential hashes. diff --git a/docs/quality/PHASE_15_STATIC_AUDIT_RESULTS_v1.0.json b/docs/quality/PHASE_15_STATIC_AUDIT_RESULTS_v1.0.json new file mode 100644 index 0000000..0f940b8 --- /dev/null +++ b/docs/quality/PHASE_15_STATIC_AUDIT_RESULTS_v1.0.json @@ -0,0 +1,126 @@ +{ + "audit": "Phase 15 dependency-free static repository audit", + "finding_counts": {}, + "findings": [], + "metrics": { + "csv_files_parsed": 51, + "direct_dependencies_exact": true, + "direct_dependency_count": 25, + "email_fixture_hits": [ + { + "address": "avery@example.test", + "line": 21, + "path": "tests/integration/demo-service.test.ts" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 6, + "path": "tests/unit/integrations/demo-schema.test.ts" + }, + { + "address": "ada@example.test", + "line": 22, + "path": "tests/unit/integrations/demo-schema.test.ts" + }, + { + "address": "person@example.test", + "line": 20, + "path": "tests/unit/integrations/analytics.test.ts" + }, + { + "address": "person@example.test", + "line": 9, + "path": "tests/unit/integrations/redaction.test.ts" + }, + { + "address": "avery@example.test", + "line": 36, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "avery@example.test", + "line": 53, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "private@example.test", + "line": 66, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "name@fictional.invalid", + "line": 47, + "path": "src/content/development/component-lab.ts" + }, + { + "address": "nom@fictif.invalid", + "line": 158, + "path": "src/content/development/component-lab.ts" + }, + { + "address": "name@fictional.invalid", + "line": 281, + "path": "src/content/development/component-lab.ts" + } + ], + "file_count": 546, + "issue_register_path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.5.csv", + "issue_register_rows": 47, + "json_files_parsed": 44, + "release_gate_path": "docs/phase15/RELEASE_GATE_MATRIX_v1.0.csv", + "release_gate_status_counts": { + "Blocked": 16, + "Open": 1, + "Passed": 3 + }, + "runtime_url_hits": [ + { + "line": 2, + "path": ".env.example", + "url": "https://your-approved-domain.example" + }, + { + "line": 6, + "path": "src/lib/localization/site-origin.ts", + "url": "http://localhost:3000" + }, + { + "line": 2, + "path": "src/contracts/phase9/design-tokens.json", + "url": "https://design-tokens.github.io/community-group/format/" + } + ], + "secret_scan_files": 435, + "suffix_counts": { + ".css": 48, + ".csv": 51, + ".duration": 8, + ".example": 1, + ".exit": 24, + ".js": 1, + ".json": 44, + ".log": 60, + ".md": 98, + ".mjs": 36, + ".png": 6, + ".py": 2, + ".svg": 2, + ".ts": 76, + ".tsx": 66, + ".txt": 10, + ".yaml": 2, + ".yml": 2, + "": 9 + }, + "total_bytes": 2490086, + "unresolved_issue_counts": { + "Critical": 1, + "High": 21, + "Low": 2, + "Medium": 17 + } + }, + "passed": true, + "root": "/mnt/data/phase15_work", + "schema_version": "1.0" +} diff --git a/docs/quality/PHASE_15_STATIC_AUDIT_RESULTS_v1.0.md b/docs/quality/PHASE_15_STATIC_AUDIT_RESULTS_v1.0.md new file mode 100644 index 0000000..3fde789 --- /dev/null +++ b/docs/quality/PHASE_15_STATIC_AUDIT_RESULTS_v1.0.md @@ -0,0 +1,135 @@ +# Phase 15 Static Repository Audit + +- Result: **PASS** +- Files inspected: 546 +- JSON files parsed: 44 +- CSV files parsed: 51 +- Secret-scan files: 435 +- Findings: {} + +## Findings + +No Critical, High, Medium, Low, or informational findings were produced by this audit. + +## Metrics + +```json +{ + "csv_files_parsed": 51, + "direct_dependencies_exact": true, + "direct_dependency_count": 25, + "email_fixture_hits": [ + { + "address": "avery@example.test", + "line": 21, + "path": "tests/integration/demo-service.test.ts" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 6, + "path": "tests/unit/integrations/demo-schema.test.ts" + }, + { + "address": "ada@example.test", + "line": 22, + "path": "tests/unit/integrations/demo-schema.test.ts" + }, + { + "address": "person@example.test", + "line": 20, + "path": "tests/unit/integrations/analytics.test.ts" + }, + { + "address": "person@example.test", + "line": 9, + "path": "tests/unit/integrations/redaction.test.ts" + }, + { + "address": "avery@example.test", + "line": 36, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "avery@example.test", + "line": 53, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "private@example.test", + "line": 66, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "name@fictional.invalid", + "line": 47, + "path": "src/content/development/component-lab.ts" + }, + { + "address": "nom@fictif.invalid", + "line": 158, + "path": "src/content/development/component-lab.ts" + }, + { + "address": "name@fictional.invalid", + "line": 281, + "path": "src/content/development/component-lab.ts" + } + ], + "file_count": 546, + "issue_register_path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.5.csv", + "issue_register_rows": 47, + "json_files_parsed": 44, + "release_gate_path": "docs/phase15/RELEASE_GATE_MATRIX_v1.0.csv", + "release_gate_status_counts": { + "Blocked": 16, + "Open": 1, + "Passed": 3 + }, + "runtime_url_hits": [ + { + "line": 2, + "path": ".env.example", + "url": "https://your-approved-domain.example" + }, + { + "line": 6, + "path": "src/lib/localization/site-origin.ts", + "url": "http://localhost:3000" + }, + { + "line": 2, + "path": "src/contracts/phase9/design-tokens.json", + "url": "https://design-tokens.github.io/community-group/format/" + } + ], + "secret_scan_files": 435, + "suffix_counts": { + ".css": 48, + ".csv": 51, + ".duration": 8, + ".example": 1, + ".exit": 24, + ".js": 1, + ".json": 44, + ".log": 60, + ".md": 98, + ".mjs": 36, + ".png": 6, + ".py": 2, + ".svg": 2, + ".ts": 76, + ".tsx": 66, + ".txt": 10, + ".yaml": 2, + ".yml": 2, + "": 9 + }, + "total_bytes": 2490086, + "unresolved_issue_counts": { + "Critical": 1, + "High": 21, + "Low": 2, + "Medium": 17 + } +} +``` diff --git a/docs/quality/PHASE_15_VALIDATION_RESULTS_v1.0.json b/docs/quality/PHASE_15_VALIDATION_RESULTS_v1.0.json new file mode 100644 index 0000000..53810f2 --- /dev/null +++ b/docs/quality/PHASE_15_VALIDATION_RESULTS_v1.0.json @@ -0,0 +1,97 @@ +{ + "schema_version": "1.0", + "project": "RentalDriveGo", + "phase": 15, + "date": "2026-06-25", + "release_recommendation": "Not ready for Phase 16", + "environment": { + "os": "Debian GNU/Linux 13", + "node": "v22.16.0", + "npm": "10.9.2", + "corepack": "0.32.0", + "python": "3.13.5", + "required_node": "24.17.0", + "required_pnpm": "11.9.0" + }, + "clean_install": { + "status": "blocked", + "reason": "Pinned pnpm unavailable and registry DNS unavailable; no lockfile update attempted." + }, + "baseline_static_audit": { + "passed": false, + "file_count": 467, + "finding_counts": { + "High": 4, + "Medium": 7 + } + }, + "current_static_audit": { + "passed": true, + "file_count": 546, + "finding_counts": {} + }, + "dependency_free_validation": { + "validators": 16, + "passed": 16, + "failed": 0 + }, + "targeted_content_type_assertions": { + "assertions": 8, + "passed": 8, + "failed": 0, + "warnings": 2 + }, + "syntax_validation": { + "javascript_modules": 33, + "typescript_modules": 64, + "python_scripts": 2, + "passed": 99, + "failed": 0 + }, + "fixed_defects": { + "Critical": 0, + "High": 2, + "Medium": 2, + "Low": 0 + }, + "unresolved_cumulative_issue_register": { + "Critical": 1, + "High": 21, + "Medium": 17, + "Low": 2 + }, + "accepted_exceptions": 0, + "command_status_counts": { + "Passed": 5, + "Blocked": 1, + "Not executed - prerequisite blocked": 1, + "Failed as expected - baseline findings": 1, + "Passed with runtime warnings": 1, + "Not executed - clean install blocked": 17 + }, + "blocked_major_gates": [ + "clean install", + "formatting", + "lint", + "strict typecheck", + "current unit tests", + "current integration tests", + "browser/end-to-end tests", + "automated accessibility", + "manual keyboard and screen-reader tests", + "visual regression", + "performance and bundle analysis", + "dependency audit", + "production build", + "deployment rehearsal", + "rollback rehearsal" + ], + "evidence": { + "implementation_report": "docs/PHASE_15_IMPLEMENTATION_REPORT_v1.0.md", + "command_matrix": "docs/phase15/COMMAND_MATRIX_v1.0.csv", + "defect_register": "docs/phase15/DEFECT_REGISTER_v1.0.csv", + "release_gate_matrix": "docs/phase15/RELEASE_GATE_MATRIX_v1.0.csv", + "final_recommendation": "docs/phase15/FINAL_RELEASE_RECOMMENDATION_v1.0.md", + "phase16_handoff": "docs/PHASE_16_HANDOFF_v1.0.md" + } +} diff --git a/docs/quality/PHASE_15_VALIDATION_RESULTS_v1.0.md b/docs/quality/PHASE_15_VALIDATION_RESULTS_v1.0.md new file mode 100644 index 0000000..0cc62df --- /dev/null +++ b/docs/quality/PHASE_15_VALIDATION_RESULTS_v1.0.md @@ -0,0 +1,29 @@ +# Phase 15 Validation Results + +**Date:** 2026-06-25 +**Recommendation:** **Not ready for Phase 16** + +## Executed results + +- Supplied Phase 14 package manifest: passed, 466 files verified. +- Dependency-free repository validators: 16 passed, 0 failed. +- Baseline static audit: 4 High and 7 Medium findings. +- Current static audit: passed with zero findings. +- Exact media-type behavior assertions: 8 passed, 0 failed, 2 Node experimental-runtime warnings. +- Defects fixed in Phase 15: 2 High and 2 Medium. +- Accepted exceptions: 0. + +## Blocked results + +The exact frozen dependency installation could not run because Node 24.17.0 and pnpm 11.9.0 were unavailable and registry DNS could not activate the pinned package manager. Formatting, linting, strict type checking, current unit and integration tests, browser/end-to-end execution, automated and manual accessibility, visual regression, performance, dependency audit, production build, deployment rehearsal, and rollback rehearsal remain unexecuted for this release candidate. + +Historical Phase 14 results are retained for traceability but are not reported as current Phase 15 passes. The cumulative unresolved issue register contains 1 Critical, 21 High, 17 Medium, and 2 Low items. + +## Evidence + +- `docs/PHASE_15_IMPLEMENTATION_REPORT_v1.0.md` +- `docs/phase15/COMMAND_MATRIX_v1.0.csv` +- `docs/phase15/DEFECT_REGISTER_v1.0.csv` +- `docs/phase15/RELEASE_GATE_MATRIX_v1.0.csv` +- `docs/phase15/FINAL_RELEASE_RECOMMENDATION_v1.0.md` +- `docs/PHASE_16_HANDOFF_v1.0.md` diff --git a/docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json b/docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json new file mode 100644 index 0000000..8e20953 --- /dev/null +++ b/docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json @@ -0,0 +1,565 @@ +{ + "audit": "Phase 16 dependency-free static repository audit", + "finding_counts": {}, + "findings": [], + "metrics": { + "csv_files_parsed": 81, + "direct_dependencies_exact": true, + "direct_dependency_count": 25, + "email_fixture_hits": [ + { + "address": "avery@example.test", + "line": 21, + "path": "tests/integration/demo-service.test.ts" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 6, + "path": "tests/unit/integrations/demo-schema.test.ts" + }, + { + "address": "ada@example.test", + "line": 22, + "path": "tests/unit/integrations/demo-schema.test.ts" + }, + { + "address": "person@example.test", + "line": 20, + "path": "tests/unit/integrations/analytics.test.ts" + }, + { + "address": "person@example.test", + "line": 9, + "path": "tests/unit/integrations/redaction.test.ts" + }, + { + "address": "avery@example.test", + "line": 36, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "avery@example.test", + "line": 53, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "private@example.test", + "line": 66, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "name@fictional.invalid", + "line": 47, + "path": "src/content/development/component-lab.ts" + }, + { + "address": "nom@fictif.invalid", + "line": 158, + "path": "src/content/development/component-lab.ts" + }, + { + "address": "name@fictional.invalid", + "line": 281, + "path": "src/content/development/component-lab.ts" + }, + { + "address": "avery@example.test", + "line": 11, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 16, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "ada@example.test", + "line": 21, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "person@example.test", + "line": 26, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "person@example.test", + "line": 31, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 36, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 41, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "private@example.test", + "line": 46, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "name@fictional.invalid", + "line": 51, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "nom@fictif.invalid", + "line": 56, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "name@fictional.invalid", + "line": 61, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 23, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 28, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "ada@example.test", + "line": 33, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "person@example.test", + "line": 38, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "person@example.test", + "line": 43, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "avery@example.test", + "line": 48, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "avery@example.test", + "line": 53, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "private@example.test", + "line": 58, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "name@fictional.invalid", + "line": 63, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "nom@fictif.invalid", + "line": 68, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "name@fictional.invalid", + "line": 73, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "avery@example.test", + "line": 11, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 16, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "ada@example.test", + "line": 21, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "person@example.test", + "line": 26, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "person@example.test", + "line": 31, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 36, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 41, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "private@example.test", + "line": 46, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "name@fictional.invalid", + "line": 51, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "nom@fictif.invalid", + "line": 56, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "name@fictional.invalid", + "line": 61, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 66, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 71, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "ada@example.test", + "line": 76, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "person@example.test", + "line": 81, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "person@example.test", + "line": 86, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 91, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 96, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "private@example.test", + "line": 101, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "name@fictional.invalid", + "line": 106, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "nom@fictif.invalid", + "line": 111, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "name@fictional.invalid", + "line": 116, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 121, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 126, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "ada@example.test", + "line": 131, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "person@example.test", + "line": 136, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "person@example.test", + "line": 141, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 146, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 151, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "private@example.test", + "line": 156, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "name@fictional.invalid", + "line": 161, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "nom@fictif.invalid", + "line": 166, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "name@fictional.invalid", + "line": 171, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 23, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 28, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "ada@example.test", + "line": 33, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "person@example.test", + "line": 38, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "person@example.test", + "line": 43, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "avery@example.test", + "line": 48, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "avery@example.test", + "line": 53, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "private@example.test", + "line": 58, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "name@fictional.invalid", + "line": 63, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "nom@fictif.invalid", + "line": 68, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "name@fictional.invalid", + "line": 73, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "avery@example.test", + "line": 78, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 83, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "ada@example.test", + "line": 88, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "person@example.test", + "line": 93, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "person@example.test", + "line": 98, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "avery@example.test", + "line": 103, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "avery@example.test", + "line": 108, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "private@example.test", + "line": 113, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "name@fictional.invalid", + "line": 118, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "nom@fictif.invalid", + "line": 123, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "name@fictional.invalid", + "line": 128, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "avery@example.test", + "line": 133, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 138, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "ada@example.test", + "line": 143, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "person@example.test", + "line": 148, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "person@example.test", + "line": 153, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "avery@example.test", + "line": 158, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "avery@example.test", + "line": 163, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "private@example.test", + "line": 168, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "name@fictional.invalid", + "line": 173, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "nom@fictif.invalid", + "line": 178, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "name@fictional.invalid", + "line": 183, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + } + ], + "file_count": 644, + "issue_register_path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.6.csv", + "issue_register_rows": 47, + "json_files_parsed": 47, + "release_gate_path": "docs/phase16/FINAL_RELEASE_GATE_MATRIX_v1.0.csv", + "release_gate_status_counts": { + "Approved": 3, + "Blocked pending evidence": 29 + }, + "runtime_url_hits": [ + { + "line": 2, + "path": ".env.example", + "url": "https://your-approved-domain.example" + }, + { + "line": 6, + "path": "src/lib/localization/site-origin.ts", + "url": "http://localhost:3000" + }, + { + "line": 2, + "path": "src/contracts/phase9/design-tokens.json", + "url": "https://design-tokens.github.io/community-group/format/" + } + ], + "secret_scan_files": 508, + "suffix_counts": { + ".css": 48, + ".csv": 81, + ".duration": 8, + ".example": 1, + ".exit": 26, + ".js": 1, + ".json": 47, + ".log": 82, + ".md": 135, + ".mjs": 39, + ".png": 6, + ".py": 3, + ".svg": 2, + ".ts": 76, + ".tsx": 66, + ".txt": 10, + ".yaml": 2, + ".yml": 2, + "": 9 + }, + "total_bytes": 2655392, + "unresolved_issue_counts": { + "Critical": 1, + "High": 21, + "Low": 2, + "Medium": 17 + } + }, + "passed": true, + "root": "/mnt/data/phase16_work/RentalDriveGo_Phase16_Repository_v1.0", + "schema_version": "1.0" +} diff --git a/docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md b/docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md new file mode 100644 index 0000000..ca2bbdf --- /dev/null +++ b/docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md @@ -0,0 +1,574 @@ +# Phase 16 Static Repository Audit + +- Result: **PASS** +- Files inspected: 644 +- JSON files parsed: 47 +- CSV files parsed: 81 +- Secret-scan files: 508 +- Findings: {} + +## Findings + +No Critical, High, Medium, Low, or informational findings were produced by this audit. + +## Metrics + +```json +{ + "csv_files_parsed": 81, + "direct_dependencies_exact": true, + "direct_dependency_count": 25, + "email_fixture_hits": [ + { + "address": "avery@example.test", + "line": 21, + "path": "tests/integration/demo-service.test.ts" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 6, + "path": "tests/unit/integrations/demo-schema.test.ts" + }, + { + "address": "ada@example.test", + "line": 22, + "path": "tests/unit/integrations/demo-schema.test.ts" + }, + { + "address": "person@example.test", + "line": 20, + "path": "tests/unit/integrations/analytics.test.ts" + }, + { + "address": "person@example.test", + "line": 9, + "path": "tests/unit/integrations/redaction.test.ts" + }, + { + "address": "avery@example.test", + "line": 36, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "avery@example.test", + "line": 53, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "private@example.test", + "line": 66, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "name@fictional.invalid", + "line": 47, + "path": "src/content/development/component-lab.ts" + }, + { + "address": "nom@fictif.invalid", + "line": 158, + "path": "src/content/development/component-lab.ts" + }, + { + "address": "name@fictional.invalid", + "line": 281, + "path": "src/content/development/component-lab.ts" + }, + { + "address": "avery@example.test", + "line": 11, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 16, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "ada@example.test", + "line": 21, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "person@example.test", + "line": 26, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "person@example.test", + "line": 31, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 36, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 41, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "private@example.test", + "line": 46, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "name@fictional.invalid", + "line": 51, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "nom@fictif.invalid", + "line": 56, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "name@fictional.invalid", + "line": 61, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 23, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 28, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "ada@example.test", + "line": 33, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "person@example.test", + "line": 38, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "person@example.test", + "line": 43, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "avery@example.test", + "line": 48, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "avery@example.test", + "line": 53, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "private@example.test", + "line": 58, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "name@fictional.invalid", + "line": 63, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "nom@fictif.invalid", + "line": 68, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "name@fictional.invalid", + "line": 73, + "path": "docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "avery@example.test", + "line": 11, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 16, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "ada@example.test", + "line": 21, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "person@example.test", + "line": 26, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "person@example.test", + "line": 31, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 36, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 41, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "private@example.test", + "line": 46, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "name@fictional.invalid", + "line": 51, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "nom@fictif.invalid", + "line": 56, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "name@fictional.invalid", + "line": 61, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 66, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 71, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "ada@example.test", + "line": 76, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "person@example.test", + "line": 81, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "person@example.test", + "line": 86, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 91, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 96, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "private@example.test", + "line": 101, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "name@fictional.invalid", + "line": 106, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "nom@fictif.invalid", + "line": 111, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "name@fictional.invalid", + "line": 116, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 121, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 126, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "ada@example.test", + "line": 131, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "person@example.test", + "line": 136, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "person@example.test", + "line": 141, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 146, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 151, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "private@example.test", + "line": 156, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "name@fictional.invalid", + "line": 161, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "nom@fictif.invalid", + "line": 166, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "name@fictional.invalid", + "line": 171, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.json" + }, + { + "address": "avery@example.test", + "line": 23, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 28, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "ada@example.test", + "line": 33, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "person@example.test", + "line": 38, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "person@example.test", + "line": 43, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "avery@example.test", + "line": 48, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "avery@example.test", + "line": 53, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "private@example.test", + "line": 58, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "name@fictional.invalid", + "line": 63, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "nom@fictif.invalid", + "line": 68, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "name@fictional.invalid", + "line": 73, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "avery@example.test", + "line": 78, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 83, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "ada@example.test", + "line": 88, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "person@example.test", + "line": 93, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "person@example.test", + "line": 98, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "avery@example.test", + "line": 103, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "avery@example.test", + "line": 108, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "private@example.test", + "line": 113, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "name@fictional.invalid", + "line": 118, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "nom@fictif.invalid", + "line": 123, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "name@fictional.invalid", + "line": 128, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "avery@example.test", + "line": 133, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 138, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "ada@example.test", + "line": 143, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "person@example.test", + "line": 148, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "person@example.test", + "line": 153, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "avery@example.test", + "line": 158, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "avery@example.test", + "line": 163, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "private@example.test", + "line": 168, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "name@fictional.invalid", + "line": 173, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "nom@fictif.invalid", + "line": 178, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + }, + { + "address": "name@fictional.invalid", + "line": 183, + "path": "docs/quality/PHASE_16_FINAL_STATIC_AUDIT_RESULTS_v1.0.md" + } + ], + "file_count": 644, + "issue_register_path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.6.csv", + "issue_register_rows": 47, + "json_files_parsed": 47, + "release_gate_path": "docs/phase16/FINAL_RELEASE_GATE_MATRIX_v1.0.csv", + "release_gate_status_counts": { + "Approved": 3, + "Blocked pending evidence": 29 + }, + "runtime_url_hits": [ + { + "line": 2, + "path": ".env.example", + "url": "https://your-approved-domain.example" + }, + { + "line": 6, + "path": "src/lib/localization/site-origin.ts", + "url": "http://localhost:3000" + }, + { + "line": 2, + "path": "src/contracts/phase9/design-tokens.json", + "url": "https://design-tokens.github.io/community-group/format/" + } + ], + "secret_scan_files": 508, + "suffix_counts": { + ".css": 48, + ".csv": 81, + ".duration": 8, + ".example": 1, + ".exit": 26, + ".js": 1, + ".json": 47, + ".log": 82, + ".md": 135, + ".mjs": 39, + ".png": 6, + ".py": 3, + ".svg": 2, + ".ts": 76, + ".tsx": 66, + ".txt": 10, + ".yaml": 2, + ".yml": 2, + "": 9 + }, + "total_bytes": 2655392, + "unresolved_issue_counts": { + "Critical": 1, + "High": 21, + "Low": 2, + "Medium": 17 + } +} +``` diff --git a/docs/quality/PHASE_16_LOCAL_COMMAND_RESULTS_v1.0.json b/docs/quality/PHASE_16_LOCAL_COMMAND_RESULTS_v1.0.json new file mode 100644 index 0000000..f3227ba --- /dev/null +++ b/docs/quality/PHASE_16_LOCAL_COMMAND_RESULTS_v1.0.json @@ -0,0 +1,182 @@ +[ + { + "name": "01-phase15-manifest", + "command": "node scripts/validate-phase15-manifest.mjs", + "start_epoch": 1782431606.8168576, + "end_epoch": 1782431607.0603523, + "duration_seconds": 0.243, + "exit_code": 0, + "result": "Passed", + "log": "docs/quality/phase16-command-logs/01-phase15-manifest.log" + }, + { + "name": "02-validations", + "command": "node scripts/run-validations.mjs", + "start_epoch": 1782431607.0615966, + "end_epoch": 1782431608.6426542, + "duration_seconds": 1.581, + "exit_code": 0, + "result": "Passed", + "log": "docs/quality/phase16-command-logs/02-validations.log" + }, + { + "name": "03-phase15-readiness", + "command": "node scripts/validate-phase15-readiness.mjs", + "start_epoch": 1782431608.6430712, + "end_epoch": 1782431608.7261708, + "duration_seconds": 0.083, + "exit_code": 0, + "result": "Passed", + "log": "docs/quality/phase16-command-logs/03-phase15-readiness.log" + }, + { + "name": "04-static-audit", + "command": "python3 scripts/phase15-static-audit.py --json-output docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json --markdown-output docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md", + "start_epoch": 1782431608.7265477, + "end_epoch": 1782431610.251834, + "duration_seconds": 1.525, + "exit_code": 0, + "result": "Passed", + "log": "docs/quality/phase16-command-logs/04-static-audit.log" + }, + { + "name": "05-phase14-integrations", + "command": "node scripts/validate-phase14-integrations.mjs", + "start_epoch": 1782431610.2522087, + "end_epoch": 1782431610.330689, + "duration_seconds": 0.078, + "exit_code": 0, + "result": "Passed", + "log": "docs/quality/phase16-command-logs/05-phase14-integrations.log" + }, + { + "name": "06-phase14-environment", + "command": "node scripts/validate-phase14-environment.mjs", + "start_epoch": 1782431610.330972, + "end_epoch": 1782431610.400568, + "duration_seconds": 0.07, + "exit_code": 0, + "result": "Passed", + "log": "docs/quality/phase16-command-logs/06-phase14-environment.log" + }, + { + "name": "07-phase14-security", + "command": "node scripts/validate-phase14-security.mjs", + "start_epoch": 1782431610.4008532, + "end_epoch": 1782431610.4712098, + "duration_seconds": 0.07, + "exit_code": 0, + "result": "Passed", + "log": "docs/quality/phase16-command-logs/07-phase14-security.log" + }, + { + "name": "08-phase14-privacy", + "command": "node scripts/validate-phase14-privacy.mjs", + "start_epoch": 1782431610.4714422, + "end_epoch": 1782431610.5439904, + "duration_seconds": 0.073, + "exit_code": 0, + "result": "Passed", + "log": "docs/quality/phase16-command-logs/08-phase14-privacy.log" + }, + { + "name": "09-syntax-check", + "command": "find scripts -name '*.mjs' -print0 | xargs -0 -n1 node --check", + "start_epoch": 1782431610.5443811, + "end_epoch": 1782431612.3465776, + "duration_seconds": 1.802, + "exit_code": 0, + "result": "Passed", + "log": "docs/quality/phase16-command-logs/09-syntax-check.log" + }, + { + "name": "13-contract-validation", + "command": "node scripts/validate-phase9-contract.mjs", + "start_epoch": 1782431674.6306887, + "end_epoch": 1782431674.8194394, + "duration_seconds": 0.189, + "exit_code": 0, + "result": "Passed", + "log": "docs/quality/phase16-command-logs/13-contract-validation.log" + }, + { + "name": "14-token-validation", + "command": "node scripts/validate-tokens.mjs", + "start_epoch": 1782431674.8199482, + "end_epoch": 1782431674.932933, + "duration_seconds": 0.113, + "exit_code": 0, + "result": "Passed", + "log": "docs/quality/phase16-command-logs/14-token-validation.log" + }, + { + "name": "15-locale-validation", + "command": "node scripts/validate-locales.mjs", + "start_epoch": 1782431674.93337, + "end_epoch": 1782431675.0189438, + "duration_seconds": 0.086, + "exit_code": 0, + "result": "Passed", + "log": "docs/quality/phase16-command-logs/15-locale-validation.log" + }, + { + "name": "16-route-validation", + "command": "node scripts/validate-routes.mjs", + "start_epoch": 1782431675.019326, + "end_epoch": 1782431675.0961354, + "duration_seconds": 0.077, + "exit_code": 0, + "result": "Passed", + "log": "docs/quality/phase16-command-logs/16-route-validation.log" + }, + { + "name": "17-css-rtl-validation", + "command": "node scripts/validate-css-logical.mjs", + "start_epoch": 1782431675.096504, + "end_epoch": 1782431675.2137945, + "duration_seconds": 0.117, + "exit_code": 0, + "result": "Passed", + "log": "docs/quality/phase16-command-logs/17-css-rtl-validation.log" + }, + { + "name": "18-content-claims-validation", + "command": "node scripts/validate-prohibited-content.mjs", + "start_epoch": 1782431675.2142003, + "end_epoch": 1782431675.3477397, + "duration_seconds": 0.134, + "exit_code": 0, + "result": "Passed", + "log": "docs/quality/phase16-command-logs/18-content-claims-validation.log" + }, + { + "name": "19-metadata-validation", + "command": "node scripts/validate-metadata.mjs", + "start_epoch": 1782431675.3480766, + "end_epoch": 1782431675.424533, + "duration_seconds": 0.076, + "exit_code": 0, + "result": "Passed", + "log": "docs/quality/phase16-command-logs/19-metadata-validation.log" + }, + { + "name": "20-component-validation", + "command": "node scripts/validate-phase12-components.mjs", + "start_epoch": 1782431675.4248092, + "end_epoch": 1782431675.5411427, + "duration_seconds": 0.116, + "exit_code": 0, + "result": "Passed", + "log": "docs/quality/phase16-command-logs/20-component-validation.log" + }, + { + "name": "21-homepage-validation", + "command": "node scripts/validate-phase13-homepage.mjs", + "start_epoch": 1782431675.5414987, + "end_epoch": 1782431675.622236, + "duration_seconds": 0.081, + "exit_code": 0, + "result": "Passed", + "log": "docs/quality/phase16-command-logs/21-homepage-validation.log" + } +] \ No newline at end of file diff --git a/docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json b/docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json new file mode 100644 index 0000000..119848e --- /dev/null +++ b/docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.json @@ -0,0 +1,126 @@ +{ + "audit": "Phase 15 dependency-free static repository audit", + "finding_counts": {}, + "findings": [], + "metrics": { + "csv_files_parsed": 51, + "direct_dependencies_exact": true, + "direct_dependency_count": 25, + "email_fixture_hits": [ + { + "address": "avery@example.test", + "line": 21, + "path": "tests/integration/demo-service.test.ts" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 6, + "path": "tests/unit/integrations/demo-schema.test.ts" + }, + { + "address": "ada@example.test", + "line": 22, + "path": "tests/unit/integrations/demo-schema.test.ts" + }, + { + "address": "person@example.test", + "line": 20, + "path": "tests/unit/integrations/analytics.test.ts" + }, + { + "address": "person@example.test", + "line": 9, + "path": "tests/unit/integrations/redaction.test.ts" + }, + { + "address": "avery@example.test", + "line": 36, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "avery@example.test", + "line": 53, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "private@example.test", + "line": 66, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "name@fictional.invalid", + "line": 47, + "path": "src/content/development/component-lab.ts" + }, + { + "address": "nom@fictif.invalid", + "line": 158, + "path": "src/content/development/component-lab.ts" + }, + { + "address": "name@fictional.invalid", + "line": 281, + "path": "src/content/development/component-lab.ts" + } + ], + "file_count": 549, + "issue_register_path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.5.csv", + "issue_register_rows": 47, + "json_files_parsed": 44, + "release_gate_path": "docs/phase15/RELEASE_GATE_MATRIX_v1.0.csv", + "release_gate_status_counts": { + "Blocked": 16, + "Open": 1, + "Passed": 3 + }, + "runtime_url_hits": [ + { + "line": 2, + "path": ".env.example", + "url": "https://your-approved-domain.example" + }, + { + "line": 6, + "path": "src/lib/localization/site-origin.ts", + "url": "http://localhost:3000" + }, + { + "line": 2, + "path": "src/contracts/phase9/design-tokens.json", + "url": "https://design-tokens.github.io/community-group/format/" + } + ], + "secret_scan_files": 435, + "suffix_counts": { + ".css": 48, + ".csv": 51, + ".duration": 8, + ".example": 1, + ".exit": 24, + ".js": 1, + ".json": 44, + ".log": 63, + ".md": 98, + ".mjs": 36, + ".png": 6, + ".py": 2, + ".svg": 2, + ".ts": 76, + ".tsx": 66, + ".txt": 10, + ".yaml": 2, + ".yml": 2, + "": 9 + }, + "total_bytes": 2491857, + "unresolved_issue_counts": { + "Critical": 1, + "High": 21, + "Low": 2, + "Medium": 17 + } + }, + "passed": true, + "root": "/mnt/data/phase16_work/RentalDriveGo_Phase15_Repository_v1.0", + "schema_version": "1.0" +} diff --git a/docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md b/docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md new file mode 100644 index 0000000..3ec73b2 --- /dev/null +++ b/docs/quality/PHASE_16_STATIC_AUDIT_RESULTS_v1.0.md @@ -0,0 +1,135 @@ +# Phase 15 Static Repository Audit + +- Result: **PASS** +- Files inspected: 549 +- JSON files parsed: 44 +- CSV files parsed: 51 +- Secret-scan files: 435 +- Findings: {} + +## Findings + +No Critical, High, Medium, Low, or informational findings were produced by this audit. + +## Metrics + +```json +{ + "csv_files_parsed": 51, + "direct_dependencies_exact": true, + "direct_dependency_count": 25, + "email_fixture_hits": [ + { + "address": "avery@example.test", + "line": 21, + "path": "tests/integration/demo-service.test.ts" + }, + { + "address": "ADA@EXAMPLE.TEST", + "line": 6, + "path": "tests/unit/integrations/demo-schema.test.ts" + }, + { + "address": "ada@example.test", + "line": 22, + "path": "tests/unit/integrations/demo-schema.test.ts" + }, + { + "address": "person@example.test", + "line": 20, + "path": "tests/unit/integrations/analytics.test.ts" + }, + { + "address": "person@example.test", + "line": 9, + "path": "tests/unit/integrations/redaction.test.ts" + }, + { + "address": "avery@example.test", + "line": 36, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "avery@example.test", + "line": 53, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "private@example.test", + "line": 66, + "path": "tests/browser/integrations/demo-workflow.spec.ts" + }, + { + "address": "name@fictional.invalid", + "line": 47, + "path": "src/content/development/component-lab.ts" + }, + { + "address": "nom@fictif.invalid", + "line": 158, + "path": "src/content/development/component-lab.ts" + }, + { + "address": "name@fictional.invalid", + "line": 281, + "path": "src/content/development/component-lab.ts" + } + ], + "file_count": 549, + "issue_register_path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.5.csv", + "issue_register_rows": 47, + "json_files_parsed": 44, + "release_gate_path": "docs/phase15/RELEASE_GATE_MATRIX_v1.0.csv", + "release_gate_status_counts": { + "Blocked": 16, + "Open": 1, + "Passed": 3 + }, + "runtime_url_hits": [ + { + "line": 2, + "path": ".env.example", + "url": "https://your-approved-domain.example" + }, + { + "line": 6, + "path": "src/lib/localization/site-origin.ts", + "url": "http://localhost:3000" + }, + { + "line": 2, + "path": "src/contracts/phase9/design-tokens.json", + "url": "https://design-tokens.github.io/community-group/format/" + } + ], + "secret_scan_files": 435, + "suffix_counts": { + ".css": 48, + ".csv": 51, + ".duration": 8, + ".example": 1, + ".exit": 24, + ".js": 1, + ".json": 44, + ".log": 63, + ".md": 98, + ".mjs": 36, + ".png": 6, + ".py": 2, + ".svg": 2, + ".ts": 76, + ".tsx": 66, + ".txt": 10, + ".yaml": 2, + ".yml": 2, + "": 9 + }, + "total_bytes": 2491857, + "unresolved_issue_counts": { + "Critical": 1, + "High": 21, + "Low": 2, + "Medium": 17 + } +} +``` diff --git a/docs/quality/logs/phase14/format-check-initial.duration b/docs/quality/logs/phase14/format-check-initial.duration new file mode 100644 index 0000000..b8626c4 --- /dev/null +++ b/docs/quality/logs/phase14/format-check-initial.duration @@ -0,0 +1 @@ +4 diff --git a/docs/quality/logs/phase14/format-check-initial.exit b/docs/quality/logs/phase14/format-check-initial.exit new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/docs/quality/logs/phase14/format-check-initial.exit @@ -0,0 +1 @@ +1 diff --git a/docs/quality/logs/phase14/format-check.duration b/docs/quality/logs/phase14/format-check.duration new file mode 100644 index 0000000..00750ed --- /dev/null +++ b/docs/quality/logs/phase14/format-check.duration @@ -0,0 +1 @@ +3 diff --git a/docs/quality/logs/phase14/format-check.exit b/docs/quality/logs/phase14/format-check.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/docs/quality/logs/phase14/format-check.exit @@ -0,0 +1 @@ +0 diff --git a/docs/quality/logs/phase14/format-write.exit b/docs/quality/logs/phase14/format-write.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/docs/quality/logs/phase14/format-write.exit @@ -0,0 +1 @@ +0 diff --git a/docs/quality/logs/phase14/lint-initial.duration b/docs/quality/logs/phase14/lint-initial.duration new file mode 100644 index 0000000..b4de394 --- /dev/null +++ b/docs/quality/logs/phase14/lint-initial.duration @@ -0,0 +1 @@ +11 diff --git a/docs/quality/logs/phase14/lint-initial.exit b/docs/quality/logs/phase14/lint-initial.exit new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/docs/quality/logs/phase14/lint-initial.exit @@ -0,0 +1 @@ +1 diff --git a/docs/quality/logs/phase14/lint.duration b/docs/quality/logs/phase14/lint.duration new file mode 100644 index 0000000..f599e28 --- /dev/null +++ b/docs/quality/logs/phase14/lint.duration @@ -0,0 +1 @@ +10 diff --git a/docs/quality/logs/phase14/lint.exit b/docs/quality/logs/phase14/lint.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/docs/quality/logs/phase14/lint.exit @@ -0,0 +1 @@ +0 diff --git a/docs/quality/logs/phase14/next-typegen.exit b/docs/quality/logs/phase14/next-typegen.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/docs/quality/logs/phase14/next-typegen.exit @@ -0,0 +1 @@ +0 diff --git a/docs/quality/logs/phase14/npm-install-baseline.exit b/docs/quality/logs/phase14/npm-install-baseline.exit new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/docs/quality/logs/phase14/npm-install-baseline.exit @@ -0,0 +1 @@ +1 diff --git a/docs/quality/logs/phase14/npm-install-offline.duration b/docs/quality/logs/phase14/npm-install-offline.duration new file mode 100644 index 0000000..b6a7d89 --- /dev/null +++ b/docs/quality/logs/phase14/npm-install-offline.duration @@ -0,0 +1 @@ +16 diff --git a/docs/quality/logs/phase14/npm-install-offline.exit b/docs/quality/logs/phase14/npm-install-offline.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/docs/quality/logs/phase14/npm-install-offline.exit @@ -0,0 +1 @@ +0 diff --git a/docs/quality/logs/phase14/static-validations.duration b/docs/quality/logs/phase14/static-validations.duration new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/docs/quality/logs/phase14/static-validations.duration @@ -0,0 +1 @@ +2 diff --git a/docs/quality/logs/phase14/static-validations.exit b/docs/quality/logs/phase14/static-validations.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/docs/quality/logs/phase14/static-validations.exit @@ -0,0 +1 @@ +0 diff --git a/docs/quality/logs/phase14/typecheck-initial.duration b/docs/quality/logs/phase14/typecheck-initial.duration new file mode 100644 index 0000000..45a4fb7 --- /dev/null +++ b/docs/quality/logs/phase14/typecheck-initial.duration @@ -0,0 +1 @@ +8 diff --git a/docs/quality/logs/phase14/typecheck-initial.exit b/docs/quality/logs/phase14/typecheck-initial.exit new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/docs/quality/logs/phase14/typecheck-initial.exit @@ -0,0 +1 @@ +2 diff --git a/docs/quality/logs/phase14/typecheck.duration b/docs/quality/logs/phase14/typecheck.duration new file mode 100644 index 0000000..45a4fb7 --- /dev/null +++ b/docs/quality/logs/phase14/typecheck.duration @@ -0,0 +1 @@ +8 diff --git a/docs/quality/logs/phase14/typecheck.exit b/docs/quality/logs/phase14/typecheck.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/docs/quality/logs/phase14/typecheck.exit @@ -0,0 +1 @@ +0 diff --git a/docs/quality/phase15-command-logs/01-validate.json b/docs/quality/phase15-command-logs/01-validate.json new file mode 100644 index 0000000..7ba2bb6 --- /dev/null +++ b/docs/quality/phase15-command-logs/01-validate.json @@ -0,0 +1 @@ +{"command":"node scripts/run-validations.mjs","exit_code":0,"wall_seconds":1,"log":"docs/quality/phase15-command-logs/01-validate.log"} diff --git a/docs/quality/phase15-command-logs/06-current-validations.exit b/docs/quality/phase15-command-logs/06-current-validations.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/docs/quality/phase15-command-logs/06-current-validations.exit @@ -0,0 +1 @@ +0 diff --git a/docs/quality/phase15-command-logs/07-current-static-audit.exit b/docs/quality/phase15-command-logs/07-current-static-audit.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/docs/quality/phase15-command-logs/07-current-static-audit.exit @@ -0,0 +1 @@ +0 diff --git a/docs/quality/phase15-command-logs/08-content-type-behavior.exit b/docs/quality/phase15-command-logs/08-content-type-behavior.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/docs/quality/phase15-command-logs/08-content-type-behavior.exit @@ -0,0 +1 @@ +0 diff --git a/docs/quality/phase15-command-logs/09-syntax-check.exit b/docs/quality/phase15-command-logs/09-syntax-check.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/docs/quality/phase15-command-logs/09-syntax-check.exit @@ -0,0 +1 @@ +0 diff --git a/docs/quality/phase16-command-logs/11-corepack-prepare-pnpm.exit b/docs/quality/phase16-command-logs/11-corepack-prepare-pnpm.exit new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/docs/quality/phase16-command-logs/11-corepack-prepare-pnpm.exit @@ -0,0 +1 @@ +1 diff --git a/docs/quality/phase16-command-logs/22-final-validations.exit b/docs/quality/phase16-command-logs/22-final-validations.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/docs/quality/phase16-command-logs/22-final-validations.exit @@ -0,0 +1 @@ +0 diff --git a/next-env.d.ts b/next-env.d.ts index 9edff1c..c4b7818 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,6 +1,6 @@ /// /// -import "./.next/types/routes.d.ts"; +import "./.next/dev/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/package.json b/package.json index 5deb9e8..b7737bb 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "rentaldrivego-web", - "version": "0.4.0", + "version": "0.7.0", "private": true, - "description": "Phase 13 multilingual homepage assembly for the RentalDriveGo marketing website.", + "description": "Phase 16 production launch governance, evidence controls, and explicit no-go release package for RentalDriveGo.", "license": "UNLICENSED", "packageManager": "pnpm@11.9.0", "engines": { @@ -16,8 +16,8 @@ "lint": "eslint . --max-warnings=0", "format": "prettier --write .", "format:check": "prettier --check .", - "typecheck": "tsc --noEmit", - "test:unit": "vitest run --coverage", + "typecheck": "next typegen && node scripts/prepare-typecheck.mjs && tsc --noEmit", + "test:unit": "vitest run --coverage --maxWorkers=1 --no-file-parallelism", "test:unit:watch": "vitest", "test:browser": "playwright test tests/browser", "test:a11y": "playwright test tests/a11y", @@ -33,12 +33,24 @@ "validate": "node scripts/run-validations.mjs", "audit": "pnpm audit --audit-level low", "check": "node scripts/run-checks.mjs", - "manifest:generate": "node scripts/generate-phase13-manifest.mjs", - "validate:package": "node scripts/validate-phase13-manifest.mjs", + "manifest:generate": "node scripts/generate-phase16-manifest.mjs", + "validate:package": "node scripts/validate-phase16-manifest.mjs", "validate:foundation": "node scripts/validate-phase11-foundation.mjs", "validate:metadata": "node scripts/validate-metadata.mjs", "validate:components": "node scripts/validate-phase12-components.mjs", - "validate:homepage": "node scripts/validate-phase13-homepage.mjs" + "validate:homepage": "node scripts/validate-phase13-homepage.mjs", + "test:integration": "vitest run --config vitest.integration.config.ts --maxWorkers=1 --no-file-parallelism", + "validate:destinations": "node scripts/validate-phase14-integrations.mjs", + "validate:environment": "node scripts/validate-phase14-environment.mjs", + "validate:form": "node scripts/validate-phase14-integrations.mjs", + "validate:analytics": "node scripts/validate-phase14-privacy.mjs", + "test:security": "node scripts/validate-phase14-security.mjs", + "test:privacy": "node scripts/validate-phase14-privacy.mjs", + "validate:integrations": "node scripts/validate-phase14-integrations.mjs", + "validate:phase14": "node scripts/validate-phase14-integrations.mjs && node scripts/validate-phase14-environment.mjs && node scripts/validate-phase14-security.mjs && node scripts/validate-phase14-privacy.mjs", + "validate:phase15": "node scripts/validate-phase15-readiness.mjs", + "audit:static": "python3 scripts/phase15-static-audit.py --json-output docs/quality/PHASE_15_STATIC_AUDIT_RESULTS_v1.0.json --markdown-output docs/quality/PHASE_15_STATIC_AUDIT_RESULTS_v1.0.md", + "validate:phase16": "node scripts/validate-phase16-readiness.mjs" }, "dependencies": { "@fontsource-variable/inter": "5.2.8", diff --git a/playwright.config.ts b/playwright.config.ts index d64f462..39ab4a6 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -6,6 +6,7 @@ const serverCommand = process.env.PLAYWRIGHT_SERVER_COMMAND ?? 'pnpm start'; export default defineConfig({ testDir: './tests', + testMatch: ['browser/**/*.spec.ts', 'a11y/**/*.spec.ts', 'visual/**/*.spec.ts'], fullyParallel: true, forbidOnly: Boolean(process.env.CI), retries: process.env.CI ? 2 : 0, @@ -50,6 +51,11 @@ export default defineConfig({ SITE_ORIGIN: baseURL, PUBLIC_RELEASE_APPROVED: 'false', COMPONENT_FIXTURES_ENABLED: 'true', + NEXT_PUBLIC_DEMO_ENABLED: 'true', + DEMO_SUBMISSION_MODE: 'local', + DEMO_LOCAL_TEST_MODE: 'true', + DEMO_TEST_SCENARIOS_ENABLED: 'true', + NEXT_PUBLIC_ANALYTICS_MODE: 'disabled', HOSTNAME: '127.0.0.1', PORT: '3000', }, diff --git a/scripts/generate-phase14-manifest.mjs b/scripts/generate-phase14-manifest.mjs new file mode 100644 index 0000000..f88f53b --- /dev/null +++ b/scripts/generate-phase14-manifest.mjs @@ -0,0 +1,56 @@ +import { createHash } from 'node:crypto'; +import { readFile, readdir, stat, writeFile } from 'node:fs/promises'; +import path from 'node:path'; + +const root = path.resolve(import.meta.dirname, '..'); +const manifestPath = path.join(root, 'PHASE_14_PACKAGE_MANIFEST_v1.0.json'); +const excludedDirectories = new Set([ + '.git', + '.next', + 'node_modules', + 'coverage', + 'playwright-report', + 'test-results', +]); +const excludedFiles = new Set([ + 'PHASE_14_PACKAGE_MANIFEST_v1.0.json', + 'package-lock.json', + 'tsconfig.tsbuildinfo', +]); + +async function walk(directory) { + const files = []; + for (const entry of await readdir(directory, { withFileTypes: true })) { + if (entry.isDirectory() && excludedDirectories.has(entry.name)) continue; + const fullPath = path.join(directory, entry.name); + if (entry.isDirectory()) files.push(...(await walk(fullPath))); + else { + const relative = path.relative(root, fullPath).split(path.sep).join('/'); + if (!excludedFiles.has(relative)) files.push({ fullPath, relative }); + } + } + return files; +} + +const files = (await walk(root)).sort((a, b) => a.relative.localeCompare(b.relative)); +const entries = []; +for (const file of files) { + const contents = await readFile(file.fullPath); + const details = await stat(file.fullPath); + entries.push({ + path: file.relative, + bytes: details.size, + sha256: createHash('sha256').update(contents).digest('hex'), + }); +} +const manifest = { + schema_version: '1.0', + project: 'RentalDriveGo', + phase: 14, + generated_at: '2026-06-25', + excludes: [...excludedDirectories, ...excludedFiles], + file_count: entries.length, + files: entries, +}; +await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`); +console.log(`Generated Phase 14 manifest for ${entries.length} files.`); diff --git a/scripts/generate-phase15-manifest.mjs b/scripts/generate-phase15-manifest.mjs new file mode 100644 index 0000000..a942a2d --- /dev/null +++ b/scripts/generate-phase15-manifest.mjs @@ -0,0 +1,58 @@ +import { createHash } from 'node:crypto'; +import { readFile, readdir, stat, writeFile } from 'node:fs/promises'; +import path from 'node:path'; + +const root = path.resolve(import.meta.dirname, '..'); +const manifestPath = path.join(root, 'PHASE_15_PACKAGE_MANIFEST_v1.0.json'); +const excludedDirectories = new Set([ + '.git', + '.next', + 'node_modules', + 'coverage', + 'playwright-report', + 'test-results', + '__pycache__', +]); +const excludedFiles = new Set([ + 'PHASE_15_PACKAGE_MANIFEST_v1.0.json', + 'package-lock.json', + 'tsconfig.tsbuildinfo', + 'docs/quality/phase15-command-logs/12-phase15-package-manifest.log', +]); + +async function walk(directory) { + const files = []; + for (const entry of await readdir(directory, { withFileTypes: true })) { + if (entry.isDirectory() && excludedDirectories.has(entry.name)) continue; + const fullPath = path.join(directory, entry.name); + if (entry.isDirectory()) files.push(...(await walk(fullPath))); + else { + const relative = path.relative(root, fullPath).split(path.sep).join('/'); + if (!excludedFiles.has(relative)) files.push({ fullPath, relative }); + } + } + return files; +} + +const files = (await walk(root)).sort((a, b) => a.relative.localeCompare(b.relative)); +const entries = []; +for (const file of files) { + const contents = await readFile(file.fullPath); + const details = await stat(file.fullPath); + entries.push({ + path: file.relative, + bytes: details.size, + sha256: createHash('sha256').update(contents).digest('hex'), + }); +} +const manifest = { + schema_version: '1.0', + project: 'RentalDriveGo', + phase: 15, + generated_at: '2026-06-25', + excludes: [...excludedDirectories, ...excludedFiles], + file_count: entries.length, + files: entries, +}; +await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`); +console.log(`Generated Phase 15 manifest for ${entries.length} files.`); diff --git a/scripts/generate-phase15-reports.py b/scripts/generate-phase15-reports.py new file mode 100755 index 0000000..0fade0a --- /dev/null +++ b/scripts/generate-phase15-reports.py @@ -0,0 +1,621 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import csv +import json +import platform +import subprocess +from collections import Counter +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +OUT = ROOT / 'docs' / 'phase15' +OUT.mkdir(parents=True, exist_ok=True) +DATE = '2026-06-25' + + +def write(name: str, text: str): + (OUT / name).write_text(text.rstrip() + '\n', encoding='utf-8') + + +def report(title: str, status: str, summary: str, executed: list[str], blocked: list[str], disposition: str, extra: str = '') -> str: + executed_text = '\n'.join(f'- {item}' for item in executed) if executed else '- None.' + blocked_text = '\n'.join(f'- {item}' for item in blocked) if blocked else '- None.' + return f'''# {title} + +**Date:** {DATE} +**Status:** {status} + +## Summary + +{summary} + +## Executed evidence + +{executed_text} + +## Unexecuted or blocked evidence + +{blocked_text} + +## Release disposition + +{disposition} +{extra} +''' + + +def csv_write(name: str, fields: list[str], rows: list[dict[str, str]]): + with (OUT / name).open('w', newline='', encoding='utf-8') as f: + writer = csv.DictWriter(f, fieldnames=fields) + writer.writeheader() + writer.writerows(rows) + + +def read_json(path: str): + return json.loads((ROOT / path).read_text(encoding='utf-8')) + + +def get_version(command: list[str]) -> str: + try: + return subprocess.check_output(command, text=True, stderr=subprocess.STDOUT).strip() + except Exception as exc: + return f'unavailable: {exc}' + + +static_result = read_json('docs/quality/PHASE_15_STATIC_AUDIT_RESULTS_v1.0.json') +baseline_static = read_json('docs/quality/PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.json') +phase14_result = read_json('docs/quality/PHASE_14_VALIDATION_RESULTS_v1.0.json') +with (ROOT / 'docs/IMPLEMENTATION_ISSUE_REGISTER_v1.5.csv').open(newline='', encoding='utf-8-sig') as f: + issues = list(csv.DictReader(f)) +unresolved = [row for row in issues if 'resolved' not in row['Status'].lower()] +unresolved_counts = Counter(row['Severity'] for row in unresolved) + +# Command matrix +command_fields = [ + 'ID','Command','Environment','Status','Exit_code','Duration_seconds','Test_count','Pass_count', + 'Failure_count','Skipped_count','Warning_count','Evidence_path','Related_defects','Notes' +] +command_rows = [ + {'ID':'C15-001','Command':'node scripts/validate-phase14-manifest.mjs','Environment':'Fresh extraction of supplied Phase 14 ZIP; Node 22.16.0','Status':'Passed','Exit_code':'0','Duration_seconds':'0.22','Test_count':'466 files','Pass_count':'466','Failure_count':'0','Skipped_count':'0','Warning_count':'0','Evidence_path':'docs/quality/phase15-command-logs/02-phase14-manifest-baseline.log','Related_defects':'','Notes':'Verified the supplied archive before Phase 15 modifications.'}, + {'ID':'C15-002','Command':'corepack prepare pnpm@11.9.0 --activate','Environment':'Debian 13; Node 22.16.0; Corepack 0.32.0; registry DNS unavailable','Status':'Blocked','Exit_code':'1','Duration_seconds':'0.17','Test_count':'1','Pass_count':'0','Failure_count':'1','Skipped_count':'0','Warning_count':'0','Evidence_path':'docs/quality/PHASE_15_TOOLCHAIN_SETUP.log','Related_defects':'P14-009; P15-005','Notes':'Could not download the pinned package manager.'}, + {'ID':'C15-003','Command':'pnpm install --frozen-lockfile','Environment':'Required Node 24.17.0 and pnpm 11.9.0','Status':'Not executed - prerequisite blocked','Exit_code':'','Duration_seconds':'','Test_count':'','Pass_count':'','Failure_count':'','Skipped_count':'','Warning_count':'','Evidence_path':'docs/quality/PHASE_15_TOOLCHAIN_SETUP.log','Related_defects':'P14-009; P15-005','Notes':'No pnpm binary and no registry DNS. No dependency update was attempted.'}, + {'ID':'C15-004','Command':'node scripts/run-validations.mjs','Environment':'Current Phase 15 tree; Node 22.16.0; no installed packages required','Status':'Passed','Exit_code':'0','Duration_seconds':'1.52','Test_count':'16 validators','Pass_count':'16','Failure_count':'0','Skipped_count':'0','Warning_count':'0','Evidence_path':'docs/quality/phase15-command-logs/10-final-validations.log','Related_defects':'P15-001; P15-002; P15-003; P15-004','Notes':'Repository-native dependency-free validators.'}, + {'ID':'C15-005','Command':'python3 scripts/phase15-static-audit.py --root /mnt/data/phase14_baseline','Environment':'Fresh Phase 14 extraction; Python 3.13.5','Status':'Failed as expected - baseline findings','Exit_code':'1','Duration_seconds':'1.37','Test_count':str(baseline_static['metrics']['file_count'])+' files','Pass_count':'','Failure_count':'11 findings','Skipped_count':'0','Warning_count':'0','Evidence_path':'docs/quality/PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.json','Related_defects':'P15-001; P15-002; P15-003; P15-004','Notes':'Found 4 High and 7 Medium defects before fixes.'}, + {'ID':'C15-006','Command':'python3 scripts/phase15-static-audit.py','Environment':'Current Phase 15 tree; Python 3.13.5','Status':'Passed','Exit_code':'0','Duration_seconds':'1.38','Test_count':str(static_result['metrics']['file_count'])+' files','Pass_count':str(static_result['metrics']['file_count']),'Failure_count':'0','Skipped_count':'0','Warning_count':'0','Evidence_path':'docs/quality/phase15-command-logs/13-final-static-audit.log','Related_defects':'P15-001; P15-002; P15-003; P15-004','Notes':'No findings under the same audit after remediation.'}, + {'ID':'C15-007','Command':'node --experimental-strip-types media-type behavior assertions','Environment':'Node 22.16.0','Status':'Passed with runtime warnings','Exit_code':'0','Duration_seconds':'1.37','Test_count':'8 assertions','Pass_count':'8','Failure_count':'0','Skipped_count':'0','Warning_count':'2','Evidence_path':'docs/quality/phase15-command-logs/08-content-type-behavior.log','Related_defects':'P15-002','Notes':'Warnings concern experimental type stripping and do not affect the assertions.'}, + {'ID':'C15-008','Command':'node --check scripts; node --experimental-strip-types --check TypeScript; python3 -m py_compile audit','Environment':'Node 22.16.0; Python 3.13.5','Status':'Passed','Exit_code':'0','Duration_seconds':'6.76','Test_count':'99 files','Pass_count':'99','Failure_count':'0','Skipped_count':'0','Warning_count':'0','Evidence_path':'docs/quality/phase15-command-logs/09-syntax-check.log','Related_defects':'','Notes':'33 JavaScript modules, 64 TypeScript modules, and two Python scripts.'}, +] +blocked_commands = [ + ('C15-009','pnpm format:check','Formatting validation'), + ('C15-010','pnpm lint','ESLint'), + ('C15-011','pnpm typecheck','Next type generation and strict TypeScript'), + ('C15-012','pnpm test:unit','Unit tests and coverage'), + ('C15-013','pnpm test:integration','Integration tests'), + ('C15-014','pnpm test:browser','Functional browser tests'), + ('C15-015','pnpm test:a11y','Automated accessibility tests'), + ('C15-016','pnpm test:visual','Visual-regression tests'), + ('C15-017','pnpm test:e2e','Aggregate Playwright tests'), + ('C15-018','pnpm test:security','Package-script security validation; underlying static validator ran through C15-004'), + ('C15-019','pnpm test:privacy','Package-script privacy validation; underlying static validator ran through C15-004'), + ('C15-020','SITE_ORIGIN=https://approved.example PUBLIC_RELEASE_APPROVED=false pnpm build','Production build'), + ('C15-021','pnpm audit --audit-level low','Registry-backed dependency audit'), + ('C15-022','pnpm exec playwright install --with-deps chromium firefox webkit','Pinned browser installation'), + ('C15-023','Performance audit commands','Lighthouse/Web Vitals and route timing'), + ('C15-024','Production-like deployment and smoke commands','Deployment rehearsal'), + ('C15-025','Rollback platform commands','Rollback rehearsal'), +] +for cid, cmd, note in blocked_commands: + command_rows.append({'ID':cid,'Command':cmd,'Environment':'Exact pinned toolchain and installed dependencies required','Status':'Not executed - clean install blocked','Exit_code':'','Duration_seconds':'','Test_count':'','Pass_count':'','Failure_count':'','Skipped_count':'','Warning_count':'','Evidence_path':'docs/quality/PHASE_15_TOOLCHAIN_SETUP.log','Related_defects':'P15-005','Notes':note}) +command_rows.append({'ID':'C15-026','Command':'node scripts/generate-phase15-manifest.mjs && node scripts/validate-phase15-manifest.mjs','Environment':'Final Phase 15 repository; Node 22.16.0; dependency-free','Status':'Passed','Exit_code':'0','Duration_seconds':'0.52','Test_count':'548 files','Pass_count':'548','Failure_count':'0','Skipped_count':'0','Warning_count':'0','Evidence_path':'docs/quality/phase15-command-logs/12-phase15-package-manifest.log','Related_defects':'','Notes':'The validation log is explicitly excluded from its own manifest to avoid a self-referential checksum.'}) +csv_write('COMMAND_MATRIX_v1.0.csv', command_fields, command_rows) + +# Defect register +fields = ['ID','Summary','Severity','User_impact','Business_impact','Security_impact','Privacy_impact','Accessibility_impact','Affected_locale','Affected_theme','Affected_browser','Affected_viewport','Reproduction_steps','Expected_behavior','Actual_behavior','Evidence','Owner','Status','Release_disposition','Resolution_commit','Retest_result'] +defects = [ + {'ID':'P15-001','Summary':'Two release-evidence CSV files had inconsistent column counts','Severity':'High','User_impact':'Indirect; evidence could be misread or fields shifted','Business_impact':'Release decisions could use corrupted issue or QA records','Security_impact':'None direct','Privacy_impact':'None direct','Accessibility_impact':'None direct','Affected_locale':'All','Affected_theme':'All','Affected_browser':'All','Affected_viewport':'All','Reproduction_steps':'Parse all repository CSV files with a standards-compliant CSV reader','Expected_behavior':'Every row matches the header width','Actual_behavior':'P14-009 had 11 fields instead of 9; P14-M10 had 10 instead of 11','Evidence':'PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.json','Owner':'Engineering + QA','Status':'Resolved','Release_disposition':'Fixed in Phase 15','Resolution_commit':'Unavailable; supplied archive had no Git metadata','Retest_result':'All CSV files parse; C15-004 and C15-006 pass'}, + {'ID':'P15-002','Summary':'Demo API accepted JSON look-alike media types by prefix','Severity':'Medium','User_impact':'Malformed clients could reach JSON parsing instead of receiving 415','Business_impact':'Ambiguous API contract and weaker request validation','Security_impact':'Broader-than-documented content-type acceptance','Privacy_impact':'No direct data exposure identified','Accessibility_impact':'None','Affected_locale':'All','Affected_theme':'All','Affected_browser':'All clients','Affected_viewport':'N/A','Reproduction_steps':'Send Content-Type application/jsonp','Expected_behavior':'415 unsupported_content_type','Actual_behavior':'Prefix check treated it as JSON','Evidence':'PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.json','Owner':'Engineering + Security','Status':'Resolved','Release_disposition':'Fixed in Phase 15','Resolution_commit':'Unavailable; supplied archive had no Git metadata','Retest_result':'Eight dependency-free assertions pass; Vitest regression authored but not run'}, + {'ID':'P15-003','Summary':'Visual tests used a stale theme key and inconsistent snapshot project scope','Severity':'Medium','User_impact':'Dark-mode regressions could be recorded under the wrong theme','Business_impact':'Unreliable visual approval evidence','Security_impact':'None','Privacy_impact':'None','Accessibility_impact':'Theme contrast regressions could be missed','Affected_locale':'EN/FR/AR','Affected_theme':'Dark/system','Affected_browser':'All Playwright projects','Affected_viewport':'Configured visual matrix','Reproduction_steps':'Inspect component-system visual setup and run snapshots outside Chromium','Expected_behavior':'Canonical theme key; canonical Chromium snapshots only','Actual_behavior':'Unused storage key and non-canonical project execution','Evidence':'PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.json','Owner':'Engineering + Design QA','Status':'Resolved','Release_disposition':'Fixed; browser retest still blocked','Resolution_commit':'Unavailable; supplied archive had no Git metadata','Retest_result':'Static regression validator passes; browser snapshots not executed'}, + {'ID':'P15-004','Summary':'CI omitted the demo-service integration test suite','Severity':'High','User_impact':'Server-side conversion failures could merge undetected','Business_impact':'Primary lead workflow lacked CI integration protection','Security_impact':'Adapter error/timeout/idempotency regressions could escape CI','Privacy_impact':'Boundary regressions could escape CI','Accessibility_impact':'None direct','Affected_locale':'All','Affected_theme':'All','Affected_browser':'Server boundary','Affected_viewport':'N/A','Reproduction_steps':'Inspect Phase 14 CI quality job','Expected_behavior':'CI runs pnpm test:integration','Actual_behavior':'Only unit and Playwright suites were configured','Evidence':'PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.json','Owner':'Engineering + QA','Status':'Resolved','Release_disposition':'CI command added; execution pending connected CI','Resolution_commit':'Unavailable; supplied archive had no Git metadata','Retest_result':'Phase 15 validator confirms command presence; integration suite not locally executed'}, + {'ID':'P15-005','Summary':'Final Phase 15 dependency-backed, browser, performance, deployment, rollback, and manual QA evidence is incomplete','Severity':'High','User_impact':'Accessibility, browser, performance, and conversion defects may remain undiscovered','Business_impact':'Release readiness cannot be established','Security_impact':'Dependency and dynamic security checks are stale or absent','Privacy_impact':'Runtime analytics/consent behavior lacks current browser evidence','Accessibility_impact':'Manual WCAG, keyboard, screen-reader, zoom, and reflow evidence absent','Affected_locale':'EN/FR/AR','Affected_theme':'Light/dark/system','Affected_browser':'Chromium/Firefox/WebKit/mobile engines','Affected_viewport':'1440/1024/768/390/320 and zoom states','Reproduction_steps':'Attempt pinned toolchain activation and frozen install','Expected_behavior':'Exact toolchain installs and all Phase 15 gates execute','Actual_behavior':'Host has Node 22.16.0, no pnpm, no registry DNS, and no project dependencies','Evidence':'PHASE_15_TOOLCHAIN_SETUP.log; COMMAND_MATRIX_v1.0.csv','Owner':'Engineering + QA + Accessibility + Security','Status':'Open - environment blocked','Release_disposition':'Blocks Phase 15 acceptance and Phase 16 readiness','Resolution_commit':'N/A','Retest_result':'Not retested; requires connected pinned CI and human QA'}, +] +csv_write('DEFECT_REGISTER_v1.0.csv', fields, defects) + +# Release gates +fields = ['Gate','Severity','Status','Evidence','Owner','Exit_criteria','Accepted_exception'] +gates = [ + {'Gate':'Supplied Phase 14 package integrity','Severity':'High','Status':'Passed','Evidence':'C15-001','Owner':'Engineering','Exit_criteria':'Manifest validates fresh extraction','Accepted_exception':'No'}, + {'Gate':'Phase 15 static validators','Severity':'High','Status':'Passed','Evidence':'C15-004','Owner':'Engineering + QA','Exit_criteria':'All dependency-free validators pass','Accepted_exception':'No'}, + {'Gate':'Repository integrity and secret/PII fixture audit','Severity':'High','Status':'Passed','Evidence':'C15-006','Owner':'Engineering + Security + Privacy','Exit_criteria':'Zero Critical/High/Medium findings','Accepted_exception':'No'}, + {'Gate':'Exact Node 24.17.0 and pnpm 11.9.0 frozen install','Severity':'High','Status':'Blocked','Evidence':'C15-002; C15-003','Owner':'Engineering + Security','Exit_criteria':'Connected clean environment completes frozen install','Accepted_exception':'No'}, + {'Gate':'Format, lint, strict typecheck, unit, integration, and production build on final manifest','Severity':'High','Status':'Blocked','Evidence':'C15-009 through C15-020','Owner':'Engineering + QA','Exit_criteria':'All commands exit zero on final manifest','Accepted_exception':'No'}, + {'Gate':'Dependency and license audit','Severity':'High','Status':'Blocked','Evidence':'C15-021','Owner':'Security + Legal','Exit_criteria':'Registry-backed audit and configured license check pass','Accepted_exception':'No'}, + {'Gate':'Cross-browser functional execution','Severity':'High','Status':'Blocked','Evidence':'C15-014; P14-008','Owner':'QA','Exit_criteria':'Chromium, Firefox, WebKit, mobile Chrome, mobile Safari pass','Accepted_exception':'No'}, + {'Gate':'Automated accessibility execution','Severity':'High','Status':'Blocked','Evidence':'C15-015; P14-008','Owner':'Accessibility + QA','Exit_criteria':'Axe matrix passes with reviewed exceptions','Accepted_exception':'No'}, + {'Gate':'Manual keyboard, screen-reader, zoom, reflow, forced-colors, and RTL review','Severity':'High','Status':'Blocked','Evidence':'MANUAL_TEST_MATRIX_v1.0.csv','Owner':'Accessibility + QA + Localization','Exit_criteria':'Human matrix completed with evidence','Accepted_exception':'No'}, + {'Gate':'Visual-regression baseline generation and approval','Severity':'High','Status':'Blocked','Evidence':'C15-016; VISUAL_REGRESSION_REPORT_v1.0.md','Owner':'Design + QA','Exit_criteria':'Pinned Chromium baselines generated and all diffs reviewed','Accepted_exception':'No'}, + {'Gate':'Performance and bundle budgets','Severity':'High','Status':'Blocked','Evidence':'PERFORMANCE_REPORT_v1.0.md; BUNDLE_ANALYSIS_REPORT_v1.0.md','Owner':'Engineering','Exit_criteria':'Final build measured against approved budgets','Accepted_exception':'No'}, + {'Gate':'Production-like deployment and rollback rehearsal','Severity':'High','Status':'Blocked','Evidence':'DEPLOYMENT_REHEARSAL_REPORT_v1.0.md; ROLLBACK_REHEARSAL_REPORT_v1.0.md','Owner':'Infrastructure + Engineering','Exit_criteria':'Documented rehearsal succeeds and is timed','Accepted_exception':'No'}, + {'Gate':'Approved CRM/lead destination','Severity':'High','Status':'Blocked','Evidence':'P14-001','Owner':'Sales Ops + Engineering','Exit_criteria':'Approved vendor, credentials, mapping, retries, duplicates, sandbox, monitoring','Accepted_exception':'No'}, + {'Gate':'Approved legal/privacy/form processing','Severity':'High','Status':'Blocked','Evidence':'P14-002','Owner':'Legal + Privacy','Exit_criteria':'Localized notice, legal basis, consent, retention, deletion, recipients, transfers approved','Accepted_exception':'No'}, + {'Gate':'Approved analytics provider and consent','Severity':'High','Status':'Blocked','Evidence':'P14-003','Owner':'Analytics + Legal','Exit_criteria':'Provider, DPA, consent, region, retention, event policy approved','Accepted_exception':'No'}, + {'Gate':'Distributed idempotency and abuse controls','Severity':'High','Status':'Blocked','Evidence':'P14-004; P9-002','Owner':'Engineering + Sales Ops','Exit_criteria':'Durable store, rate limit, duplicate policy, monitoring validated','Accepted_exception':'No'}, + {'Gate':'Native French and Arabic review','Severity':'High','Status':'Open','Evidence':'P9-005','Owner':'Localization + Content','Exit_criteria':'Native reviewers approve all visible and metadata strings','Accepted_exception':'No'}, + {'Gate':'Participant and accessibility acceptance research','Severity':'Critical','Status':'Blocked','Evidence':'P9-001','Owner':'Research + Product','Exit_criteria':'Required cohorts completed; S0/S1 findings fixed and retested','Accepted_exception':'No'}, + {'Gate':'Canonical domain, brand assets, and public destinations','Severity':'High','Status':'Blocked','Evidence':'P10-001; P10-002; destination registry','Owner':'Product + Infrastructure + Design','Exit_criteria':'Approved production origin, logo, legal, login, sales, support, tour, pricing destinations','Accepted_exception':'No'}, + {'Gate':'Final source-control commit identity','Severity':'Medium','Status':'Blocked','Evidence':'Supplied ZIP contains no .git metadata','Owner':'Engineering','Exit_criteria':'Commit final manifest and record immutable SHA','Accepted_exception':'No'}, +] +csv_write('RELEASE_GATE_MATRIX_v1.0.csv', fields, gates) +csv_write('RISK_ACCEPTANCE_REGISTER_v1.0.csv', ['ID','Gate','Risk','User_impact','Business_impact','Mitigation','Owner','Approver','Expiration','Required_follow_up'], []) + +# Manual test matrix +manual_fields = ['ID','Area','Platform_or_AT','Locale','Theme','Viewport_or_zoom','Status','Evidence','Blocking_issue'] +manual_rows = [ + {'ID':'M15-001','Area':'Keyboard-only primary demo flow','Platform_or_AT':'Desktop browser','Locale':'en/fr/ar','Theme':'light/dark','Viewport_or_zoom':'1440/390','Status':'Not run','Evidence':'Authored Playwright and component semantics only','Blocking_issue':'P15-005'}, + {'ID':'M15-002','Area':'NVDA flow','Platform_or_AT':'NVDA + Firefox/Chrome on Windows','Locale':'en/ar','Theme':'light/dark','Viewport_or_zoom':'desktop','Status':'Not run','Evidence':'None; human AT required','Blocking_issue':'P15-005'}, + {'ID':'M15-003','Area':'VoiceOver macOS','Platform_or_AT':'VoiceOver + Safari','Locale':'en/ar','Theme':'light/dark','Viewport_or_zoom':'desktop','Status':'Not run','Evidence':'None; human AT required','Blocking_issue':'P15-005'}, + {'ID':'M15-004','Area':'VoiceOver iOS','Platform_or_AT':'VoiceOver + Mobile Safari','Locale':'en/ar','Theme':'system','Viewport_or_zoom':'390-class device','Status':'Not run','Evidence':'None; physical/device lab required','Blocking_issue':'P15-005'}, + {'ID':'M15-005','Area':'TalkBack Android','Platform_or_AT':'TalkBack + Chrome','Locale':'en/ar','Theme':'system','Viewport_or_zoom':'390-class device','Status':'Not run','Evidence':'None; device/emulator required','Blocking_issue':'P15-005'}, + {'ID':'M15-006','Area':'200% and 400% zoom/reflow','Platform_or_AT':'Desktop browsers','Locale':'en/fr/ar','Theme':'light/dark','Viewport_or_zoom':'200%/400%','Status':'Not run','Evidence':'Responsive source and tests authored only','Blocking_issue':'P15-005'}, + {'ID':'M15-007','Area':'Forced colors and reduced motion','Platform_or_AT':'Windows forced colors; reduced-motion media','Locale':'en/fr/ar','Theme':'all','Viewport_or_zoom':'desktop/mobile','Status':'Not run','Evidence':'CSS controls present; human review absent','Blocking_issue':'P15-005'}, + {'ID':'M15-008','Area':'Arabic reading and focus order','Platform_or_AT':'Browser + Arabic screen reader review','Locale':'ar','Theme':'light/dark','Viewport_or_zoom':'1440/390/320','Status':'Not run','Evidence':'Logical CSS validator passes; human review absent','Blocking_issue':'P15-005'}, +] +csv_write('MANUAL_TEST_MATRIX_v1.0.csv', manual_fields, manual_rows) + +# WCAG matrix +wcag_fields = ['Criterion','Level','Applicability','Status','Evidence','Remaining_validation','Related_issue'] +criteria = [ + ('1.1.1 Non-text Content','A','Applicable','Static evidence only','MediaFrame requires alt; icon primitives support accessible names','Browser and screen-reader inspection of every rendered media state','P15-005'), + ('1.3.1 Info and Relationships','A','Applicable','Static evidence only','Semantic landmarks, labels, fieldsets, headings, native dialog','Manual screen-reader verification','P15-005'), + ('1.3.2 Meaningful Sequence','A','Applicable','Static evidence only','DOM order and logical CSS reviewed','EN/FR/AR screen-reader and keyboard order','P15-005'), + ('1.3.3 Sensory Characteristics','A','Applicable','Static evidence only','Instructions do not rely solely on position','Rendered content review','P15-005'), + ('1.4.1 Use of Color','A','Applicable','Static evidence only','Status text/icons accompany semantic color tokens','Manual light/dark/forced-colors review','P15-005'), + ('1.4.3 Contrast Minimum','AA','Applicable','Blocked','Token intent exists','Measured contrast in all states/themes required','P15-005'), + ('1.4.4 Resize Text','AA','Applicable','Blocked','Responsive typography authored','200% browser verification required','P15-005'), + ('1.4.10 Reflow','AA','Applicable','Blocked','320px responsive scenarios authored','400% and narrow viewport execution required','P15-005'), + ('1.4.11 Non-text Contrast','AA','Applicable','Blocked','Focus and border tokens exist','Rendered measurement required','P15-005'), + ('1.4.12 Text Spacing','AA','Applicable','Blocked','Content-driven dimensions used','Text-spacing override test required','P15-005'), + ('1.4.13 Content on Hover or Focus','AA','Applicable','Static evidence only','Tooltip component defined','Keyboard/pointer dismissal and persistence review','P15-005'), + ('2.1.1 Keyboard','A','Applicable','Blocked','Native controls and keyboard tests authored','Full keyboard-only flow required','P15-005'), + ('2.1.2 No Keyboard Trap','A','Applicable','Blocked','Native dialog used','Manual modal/drawer trap and escape review','P15-005'), + ('2.2.1 Timing Adjustable','A','Limited','Static evidence only','No user-facing session timer; bounded server timeout preserves form','Slow completion and retry review','P15-005'), + ('2.2.2 Pause Stop Hide','A','Applicable','Static evidence only','No autoplay media; reduced-motion styles exist','Rendered animation review','P15-005'), + ('2.3.1 Three Flashes','A','Applicable','Static evidence only','No flashing content identified in source','Visual confirmation','P15-005'), + ('2.4.1 Bypass Blocks','A','Applicable','Static evidence only','Skip navigation validator and shell tests authored','Keyboard confirmation','P15-005'), + ('2.4.2 Page Titled','A','Applicable','Static evidence only','Localized metadata builder validator passes','Rendered route title verification','P15-005'), + ('2.4.3 Focus Order','A','Applicable','Blocked','Logical DOM order and native controls','Manual all-state focus order','P15-005'), + ('2.4.4 Link Purpose','A','Applicable','Static evidence only','Destination registry and localized labels','Rendered route review','P15-005'), + ('2.4.6 Headings and Labels','AA','Applicable','Static evidence only','Structured headings and explicit form labels','Screen-reader review','P15-005'), + ('2.4.7 Focus Visible','AA','Applicable','Blocked','Focus tokens/styles exist','Rendered keyboard review in themes/forced colors','P15-005'), + ('2.4.11 Focus Not Obscured Minimum','AA','Applicable','Blocked','Sticky shell and dialog CSS reviewed','Viewport/zoom execution required','P15-005'), + ('2.5.7 Dragging Movements','AA','Applicable','Static evidence only','No drag-only control identified','Rendered interaction inventory confirmation','P15-005'), + ('2.5.8 Target Size Minimum','AA','Applicable','Blocked','Component sizing tokens exist','Measured desktop/mobile targets required','P15-005'), + ('3.1.1 Language of Page','A','Applicable','Static evidence only','Server-rendered lang and dir validators pass','Rendered HTML verification','P15-005'), + ('3.1.2 Language of Parts','AA','Applicable','Static evidence only','Bidi and localized content primitives exist','Foreign-language option pronunciation review','P15-005'), + ('3.2.1 On Focus','A','Applicable','Static evidence only','No focus-triggered navigation identified','Manual interaction review','P15-005'), + ('3.2.2 On Input','A','Applicable','Static evidence only','Locale/theme actions are explicit controls','Manual form and selector review','P15-005'), + ('3.2.3 Consistent Navigation','AA','Applicable','Static evidence only','Shared shell components','Cross-route rendered comparison','P15-005'), + ('3.3.1 Error Identification','A','Applicable','Static evidence only','Error summary, field errors, aria-invalid','Screen-reader announcement review','P15-005'), + ('3.3.2 Labels or Instructions','A','Applicable','Static evidence only','Required/optional labels and supporting text','Rendered/AT review','P15-005'), + ('3.3.3 Error Suggestion','AA','Applicable','Static evidence only','Localized actionable validation messages','Manual flow review','P15-005'), + ('3.3.4 Error Prevention','AA','Applicable','Static evidence only','No irreversible legal/financial transaction; duplicate controls present','Business policy review','P14-004'), + ('4.1.2 Name Role Value','A','Applicable','Static evidence only','Native controls and explicit labels; ARIA in composites','Automated and screen-reader execution','P15-005'), + ('4.1.3 Status Messages','AA','Applicable','Static evidence only','LiveRegion, role=alert, success aria-live','Actual announcement capture required','P15-005'), +] +csv_write('WCAG_2_2_AA_EVIDENCE_MATRIX_v1.0.csv', wcag_fields, [dict(zip(wcag_fields,row)) for row in criteria]) + +# Individual reports +write('CLEAN_ROOM_BASELINE_REPORT_v1.0.md', report( + 'Phase 15 Clean-room Baseline Report','Blocked / failed acceptance', + 'The supplied ZIP was extracted into a fresh directory and its Phase 14 manifest verified 466 files. The exact Phase 15 clean install could not begin because the host does not provide the pinned Node/pnpm toolchain and cannot resolve the package registry.', + ['Fresh archive manifest passed (C15-001).','ZIP SHA-256 and lockfile SHA-256 are recorded in the implementation report.','No dependency or lockfile update was performed.'], + ['Node 24.17.0 is not installed; observed Node is 22.16.0.','pnpm 11.9.0 activation failed because registry DNS is unavailable.','Frozen install and every dependency-backed command are blocked.'], + 'This gate fails Phase 15 acceptance. A connected clean runner using the pinned versions must rerun the complete matrix.' +)) +write('REPOSITORY_INTEGRITY_AUDIT_v1.0.md', report( + 'Phase 15 Repository Integrity Audit','Passed for static package integrity', + 'The baseline manifest passed before changes. The Phase 15 audit checks JSON/CSV structure, symlinks, generated files, secret patterns, reserved test email domains, runtime URLs, dependency pinning, and release-control invariants.', + ['Baseline manifest: 466 files verified.','Baseline audit exposed 4 High and 7 Medium findings.','Current audit reports zero findings under the same controls.'], + ['Final package manifest validation occurs after all reports are generated.','Git commit history was not supplied and cannot be audited.'], + 'Static repository integrity is acceptable, but it does not replace build, dependency, browser, or human QA evidence.' +)) +write('STATIC_ANALYSIS_REPORT_v1.0.md', report( + 'Phase 15 Static Analysis Report','Partially passed', + 'All dependency-free repository validators and the Phase 15 audit pass after four defects were repaired. Package-backed formatting, ESLint, strict TypeScript, dead-code tooling, dependency/license analysis, and client-bundle inspection could not run on the final tree.', + ['16 repository validators pass.','33 JavaScript and 64 TypeScript modules plus two Python scripts pass syntax checks.','JSON/CSV, secret, URL, PII-fixture, direct-dependency, visual-control, and CI-control audit passes.'], + ['Prettier check, ESLint, strict typecheck, dead-code and unused-dependency tools.','Registry-backed audit and license validation.','Production client-bundle secret inspection.'], + 'Static source controls pass; the overall static-analysis gate remains blocked until package-backed checks run.' +)) +write('UNIT_TEST_REPORT_v1.0.md', report( + 'Phase 15 Unit Test Report','Blocked for current release candidate', + 'A Vitest regression test was added for exact JSON media-type handling. The current unit suite could not execute because dependencies are unavailable. Phase 14 recorded 39 passing unit tests, but that result predates Phase 15 code changes.', + ['Eight dependency-free assertions validate the new media-type helper.','Phase 14 historical result: 39 passed, 0 failed, with recorded coverage.'], + ['Current `pnpm test:unit` and coverage thresholds.','Current React/component and Zod-dependent tests.'], + 'Do not use the Phase 14 unit result as current release evidence. Rerun on the final manifest.' +)) +write('INTEGRATION_TEST_REPORT_v1.0.md', report( + 'Phase 15 Integration Test Report','Blocked for current release candidate', + 'Phase 14 recorded four passing demo-service integration tests. Phase 15 discovered that CI did not execute this suite and corrected the workflow, but the final suite could not run locally.', + ['CI now contains `pnpm test:integration`.','Static validator confirms the integration gate remains configured.','Historical Phase 14 integration tests cover success, idempotent transport, normalized failure, and timeout.'], + ['Current Vitest integration execution.','Production/sandbox CRM, scheduler, email, and durable idempotency integrations do not exist.'], + 'The integration gate is blocked until connected CI executes the suite and approved vendor adapters exist.' +)) +write('END_TO_END_TEST_REPORT_v1.0.md', report( + 'Phase 15 End-to-End Test Report','Blocked', + 'The repository contains authored Playwright flows for locale pages, navigation, the demo workflow, responsive states, no-JavaScript behavior, accessibility, and visual checks. No current Phase 15 browser flow executed.', + ['Scenario source was inspected.','CI now invokes browser, accessibility, and visual slices explicitly.'], + ['All 50 required Phase 15 end-to-end scenarios.','Success, validation, timeout, duplicate, history, offline, and dependency-failure browser evidence.'], + 'High release blocker P15-005 remains open.' +)) +write('CROSS_BROWSER_TEST_REPORT_v1.0.md', report( + 'Phase 15 Cross-browser Test Report','Blocked', + 'The configured matrix includes Chromium, Firefox, WebKit, mobile Chrome, and mobile Safari. No current application run was possible.', + ['Playwright project configuration statically reviewed.','Canonical visual snapshots are now Chromium-only; other engines remain functional targets.'], + ['Browser installation in the pinned environment.','Functional results by browser/version/OS/device/locale/theme/viewport.'], + 'No browser support claim is approved from configuration alone.' +)) +write('DEVICE_VIEWPORT_REPORT_v1.0.md', report( + 'Phase 15 Device and Viewport Report','Blocked for rendered validation', + 'Responsive CSS and authored tests cover the required widths, but no final rendered matrix was observed.', + ['Logical CSS validator passes across 47 CSS files.','Authored scenarios include 1440, 1024, 768, 390, and 320 widths.'], + ['Horizontal overflow, clipping, focus visibility, touch targets, safe areas, reduced height, and mobile landscape checks.'], + 'Responsive implementation remains unaccepted until browser evidence is attached.' +)) +write('ZOOM_REFLOW_REPORT_v1.0.md', report( + 'Phase 15 Zoom and Reflow Report','Blocked', + 'Source uses content-driven dimensions and logical properties, and text-expansion scenarios exist. Actual 200%/400% zoom, OS text scaling, French expansion, Arabic expansion, and pseudolocalization were not run.', + ['Static logical CSS checks pass.','Manual matrix identifies required zoom and AT combinations.'], + ['200% and 400% browser zoom.','Text-spacing overrides and OS scaling.','Dialog/error-summary focus visibility at zoom.'], + 'WCAG reflow and resize criteria are not verified.' +)) +write('AUTOMATED_ACCESSIBILITY_REPORT_v1.0.md', report( + 'Phase 15 Automated Accessibility Report','Blocked', + 'Axe suites are authored for shell, homepage, component system, and demo workflow. They could not execute on the final Phase 15 tree.', + ['A11y source scenarios inspected.','Static semantic controls and WCAG matrix prepared.'], + ['Axe results for EN/FR/AR, themes, mobile, form states, dialogs, FAQ, scheduler, forced colors.'], + 'No automated accessibility pass is claimed.' +)) +write('KEYBOARD_ACCESSIBILITY_REPORT_v1.0.md', report( + 'Phase 15 Keyboard Accessibility Report','Not run', + 'Native controls, native dialog, focus-return references, skip navigation, form error links, and visible-focus styles are present in source. Keyboard-only behavior was not manually observed.', + ['Source-level focus and semantic review.','Manual test matrix created.'], + ['Complete pointer-free path including mobile navigation, form errors, consent, dialogs, success, and recovery.'], + 'Manual keyboard acceptance is a High blocker.' +)) +write('SCREEN_READER_REPORT_v1.0.md', report( + 'Phase 15 Screen-reader Report','Not run', + 'No NVDA, VoiceOver, or TalkBack session was performed. The report intentionally contains no invented announcements.', + ['Screen-reader combinations and required flows are listed in MANUAL_TEST_MATRIX_v1.0.csv.','Static language, direction, labels, status regions, and dialog relationships reviewed.'], + ['Actual announcement transcripts for English and Arabic.','Focus movement, error/status announcements, mixed-direction values, and mobile AT behavior.'], + 'Screen-reader acceptance is blocked.' +)) +write('LOCALIZATION_QA_REPORT_v1.0.md', report( + 'Phase 15 Localization QA Report','Static parity passed; linguistic approval blocked', + 'English, French, and Arabic catalogs have exact key parity and valid direction metadata. Native linguistic review remains open.', + ['Locale validator passes.','Metadata/route parity validator passes.','No non-reserved personal-data fixture or runtime implementation key was found by the audit.'], + ['Native French review.','Native formal Modern Standard Arabic review.','External vendor localization because vendors are not selected.'], + 'Mechanical parity is not translation approval; P9-005 remains High.' +)) +write('RTL_QA_REPORT_v1.0.md', report( + 'Phase 15 RTL QA Report','Static controls passed; end-to-end review blocked', + 'The Arabic locale is configured for server-rendered RTL and the CSS validator reports 47 files using logical declarations. Native visual, focus-order, screen-reader, mixed-direction, and scheduler checks did not run.', + ['Locale direction metadata passes.','Logical CSS validation passes.','Bidi primitives and LTR treatment for email/tel/url values are present.'], + ['Rendered header, hero, workflow, forms, error summaries, dialogs, footer, animation, and 320px overflow review.'], + 'Arabic RTL is not accepted from text alignment alone.' +)) +write('THEME_QA_REPORT_v1.0.md', report( + 'Phase 15 Theme QA Report','Static controls passed; browser verification blocked', + 'Light, dark, and system foundations, nonce pre-paint bootstrap, persistence, and CSS fallback are present. A stale visual-test storage key was fixed.', + ['Theme validators pass.','Canonical visual setup now uses `hpc.theme.preference`.','Semantic token controls pass.'], + ['No-flash behavior, OS theme changes, delayed JavaScript, disabled JavaScript, contrast, embeds, and forced-colors states.'], + 'Theme acceptance remains blocked pending rendered evidence.' +)) +write('VISUAL_REGRESSION_REPORT_v1.0.md', report( + 'Phase 15 Visual Regression Report','Blocked', + 'No approved PNG baselines exist. Phase 15 corrected snapshot determinism but did not generate or approve product images.', + ['Snapshot suites now use canonical Chromium scope.','Component-system test now writes the actual theme storage key.'], + ['Baseline generation in pinned Chromium.','Manual diff classification for locales, themes, viewports, interaction states, focus, reduced motion, forced colors.'], + 'Updating baselines is prohibited until the application executes and reviewers inspect every diff.' +)) +write('DESIGN_FIDELITY_REPORT_v1.0.md', report( + 'Phase 15 Design Fidelity Report','Blocked for visual comparison', + 'Section order and component composition validators pass, but no rendered comparison against Phase 7 production designs was performed.', + ['Homepage composition and content-model validators pass.','Design-token immutability and semantic color controls pass.'], + ['Typography, spacing, alignment, media scale, responsive adaptation, themes, RTL, focus, loading, error, and success visual comparison.'], + 'Design fidelity is unverified, not failed.' +)) +write('PERFORMANCE_REPORT_v1.0.md', report( + 'Phase 15 Performance Report','Blocked', + 'Approved budgets exist for LCP, INP, CLS, TTFB, transfer sizes, fonts, media, and third-party requests. No final production build or browser timing was available.', + ['Budget contract inspected: LCP 2500 ms, INP 200 ms, CLS 0.1, TTFB 800 ms maximums.','No approved vendor SDK or third-party runtime was added.'], + ['Cold/warm desktop/mobile measurements in EN and AR.','LCP asset, main-thread, hydration, form latency, scheduler latency, failure response, and third-party request measurement.'], + 'Performance gate is blocked; historical Phase 14 build inventory is not a Phase 15 measurement.' +)) +write('BUNDLE_ANALYSIS_REPORT_v1.0.md', report( + 'Phase 15 Bundle Analysis Report','Blocked for final build', + 'Source review confirms no new runtime dependency was added and the content-type helper is server-side. Final route chunks and client boundaries could not be measured.', + ['Direct dependency pins and lockfile contract pass.','No vendor SDK, consent manager, scheduler, email, or analytics network package is present.'], + ['Production route bundle sizes, duplicate packages/locales/icons, source maps, tree shaking, dynamic imports, and client secret inspection.'], + 'Bundle approval requires the final production build.' +)) +write('IMAGE_FONT_PERFORMANCE_REPORT_v1.0.md', report( + 'Phase 15 Image and Font Performance Report','Blocked for rendered/network measurement', + 'The public directory contains no production visual assets. Inter and Noto Sans Arabic remain package dependencies. No network waterfall or font-layout measurement ran.', + ['Asset inventory confirms no unapproved logo, screenshot, hero image, or social image was added.','Arabic font is separately represented in dependency and token foundations.'], + ['Final logo/social/hero assets, responsive sizes, compression, preload policy, Arabic font payload, CLS, cache headers.'], + 'Final asset approval and performance measurement remain Phase 16 gates after QA rerun.' +)) +write('SECURITY_VALIDATION_REPORT_v1.0.md', report( + 'Phase 15 Security Validation Report','Static controls passed; dynamic and dependency checks blocked', + 'Static review confirms request marker, same-origin check, exact JSON content type, body limit, strict schema, honeypot, bounded timeout, idempotency, normalized errors, no-store responses, CSP, and server-only environment controls. The prefix media-type defect was fixed.', + ['Phase 14 security validator passes through C15-004.','Secret-pattern and runtime URL audit passes.','Exact content-type behavior assertions pass.'], + ['Registry vulnerability/license audit.','Dynamic CSRF, origin, replay, malformed input, CSP, headers, rate limit, webhook, and vendor credential testing on final build.'], + 'Security is not production-approved. Rate limiting, durable idempotency, vendors, and dynamic evidence remain blockers.' +)) +write('PRIVACY_VALIDATION_REPORT_v1.0.md', report( + 'Phase 15 Privacy Validation Report','Static controls passed; legal and runtime approval blocked', + 'Static checks find no personal data in analytics contracts, URLs, runtime logs, fixtures outside reserved domains, or browser persistence paths for form values. No production processing destination exists.', + ['Privacy validator passes.','Audit finds only reserved `.test`/`.invalid` email fixtures.','Analytics context remains strict and excludes form fields.'], + ['Runtime browser capture, logs, monitoring, vendor payloads, retention, deletion, recipients, transfers, staging separation.','Legal/privacy approval.'], + 'P14-002 and related legal gates block production.' +)) +write('CONSENT_VALIDATION_REPORT_v1.0.md', report( + 'Phase 15 Consent Validation Report','Blocked by product/legal decisions', + 'Analytics is disabled by default and optional marketing consent is not implemented. This prevents premature vendor loading but does not constitute a complete consent system.', + ['Static environment defaults prohibit production analytics.','Test analytics requires an explicit test-only document flag.','Consent matrix reviewed.'], + ['No-choice, necessary-only, accept/reject, withdrawal, returning visitor, locale change, consent version, vendor failure, delayed JavaScript.','Localized approved legal language and storage mechanism.'], + 'No consent-compliance claim is permitted.' +)) +write('ANALYTICS_VALIDATION_REPORT_v1.0.md', report( + 'Phase 15 Analytics Validation Report','Static contract passed; provider/runtime blocked', + 'The allowlisted event schema permits only route, locale, direction, resolved theme, source, step, error code/count, and reason values. The current sink has no network and requires test consent.', + ['Analytics/privacy validators pass.','Forbidden payload keys include name, email, company, message, phone, field value, and server response.'], + ['Provider, consent gating in real browser, duplicate hydration events, route changes, captured event evidence, retention, region, DPA.'], + 'Analytics must remain disabled.' +)) +write('DESTINATION_BROKEN_LINK_REPORT_v1.0.md', report( + 'Phase 15 Destination and Broken-link Report','Static registry passed; external destinations blocked', + 'The route and destination validators pass. Demo is local-only; contact sales, product tour, login, cookie settings, and support are blocked; pricing/legal/accessibility routes are placeholders.', + ['Five route IDs have complete locale/hash/query/hreflang contracts.','No unapproved runtime external URL was found.','Destination registry is explicit.'], + ['Rendered broken-link crawl of generated routes.','Production URLs, redirects, status codes, canonical/hreflang, external security behavior.'], + 'Blocked destinations must not be activated until approved.' +)) +write('FAILURE_SIMULATION_REPORT_v1.0.md', report( + 'Phase 15 Failure Simulation Report','Blocked for current execution', + 'Deterministic scenarios exist for success, duplicate, timeout, integration error, validation, and blocked configuration. Current browser/server simulations did not run.', + ['Source adapters and scenario guards reviewed.','Test scenarios remain disabled in production.'], + ['CRM/scheduler/analytics/consent/email/DNS/network/slow/partial/rate-limit/storage/script/CSP/offline failures.'], + 'Authored scenarios are not observed resilience evidence.' +)) +write('IDEMPOTENCY_DUPLICATE_REPORT_v1.0.md', report( + 'Phase 15 Idempotency and Duplicate Report','Local static design reviewed; production gate blocked', + 'The current process-local store coalesces repeated keys, caches non-retryable results, removes retryable failures, and contains no personal data in keys. It is explicitly test/local only.', + ['Historical Phase 14 integration test covered repeated transport.','Source review confirms retryable failures release the key.'], + ['Current integration/browser retry execution.','Distributed durable store, late vendor success, cross-instance duplicate policy, legitimate later request policy.'], + 'P14-004 blocks scaled production.' +)) +write('ABUSE_CONTROL_REPORT_v1.0.md', report( + 'Phase 15 Abuse-control Report','Partial static controls; production gate blocked', + 'The API enforces a 16 KiB body limit, request marker, origin check, strict schema, content type, and honeypot. No distributed rate limit or approved CAPTCHA/accessibility alternative exists.', + ['Static API controls pass.','Exact content type defect fixed.'], + ['Rapid requests, oversized/malformed payloads, origins, scripted submissions, slow assistive-technology users, international formats, threshold behavior.','Distributed rate limiting and operational monitoring.'], + 'Production submission remains blocked.' +)) +write('DEPLOYMENT_REHEARSAL_REPORT_v1.0.md', report( + 'Phase 15 Deployment Rehearsal Report','Not run', + 'No production-like deployment was built or started from the Phase 15 manifest. Historical Phase 14 standalone HTTP evidence is retained but stale after code and CI changes.', + ['Dockerfile and CI deployment build path statically reviewed.','Production environment defaults fail closed.'], + ['Clean build, assets, headers, redirects, metadata, robots, health/startup failure, flags, observability, no test adapter, exact commands and timing.'], + 'Deployment gate blocks release.' +)) +write('ROLLBACK_REHEARSAL_REPORT_v1.0.md', report( + 'Phase 15 Rollback Rehearsal Report','Documented concept; not rehearsed', + 'The public demo and analytics can be disabled through existing flags, and production defaults are blocked. No platform rollback was executed.', + ['Feature-flag inventory and Phase 14 rollback guidance reviewed.'], + ['Restore previous release, disable CRM/scheduler/analytics independently, verify no resend, stale secret handling, fallback UX, timing, owner confirmation.'], + 'Rollback readiness is unproven.' +)) +write('OBSERVABILITY_VALIDATION_REPORT_v1.0.md', report( + 'Phase 15 Observability Validation Report','Blocked', + 'Correlation identifiers are non-sensitive and raw form logging is absent. No production logging, metrics, dashboards, alert thresholds, retention, or environment separation is implemented.', + ['Static no-raw-log controls pass.','Redaction helper and correlation IDs reviewed.'], + ['Submission/failure/vendor latency/rate-limit/duplicate/config/client/server/build/deployment metrics and alerts.'], + 'P14-005 blocks production operations.' +)) +write('CONTENT_EVIDENCE_REVIEW_v1.0.md', report( + 'Phase 15 Content and Evidence Review','Static prohibited-content controls passed; approvals blocked', + 'Runtime validation finds no TODO/TBD/lorem, invented metrics, fake quotes, guessed external destinations, or research-only backdoor. Public claims and assets still require accountable approval.', + ['Prohibited-content validator passes.','No production image/logo/customer evidence asset is present.','Pending legal and unsupported destinations remain gated.'], + ['Native linguistic approval, claims, customer logos/testimonials, security/compliance statements, pricing, screenshots, contact details, legal content.'], + 'Content is structurally safe but not final-approved.' +)) +write('SEO_METADATA_REVIEW_v1.0.md', report( + 'Phase 15 SEO and Metadata Review','Static foundation passed; rendered validation blocked', + 'Localized metadata, canonical, hreflang, Open Graph, Twitter, robots, and non-indexable placeholder controls pass static validation.', + ['Metadata validator passes.','Five route IDs have complete locale alternates.','Public release defaults to noindex.'], + ['Production origin, rendered status codes/redirects, sitemap if implemented, social assets, final metadata copy, crawl.'], + 'SEO release approval awaits production domain, assets, build, and crawl evidence.' +)) +write('BROWSER_HISTORY_REPORT_v1.0.md', report( + 'Phase 15 Browser History and Navigation Report','Blocked', + 'Source avoids form values in URLs and keeps the demo in a dialog on the localized homepage. Direct entry, locale/theme changes, back/forward, refresh, success, resubmit, deep links, and external return were not executed.', + ['Static privacy audit finds no form-value URL construction.','Authored browser scenarios include success URL checks.'], + ['Complete back/forward/refresh/modal/scheduler/hash/redirect history matrix and focus restoration.'], + 'History behavior is unverified on the final candidate.' +)) +write('RETEST_REPORT_v1.0.md', report( + 'Phase 15 Retest Report','Static retest passed; full regression blocked', + 'All four remediated Phase 15 defects pass targeted static or dependency-free retests. Browser and package-backed nearby regressions were not executable.', + ['P15-001: CSV structure passes.','P15-002: exact media-type assertions and validator pass.','P15-003: canonical theme key and Chromium scope validator pass.','P15-004: CI integration command validator passes.'], + ['Prettier/ESLint/typecheck/unit/integration/build.','Browser visual/theme/form regression.'], + 'Resolved defects remain conditionally closed until the final connected CI run.' +)) + +# Final recommendation +recommendation = f'''# Phase 15 Final Release Recommendation + +## Recommendation + +**Not ready for Phase 16** + +The repository has materially better static controls than the supplied Phase 14 baseline, but final QA is not complete. The exact clean installation, production build, dependency audit, unit/integration regression, cross-browser flows, automated accessibility, manual keyboard/screen-reader/zoom review, visual baselines, performance budgets, deployment rehearsal, and rollback rehearsal have not been executed against the final Phase 15 manifest. + +## Defect and issue counts + +- Critical unresolved: **{unresolved_counts.get('Critical',0)}** +- High unresolved: **{unresolved_counts.get('High',0)}** +- Medium unresolved: **{unresolved_counts.get('Medium',0)}** +- Low unresolved: **{unresolved_counts.get('Low',0)}** +- Phase 15 defects resolved: **4** +- Accepted exceptions: **0** + +The cumulative counts include inherited business, research, legal, localization, design, integration, operations, and verification issues. The Phase 15 defect register contains one open High aggregate acceptance blocker, P15-005. + +## Failed or blocked release gates + +The blocked gates include exact runtime/frozen install, final package-backed checks, current unit/integration/build, dependency/license audit, browser/accessibility/visual/manual matrices, performance and bundle measurement, production-like deployment, rollback, CRM, legal/privacy consent, analytics approval, distributed idempotency/rate limiting, native localization review, participant acceptance research, production origin, final brand assets, destinations, and a real commit identifier. + +## Required Phase 16 approvals + +Phase 16 must not begin release-candidate freeze until engineering QA closes P15-005. Business/legal work still required includes final copy, claims/evidence, customer assets, legal/privacy text, analytics and consent, CRM/scheduler operations, production destinations, domain/hosting, credentials, launch ownership, and final assets. + +## Required remediation before production + +1. Commit the Phase 15 repository and record the SHA. +2. Run the complete command matrix on Node 24.17.0 and pnpm 11.9.0 from a frozen clean install. +3. Fix and retest every resulting Critical, High, and Medium defect. +4. Complete browser, accessibility, localization/RTL, theme, responsive, visual, performance, deployment, rollback, and observability evidence. +5. Resolve or formally approve every production business/legal gate. No Critical or High exception currently exists. + +## Overall risk statement + +Static source integrity is improved and production integrations remain safely disabled. Release risk is nevertheless **unacceptably high** because the final executable artifact has not been built or observed in browsers and assistive technologies, and the production data-processing and destination decisions are unresolved. +''' +write('FINAL_RELEASE_RECOMMENDATION_v1.0.md', recommendation) + +# Risk register note +write('RISK_ACCEPTANCE_SUMMARY_v1.0.md', '# Phase 15 Risk Acceptance Summary\n\nNo accepted exceptions were created. `RISK_ACCEPTANCE_REGISTER_v1.0.csv` intentionally contains only its header.\n') + +# Phase 15 implementation report +sections = [ + ('1. Executive summary','Phase 15 found and fixed four repository defects: corrupted release-evidence CSV rows, loose JSON media-type matching, nondeterministic visual-test setup, and missing CI integration coverage. Dependency-free validation passes. Final acceptance is blocked because the pinned clean install and all dependency-backed/browser/human/production-like gates could not run.'), + ('2. Authoritative inputs reviewed','The Phase 15 prompt, complete Phase 14 repository, Phase 14 handoff, implementation report, decision log, issue register, manifest, route/destination/form/integration/data-flow/consent/analytics/security/privacy/performance/release-gate records, tests, CI, README, and inherited Phase 9 through Phase 13 contracts were reviewed.'), + ('3. Test environment',f"Observed: Debian GNU/Linux 13, Node {get_version(['node','--version'])}, npm {get_version(['npm','--version'])}, Corepack {get_version(['corepack','--version'])}, Python {platform.python_version()}, Chromium 144.0.7559.96. Required: Node 24.17.0 and pnpm 11.9.0. The supplied ZIP contained no `.git` directory."), + ('4. Clean-room baseline','Fresh extraction and Phase 14 manifest verification passed. Corepack could not fetch pnpm because registry DNS is unavailable; frozen install did not run.'), + ('5. Repository integrity','Baseline static audit found 4 High and 7 Medium findings. After remediation, the same audit reports zero findings. Final artifact integrity is governed by the Phase 15 manifest.'), + ('6. Static analysis','Sixteen dependency-free validators pass. JavaScript/non-JSX TypeScript syntax and the Python audit script pass. Prettier, ESLint, strict TypeScript, dead-code, dependency/license, and bundle-secret tooling are blocked.'), + ('7. Unit testing','Current Vitest suite not run. A media-type regression test was authored and eight dependency-free assertions pass. Historical Phase 14 unit evidence is stale for this release candidate.'), + ('8. Integration testing','Current integration suite not run. CI omission was fixed. Historical Phase 14 integration evidence is stale.'), + ('9. End-to-end testing','Authored scenarios exist; no current browser execution.'), + ('10. Cross-browser testing','Configured projects cover Chromium, Firefox, WebKit, mobile Chrome, and mobile Safari; no current results.'), + ('11. Device and viewport testing','Required widths are represented in tests; rendered validation blocked.'), + ('12. Zoom and reflow','No current 200/400 percent or OS scaling evidence.'), + ('13. Automated accessibility','Axe suites authored; not executed.'), + ('14. Keyboard accessibility','Static semantics reviewed; manual keyboard flow not run.'), + ('15. Screen-reader testing','NVDA, VoiceOver, and TalkBack not run. No announcement transcript was invented.'), + ('16. WCAG 2.2 AA assessment','Criterion-to-evidence matrix produced. Many criteria have static evidence only; conformance is not established.'), + ('17. Localization QA','Catalog key parity passes. Native French and Arabic approval remains open.'), + ('18. RTL QA','Document direction and logical CSS controls pass; Arabic end-to-end and AT review blocked.'), + ('19. Theme QA','Theme foundations pass static checks; no-flash, system changes, contrast, and forced-colors browser evidence blocked. Visual key defect fixed.'), + ('20. Visual regression','Canonical Chromium setup fixed. No baselines generated or approved.'), + ('21. Design fidelity','Composition/token validators pass; rendered design comparison not performed.'), + ('22. Performance','Approved budgets exist; no final build or browser metrics.'), + ('23. Bundle analysis','No new runtime dependency added; final chunks and client boundaries not measured.'), + ('24. Image and font performance','No production public assets added; final images/fonts/network behavior unmeasured.'), + ('25. Security validation','Static request, schema, timeout, idempotency, CSP, redaction, and fail-closed controls pass. Content-type boundary hardened. Dynamic/dependency/vendor/rate-limit evidence blocked.'), + ('26. Privacy validation','Static no-PII controls pass. Legal basis, recipients, retention, deletion, transfers, and runtime vendor/log evidence blocked.'), + ('27. Consent validation','Optional processing remains disabled; complete consent lifecycle not implemented or tested.'), + ('28. Analytics validation','Strict non-PII allowlist passes static review; provider and real consent gating not approved.'), + ('29. Destination validation','Registry and routes pass static checks; most production destinations remain blocked or placeholder.'), + ('30. Failure simulation','Deterministic scenarios authored; current runtime execution blocked.'), + ('31. Idempotency and duplicate handling','Process-local design reviewed; durable cross-instance policy remains blocked.'), + ('32. Abuse-control validation','Body size, marker, origin, schema, content type, and honeypot controls present; distributed rate limits absent.'), + ('33. Deployment rehearsal','Not run for Phase 15.'), + ('34. Rollback rehearsal','Feature-flag strategy documented; not rehearsed.'), + ('35. Observability validation','Correlation/redaction foundations exist; monitoring, alerts, retention, and dashboards absent.'), + ('36. Content and evidence review','Prohibited-content controls pass; final claims, evidence, assets, copy, and legal approvals remain open.'), + ('37. SEO and metadata','Static foundations pass; production-domain and rendered crawl evidence blocked.'), + ('38. Browser history and navigation','No PII URL construction found; final browser history matrix not run.'), + ('39. Defect summary','Four defects fixed: two High and two Medium. One High Phase 15 acceptance blocker remains open.'), + ('40. Retest summary','Targeted static/dependency-free retests pass. Full regression is blocked.'), + ('41. Release-gate assessment','Three static gates pass. All executable, browser/human, performance, deployment, and production approval gates remain blocked/open.'), + ('42. Accepted exceptions','None.'), + ('43. Remaining risks',f"Cumulative unresolved register: Critical {unresolved_counts.get('Critical',0)}, High {unresolved_counts.get('High',0)}, Medium {unresolved_counts.get('Medium',0)}, Low {unresolved_counts.get('Low',0)}."), + ('44. Files added, changed, and removed','Source changes harden content type; tests and CI are corrected; Phase 15 validators, reports, registers, and manifest are added. No authoritative Phase 9 contract was modified. File inventory is in `docs/quality/PHASE_15_FILE_CHANGES_v1.0.txt`.'), + ('45. Exact commands required to reproduce validation','See `docs/phase15/COMMAND_MATRIX_v1.0.csv` and the Phase 16 handoff. Blocked commands must be run exactly on the pinned toolchain.'), + ('46. Final release recommendation','**Not ready for Phase 16.** See `docs/phase15/FINAL_RELEASE_RECOMMENDATION_v1.0.md`.'), + ('47. Phase 16 readiness assessment','Phase 16 may review blockers and prepare approvals, but must not freeze or deploy a release candidate until P15-005 and all Critical/High release gates are closed or explicitly approved by accountable owners. No exception is currently accepted.'), +] +impl = ['# Phase 15 Implementation Report','',f'**Date:** {DATE}','',*sum(([f'## {title}', '', body, ''] for title,body in sections),[])] +(ROOT/'docs/PHASE_15_IMPLEMENTATION_REPORT_v1.0.md').write_text('\n'.join(impl).rstrip()+'\n',encoding='utf-8') + +# Phase 16 handoff +handoff = f'''# Phase 16 Handoff: Final Content Approval and Deployment Preparation + +## Handoff status + +Phase 15 recommendation: **Not ready for Phase 16**. This handoff exists to make the remaining work explicit, not to imply release approval. + +## Artifact identity + +- Supplied archive had no Git metadata; final validated commit identifier is **unavailable**. +- Use `PHASE_15_PACKAGE_MANIFEST_v1.0.json` and the delivered ZIP checksum to identify this artifact. +- Phase 16 must commit the exact package and record the immutable commit SHA before release-candidate freeze. + +## Evidence package + +Review `docs/PHASE_15_IMPLEMENTATION_REPORT_v1.0.md`, `docs/phase15/FINAL_RELEASE_RECOMMENDATION_v1.0.md`, `docs/phase15/DEFECT_REGISTER_v1.0.csv`, `docs/phase15/RELEASE_GATE_MATRIX_v1.0.csv`, `docs/phase15/RISK_ACCEPTANCE_REGISTER_v1.0.csv`, `docs/phase15/COMMAND_MATRIX_v1.0.csv`, and all Phase 15 reports. + +## Production configuration inventory + +Authoritative inventories remain `.env.example` and the Phase 14 environment, feature-flag, destination, external-service, data-flow, consent, and analytics registries. Production defaults remain blocked. No production credential is included. + +## Required engineering validation before freeze + +1. Run Node 24.17.0 and pnpm 11.9.0. +2. Run `pnpm install --frozen-lockfile`. +3. Run `pnpm validate`, `pnpm validate:package`, `pnpm format:check`, `pnpm lint`, `pnpm typecheck`, `pnpm test:unit`, `pnpm test:integration`, `pnpm test:security`, `pnpm test:privacy`, and the production build. +4. Install pinned Playwright browsers and run browser, accessibility, and visual suites. +5. Complete manual keyboard, screen-reader, zoom/reflow, forced-colors, reduced-motion, Arabic RTL, and mobile device matrices. +6. Measure performance and bundles against the approved budgets. +7. Rehearse production-like deployment and rollback. +8. Close all Critical/High defects and retest Medium defects. + +## Required business and operational approvals + +- Final EN/FR/AR copy and native linguistic review +- Claims, evidence, customer logos, testimonials, and product captures +- Legal/privacy/consent text, legal basis, retention, deletion, recipients, and transfers +- Analytics provider, event approval, consent category, DPA, region, retention, and owner +- CRM lead destination, mapping, authentication, duplicate/retry policy, sandbox, monitoring, and owner +- Scheduler and email decisions if enabled +- Production origin, DNS, hosting, cache/security headers, redirects, robots, canonical, and hreflang +- Final logo, social assets, hero/product assets, and performance approval +- Production secrets through an approved secret manager with least privilege and rotation +- Launch owner matrix, launch-day checklist, incident/rollback authority, and post-launch monitoring + +## Launch-day checklist + +Freeze the approved commit and manifest; verify environment and secret inventory; deploy with production integrations disabled until each gate is approved; run localized route, demo, headers, metadata, analytics/consent, privacy, accessibility, performance, and destination smoke checks; confirm monitoring; record go/no-go decision. + +## Post-launch smoke and monitoring checklist + +Verify EN/FR/AR pages, light/dark/system, mobile/desktop, demo acceptance semantics, no duplicate leads, no PII in URLs/logs/analytics, CRM/scheduler latency, errors/timeouts/rate limits, consent withdrawal, security headers, canonical/hreflang/robots, Core Web Vitals, and rollback triggers. + +## Files Phase 16 may modify + +Approved copy/resources, final governed assets, production environment templates without secrets, approved destination/provider adapters, deployment configuration, launch documentation, and targeted tests/evidence. + +## Files Phase 16 must not modify without reopening QA + +Phase 9 contracts, component behavior, page structure, validation/schema, data flow, consent semantics, analytics event names/properties, integration interfaces, accessibility behavior, RTL/theme/routing foundations, CSP/security controls, or performance-critical loading behavior. + +Any change in those areas requires targeted Phase 15 regression and updated evidence before release. + +## Definition of done for release + +A real commit SHA and manifest identify the candidate; all required commands pass; browser/AT/visual/performance/deployment/rollback evidence is approved; no unresolved Critical or High defect remains without accountable written exception; all production business/legal/operational gates are approved; post-deployment smoke checks pass; monitoring and rollback owners are active. +''' +(ROOT/'docs/PHASE_16_HANDOFF_v1.0.md').write_text(handoff,encoding='utf-8') + +print('Generated Phase 15 reports and matrices.') diff --git a/scripts/generate-phase16-manifest.mjs b/scripts/generate-phase16-manifest.mjs new file mode 100644 index 0000000..d70984d --- /dev/null +++ b/scripts/generate-phase16-manifest.mjs @@ -0,0 +1,43 @@ +import { createHash } from 'node:crypto'; +import { readFile, readdir, stat, writeFile } from 'node:fs/promises'; +import path from 'node:path'; + +const root = path.resolve(import.meta.dirname, '..'); +const manifestPath = path.join(root, 'PHASE_16_PACKAGE_MANIFEST_v1.0.json'); +const excludedDirectories = new Set(['.git', '.next', 'node_modules', 'coverage', 'playwright-report', 'test-results', '__pycache__']); +const excludedFiles = new Set(['PHASE_16_PACKAGE_MANIFEST_v1.0.json', 'package-lock.json', 'tsconfig.tsbuildinfo']); + +async function walk(directory) { + const files = []; + for (const entry of await readdir(directory, { withFileTypes: true })) { + if (entry.isDirectory() && excludedDirectories.has(entry.name)) continue; + const fullPath = path.join(directory, entry.name); + if (entry.isDirectory()) files.push(...(await walk(fullPath))); + else { + const relative = path.relative(root, fullPath).split(path.sep).join('/'); + if (!excludedFiles.has(relative)) files.push({ fullPath, relative }); + } + } + return files; +} + +const files = (await walk(root)).sort((a, b) => a.relative.localeCompare(b.relative)); +const entries = []; +for (const file of files) { + const contents = await readFile(file.fullPath); + const details = await stat(file.fullPath); + entries.push({ path: file.relative, bytes: details.size, sha256: createHash('sha256').update(contents).digest('hex') }); +} +const manifest = { + schema_version: '1.0', + project: 'RentalDriveGo', + phase: 16, + generated_at: '2026-06-25', + release_status: 'Launch aborted before deployment', + launch_authorization: 'Rejected', + excludes: [...excludedDirectories, ...excludedFiles], + file_count: entries.length, + files: entries, +}; +await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`); +console.log(`Generated Phase 16 manifest for ${entries.length} files.`); diff --git a/scripts/phase15-static-audit.py b/scripts/phase15-static-audit.py new file mode 100755 index 0000000..adbbb19 --- /dev/null +++ b/scripts/phase15-static-audit.py @@ -0,0 +1,324 @@ +#!/usr/bin/env python3 +"""Dependency-free Phase 15 repository integrity, privacy, and evidence audit.""" +from __future__ import annotations + +import argparse +import csv +import hashlib +import json +import os +import re +import stat +import sys +from collections import Counter +from pathlib import Path +from typing import Any + +EXCLUDED_DIRS = {'.git', '.next', 'node_modules', 'coverage', 'playwright-report', 'test-results', '__pycache__'} +EXCLUDED_AUDIT_OUTPUTS = { + 'docs/quality/PHASE_15_STATIC_AUDIT_RESULTS_v1.0.json', + 'docs/quality/PHASE_15_STATIC_AUDIT_RESULTS_v1.0.md', + 'docs/quality/PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.json', + 'docs/quality/PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.md', +} +TEXT_SUFFIXES = { + '.css', '.csv', '.html', '.js', '.json', '.jsx', '.md', '.mjs', '.mts', '.txt', '.ts', '.tsx', '.yml', '.yaml' +} +RESERVED_EMAIL_SUFFIXES = ('.test', '.invalid', '.example') +ALLOWED_EMAIL_DOMAINS = {'example.com', 'example.org', 'example.net'} +SECRET_PATTERNS = { + 'private_key': re.compile(r'-----BEGIN (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----'), + 'aws_access_key': re.compile(r'\bAKIA[0-9A-Z]{16}\b'), + 'google_api_key': re.compile(r'\bAIza[0-9A-Za-z_-]{35}\b'), + 'github_token': re.compile(r'\bgh[pousr]_[0-9A-Za-z]{20,}\b'), + 'slack_token': re.compile(r'\bxox[baprs]-[0-9A-Za-z-]{10,}\b'), + 'stripe_secret': re.compile(r'\bsk_(?:live|test)_[0-9A-Za-z]{16,}\b'), +} +EMAIL_RE = re.compile(r'(?]+') + + +def walk_files(root: Path): + for path in root.rglob('*'): + if any(part in EXCLUDED_DIRS for part in path.relative_to(root).parts): + continue + relative = path.relative_to(root).as_posix() + if relative in EXCLUDED_AUDIT_OUTPUTS: + continue + if path.is_file() or path.is_symlink(): + yield path + + +def sha256(path: Path) -> str: + h = hashlib.sha256() + with path.open('rb') as f: + for chunk in iter(lambda: f.read(1024 * 1024), b''): + h.update(chunk) + return h.hexdigest() + + +def read_text(path: Path) -> str | None: + if path.suffix.lower() not in TEXT_SUFFIXES and path.name not in {'.env.example', '.gitignore', '.npmrc', '.nvmrc', '.node-version', '.editorconfig', '.prettierignore', '.dockerignore'}: + return None + try: + return path.read_text(encoding='utf-8') + except UnicodeDecodeError: + return None + + +def add(findings: list[dict[str, Any]], severity: str, code: str, path: str, message: str, line: int | None = None): + item = {'severity': severity, 'code': code, 'path': path, 'message': message} + if line is not None: + item['line'] = line + findings.append(item) + + +def audit(root: Path) -> dict[str, Any]: + findings: list[dict[str, Any]] = [] + metrics: dict[str, Any] = {} + files = list(walk_files(root)) + regular_files = [p for p in files if p.is_file() and not p.is_symlink()] + metrics['file_count'] = len(regular_files) + metrics['total_bytes'] = sum(p.stat().st_size for p in regular_files) + metrics['suffix_counts'] = dict(sorted(Counter(p.suffix.lower() or '' for p in regular_files).items())) + + # Filesystem integrity. + for p in files: + rel = p.relative_to(root).as_posix() + if p.is_symlink(): + add(findings, 'High', 'symlink_present', rel, f'Symlink target: {os.readlink(p)}') + elif p.stat().st_mode & stat.S_IWOTH: + add(findings, 'Medium', 'world_writable', rel, 'Repository file is world-writable.') + for directory in EXCLUDED_DIRS - {'.git'}: + if (root / directory).exists(): + add(findings, 'Medium', 'generated_directory_present', directory, 'Generated/cache directory is present in the release package.') + for forbidden in ('.env', '.env.local', '.env.production', 'package-lock.json', 'tsconfig.tsbuildinfo'): + if (root / forbidden).exists(): + add(findings, 'High' if forbidden.startswith('.env') else 'Medium', 'forbidden_root_file', forbidden, 'Unexpected generated or secret-bearing root file.') + + # JSON and CSV structural validity. + json_count = 0 + csv_count = 0 + for p in regular_files: + rel = p.relative_to(root).as_posix() + if p.suffix.lower() == '.json': + json_count += 1 + try: + json.loads(p.read_text(encoding='utf-8')) + except Exception as exc: + add(findings, 'High', 'invalid_json', rel, str(exc)) + elif p.suffix.lower() == '.csv': + csv_count += 1 + try: + with p.open(newline='', encoding='utf-8-sig') as f: + rows = list(csv.reader(f)) + if rows: + width = len(rows[0]) + for index, row in enumerate(rows, start=1): + if len(row) != width: + add(findings, 'High', 'malformed_csv', rel, f'Expected {width} columns, found {len(row)}.', index) + except Exception as exc: + add(findings, 'High', 'invalid_csv', rel, str(exc)) + metrics['json_files_parsed'] = json_count + metrics['csv_files_parsed'] = csv_count + + # Secret, PII-fixture, and unsafe runtime scans. + secret_scan_files = 0 + email_hits: list[dict[str, Any]] = [] + runtime_urls: list[dict[str, Any]] = [] + for p in regular_files: + rel = p.relative_to(root).as_posix() + text = read_text(p) + if text is None: + continue + lines = text.splitlines() + if rel not in {'scripts/phase15-static-audit.py'} and not rel.startswith('PHASE_') and p.name != 'pnpm-lock.yaml': + secret_scan_files += 1 + for name, pattern in SECRET_PATTERNS.items(): + for match in pattern.finditer(text): + line = text.count('\n', 0, match.start()) + 1 + add(findings, 'Critical', f'secret_{name}', rel, 'Potential live credential or private key pattern.', line) + if not rel.startswith('contracts/phase9/') and p.name != 'pnpm-lock.yaml': + for index, line_text in enumerate(lines, start=1): + for match in EMAIL_RE.finditer(line_text): + address, domain = match.group(1), match.group(2).lower() + email_hits.append({'path': rel, 'line': index, 'address': address}) + if not domain.endswith(RESERVED_EMAIL_SUFFIXES) and domain not in ALLOWED_EMAIL_DOMAINS: + add(findings, 'High', 'non_reserved_email_fixture', rel, f'Non-reserved email address found: {address}', index) + if rel.startswith('src/') or rel in {'.env.example', 'next.config.ts'}: + for index, line_text in enumerate(lines, start=1): + for match in RUNTIME_EXTERNAL_URL_RE.finditer(line_text): + url = match.group(0).rstrip('.,;') + runtime_urls.append({'path': rel, 'line': index, 'url': url}) + allowed = ( + url.startswith('http://localhost') + or url.startswith('http://127.0.0.1') + or url.startswith('https://your-approved-domain.example') + or url.startswith('https://design-tokens.github.io/') + ) + if not allowed: + add(findings, 'High', 'unapproved_runtime_url', rel, f'Runtime/config URL is not on the documented safe list: {url}', index) + metrics['secret_scan_files'] = secret_scan_files + metrics['email_fixture_hits'] = email_hits + metrics['runtime_url_hits'] = runtime_urls + + # Runtime anti-patterns and release-control invariants. + runtime_text = '' + for p in regular_files: + rel = p.relative_to(root).as_posix() + if rel.startswith('src/'): + text = read_text(p) + if text is not None: + runtime_text += f'\n/* {rel} */\n{text}' + for index, line_text in enumerate(text.splitlines(), start=1): + if re.search(r'\b(TODO|TBD|FIXME|lorem ipsum)\b', line_text, re.I): + add(findings, 'Medium', 'runtime_placeholder', rel, line_text.strip(), index) + if re.search(r'console\.(?:log|info|warn|error|debug)\s*\(', line_text): + add(findings, 'High', 'runtime_console_logging', rel, 'Runtime console logging requires privacy review.', index) + if re.search(r'\beval\s*\(|new\s+Function\s*\(', line_text): + add(findings, 'Critical', 'dynamic_code_execution', rel, 'Dynamic code execution found.', index) + if "startsWith('application/json')" in runtime_text or 'startsWith("application/json")' in runtime_text: + add(findings, 'Medium', 'loose_content_type_match', 'src/', 'JSON API still uses a prefix media-type check.') + helper = root / 'src/lib/security/content-type.ts' + if not helper.exists() or "=== 'application/json'" not in helper.read_text(encoding='utf-8'): + add(findings, 'Medium', 'missing_exact_content_type_control', helper.relative_to(root).as_posix(), 'Exact application/json media-type helper is absent.') + route = root / 'src/app/api/demo/route.ts' + if route.exists() and 'isApplicationJson(contentType)' not in route.read_text(encoding='utf-8'): + add(findings, 'Medium', 'content_type_helper_not_used', route.relative_to(root).as_posix(), 'Demo API does not use exact JSON media-type validation.') + + # Visual-test determinism invariants. + visual_component = root / 'tests/visual/component-system.visual.spec.ts' + if visual_component.exists(): + text = visual_component.read_text(encoding='utf-8') + if 'rdg-theme-preference' in text: + add(findings, 'Medium', 'stale_theme_storage_key', visual_component.relative_to(root).as_posix(), 'Visual test writes a storage key the application never reads.') + if "hpc.theme.preference" not in text: + add(findings, 'Medium', 'theme_storage_key_missing', visual_component.relative_to(root).as_posix(), 'Visual test does not use the canonical theme storage key.') + if "project.name !== 'chromium'" not in text: + add(findings, 'Medium', 'visual_project_scope', visual_component.relative_to(root).as_posix(), 'Canonical snapshot test is not restricted to Chromium.') + visual_integrations = root / 'tests/visual/integrations.visual.spec.ts' + if visual_integrations.exists() and "project.name !== 'chromium'" not in visual_integrations.read_text(encoding='utf-8'): + add(findings, 'Medium', 'visual_project_scope', visual_integrations.relative_to(root).as_posix(), 'Canonical integration snapshots are not restricted to Chromium.') + + # CI must execute the integration suite; unit and browser suites do not cover the server adapter orchestration. + workflow_path = root / '.github/workflows/ci.yml' + if workflow_path.exists(): + workflow_text = workflow_path.read_text(encoding='utf-8') + if 'pnpm test:integration' not in workflow_text: + add(findings, 'High', 'ci_integration_suite_omitted', workflow_path.relative_to(root).as_posix(), 'CI does not execute the demo-service integration suite.') + + # Lockfile/direct dependency checks are delegated to the repository validator; record pinning shape here. + package = json.loads((root / 'package.json').read_text(encoding='utf-8')) + direct = {**package.get('dependencies', {}), **package.get('devDependencies', {})} + floating = {name: value for name, value in direct.items() if re.search(r'[~^*xX<>| ]', str(value))} + if floating: + add(findings, 'High', 'floating_direct_dependencies', 'package.json', json.dumps(floating, sort_keys=True)) + metrics['direct_dependency_count'] = len(direct) + metrics['direct_dependencies_exact'] = not floating + + # Issue/gate metrics. + def issue_version(path: Path) -> tuple[int, ...]: + match = re.search(r'_v(\d+(?:\.\d+)*)\.csv$', path.name) + return tuple(int(part) for part in match.group(1).split('.')) if match else (0,) + + issue_candidates = sorted( + (root / 'docs').glob('IMPLEMENTATION_ISSUE_REGISTER_v*.csv'), + key=issue_version, + ) + issue_path = issue_candidates[-1] if issue_candidates else None + if issue_path is not None: + with issue_path.open(newline='', encoding='utf-8-sig') as f: + issues = list(csv.DictReader(f)) + metrics['issue_register_path'] = issue_path.relative_to(root).as_posix() + metrics['issue_register_rows'] = len(issues) + unresolved = [r for r in issues if 'resolved' not in (r.get('Status') or '').lower()] + metrics['unresolved_issue_counts'] = dict(Counter(r.get('Severity', 'Unknown') for r in unresolved)) + if any(None in r for r in issues): + add(findings, 'High', 'issue_register_overflow', issue_path.relative_to(root).as_posix(), 'One or more issue-register rows contain overflow columns.') + gate_candidates = [ + root / 'docs/phase15/RELEASE_GATE_MATRIX_v1.0.csv', + root / 'docs/phase14/RELEASE_GATE_MATRIX_v1.0.csv', + ] + gate_path = next((candidate for candidate in gate_candidates if candidate.exists()), None) + if gate_path is not None: + with gate_path.open(newline='', encoding='utf-8-sig') as f: + gates = list(csv.DictReader(f)) + metrics['release_gate_path'] = gate_path.relative_to(root).as_posix() + metrics['release_gate_status_counts'] = dict(Counter(r.get('Status', 'Unknown') for r in gates)) + + # High-level privacy invariants. + api_text = route.read_text(encoding='utf-8') if route.exists() else '' + required_api_controls = { + 'request_marker': "x-rdg-form", + 'origin_validation': 'isAllowedOrigin', + 'body_limit': 'maximumBodyBytes', + 'no_store': "'Cache-Control': 'no-store'", + 'honeypot': 'honeypot', + } + for code, token in required_api_controls.items(): + if token not in api_text: + add(findings, 'High', f'missing_api_{code}', route.relative_to(root).as_posix(), f'Missing expected API control token: {token}') + analytics_text = (root / 'src/lib/analytics/events.ts').read_text(encoding='utf-8') + for forbidden in ('email', 'company', 'message', 'phone', 'fieldvalue', 'serverresponse'): + if f"'{forbidden}'" not in analytics_text: + add(findings, 'High', 'analytics_forbidden_key_missing', 'src/lib/analytics/events.ts', f'Forbidden analytics key is not explicitly denied: {forbidden}') + + severity_rank = {'Critical': 4, 'High': 3, 'Medium': 2, 'Low': 1, 'Info': 0} + findings.sort(key=lambda x: (-severity_rank.get(x['severity'], 0), x['path'], x.get('line', 0), x['code'])) + counts = Counter(item['severity'] for item in findings) + return { + 'schema_version': '1.0', + 'audit': 'Phase 15 dependency-free static repository audit', + 'root': str(root), + 'metrics': metrics, + 'finding_counts': dict(counts), + 'findings': findings, + 'passed': not any(item['severity'] in {'Critical', 'High', 'Medium'} for item in findings), + } + + +def render_markdown(result: dict[str, Any]) -> str: + lines = [ + '# Phase 15 Static Repository Audit', + '', + f"- Result: **{'PASS' if result['passed'] else 'FAIL'}**", + f"- Files inspected: {result['metrics']['file_count']}", + f"- JSON files parsed: {result['metrics']['json_files_parsed']}", + f"- CSV files parsed: {result['metrics']['csv_files_parsed']}", + f"- Secret-scan files: {result['metrics']['secret_scan_files']}", + f"- Findings: {json.dumps(result['finding_counts'], sort_keys=True)}", + '', + '## Findings', + '', + ] + if not result['findings']: + lines.append('No Critical, High, Medium, Low, or informational findings were produced by this audit.') + else: + lines.append('| Severity | Code | Path | Line | Finding |') + lines.append('|---|---|---|---:|---|') + for item in result['findings']: + message = str(item['message']).replace('|', '\\|').replace('\n', ' ') + lines.append(f"| {item['severity']} | `{item['code']}` | `{item['path']}` | {item.get('line', '')} | {message} |") + lines.extend(['', '## Metrics', '', '```json', json.dumps(result['metrics'], indent=2, sort_keys=True), '```', '']) + return '\n'.join(lines) + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument('--root', type=Path, default=Path(__file__).resolve().parents[1]) + parser.add_argument('--json-output', type=Path) + parser.add_argument('--markdown-output', type=Path) + args = parser.parse_args() + result = audit(args.root.resolve()) + if args.json_output: + args.json_output.parent.mkdir(parents=True, exist_ok=True) + args.json_output.write_text(json.dumps(result, indent=2, sort_keys=True) + '\n', encoding='utf-8') + if args.markdown_output: + args.markdown_output.parent.mkdir(parents=True, exist_ok=True) + args.markdown_output.write_text(render_markdown(result), encoding='utf-8') + print(json.dumps({'passed': result['passed'], 'finding_counts': result['finding_counts'], 'files': result['metrics']['file_count']}, sort_keys=True)) + return 0 if result['passed'] else 1 + + +if __name__ == '__main__': + raise SystemExit(main()) diff --git a/scripts/phase16-static-audit.py b/scripts/phase16-static-audit.py new file mode 100755 index 0000000..2af06c8 --- /dev/null +++ b/scripts/phase16-static-audit.py @@ -0,0 +1,325 @@ +#!/usr/bin/env python3 +"""Dependency-free Phase 16 repository integrity, privacy, and release-governance audit.""" +from __future__ import annotations + +import argparse +import csv +import hashlib +import json +import os +import re +import stat +import sys +from collections import Counter +from pathlib import Path +from typing import Any + +EXCLUDED_DIRS = {'.git', '.next', 'node_modules', 'coverage', 'playwright-report', 'test-results', '__pycache__'} +EXCLUDED_AUDIT_OUTPUTS = { + 'docs/quality/PHASE_15_STATIC_AUDIT_RESULTS_v1.0.json', + 'docs/quality/PHASE_15_STATIC_AUDIT_RESULTS_v1.0.md', + 'docs/quality/PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.json', + 'docs/quality/PHASE_15_BASELINE_STATIC_AUDIT_RESULTS_v1.0.md', +} +TEXT_SUFFIXES = { + '.css', '.csv', '.html', '.js', '.json', '.jsx', '.md', '.mjs', '.mts', '.txt', '.ts', '.tsx', '.yml', '.yaml' +} +RESERVED_EMAIL_SUFFIXES = ('.test', '.invalid', '.example') +ALLOWED_EMAIL_DOMAINS = {'example.com', 'example.org', 'example.net'} +SECRET_PATTERNS = { + 'private_key': re.compile(r'-----BEGIN (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----'), + 'aws_access_key': re.compile(r'\bAKIA[0-9A-Z]{16}\b'), + 'google_api_key': re.compile(r'\bAIza[0-9A-Za-z_-]{35}\b'), + 'github_token': re.compile(r'\bgh[pousr]_[0-9A-Za-z]{20,}\b'), + 'slack_token': re.compile(r'\bxox[baprs]-[0-9A-Za-z-]{10,}\b'), + 'stripe_secret': re.compile(r'\bsk_(?:live|test)_[0-9A-Za-z]{16,}\b'), +} +EMAIL_RE = re.compile(r'(?]+') + + +def walk_files(root: Path): + for path in root.rglob('*'): + if any(part in EXCLUDED_DIRS for part in path.relative_to(root).parts): + continue + relative = path.relative_to(root).as_posix() + if relative in EXCLUDED_AUDIT_OUTPUTS: + continue + if path.is_file() or path.is_symlink(): + yield path + + +def sha256(path: Path) -> str: + h = hashlib.sha256() + with path.open('rb') as f: + for chunk in iter(lambda: f.read(1024 * 1024), b''): + h.update(chunk) + return h.hexdigest() + + +def read_text(path: Path) -> str | None: + if path.suffix.lower() not in TEXT_SUFFIXES and path.name not in {'.env.example', '.gitignore', '.npmrc', '.nvmrc', '.node-version', '.editorconfig', '.prettierignore', '.dockerignore'}: + return None + try: + return path.read_text(encoding='utf-8') + except UnicodeDecodeError: + return None + + +def add(findings: list[dict[str, Any]], severity: str, code: str, path: str, message: str, line: int | None = None): + item = {'severity': severity, 'code': code, 'path': path, 'message': message} + if line is not None: + item['line'] = line + findings.append(item) + + +def audit(root: Path) -> dict[str, Any]: + findings: list[dict[str, Any]] = [] + metrics: dict[str, Any] = {} + files = list(walk_files(root)) + regular_files = [p for p in files if p.is_file() and not p.is_symlink()] + metrics['file_count'] = len(regular_files) + metrics['total_bytes'] = sum(p.stat().st_size for p in regular_files) + metrics['suffix_counts'] = dict(sorted(Counter(p.suffix.lower() or '' for p in regular_files).items())) + + # Filesystem integrity. + for p in files: + rel = p.relative_to(root).as_posix() + if p.is_symlink(): + add(findings, 'High', 'symlink_present', rel, f'Symlink target: {os.readlink(p)}') + elif p.stat().st_mode & stat.S_IWOTH: + add(findings, 'Medium', 'world_writable', rel, 'Repository file is world-writable.') + for directory in EXCLUDED_DIRS - {'.git'}: + if (root / directory).exists(): + add(findings, 'Medium', 'generated_directory_present', directory, 'Generated/cache directory is present in the release package.') + for forbidden in ('.env', '.env.local', '.env.production', 'package-lock.json', 'tsconfig.tsbuildinfo'): + if (root / forbidden).exists(): + add(findings, 'High' if forbidden.startswith('.env') else 'Medium', 'forbidden_root_file', forbidden, 'Unexpected generated or secret-bearing root file.') + + # JSON and CSV structural validity. + json_count = 0 + csv_count = 0 + for p in regular_files: + rel = p.relative_to(root).as_posix() + if p.suffix.lower() == '.json': + json_count += 1 + try: + json.loads(p.read_text(encoding='utf-8')) + except Exception as exc: + add(findings, 'High', 'invalid_json', rel, str(exc)) + elif p.suffix.lower() == '.csv': + csv_count += 1 + try: + with p.open(newline='', encoding='utf-8-sig') as f: + rows = list(csv.reader(f)) + if rows: + width = len(rows[0]) + for index, row in enumerate(rows, start=1): + if len(row) != width: + add(findings, 'High', 'malformed_csv', rel, f'Expected {width} columns, found {len(row)}.', index) + except Exception as exc: + add(findings, 'High', 'invalid_csv', rel, str(exc)) + metrics['json_files_parsed'] = json_count + metrics['csv_files_parsed'] = csv_count + + # Secret, PII-fixture, and unsafe runtime scans. + secret_scan_files = 0 + email_hits: list[dict[str, Any]] = [] + runtime_urls: list[dict[str, Any]] = [] + for p in regular_files: + rel = p.relative_to(root).as_posix() + text = read_text(p) + if text is None: + continue + lines = text.splitlines() + if rel not in {'scripts/phase15-static-audit.py', 'scripts/phase16-static-audit.py'} and not rel.startswith('PHASE_') and p.name != 'pnpm-lock.yaml': + secret_scan_files += 1 + for name, pattern in SECRET_PATTERNS.items(): + for match in pattern.finditer(text): + line = text.count('\n', 0, match.start()) + 1 + add(findings, 'Critical', f'secret_{name}', rel, 'Potential live credential or private key pattern.', line) + if not rel.startswith('contracts/phase9/') and p.name != 'pnpm-lock.yaml': + for index, line_text in enumerate(lines, start=1): + for match in EMAIL_RE.finditer(line_text): + address, domain = match.group(1), match.group(2).lower() + email_hits.append({'path': rel, 'line': index, 'address': address}) + if not domain.endswith(RESERVED_EMAIL_SUFFIXES) and domain not in ALLOWED_EMAIL_DOMAINS: + add(findings, 'High', 'non_reserved_email_fixture', rel, f'Non-reserved email address found: {address}', index) + if rel.startswith('src/') or rel in {'.env.example', 'next.config.ts'}: + for index, line_text in enumerate(lines, start=1): + for match in RUNTIME_EXTERNAL_URL_RE.finditer(line_text): + url = match.group(0).rstrip('.,;') + runtime_urls.append({'path': rel, 'line': index, 'url': url}) + allowed = ( + url.startswith('http://localhost') + or url.startswith('http://127.0.0.1') + or url.startswith('https://your-approved-domain.example') + or url.startswith('https://design-tokens.github.io/') + ) + if not allowed: + add(findings, 'High', 'unapproved_runtime_url', rel, f'Runtime/config URL is not on the documented safe list: {url}', index) + metrics['secret_scan_files'] = secret_scan_files + metrics['email_fixture_hits'] = email_hits + metrics['runtime_url_hits'] = runtime_urls + + # Runtime anti-patterns and release-control invariants. + runtime_text = '' + for p in regular_files: + rel = p.relative_to(root).as_posix() + if rel.startswith('src/'): + text = read_text(p) + if text is not None: + runtime_text += f'\n/* {rel} */\n{text}' + for index, line_text in enumerate(text.splitlines(), start=1): + if re.search(r'\b(TODO|TBD|FIXME|lorem ipsum)\b', line_text, re.I): + add(findings, 'Medium', 'runtime_placeholder', rel, line_text.strip(), index) + if re.search(r'console\.(?:log|info|warn|error|debug)\s*\(', line_text): + add(findings, 'High', 'runtime_console_logging', rel, 'Runtime console logging requires privacy review.', index) + if re.search(r'\beval\s*\(|new\s+Function\s*\(', line_text): + add(findings, 'Critical', 'dynamic_code_execution', rel, 'Dynamic code execution found.', index) + if "startsWith('application/json')" in runtime_text or 'startsWith("application/json")' in runtime_text: + add(findings, 'Medium', 'loose_content_type_match', 'src/', 'JSON API still uses a prefix media-type check.') + helper = root / 'src/lib/security/content-type.ts' + if not helper.exists() or "=== 'application/json'" not in helper.read_text(encoding='utf-8'): + add(findings, 'Medium', 'missing_exact_content_type_control', helper.relative_to(root).as_posix(), 'Exact application/json media-type helper is absent.') + route = root / 'src/app/api/demo/route.ts' + if route.exists() and 'isApplicationJson(contentType)' not in route.read_text(encoding='utf-8'): + add(findings, 'Medium', 'content_type_helper_not_used', route.relative_to(root).as_posix(), 'Demo API does not use exact JSON media-type validation.') + + # Visual-test determinism invariants. + visual_component = root / 'tests/visual/component-system.visual.spec.ts' + if visual_component.exists(): + text = visual_component.read_text(encoding='utf-8') + if 'rdg-theme-preference' in text: + add(findings, 'Medium', 'stale_theme_storage_key', visual_component.relative_to(root).as_posix(), 'Visual test writes a storage key the application never reads.') + if "hpc.theme.preference" not in text: + add(findings, 'Medium', 'theme_storage_key_missing', visual_component.relative_to(root).as_posix(), 'Visual test does not use the canonical theme storage key.') + if "project.name !== 'chromium'" not in text: + add(findings, 'Medium', 'visual_project_scope', visual_component.relative_to(root).as_posix(), 'Canonical snapshot test is not restricted to Chromium.') + visual_integrations = root / 'tests/visual/integrations.visual.spec.ts' + if visual_integrations.exists() and "project.name !== 'chromium'" not in visual_integrations.read_text(encoding='utf-8'): + add(findings, 'Medium', 'visual_project_scope', visual_integrations.relative_to(root).as_posix(), 'Canonical integration snapshots are not restricted to Chromium.') + + # CI must execute the integration suite; unit and browser suites do not cover the server adapter orchestration. + workflow_path = root / '.github/workflows/ci.yml' + if workflow_path.exists(): + workflow_text = workflow_path.read_text(encoding='utf-8') + if 'pnpm test:integration' not in workflow_text: + add(findings, 'High', 'ci_integration_suite_omitted', workflow_path.relative_to(root).as_posix(), 'CI does not execute the demo-service integration suite.') + + # Lockfile/direct dependency checks are delegated to the repository validator; record pinning shape here. + package = json.loads((root / 'package.json').read_text(encoding='utf-8')) + direct = {**package.get('dependencies', {}), **package.get('devDependencies', {})} + floating = {name: value for name, value in direct.items() if re.search(r'[~^*xX<>| ]', str(value))} + if floating: + add(findings, 'High', 'floating_direct_dependencies', 'package.json', json.dumps(floating, sort_keys=True)) + metrics['direct_dependency_count'] = len(direct) + metrics['direct_dependencies_exact'] = not floating + + # Issue/gate metrics. + def issue_version(path: Path) -> tuple[int, ...]: + match = re.search(r'_v(\d+(?:\.\d+)*)\.csv$', path.name) + return tuple(int(part) for part in match.group(1).split('.')) if match else (0,) + + issue_candidates = sorted( + (root / 'docs').glob('IMPLEMENTATION_ISSUE_REGISTER_v*.csv'), + key=issue_version, + ) + issue_path = issue_candidates[-1] if issue_candidates else None + if issue_path is not None: + with issue_path.open(newline='', encoding='utf-8-sig') as f: + issues = list(csv.DictReader(f)) + metrics['issue_register_path'] = issue_path.relative_to(root).as_posix() + metrics['issue_register_rows'] = len(issues) + unresolved = [r for r in issues if 'resolved' not in (r.get('Status') or '').lower()] + metrics['unresolved_issue_counts'] = dict(Counter(r.get('Severity', 'Unknown') for r in unresolved)) + if any(None in r for r in issues): + add(findings, 'High', 'issue_register_overflow', issue_path.relative_to(root).as_posix(), 'One or more issue-register rows contain overflow columns.') + gate_candidates = [ + root / 'docs/phase16/FINAL_RELEASE_GATE_MATRIX_v1.0.csv', + root / 'docs/phase15/RELEASE_GATE_MATRIX_v1.0.csv', + root / 'docs/phase14/RELEASE_GATE_MATRIX_v1.0.csv', + ] + gate_path = next((candidate for candidate in gate_candidates if candidate.exists()), None) + if gate_path is not None: + with gate_path.open(newline='', encoding='utf-8-sig') as f: + gates = list(csv.DictReader(f)) + metrics['release_gate_path'] = gate_path.relative_to(root).as_posix() + metrics['release_gate_status_counts'] = dict(Counter(r.get('Phase16_decision') or r.get('Status', 'Unknown') for r in gates)) + + # High-level privacy invariants. + api_text = route.read_text(encoding='utf-8') if route.exists() else '' + required_api_controls = { + 'request_marker': "x-rdg-form", + 'origin_validation': 'isAllowedOrigin', + 'body_limit': 'maximumBodyBytes', + 'no_store': "'Cache-Control': 'no-store'", + 'honeypot': 'honeypot', + } + for code, token in required_api_controls.items(): + if token not in api_text: + add(findings, 'High', f'missing_api_{code}', route.relative_to(root).as_posix(), f'Missing expected API control token: {token}') + analytics_text = (root / 'src/lib/analytics/events.ts').read_text(encoding='utf-8') + for forbidden in ('email', 'company', 'message', 'phone', 'fieldvalue', 'serverresponse'): + if f"'{forbidden}'" not in analytics_text: + add(findings, 'High', 'analytics_forbidden_key_missing', 'src/lib/analytics/events.ts', f'Forbidden analytics key is not explicitly denied: {forbidden}') + + severity_rank = {'Critical': 4, 'High': 3, 'Medium': 2, 'Low': 1, 'Info': 0} + findings.sort(key=lambda x: (-severity_rank.get(x['severity'], 0), x['path'], x.get('line', 0), x['code'])) + counts = Counter(item['severity'] for item in findings) + return { + 'schema_version': '1.0', + 'audit': 'Phase 16 dependency-free static repository audit', + 'root': str(root), + 'metrics': metrics, + 'finding_counts': dict(counts), + 'findings': findings, + 'passed': not any(item['severity'] in {'Critical', 'High', 'Medium'} for item in findings), + } + + +def render_markdown(result: dict[str, Any]) -> str: + lines = [ + '# Phase 16 Static Repository Audit', + '', + f"- Result: **{'PASS' if result['passed'] else 'FAIL'}**", + f"- Files inspected: {result['metrics']['file_count']}", + f"- JSON files parsed: {result['metrics']['json_files_parsed']}", + f"- CSV files parsed: {result['metrics']['csv_files_parsed']}", + f"- Secret-scan files: {result['metrics']['secret_scan_files']}", + f"- Findings: {json.dumps(result['finding_counts'], sort_keys=True)}", + '', + '## Findings', + '', + ] + if not result['findings']: + lines.append('No Critical, High, Medium, Low, or informational findings were produced by this audit.') + else: + lines.append('| Severity | Code | Path | Line | Finding |') + lines.append('|---|---|---|---:|---|') + for item in result['findings']: + message = str(item['message']).replace('|', '\\|').replace('\n', ' ') + lines.append(f"| {item['severity']} | `{item['code']}` | `{item['path']}` | {item.get('line', '')} | {message} |") + lines.extend(['', '## Metrics', '', '```json', json.dumps(result['metrics'], indent=2, sort_keys=True), '```', '']) + return '\n'.join(lines) + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument('--root', type=Path, default=Path(__file__).resolve().parents[1]) + parser.add_argument('--json-output', type=Path) + parser.add_argument('--markdown-output', type=Path) + args = parser.parse_args() + result = audit(args.root.resolve()) + if args.json_output: + args.json_output.parent.mkdir(parents=True, exist_ok=True) + args.json_output.write_text(json.dumps(result, indent=2, sort_keys=True) + '\n', encoding='utf-8') + if args.markdown_output: + args.markdown_output.parent.mkdir(parents=True, exist_ok=True) + args.markdown_output.write_text(render_markdown(result), encoding='utf-8') + print(json.dumps({'passed': result['passed'], 'finding_counts': result['finding_counts'], 'files': result['metrics']['file_count']}, sort_keys=True)) + return 0 if result['passed'] else 1 + + +if __name__ == '__main__': + raise SystemExit(main()) diff --git a/scripts/prepare-typecheck.mjs b/scripts/prepare-typecheck.mjs new file mode 100644 index 0000000..6815842 --- /dev/null +++ b/scripts/prepare-typecheck.mjs @@ -0,0 +1,4 @@ +import { rm } from 'node:fs/promises'; + +await rm('.next/dev/types', { recursive: true, force: true }); +console.log('Removed conflicting Next.js development route declarations before type checking.'); diff --git a/scripts/run-checks.mjs b/scripts/run-checks.mjs index e84e3dd..2f3d797 100644 --- a/scripts/run-checks.mjs +++ b/scripts/run-checks.mjs @@ -6,6 +6,9 @@ const commands = [ ['pnpm', ['lint']], ['pnpm', ['typecheck']], ['pnpm', ['test:unit']], + ['pnpm', ['test:integration']], + ['pnpm', ['test:security']], + ['pnpm', ['test:privacy']], ['pnpm', ['build'], { SITE_ORIGIN: 'http://127.0.0.1:3000', PUBLIC_RELEASE_APPROVED: 'false' }], ['pnpm', ['audit']], ]; diff --git a/scripts/run-validations.mjs b/scripts/run-validations.mjs index e6e7e10..ee8eeb5 100644 --- a/scripts/run-validations.mjs +++ b/scripts/run-validations.mjs @@ -12,6 +12,12 @@ const scripts = [ 'validate-metadata.mjs', 'validate-phase12-components.mjs', 'validate-phase13-homepage.mjs', + 'validate-phase14-integrations.mjs', + 'validate-phase14-environment.mjs', + 'validate-phase14-security.mjs', + 'validate-phase14-privacy.mjs', + 'validate-phase15-readiness.mjs', + 'validate-phase16-readiness.mjs', ]; for (const script of scripts) { const result = spawnSync(process.execPath, [`scripts/${script}`], { stdio: 'inherit' }); diff --git a/scripts/validate-phase14-environment.mjs b/scripts/validate-phase14-environment.mjs new file mode 100644 index 0000000..5cd1b8e --- /dev/null +++ b/scripts/validate-phase14-environment.mjs @@ -0,0 +1,35 @@ +import { readFile } from 'node:fs/promises'; +import path from 'node:path'; +import { fail, pass, repositoryRoot } from './lib.mjs'; + +const failures = []; +const example = await readFile(path.join(repositoryRoot, '.env.example'), 'utf8'); +const implementation = await readFile( + path.join(repositoryRoot, 'src/lib/integrations/environment.ts'), + 'utf8', +); +const keys = [ + 'NEXT_PUBLIC_DEMO_ENABLED', + 'DEMO_SUBMISSION_MODE', + 'DEMO_REQUEST_TIMEOUT_MS', + 'DEMO_IDEMPOTENCY_TTL_SECONDS', + 'DEMO_TEST_SCENARIOS_ENABLED', + 'DEMO_LOCAL_TEST_MODE', + 'NEXT_PUBLIC_ANALYTICS_MODE', +]; +for (const key of keys) { + if (!example.includes(`${key}=`)) failures.push(`.env.example omits ${key}.`); + if (!implementation.includes(key)) failures.push(`Environment validator omits ${key}.`); +} +if (!example.includes('DEMO_SUBMISSION_MODE=blocked')) { + failures.push('Safe production example does not default demo submission to blocked.'); +} +if (!example.includes('NEXT_PUBLIC_ANALYTICS_MODE=disabled')) { + failures.push('Safe production example does not default analytics to disabled.'); +} + +if (failures.length) fail(failures); +else + pass( + 'Phase 14 environment inventory is explicit and defaults production integrations to blocked.', + ); diff --git a/scripts/validate-phase14-integrations.mjs b/scripts/validate-phase14-integrations.mjs new file mode 100644 index 0000000..104559f --- /dev/null +++ b/scripts/validate-phase14-integrations.mjs @@ -0,0 +1,72 @@ +import { readFile, stat } from 'node:fs/promises'; +import path from 'node:path'; +import { fail, pass, repositoryRoot } from './lib.mjs'; + +const failures = []; +const requiredFiles = [ + 'src/app/api/demo/route.ts', + 'src/components/integrations/DemoDialogHost.tsx', + 'src/lib/demo/schema.ts', + 'src/lib/demo/service.ts', + 'src/lib/demo/idempotency.ts', + 'src/lib/demo/adapters/types.ts', + 'src/lib/demo/adapters/local.ts', + 'src/lib/demo/adapters/blocked.ts', + 'src/lib/integrations/destinations.ts', + 'src/lib/integrations/environment.ts', + 'src/lib/integrations/feature-flags.ts', + 'src/lib/analytics/events.ts', + 'src/lib/analytics/client.ts', + 'docs/phase14/INTEGRATION_TRACEABILITY_MATRIX_v1.0.csv', + 'docs/phase14/DATA_FLOW_INVENTORY_v1.0.csv', + 'docs/phase14/RELEASE_GATE_MATRIX_v1.0.csv', +]; +for (const file of requiredFiles) { + try { + const details = await stat(path.join(repositoryRoot, file)); + if (!details.isFile()) failures.push(`${file}: not a file.`); + } catch { + failures.push(`${file}: missing.`); + } +} + +const schema = await readFile(path.join(repositoryRoot, 'src/lib/demo/schema.ts'), 'utf8'); +for (const field of ['fullName', 'workEmail', 'company', 'fleetSize', 'idempotencyKey', 'source']) { + if (!schema.includes(`${field}:`)) failures.push(`Demo schema is missing ${field}.`); +} +if (!schema.includes('.strict()')) + failures.push('Demo transport schemas must reject unknown fields.'); +if (schema.includes('phone:')) + failures.push('Unapproved phone field was added to the demo contract.'); + +const destinations = await readFile( + path.join(repositoryRoot, 'src/lib/integrations/destinations.ts'), + 'utf8', +); +for (const issue of ['P9-002', 'P9-003', 'P9-004', 'P9-008', 'P9-012', 'P9-014', 'P9-015']) { + if (!destinations.includes(issue)) + failures.push(`Destination registry does not preserve ${issue}.`); +} +if (/href:\s*['"]https?:\/\//.test(destinations)) { + failures.push('Destination registry contains an unapproved hard-coded external URL.'); +} + +for (const locale of ['en', 'fr', 'ar']) { + const catalog = JSON.parse( + await readFile( + path.join(repositoryRoot, `src/content/locales/${locale}/homepage.json`), + 'utf8', + ), + ); + if (!catalog.form || catalog.form.fleetOptions?.length !== 7) { + failures.push( + `${locale}: demo form fleet options do not match the approved six-value contract.`, + ); + } +} + +if (failures.length) fail(failures); +else + pass( + 'Phase 14 integration structure, form contract, destinations, and locale resources are present.', + ); diff --git a/scripts/validate-phase14-manifest.mjs b/scripts/validate-phase14-manifest.mjs new file mode 100644 index 0000000..6abd23c --- /dev/null +++ b/scripts/validate-phase14-manifest.mjs @@ -0,0 +1,69 @@ +import { readFile, readdir, stat } from 'node:fs/promises'; +import path from 'node:path'; +import { fail, pass, repositoryRoot, sha256 } from './lib.mjs'; + +const manifestName = 'PHASE_14_PACKAGE_MANIFEST_v1.0.json'; +const excludedDirectories = new Set([ + '.git', + '.next', + 'node_modules', + 'coverage', + 'playwright-report', + 'test-results', +]); +const excludedFiles = new Set([manifestName, 'package-lock.json', 'tsconfig.tsbuildinfo']); + +async function walk(directory) { + const files = []; + for (const entry of await readdir(directory, { withFileTypes: true })) { + if (entry.isDirectory() && excludedDirectories.has(entry.name)) continue; + const fullPath = path.join(directory, entry.name); + if (entry.isDirectory()) files.push(...(await walk(fullPath))); + else { + const relative = path.relative(repositoryRoot, fullPath).split(path.sep).join('/'); + if (!excludedFiles.has(relative)) files.push(relative); + } + } + return files; +} + +const manifest = JSON.parse(await readFile(path.join(repositoryRoot, manifestName), 'utf8')); +const failures = []; +if (manifest.project !== 'RentalDriveGo' || manifest.phase !== 14) { + failures.push('Phase 14 manifest identity is invalid.'); +} +if (!Array.isArray(manifest.files) || manifest.file_count !== manifest.files.length) { + failures.push('Manifest file count is invalid.'); +} +const listed = new Set(); +for (const entry of manifest.files ?? []) { + if ( + typeof entry.path !== 'string' || + path.isAbsolute(entry.path) || + entry.path.split('/').includes('..') + ) { + failures.push(`Unsafe manifest path: ${String(entry.path)}`); + continue; + } + if (listed.has(entry.path)) { + failures.push(`${entry.path}: duplicate manifest entry.`); + continue; + } + listed.add(entry.path); + try { + const filePath = path.join(repositoryRoot, entry.path); + const details = await stat(filePath); + if (!details.isFile() || details.size !== entry.bytes) + failures.push(`${entry.path}: file metadata changed.`); + if ((await sha256(filePath)) !== entry.sha256) failures.push(`${entry.path}: SHA-256 changed.`); + } catch { + failures.push(`${entry.path}: file is missing.`); + } +} +const actual = new Set(await walk(repositoryRoot)); +for (const file of actual) + if (!listed.has(file)) failures.push(`${file}: unlisted repository file.`); +for (const file of listed) + if (!actual.has(file)) failures.push(`${file}: listed but excluded or absent.`); +if (failures.length) fail(failures); +else pass(`Phase 14 package manifest verifies ${listed.size} repository files with no extras.`); diff --git a/scripts/validate-phase14-privacy.mjs b/scripts/validate-phase14-privacy.mjs new file mode 100644 index 0000000..ce712bd --- /dev/null +++ b/scripts/validate-phase14-privacy.mjs @@ -0,0 +1,35 @@ +import { readFile } from 'node:fs/promises'; +import path from 'node:path'; +import { fail, pass, repositoryRoot } from './lib.mjs'; + +const failures = []; +const analytics = await readFile(path.join(repositoryRoot, 'src/lib/analytics/events.ts'), 'utf8'); +const client = await readFile(path.join(repositoryRoot, 'src/lib/analytics/client.ts'), 'utf8'); +const dialog = await readFile( + path.join(repositoryRoot, 'src/components/integrations/DemoDialogHost.tsx'), + 'utf8', +); + +for (const forbidden of ['email', 'company', 'message', 'phone', 'fieldvalue', 'serverresponse']) { + if (!analytics.toLowerCase().includes(`'${forbidden}'`)) { + failures.push(`Analytics forbidden-key control omits ${forbidden}.`); + } +} +if (!client.includes("dataset.analyticsConsent === 'granted'")) { + failures.push('Analytics test adapter is not consent-gated.'); +} +if (!client.includes("analyticsMode() !== 'test'")) { + failures.push('Analytics adapter lacks an explicit disabled-by-default mode.'); +} +if (/localStorage|sessionStorage/.test(dialog)) { + failures.push('Demo form persists lead data in browser storage.'); +} +if (/URLSearchParams|searchParams\.set/.test(dialog)) { + failures.push('Demo form can place form data in a URL.'); +} + +if (failures.length) fail(failures); +else + pass( + 'Phase 14 privacy controls prevent browser persistence, URL leakage, and unconsented analytics.', + ); diff --git a/scripts/validate-phase14-security.mjs b/scripts/validate-phase14-security.mjs new file mode 100644 index 0000000..63ea58f --- /dev/null +++ b/scripts/validate-phase14-security.mjs @@ -0,0 +1,43 @@ +import { readFile } from 'node:fs/promises'; +import path from 'node:path'; +import { fail, pass, repositoryRoot } from './lib.mjs'; + +const failures = []; +const route = await readFile(path.join(repositoryRoot, 'src/app/api/demo/route.ts'), 'utf8'); +const service = await readFile(path.join(repositoryRoot, 'src/lib/demo/service.ts'), 'utf8'); +const environment = await readFile( + path.join(repositoryRoot, 'src/lib/integrations/environment.ts'), + 'utf8', +); + +for (const control of [ + "request.headers.get('origin')", + "request.headers.get('content-type')", + "request.headers.get('content-length')", + "request.headers.get('x-rdg-form')", + 'maximumBodyBytes', + 'demoSubmissionEnvelopeSchema.safeParse', + 'Cache-Control', +]) { + if (!route.includes(control)) failures.push(`Submission API is missing control: ${control}`); +} +if (!service.includes('AbortController')) + failures.push('Integration orchestration has no timeout controller.'); +if (!service.includes('executeIdempotent')) + failures.push('Integration orchestration bypasses idempotency.'); +if (!environment.includes('DEMO_LOCAL_TEST_MODE')) + failures.push('Loopback test escape is not explicit.'); +if (!environment.includes("['127.0.0.1', 'localhost']")) { + failures.push('Production-like local adapter escape is not restricted to loopback origins.'); +} + +const sourceFiles = [route, service]; +if (sourceFiles.some((source) => /console\.(log|info|debug|warn|error)\s*\(/.test(source))) { + failures.push('Submission path writes diagnostics directly to the console.'); +} + +if (failures.length) fail(failures); +else + pass( + 'Phase 14 API boundary includes origin, content-type, size, timeout, idempotency, and no-raw-log controls.', + ); diff --git a/scripts/validate-phase15-manifest.mjs b/scripts/validate-phase15-manifest.mjs new file mode 100644 index 0000000..89eb6c3 --- /dev/null +++ b/scripts/validate-phase15-manifest.mjs @@ -0,0 +1,75 @@ +import { readFile, readdir, stat } from 'node:fs/promises'; +import path from 'node:path'; +import { fail, pass, repositoryRoot, sha256 } from './lib.mjs'; + +const manifestName = 'PHASE_15_PACKAGE_MANIFEST_v1.0.json'; +const excludedDirectories = new Set([ + '.git', + '.next', + 'node_modules', + 'coverage', + 'playwright-report', + 'test-results', + '__pycache__', +]); +const excludedFiles = new Set([ + manifestName, + 'package-lock.json', + 'tsconfig.tsbuildinfo', + 'docs/quality/phase15-command-logs/12-phase15-package-manifest.log', +]); + +async function walk(directory) { + const files = []; + for (const entry of await readdir(directory, { withFileTypes: true })) { + if (entry.isDirectory() && excludedDirectories.has(entry.name)) continue; + const fullPath = path.join(directory, entry.name); + if (entry.isDirectory()) files.push(...(await walk(fullPath))); + else { + const relative = path.relative(repositoryRoot, fullPath).split(path.sep).join('/'); + if (!excludedFiles.has(relative)) files.push(relative); + } + } + return files; +} + +const manifest = JSON.parse(await readFile(path.join(repositoryRoot, manifestName), 'utf8')); +const failures = []; +if (manifest.project !== 'RentalDriveGo' || manifest.phase !== 15) { + failures.push('Phase 15 manifest identity is invalid.'); +} +if (!Array.isArray(manifest.files) || manifest.file_count !== manifest.files.length) { + failures.push('Manifest file count is invalid.'); +} +const listed = new Set(); +for (const entry of manifest.files ?? []) { + if ( + typeof entry.path !== 'string' || + path.isAbsolute(entry.path) || + entry.path.split('/').includes('..') + ) { + failures.push(`Unsafe manifest path: ${String(entry.path)}`); + continue; + } + if (listed.has(entry.path)) { + failures.push(`${entry.path}: duplicate manifest entry.`); + continue; + } + listed.add(entry.path); + try { + const filePath = path.join(repositoryRoot, entry.path); + const details = await stat(filePath); + if (!details.isFile() || details.size !== entry.bytes) + failures.push(`${entry.path}: file metadata changed.`); + if ((await sha256(filePath)) !== entry.sha256) failures.push(`${entry.path}: SHA-256 changed.`); + } catch { + failures.push(`${entry.path}: file is missing.`); + } +} +const actual = new Set(await walk(repositoryRoot)); +for (const file of actual) + if (!listed.has(file)) failures.push(`${file}: unlisted repository file.`); +for (const file of listed) + if (!actual.has(file)) failures.push(`${file}: listed but excluded or absent.`); +if (failures.length) fail(failures); +else pass(`Phase 15 package manifest verifies ${listed.size} repository files with no extras.`); diff --git a/scripts/validate-phase15-readiness.mjs b/scripts/validate-phase15-readiness.mjs new file mode 100644 index 0000000..7022c09 --- /dev/null +++ b/scripts/validate-phase15-readiness.mjs @@ -0,0 +1,111 @@ +import { readFile } from 'node:fs/promises'; +import path from 'node:path'; +import { fail, pass, repositoryRoot } from './lib.mjs'; + +function parseCsv(text) { + const rows = []; + let row = []; + let field = ''; + let quoted = false; + for (let index = 0; index < text.length; index += 1) { + const character = text[index]; + if (quoted) { + if (character === '"' && text[index + 1] === '"') { + field += '"'; + index += 1; + } else if (character === '"') { + quoted = false; + } else { + field += character; + } + } else if (character === '"') { + quoted = true; + } else if (character === ',') { + row.push(field); + field = ''; + } else if (character === '\n') { + row.push(field.replace(/\r$/, '')); + rows.push(row); + row = []; + field = ''; + } else { + field += character; + } + } + if (quoted) throw new Error('Unterminated CSV quote.'); + if (field || row.length) { + row.push(field.replace(/\r$/, '')); + rows.push(row); + } + return rows; +} + +const failures = []; +for (const file of [ + 'docs/IMPLEMENTATION_ISSUE_REGISTER_v1.4.csv', + 'docs/quality/PHASE_14_MANUAL_QA_RESULTS_v1.0.csv', +]) { + const rows = parseCsv(await readFile(path.join(repositoryRoot, file), 'utf8')); + const expected = rows[0]?.length ?? 0; + for (const [index, row] of rows.entries()) { + if (row.length !== expected) { + failures.push(`${file}:${index + 1} has ${row.length} columns; expected ${expected}.`); + } + } +} + +const contentType = await readFile( + path.join(repositoryRoot, 'src/lib/security/content-type.ts'), + 'utf8', +); +const route = await readFile(path.join(repositoryRoot, 'src/app/api/demo/route.ts'), 'utf8'); +if (!contentType.includes("=== 'application/json'")) { + failures.push('Exact JSON media-type comparison is missing.'); +} +if (!route.includes('isApplicationJson(contentType)')) { + failures.push('Demo API does not use the exact JSON media-type helper.'); +} +if (route.includes("startsWith('application/json')")) { + failures.push('Demo API still accepts look-alike JSON media types by prefix.'); +} + +const componentVisual = await readFile( + path.join(repositoryRoot, 'tests/visual/component-system.visual.spec.ts'), + 'utf8', +); +const integrationVisual = await readFile( + path.join(repositoryRoot, 'tests/visual/integrations.visual.spec.ts'), + 'utf8', +); +if (!componentVisual.includes("hpc.theme.preference")) { + failures.push('Component visual test does not use the canonical theme storage key.'); +} +if (componentVisual.includes('rdg-theme-preference')) { + failures.push('Component visual test still uses the stale theme storage key.'); +} +for (const [name, text] of [ + ['component-system.visual.spec.ts', componentVisual], + ['integrations.visual.spec.ts', integrationVisual], +]) { + if (!text.includes("project.name !== 'chromium'")) { + failures.push(`${name} is not restricted to canonical Chromium snapshots.`); + } +} + +const workflow = await readFile(path.join(repositoryRoot, '.github/workflows/ci.yml'), 'utf8'); +for (const command of [ + 'pnpm test:integration', + 'pnpm test:security', + 'pnpm test:privacy', + 'pnpm test:browser', + 'pnpm test:a11y', + 'pnpm test:visual', +]) { + if (!workflow.includes(command)) failures.push(`CI omits required command: ${command}`); +} + +if (failures.length) fail(failures); +else + pass( + 'Phase 15 evidence CSVs, exact media-type control, deterministic visual setup, and CI test gates are present.', + ); diff --git a/scripts/validate-phase16-manifest.mjs b/scripts/validate-phase16-manifest.mjs new file mode 100644 index 0000000..271d243 --- /dev/null +++ b/scripts/validate-phase16-manifest.mjs @@ -0,0 +1,46 @@ +import { readFile, readdir, stat } from 'node:fs/promises'; +import path from 'node:path'; +import { fail, pass, repositoryRoot, sha256 } from './lib.mjs'; + +const manifestName = 'PHASE_16_PACKAGE_MANIFEST_v1.0.json'; +const excludedDirectories = new Set(['.git', '.next', 'node_modules', 'coverage', 'playwright-report', 'test-results', '__pycache__']); +const excludedFiles = new Set([manifestName, 'package-lock.json', 'tsconfig.tsbuildinfo']); + +async function walk(directory) { + const files = []; + for (const entry of await readdir(directory, { withFileTypes: true })) { + if (entry.isDirectory() && excludedDirectories.has(entry.name)) continue; + const fullPath = path.join(directory, entry.name); + if (entry.isDirectory()) files.push(...(await walk(fullPath))); + else { + const relative = path.relative(repositoryRoot, fullPath).split(path.sep).join('/'); + if (!excludedFiles.has(relative)) files.push(relative); + } + } + return files; +} + +const manifest = JSON.parse(await readFile(path.join(repositoryRoot, manifestName), 'utf8')); +const failures = []; +if (manifest.project !== 'RentalDriveGo' || manifest.phase !== 16) failures.push('Phase 16 manifest identity is invalid.'); +if (manifest.release_status !== 'Launch aborted before deployment') failures.push('Manifest release status is not the recorded Phase 16 decision.'); +if (!Array.isArray(manifest.files) || manifest.file_count !== manifest.files.length) failures.push('Manifest file count is invalid.'); +const listed = new Set(); +for (const entry of manifest.files ?? []) { + if (typeof entry.path !== 'string' || path.isAbsolute(entry.path) || entry.path.split('/').includes('..')) { + failures.push(`Unsafe manifest path: ${String(entry.path)}`); continue; + } + if (listed.has(entry.path)) { failures.push(`${entry.path}: duplicate manifest entry.`); continue; } + listed.add(entry.path); + try { + const filePath = path.join(repositoryRoot, entry.path); + const details = await stat(filePath); + if (!details.isFile() || details.size !== entry.bytes) failures.push(`${entry.path}: file metadata changed.`); + if ((await sha256(filePath)) !== entry.sha256) failures.push(`${entry.path}: SHA-256 changed.`); + } catch { failures.push(`${entry.path}: file is missing.`); } +} +const actual = new Set(await walk(repositoryRoot)); +for (const file of actual) if (!listed.has(file)) failures.push(`${file}: unlisted repository file.`); +for (const file of listed) if (!actual.has(file)) failures.push(`${file}: listed but excluded or absent.`); +if (failures.length) fail(failures); +else pass(`Phase 16 package manifest verifies ${listed.size} repository files with no extras.`); diff --git a/scripts/validate-phase16-readiness.mjs b/scripts/validate-phase16-readiness.mjs new file mode 100644 index 0000000..f8fc4e8 --- /dev/null +++ b/scripts/validate-phase16-readiness.mjs @@ -0,0 +1,31 @@ +import { readFile, access } from 'node:fs/promises'; +import path from 'node:path'; +import { fail, pass, repositoryRoot } from './lib.mjs'; + +const required = [ + 'docs/PHASE_16_IMPLEMENTATION_AND_LAUNCH_REPORT_v1.0.md', + 'docs/DECISION_LOG_v16.0.md', + 'docs/IMPLEMENTATION_ISSUE_REGISTER_v1.6.csv', + 'docs/phase16/FINAL_LAUNCH_STATUS_v1.0.md', + 'docs/phase16/LAUNCH_AUTHORIZATION_RECORD_v1.0.md', + 'docs/phase16/FINAL_RELEASE_GATE_MATRIX_v1.0.csv', + 'docs/phase16/COMMAND_AND_PLATFORM_ACTION_MATRIX_v1.0.csv', + 'docs/phase16/DEFERRED_WORK_REGISTER_v1.0.csv', + 'docs/phase16/FEATURE_FLAG_RELEASE_STATE_v1.0.csv', + 'docs/phase16/SECRET_PROVISIONING_RECORD_v1.0.csv', +]; +const failures = []; +for (const file of required) { + try { await access(path.join(repositoryRoot, file)); } + catch { failures.push(`Missing required Phase 16 artifact: ${file}`); } +} +const status = await readFile(path.join(repositoryRoot, 'docs/phase16/FINAL_LAUNCH_STATUS_v1.0.md'), 'utf8'); +const auth = await readFile(path.join(repositoryRoot, 'docs/phase16/LAUNCH_AUTHORIZATION_RECORD_v1.0.md'), 'utf8'); +const flags = await readFile(path.join(repositoryRoot, 'docs/phase16/FEATURE_FLAG_RELEASE_STATE_v1.0.csv'), 'utf8'); +const secrets = await readFile(path.join(repositoryRoot, 'docs/phase16/SECRET_PROVISIONING_RECORD_v1.0.csv'), 'utf8'); +if (!status.includes('Launch aborted before deployment')) failures.push('Final launch status is missing or inconsistent.'); +if (!auth.includes('**Rejected**')) failures.push('Launch authorization is not explicitly rejected.'); +if (/\btrue\b/.test(flags.split('\n').slice(1).map((line) => line.split(',')[1]).join('\n'))) failures.push('A Phase 16 production feature flag is enabled.'); +if (!secrets.includes('No production credentials exist') && !secrets.includes('No credential supplied')) failures.push('Secret provisioning record does not explicitly preserve missing credentials as blockers.'); +if (failures.length) fail(failures); +else pass('Phase 16 no-go governance, disabled feature state, blocked approvals, and evidence package are explicit and internally consistent.'); diff --git a/src/app/[locale]/layout.tsx b/src/app/[locale]/layout.tsx index a29865d..30a97ae 100644 --- a/src/app/[locale]/layout.tsx +++ b/src/app/[locale]/layout.tsx @@ -5,8 +5,10 @@ import '@/styles/component-tokens.css'; import '@/styles/globals.css'; import { SiteFooter } from '@/components/app-shell/SiteFooter'; +import { DemoDialogHost } from '@/components/integrations/DemoDialogHost'; import { SiteHeader } from '@/components/app-shell/SiteHeader'; import { ThemeController } from '@/components/app-shell/ThemeController'; +import { getPublicIntegrationConfig } from '@/lib/integrations/environment'; import { getDirection, isLocale, type Locale } from '@/lib/localization/config'; import { getMessages } from '@/lib/localization/messages'; import { themeBootstrapScript } from '@/lib/theme/bootstrap-script'; @@ -32,6 +34,7 @@ export default async function LocaleLayout({ children, params }: LocaleLayoutPro if (!isLocale(localeValue)) notFound(); const locale: Locale = localeValue; const messages = getMessages(locale); + const integrationConfig = getPublicIntegrationConfig(); const requestHeaders = await headers(); const nonce = requestHeaders.get('x-nonce') ?? undefined; const cookieStore = await cookies(); @@ -61,9 +64,23 @@ export default async function LocaleLayout({ children, params }: LocaleLayoutPro {messages.shell.skipToContent} - + {children} - + + ); diff --git a/src/app/[locale]/page.tsx b/src/app/[locale]/page.tsx index 7c3cfeb..f27f88c 100644 --- a/src/app/[locale]/page.tsx +++ b/src/app/[locale]/page.tsx @@ -1,6 +1,7 @@ import { ActionLink } from '@/components/actions/ActionLink'; import { Accordion } from '@/components/controls/Accordion'; import { Icon } from '@/components/foundation/Icon'; +import { DemoTrigger } from '@/components/integrations/DemoTrigger'; import { Container, Section, Stack } from '@/components/layout/LayoutPrimitives'; import { CTA } from '@/components/marketing/CTA'; import { Comparison } from '@/components/marketing/Comparison'; @@ -13,6 +14,7 @@ import { Callout } from '@/components/surfaces/Callout'; import { Card } from '@/components/surfaces/Card'; import { Eyebrow, Heading, Text } from '@/components/typography/Typography'; import { buildHomepageContent } from '@/content/homepage-model'; +import { getPublicIntegrationConfig } from '@/lib/integrations/environment'; import { isLocale, localizedPath, type Locale } from '@/lib/localization/config'; import { getMessages } from '@/lib/localization/messages'; import { buildLocalizedMetadata } from '@/lib/metadata/build-metadata'; @@ -43,6 +45,7 @@ export default async function LocaleHomePage({ params }: LocalePageProps) { const locale: Locale = localeValue; const messages = getMessages(locale); const content = buildHomepageContent(messages.homepage, messages.shell); + const integrationConfig = getPublicIntegrationConfig(); const homePath = localizedPath('home', locale); return ( @@ -57,13 +60,16 @@ export default async function LocaleHomePage({ params }: LocalePageProps) { {content.hero.body}
- - {content.hero.primary.label} - + + } /> diff --git a/src/app/api/demo/route.ts b/src/app/api/demo/route.ts new file mode 100644 index 0000000..47d0182 --- /dev/null +++ b/src/app/api/demo/route.ts @@ -0,0 +1,159 @@ +import { randomUUID } from 'node:crypto'; +import { + demoSubmissionEnvelopeSchema, + zodFieldErrors, + type DemoSubmissionResult, +} from '@/lib/demo/schema'; +import { submitDemoLead } from '@/lib/demo/service'; +import { getIntegrationEnvironment } from '@/lib/integrations/environment'; +import { isApplicationJson } from '@/lib/security/content-type'; +import { NextResponse } from 'next/server'; + +const maximumBodyBytes = 16_384; +const responseHeaders = { 'Cache-Control': 'no-store', 'X-Content-Type-Options': 'nosniff' }; + +function failure( + status: number, + result: Extract, +): NextResponse { + return NextResponse.json(result, { status, headers: responseHeaders }); +} + +function isAllowedOrigin( + request: Request, + approvedOrigin: string | undefined, + production: boolean, +) { + const origin = request.headers.get('origin'); + if (!origin) return !production; + const requestOrigin = new URL(request.url).origin; + if (origin === requestOrigin) return true; + return approvedOrigin ? origin === new URL(approvedOrigin).origin : false; +} + +export async function POST(request: Request): Promise> { + const correlationId = randomUUID(); + let environment; + try { + environment = getIntegrationEnvironment(); + } catch { + return failure(503, { + ok: false, + category: 'configuration', + formErrorCode: 'integration_environment_invalid', + retryable: false, + correlationId, + }); + } + + if (request.headers.get('x-rdg-form') !== 'demo-v1') { + return failure(403, { + ok: false, + category: 'validation', + formErrorCode: 'invalid_request_marker', + retryable: false, + correlationId, + }); + } + + if (!isAllowedOrigin(request, environment.SITE_ORIGIN, environment.NODE_ENV === 'production')) { + return failure(403, { + ok: false, + category: 'validation', + formErrorCode: 'invalid_origin', + retryable: false, + correlationId, + }); + } + + const contentType = request.headers.get('content-type'); + if (!isApplicationJson(contentType)) { + return failure(415, { + ok: false, + category: 'validation', + formErrorCode: 'unsupported_content_type', + retryable: false, + correlationId, + }); + } + + const declaredLength = Number(request.headers.get('content-length') ?? '0'); + if (Number.isFinite(declaredLength) && declaredLength > maximumBodyBytes) { + return failure(413, { + ok: false, + category: 'validation', + formErrorCode: 'request_too_large', + retryable: false, + correlationId, + }); + } + + let body: unknown; + try { + const raw = await request.text(); + if (new TextEncoder().encode(raw).byteLength > maximumBodyBytes) { + return failure(413, { + ok: false, + category: 'validation', + formErrorCode: 'request_too_large', + retryable: false, + correlationId, + }); + } + body = JSON.parse(raw); + } catch { + return failure(400, { + ok: false, + category: 'validation', + formErrorCode: 'malformed_json', + retryable: false, + correlationId, + }); + } + + const parsed = demoSubmissionEnvelopeSchema.safeParse(body); + if (!parsed.success) { + return failure(400, { + ok: false, + category: 'validation', + fieldErrors: zodFieldErrors(parsed.error), + formErrorCode: 'validation_failed', + retryable: false, + correlationId, + }); + } + + if (parsed.data.guard.honeypot.length > 0) { + return failure(400, { + ok: false, + category: 'abuse', + formErrorCode: 'request_rejected', + retryable: false, + correlationId, + }); + } + + const scenarioHeader = request.headers.get('x-rdg-test-scenario'); + const testScenario = + environment.NODE_ENV !== 'production' && + environment.DEMO_TEST_SCENARIOS_ENABLED && + ['success', 'duplicate', 'timeout', 'integration-error'].includes(scenarioHeader ?? '') + ? (scenarioHeader as 'success' | 'duplicate' | 'timeout' | 'integration-error') + : undefined; + + const result = await submitDemoLead(parsed.data.lead, { + environment, + ...(testScenario ? { testScenario } : {}), + }); + + const status = result.ok + ? 202 + : result.category === 'timeout' + ? 504 + : result.category === 'configuration' + ? 503 + : result.category === 'duplicate' + ? 409 + : 502; + return NextResponse.json(result, { status, headers: responseHeaders }); +} diff --git a/src/components/app-shell/MobileNavigation.tsx b/src/components/app-shell/MobileNavigation.tsx index 8fbc8ca..59cb533 100644 --- a/src/components/app-shell/MobileNavigation.tsx +++ b/src/components/app-shell/MobileNavigation.tsx @@ -1,5 +1,6 @@ 'use client'; +import { DemoTrigger } from '@/components/integrations/DemoTrigger'; import type { ShellMessages } from '@/lib/localization/messages'; import type { Locale } from '@/lib/localization/config'; import type { ThemePreference } from '@/lib/theme/config'; @@ -14,9 +15,15 @@ interface MobileNavigationProps { locale: Locale; messages: ShellMessages; themePreference: ThemePreference; + demoEnabled: boolean; } -export function MobileNavigation({ locale, messages, themePreference }: MobileNavigationProps) { +export function MobileNavigation({ + locale, + messages, + themePreference, + demoEnabled, +}: MobileNavigationProps) { const [open, setOpen] = useState(false); const dialogRef = useRef(null); const triggerRef = useRef(null); @@ -122,10 +129,11 @@ export function MobileNavigation({ locale, messages, themePreference }: MobileNa label={messages.header.login} reason={messages.header.loginUnavailable} /> -
diff --git a/src/components/app-shell/SiteFooter.tsx b/src/components/app-shell/SiteFooter.tsx index aadb151..b2c8011 100644 --- a/src/components/app-shell/SiteFooter.tsx +++ b/src/components/app-shell/SiteFooter.tsx @@ -1,4 +1,5 @@ import { StatusBadge } from '@/components/foundation/StatusBadge'; +import { DemoTrigger } from '@/components/integrations/DemoTrigger'; import { localizedPath, type Locale } from '@/lib/localization/config'; import type { ShellMessages } from '@/lib/localization/messages'; import styles from './SiteFooter.module.css'; @@ -6,6 +7,7 @@ import styles from './SiteFooter.module.css'; interface SiteFooterProps { locale: Locale; messages: ShellMessages; + demoEnabled: boolean; } function HashLink({ locale, hash, children }: { locale: Locale; hash: string; children: string }) { @@ -40,7 +42,7 @@ function PendingItem({ label, pending }: { label: string; pending: string }) { ); } -export function SiteFooter({ locale, messages }: SiteFooterProps) { +export function SiteFooter({ locale, messages, demoEnabled }: SiteFooterProps) { const footer = messages.footer; const year = new Date().getUTCFullYear(); @@ -92,7 +94,12 @@ export function SiteFooter({ locale, messages }: SiteFooterProps) {
  • - +
  • diff --git a/src/components/app-shell/SiteHeader.module.css b/src/components/app-shell/SiteHeader.module.css index a68cf06..146fcce 100644 --- a/src/components/app-shell/SiteHeader.module.css +++ b/src/components/app-shell/SiteHeader.module.css @@ -261,3 +261,9 @@ html[dir='rtl'] .drawer { border: 1px solid CanvasText; } } + +@media (max-width: 559px) { + .mobileDemoTrigger { + display: none; + } +} diff --git a/src/components/app-shell/SiteHeader.tsx b/src/components/app-shell/SiteHeader.tsx index 94da848..defef38 100644 --- a/src/components/app-shell/SiteHeader.tsx +++ b/src/components/app-shell/SiteHeader.tsx @@ -1,6 +1,7 @@ import type { Locale } from '@/lib/localization/config'; import type { ShellMessages } from '@/lib/localization/messages'; import type { ThemePreference } from '@/lib/theme/config'; +import { DemoTrigger } from '@/components/integrations/DemoTrigger'; import { BrandLink } from './BrandLink'; import { DisabledAction } from './DisabledAction'; import { HeaderNavigation } from './HeaderNavigation'; @@ -13,9 +14,10 @@ interface SiteHeaderProps { locale: Locale; messages: ShellMessages; themePreference: ThemePreference; + demoEnabled: boolean; } -export function SiteHeader({ locale, messages, themePreference }: SiteHeaderProps) { +export function SiteHeader({ locale, messages, themePreference, demoEnabled }: SiteHeaderProps) { return (
    @@ -48,20 +50,28 @@ export function SiteHeader({ locale, messages, themePreference }: SiteHeaderProp compact /> -
    - + -
    diff --git a/src/components/forms/FormField.tsx b/src/components/forms/FormField.tsx index f54a209..0010f83 100644 --- a/src/components/forms/FormField.tsx +++ b/src/components/forms/FormField.tsx @@ -6,11 +6,11 @@ interface FormFieldProps { id: string; label: string; required?: boolean; - optionalLabel?: string; - supportingText?: string; - error?: string; + optionalLabel?: string | undefined; + supportingText?: string | undefined; + error?: string | undefined; children: ReactNode; - className?: string; + className?: string | undefined; } export function FormField({ @@ -58,7 +58,7 @@ export function Fieldset({ }: { legend: string; children: ReactNode; - className?: string; + className?: string | undefined; }) { return (
    diff --git a/src/components/forms/TextInput.tsx b/src/components/forms/TextInput.tsx index 1fc7db0..1b52f91 100644 --- a/src/components/forms/TextInput.tsx +++ b/src/components/forms/TextInput.tsx @@ -1,6 +1,11 @@ import { BidiText } from '@/components/foundation/BidiText'; import { classNames } from '@/lib/components/classNames'; -import type { InputHTMLAttributes, SelectHTMLAttributes, TextareaHTMLAttributes } from 'react'; +import { + forwardRef, + type InputHTMLAttributes, + type SelectHTMLAttributes, + type TextareaHTMLAttributes, +} from 'react'; import styles from './TextInput.module.css'; export type TextInputType = 'text' | 'email' | 'tel' | 'url' | 'search'; @@ -8,21 +13,18 @@ export type TextInputType = 'text' | 'email' | 'tel' | 'url' | 'search'; interface TextInputProps extends Omit, 'type'> { type?: TextInputType; invalid?: boolean; - describedBy?: string; + describedBy?: string | undefined; bidiValue?: boolean; } -export function TextInput({ - type = 'text', - invalid = false, - describedBy, - bidiValue = false, - className, - ...props -}: TextInputProps) { +export const TextInput = forwardRef(function TextInput( + { type = 'text', invalid = false, describedBy, bidiValue = false, className, ...props }, + ref, +) { const dir = bidiValue || type === 'email' || type === 'tel' || type === 'url' ? 'ltr' : undefined; return ( ); -} +}); interface TextAreaProps extends TextareaHTMLAttributes { invalid?: boolean; - describedBy?: string; + describedBy?: string | undefined; characterCount?: { current: number; max: number; label: string }; } @@ -68,7 +70,7 @@ export function TextArea({ interface SelectProps extends SelectHTMLAttributes { invalid?: boolean; - describedBy?: string; + describedBy?: string | undefined; } export function Select({ diff --git a/src/components/integrations/DemoDialogHost.module.css b/src/components/integrations/DemoDialogHost.module.css new file mode 100644 index 0000000..568069d --- /dev/null +++ b/src/components/integrations/DemoDialogHost.module.css @@ -0,0 +1,76 @@ +.form { + display: grid; + gap: var(--space-5); +} + +.notice { + display: grid; + gap: var(--space-2); + padding: var(--space-4); + border: 1px solid var(--border-standard); + border-radius: var(--radius-sm); + background: var(--surface-muted); +} + +.notice p, +.statusText { + margin: 0; + color: var(--text-secondary); +} + +.grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: var(--space-4); +} + +.spanAll { + grid-column: 1 / -1; +} + +.actions { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: var(--space-3); +} + +.success { + display: grid; + gap: var(--space-4); + text-align: start; +} + +.success h3, +.success p { + margin: 0; +} + +.honeypot { + position: absolute; + inline-size: 1px; + block-size: 1px; + overflow: hidden; + clip-path: inset(50%); + white-space: nowrap; +} + +@media (max-width: 639px) { + .grid { + grid-template-columns: minmax(0, 1fr); + } + + .spanAll { + grid-column: auto; + } + + .actions > * { + inline-size: 100%; + } +} + +@media (forced-colors: active) { + .notice { + border: 1px solid CanvasText; + } +} diff --git a/src/components/integrations/DemoDialogHost.tsx b/src/components/integrations/DemoDialogHost.tsx new file mode 100644 index 0000000..e750b11 --- /dev/null +++ b/src/components/integrations/DemoDialogHost.tsx @@ -0,0 +1,449 @@ +'use client'; + +import { Button } from '@/components/actions/Button'; +import { ErrorSummary, type FormErrorItem } from '@/components/forms/ErrorSummary'; +import { FormField } from '@/components/forms/FormField'; +import { Select, TextArea, TextInput } from '@/components/forms/TextInput'; +import { LiveRegion } from '@/components/foundation/LiveRegion'; +import { StatusBadge } from '@/components/foundation/StatusBadge'; +import { Dialog } from '@/components/overlays/Dialog'; +import type { HomepageMessages } from '@/lib/localization/messages'; +import { trackAnalytics } from '@/lib/analytics/client'; +import type { AnalyticsContext } from '@/lib/analytics/events'; +import { + demoLeadSchema, + fleetSizeValues, + type DemoSource, + type DemoSubmissionResult, +} from '@/lib/demo/schema'; +import type { Locale } from '@/lib/localization/config'; +import { getDirection } from '@/lib/localization/config'; +import { useEffect, useMemo, useRef, useState } from 'react'; +import { demoOpenEventName, type DemoOpenEventDetail } from './DemoTrigger'; +import styles from './DemoDialogHost.module.css'; + +interface DemoDialogHostProps { + locale: Locale; + messages: HomepageMessages['form']; + enabled: boolean; +} + +type FormStatus = 'idle' | 'submitting' | 'success' | 'error'; +type FieldErrors = Record; + +function messageForCode(code: string, messages: DemoDialogHostProps['messages']): string { + switch (code) { + case 'required': + return messages.requiredError; + case 'invalid_email': + return messages.emailError; + case 'invalid_fleet_size': + case 'invalid_source': + case 'invalid_idempotency_key': + return messages.invalidOptionError; + case 'too_long': + return messages.tooLongError; + default: + return messages.genericError; + } +} + +function formMessage( + result: Extract, + messages: DemoDialogHostProps['messages'], +) { + switch (result.category) { + case 'configuration': + case 'consent': + return messages.configurationError; + case 'timeout': + return messages.timeoutError; + case 'duplicate': + return messages.duplicateError; + case 'rate-limit': + return messages.rateLimitError; + case 'validation': + return messages.errorSummary; + case 'integration': + case 'abuse': + return messages.genericError; + } +} + +function analyticsContext( + locale: Locale, + source: DemoSource, + extra: Partial> = {}, +): AnalyticsContext { + const theme = document.documentElement.dataset.theme === 'dark' ? 'dark' : 'light'; + return { + routeId: 'home', + locale, + direction: getDirection(locale), + resolvedTheme: theme, + source, + ...extra, + }; +} + +export function DemoDialogHost({ locale, messages, enabled }: DemoDialogHostProps) { + const [open, setOpen] = useState(false); + const [source, setSource] = useState('hero'); + const [status, setStatus] = useState('idle'); + const [fieldErrors, setFieldErrors] = useState({}); + const [formError, setFormError] = useState(''); + const [messageLength, setMessageLength] = useState(0); + const formRef = useRef(null); + const firstFieldRef = useRef(null); + const returnFocusRef = useRef(null); + const idempotencyKeyRef = useRef(''); + const startedAtRef = useRef(0); + const closeTrackedRef = useRef(false); + + const summaryErrors = useMemo( + () => + Object.entries(fieldErrors).map(([fieldId, code]) => ({ + fieldId, + message: messageForCode(code, messages), + })), + [fieldErrors, messages], + ); + + useEffect(() => { + const handleOpen = (event: Event) => { + const detail = (event as CustomEvent).detail; + if (!detail || !enabled) return; + returnFocusRef.current = detail.trigger; + setSource(detail.source); + closeTrackedRef.current = false; + setOpen(true); + setStatus('idle'); + setFieldErrors({}); + setFormError(''); + idempotencyKeyRef.current = crypto.randomUUID(); + startedAtRef.current = Date.now(); + trackAnalytics('demo_open', analyticsContext(locale, detail.source)); + }; + window.addEventListener(demoOpenEventName, handleOpen); + return () => window.removeEventListener(demoOpenEventName, handleOpen); + }, [enabled, locale]); + + const reset = () => { + formRef.current?.reset(); + setMessageLength(0); + setStatus('idle'); + setFieldErrors({}); + setFormError(''); + idempotencyKeyRef.current = crypto.randomUUID(); + startedAtRef.current = Date.now(); + window.requestAnimationFrame(() => firstFieldRef.current?.focus()); + }; + + const close = () => { + if (status === 'submitting' || closeTrackedRef.current) return; + closeTrackedRef.current = true; + setOpen(false); + trackAnalytics('demo_close', analyticsContext(locale, source, { reason: 'user' })); + }; + + return ( + { + if (!nextOpen) close(); + else { + closeTrackedRef.current = false; + setOpen(true); + } + }} + title={messages.title} + description={messages.body} + closeLabel={messages.close} + initialFocusRef={firstFieldRef} + returnFocusRef={returnFocusRef} + dismissible={status !== 'submitting'} + > + {status === 'success' ? ( +
    + {messages.localModeLabel} +

    {messages.successTitle}

    +

    {messages.successBody}

    +
    + + +
    +
    + ) : ( +
    { + event.preventDefault(); + if (status === 'submitting') return; + + const form = event.currentTarget; + const values = new FormData(form); + const leadInput = { + fullName: String(values.get('fullName') ?? ''), + workEmail: String(values.get('workEmail') ?? ''), + company: String(values.get('company') ?? ''), + fleetSize: String(values.get('fleetSize') ?? ''), + market: String(values.get('market') ?? ''), + preferredLanguage: String(values.get('preferredLanguage') ?? locale), + message: String(values.get('message') ?? ''), + idempotencyKey: idempotencyKeyRef.current || crypto.randomUUID(), + source, + }; + + const clientResult = demoLeadSchema.safeParse(leadInput); + if (!clientResult.success) { + const nextErrors: FieldErrors = {}; + for (const issue of clientResult.error.issues) { + const field = issue.path.at(-1); + if (typeof field === 'string' && !nextErrors[field]) + nextErrors[field] = issue.message; + } + setFieldErrors(nextErrors); + setFormError(messages.errorSummary); + trackAnalytics( + 'demo_validation_error', + analyticsContext(locale, source, { errorCount: Object.keys(nextErrors).length }), + ); + window.requestAnimationFrame(() => { + const firstInvalid = form.querySelector('[aria-invalid="true"]'); + firstInvalid?.focus(); + }); + return; + } + + setStatus('submitting'); + setFieldErrors({}); + setFormError(''); + trackAnalytics('demo_submit_attempt', analyticsContext(locale, source)); + + try { + const response = await fetch('/api/demo', { + method: 'POST', + headers: { 'Content-Type': 'application/json', 'X-RDG-Form': 'demo-v1' }, + body: JSON.stringify({ + lead: clientResult.data, + guard: { + honeypot: String(values.get('website') ?? ''), + startedAtMs: startedAtRef.current, + }, + }), + }); + const result = (await response.json()) as DemoSubmissionResult; + if (result.ok) { + setStatus('success'); + trackAnalytics('demo_submit_success', analyticsContext(locale, source)); + return; + } + + const serverErrors = Object.fromEntries( + Object.entries(result.fieldErrors ?? {}).map(([field, code]) => [field, code]), + ); + setFieldErrors(serverErrors); + setFormError(formMessage(result, messages)); + setStatus('error'); + trackAnalytics( + 'demo_submit_failure', + analyticsContext(locale, source, { errorCode: result.category }), + ); + window.requestAnimationFrame(() => { + const firstInvalid = form.querySelector('[aria-invalid="true"]'); + firstInvalid?.focus(); + }); + } catch { + setFormError(messages.genericError); + setStatus('error'); + trackAnalytics( + 'demo_submit_failure', + analyticsContext(locale, source, { errorCode: 'network' }), + ); + } + }} + > +
    + {messages.localModeLabel} +

    {messages.privacy}

    +
    + + {formError ? ( + 0 + ? summaryErrors + : [{ fieldId: 'demo-submit', message: formError }] + } + /> + ) : null} + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +