import { Incident } from './schema.ts'; export const incidents: Incident[] = [ { id: 'inc-001', name: 'Silent Bootstrap Failure', type: 'bootstrap', severity: 'critical', status: 'resolved', date: '2026-03-18', price: 1200, description: 'The application failed silently during initialisation due to a missing root-level error guard. No fallback UI was rendered, resulting in a blank white screen. A top-level ErrorBoundary and safe createRoot pattern have been applied.' }, { id: 'inc-002', name: 'Unregistered Animation Plugin', type: 'animation', severity: 'high', status: 'resolved', date: '2026-03-19', price: 650, description: 'GSAP ScrollTrigger was used without prior plugin registration. The console warned of a missing plugin, and all scroll-based animations failed silently. Plugins are now registered once in a dedicated utility module.' }, { id: 'inc-003', name: 'Broken Lazy Route Import', type: 'routing', severity: 'critical', status: 'resolved', date: '2026-03-20', price: 900, description: 'A dynamic import path for the DiagnosticsPage contained a typo, causing the route to throw a module-load error. The user was left on a blank screen. All lazy imports have been verified and wrapped in Suspense boundaries.' }, { id: 'inc-004', name: 'Missing Root Provider Guard', type: 'providers', severity: 'critical', status: 'resolved', date: '2026-03-21', price: 1450, description: 'The app assumed the existence of a global provider without checking for its presence. When the provider failed to mount, the entire component tree threw an uncaught error. A provider guard now renders a fallback.' }, { id: 'inc-005', name: 'Invalid Seed Data Shape', type: 'data', severity: 'high', status: 'resolved', date: '2026-03-22', price: 500, description: 'Seed data for incidents did not match the expected zod schema. The data was silently ignored, causing empty states that looked like loading failures. Zod validation now runs at startup and surfaces clear diagnostic messages.' }, { id: 'inc-006', name: 'Hash Route Dead End', type: 'routing', severity: 'high', status: 'resolved', date: '2026-03-23', price: 700, description: 'A hash route pointed to a non-existent page without a catch-all. Navigation to that route resulted in a blank container. A NotFoundPage catch-all route has been added to handle undefined hashes.' }, { id: 'inc-007', name: 'Asset Path Regression', type: 'assets', severity: 'medium', status: 'resolved', date: '2026-03-24', price: 850, description: 'An image asset reference in the Hero component broke after a directory restructuring. The broken image caused a layout shift but no visible error. All asset paths are now relative and verified against a manifest.' }, { id: 'inc-008', name: 'ScrollTrigger Hydration Clash', type: 'animation', severity: 'medium', status: 'resolved', date: '2026-03-25', price: 1100, description: 'ScrollTrigger instances created during server-side rendering conflicted with client hydration. This caused double-scroll and jank. All GSAP contexts are now cleaned up on unmount and guarded against SSR.' }, { id: 'inc-009', name: 'Uncaught Component Exception', type: 'components', severity: 'critical', status: 'resolved', date: '2026-03-26', price: 1300, description: 'A component threw an unhandled exception due to a null property access. The error propagated to the root, crashing the entire UI. Error boundaries now wrap each major section to isolate failures.' }, { id: 'inc-010', name: 'Blank Suspense Boundary', type: 'performance', severity: 'high', status: 'resolved', date: '2026-03-27', price: 600, description: 'A Suspense boundary lacked a fallback prop, causing a blank region while lazy components loaded. The app appeared partially broken. All Suspense boundaries now have skeleton fallbacks.' }, { id: 'inc-011', name: 'Motion Preference Violation', type: 'accessibility', severity: 'low', status: 'resolved', date: '2026-03-28', price: 400, description: 'GSAP animations did not respect prefers-reduced-motion. Users with motion sensitivities experienced disorienting transitions. All animations now check the media query and skip or shorten accordingly.' }, { id: 'inc-012', name: 'Unstyled Fallback Screen', type: 'ui', severity: 'medium', status: 'resolved', date: '2026-03-29', price: 750, description: 'The error fallback UI rendered without styles due to a missing CSS import. Users saw raw HTML text. Styles are now imported globally and the fallback includes inline critical CSS as a safety net.' }, ]; export const healthChecks = [ { id: 'bootstrap', label: 'Bootstrap', status: 'pass' as const }, { id: 'router', label: 'Router', status: 'pass' as const }, { id: 'providers', label: 'Providers', status: 'pass' as const }, { id: 'assets', label: 'Assets', status: 'pass' as const }, { id: 'gsap', label: 'GSAP Plugins', status: 'pass' as const }, { id: 'data', label: 'Data Validation', status: 'pass' as const }, ];