Implement phased modernization infrastructure for transitioning from multi-page legacy routing to SPA portal-shell architecture, plus post-delivery hardening fixes for policy loading, fallback consistency, and governance drift detection. Key changes: - Add route contract enrichment with scope/visibility/compatibility policies - Canonical 302 redirects from legacy direct-entry to /portal-shell/ routes - Asset readiness enforcement and runtime fallback retirement for in-scope routes - Shared feature-flag helpers (env > config > default) replacing duplicated _to_bool - Defensive copy for lru_cached policy payloads preventing mutation corruption - Unified retired-fallback response helper across app and blueprint routes - Frontend/backend route-contract cross-validation in governance gates - Shell CSS token fallback values for routes rendered outside shell scope - Local-safe .env.example defaults with production recommendation comments - Legacy contract fallback warning logging and single-hop redirect optimization Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
78 lines
4.2 KiB
JSON
78 lines
4.2 KiB
JSON
{
|
|
"change": "full-modernization-architecture-blueprint",
|
|
"in_scope_routes": {
|
|
"/wip-overview": {
|
|
"filter_input_semantics": ["workorder", "lotid", "package", "type", "status"],
|
|
"query_payload_contract": ["workorder", "lotid", "package", "type", "status"],
|
|
"chart_data_shape": ["status_cards", "matrix", "pareto"],
|
|
"state_contract": ["loading", "empty", "error", "success"]
|
|
},
|
|
"/wip-detail": {
|
|
"filter_input_semantics": ["workcenter", "workorder", "lotid", "package", "type", "status", "page"],
|
|
"query_payload_contract": ["workcenter", "workorder", "lotid", "package", "type", "status", "page"],
|
|
"chart_data_shape": ["summary_cards", "lot_table"],
|
|
"state_contract": ["loading", "empty", "error", "success"]
|
|
},
|
|
"/hold-overview": {
|
|
"filter_input_semantics": ["hold_type", "reason", "workcenter", "package", "age_range", "page"],
|
|
"query_payload_contract": ["hold_type", "reason", "workcenter", "package", "age_range", "page"],
|
|
"chart_data_shape": ["summary_cards", "matrix", "treemap", "lot_table"],
|
|
"state_contract": ["loading", "empty", "error", "success"]
|
|
},
|
|
"/hold-detail": {
|
|
"filter_input_semantics": ["reason", "workcenter", "package", "age_range", "page"],
|
|
"query_payload_contract": ["reason", "workcenter", "package", "age_range", "page"],
|
|
"chart_data_shape": ["summary_cards", "distribution", "lot_table"],
|
|
"state_contract": ["loading", "empty", "error", "success"]
|
|
},
|
|
"/hold-history": {
|
|
"filter_input_semantics": ["start_date", "end_date", "hold_type", "record_type", "reason", "duration_range", "page"],
|
|
"query_payload_contract": ["start_date", "end_date", "hold_type", "record_type", "reason", "duration_range", "page"],
|
|
"chart_data_shape": ["trend", "reason_pareto", "duration", "detail_table"],
|
|
"state_contract": ["loading", "empty", "error", "success"]
|
|
},
|
|
"/resource": {
|
|
"filter_input_semantics": ["workcenter_groups", "families", "resource_ids", "statuses"],
|
|
"query_payload_contract": ["workcenter_groups", "families", "resource_ids", "statuses"],
|
|
"chart_data_shape": ["summary_cards", "status_matrix", "equipment_grid"],
|
|
"state_contract": ["loading", "empty", "error", "success"]
|
|
},
|
|
"/resource-history": {
|
|
"filter_input_semantics": ["start_date", "end_date", "granularity", "workcenter_groups", "families", "resource_ids", "is_production", "is_key", "is_monitor"],
|
|
"query_payload_contract": ["start_date", "end_date", "granularity", "workcenter_groups", "families", "resource_ids", "is_production", "is_key", "is_monitor"],
|
|
"chart_data_shape": ["kpi", "trend", "heatmap", "workcenter_comparison", "detail"],
|
|
"state_contract": ["loading", "empty", "error", "success"]
|
|
},
|
|
"/qc-gate": {
|
|
"filter_input_semantics": ["chart_bucket_selection", "table_sort"],
|
|
"query_payload_contract": ["summary", "table", "pareto"],
|
|
"chart_data_shape": ["station_stack_chart", "linked_lot_table"],
|
|
"state_contract": ["loading", "empty", "error", "success"]
|
|
},
|
|
"/job-query": {
|
|
"filter_input_semantics": ["resource_ids", "start_date", "end_date"],
|
|
"query_payload_contract": ["resource_ids", "start_date", "end_date"],
|
|
"chart_data_shape": ["job_table", "txn_table"],
|
|
"state_contract": ["loading", "empty", "error", "success"]
|
|
},
|
|
"/tmtt-defect": {
|
|
"filter_input_semantics": ["start_date", "end_date", "sort", "page"],
|
|
"query_payload_contract": ["start_date", "end_date"],
|
|
"chart_data_shape": ["kpi", "pareto", "trend", "detail_table"],
|
|
"state_contract": ["loading", "empty", "error", "success"]
|
|
},
|
|
"/admin/pages": {
|
|
"filter_input_semantics": ["drawer_crud", "page_status_edit", "order_updates"],
|
|
"query_payload_contract": ["drawers", "pages", "status"],
|
|
"chart_data_shape": ["n/a"],
|
|
"state_contract": ["loading", "empty", "error", "success"]
|
|
},
|
|
"/admin/performance": {
|
|
"filter_input_semantics": ["date_range", "severity", "search"],
|
|
"query_payload_contract": ["performance_summary", "log_stream"],
|
|
"chart_data_shape": ["timeline", "status_summary"],
|
|
"state_contract": ["loading", "empty", "error", "success"]
|
|
}
|
|
}
|
|
}
|