{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-f1c90464198a6f91", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-island-public.ts:136", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-island-public.ts:136"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8a954aac6518ebd5", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ReflectionModal.tsx:207", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ReflectionModal.tsx:207"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8617eac035dd3028", "name": "`truncate` class without `title=` for hover reveal \u2014 components/YourPossibleLife.tsx:186", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/YourPossibleLife.tsx:186"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fb20fdc296dfa857", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ModuleLayout.tsx:286", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ModuleLayout.tsx:286"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-785a7481e307fe03", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ComebackEngine.tsx:810", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ComebackEngine.tsx:810"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0699d6f77cee07f8", "name": "`truncate` class without `title=` for hover reveal \u2014 components/TrainingHub.tsx:268", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/TrainingHub.tsx:268"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-783b48298609cd88", "name": "`truncate` class without `title=` for hover reveal \u2014 components/PointsOptimizationModule.tsx:89", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/PointsOptimizationModule.tsx:89"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e0e57531bea4dc43", "name": "`truncate` class without `title=` for hover reveal \u2014 components/FutureFinderResults.tsx:358", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/FutureFinderResults.tsx:358"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3c2e4e0d88316068", "name": "\"active\" state uses light bg in a dark theme \u2014 components/FutureFinderResults.tsx:244", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 components/FutureFinderResults.tsx:244"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-508493c5633a2ec5", "name": "`truncate` class without `title=` for hover reveal \u2014 components/KnowledgeTree.tsx:423", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/KnowledgeTree.tsx:423"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-efce72fa04325843", "name": "`truncate` class without `title=` for hover reveal \u2014 components/InnovationZone.tsx:678", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/InnovationZone.tsx:678"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5ca3b30a7f4b6855", "name": "`truncate` class without `title=` for hover reveal \u2014 components/FutureFinder.tsx:824", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/FutureFinder.tsx:824"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-31d13390a1fde5d0", "name": "`truncate` class without `title=` for hover reveal \u2014 components/CareerPaths.tsx:74", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/CareerPaths.tsx:74"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-703f1a93a37a9807", "name": "`truncate` class without `title=` for hover reveal \u2014 components/AchievementToast.tsx:59", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/AchievementToast.tsx:59"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f734f2b425f26355", "name": "`truncate` class without `title=` for hover reveal \u2014 components/SpacedRepetitionTimetable.tsx:199", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/SpacedRepetitionTimetable.tsx:199"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6c71977cb45d164a", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ModuleShowcase.tsx:356", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ModuleShowcase.tsx:356"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e821aad8f9f24030", "name": "`truncate` class without `title=` for hover reveal \u2014 components/CAOPointsSimulator.tsx:346", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/CAOPointsSimulator.tsx:346"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b2da5a6a3d9524fa", "name": "`truncate` class without `title=` for hover reveal \u2014 components/CollegeCompass.tsx:476", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/CollegeCompass.tsx:476"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-478684abc4e4df85", "name": "`truncate` class without `title=` for hover reveal \u2014 components/GameDayModule.tsx:270", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/GameDayModule.tsx:270"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8eaa3d88dc76edf4", "name": "`truncate` class without `title=` for hover reveal \u2014 components/Library.tsx:469", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/Library.tsx:469"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4ce62a36b488a9e1", "name": "`truncate` class without `title=` for hover reveal \u2014 components/PointsPassport.tsx:298", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/PointsPassport.tsx:298"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e20e746baed91ad3", "name": "`truncate` class without `title=` for hover reveal \u2014 components/AdminDashboard.tsx:93", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/AdminDashboard.tsx:93"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8630d1f372b6215e", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ExamHallStrategiesModule.tsx:759", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ExamHallStrategiesModule.tsx:759"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-373e2786852b8196", "name": "`truncate` class without `title=` for hover reveal \u2014 components/MasteringTheCreativesModule.tsx:274", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/MasteringTheCreativesModule.tsx:274"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bb1c7a26a6cb811c", "name": "`truncate` class without `title=` for hover reveal \u2014 components/PaperTrail/Viewer.tsx:366", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/PaperTrail/Viewer.tsx:366"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-af7fbbf1651b0a15", "name": "\"active\" state uses light bg in a dark theme \u2014 components/PaperTrail/Viewer.tsx:332", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 components/PaperTrail/Viewer.tsx:332"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-26edc04e9a0a9788", "name": "`truncate` class without `title=` for hover reveal \u2014 components/journey/JourneyView.tsx:213", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/journey/JourneyView.tsx:213"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a86f09c8be2e8fa0", "name": "`truncate` class without `title=` for hover reveal \u2014 components/journey/PeerIslandsList.tsx:233", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/journey/PeerIslandsList.tsx:233"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-de5018c87a83a620", "name": "`truncate` class without `title=` for hover reveal \u2014 components/journey/IslandShopDrawer.tsx:135", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/journey/IslandShopDrawer.tsx:135"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-37810d2c18b2a02e", "name": "`truncate` class without `title=` for hover reveal \u2014 components/study/StudySessionView.tsx:706", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/study/StudySessionView.tsx:706"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-37468005e4c70a8b", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ExamReps/index.tsx:280", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ExamReps/index.tsx:280"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b7cfbe809d7967c9", "name": "`truncate` class without `title=` for hover reveal \u2014 components/war-room/CoveragePanel.tsx:247", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/war-room/CoveragePanel.tsx:247"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e55ef95a55b83da0", "name": "`truncate` class without `title=` for hover reveal \u2014 components/war-room/TrajectoryPanel.tsx:411", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/war-room/TrajectoryPanel.tsx:411"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b9448b827e1b0409", "name": "`truncate` class without `title=` for hover reveal \u2014 components/war-room/CountdownPanel.tsx:138", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/war-room/CountdownPanel.tsx:138"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7441f5840b80d077", "name": "`truncate` class without `title=` for hover reveal \u2014 components/gc/GCOverview.tsx:1035", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/gc/GCOverview.tsx:1035"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f4d4e6a153807f6d", "name": "`truncate` class without `title=` for hover reveal \u2014 components/gc/SubjectHealthPanel.tsx:187", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/gc/SubjectHealthPanel.tsx:187"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d8fd8e526b6a8197", "name": "`truncate` class without `title=` for hover reveal \u2014 components/gc/GCStudentDetail.tsx:233", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/gc/GCStudentDetail.tsx:233"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6a6d1532e263d5c2", "name": "`truncate` class without `title=` for hover reveal \u2014 components/gc/GCKeyEvents.tsx:422", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/gc/GCKeyEvents.tsx:422"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-06148e2ebd819eb3", "name": "`truncate` class without `title=` for hover reveal \u2014 components/CatchUpLane/index.tsx:170", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/CatchUpLane/index.tsx:170"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-27b5c9a6e90dcc12", "name": "Insecure pattern 'direct_innerhtml_assignment' in integration-map.html:652", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in integration-map.html:652"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f3ecb1abf6dc1d9d", "name": "Possible secret in firebase.ts", "shortDescription": {"text": "Possible secret in firebase.ts"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-c491485c384813b8", "name": "Insecure pattern 'exec_used' in careerPathsData.ts:1400", "shortDescription": {"text": "Insecure pattern 'exec_used' in careerPathsData.ts:1400"}, "fullDescription": {"text": "Found a known-risky pattern (exec_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-28c4a04bd807da0c", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "FirebaseExtended/action-hosting-deploy@v0 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bcbed20b74639642", "name": "Very large file: subjectContentStem.ts (864 lines)", "shortDescription": {"text": "Very large file: subjectContentStem.ts (864 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0d99550f946f7a87", "name": "Very large file: curriculum.ts (9338 lines)", "shortDescription": {"text": "Very large file: curriculum.ts (9338 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2b72de8dddbb08e5", "name": "Very large file: paperTrailData.ts (3433 lines)", "shortDescription": {"text": "Very large file: paperTrailData.ts (3433 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-38b7d5dfadc3fd94", "name": "Very large file: examRepsData.ts (5444 lines)", "shortDescription": {"text": "Very large file: examRepsData.ts (5444 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-859905eaf4cadc2c", "name": "Very large file: commandWordData.ts (6353 lines)", "shortDescription": {"text": "Very large file: commandWordData.ts (6353 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9819f271dd40e6f4", "name": "Very large file: careerPathsData.ts (1801 lines)", "shortDescription": {"text": "Very large file: careerPathsData.ts (1801 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-99aa6c17b13c6e63", "name": "Very large file: components/EmotionalIntelligenceModule.tsx (811 lines)", "shortDescription": {"text": "Very large file: components/EmotionalIntelligenceModule.tsx (811 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4d770ed05a71bef3", "name": "Very large file: components/Onboarding.tsx (1468 lines)", "shortDescription": {"text": "Very large file: components/Onboarding.tsx (1468 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e279bdd5402038a1", "name": "Very large file: components/futureFinderData.ts (1509 lines)", "shortDescription": {"text": "Very large file: components/futureFinderData.ts (1509 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a14b6ccda11aded2", "name": "Very large file: components/TheContextEffectModule.tsx (864 lines)", "shortDescription": {"text": "Very large file: components/TheContextEffectModule.tsx (864 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0b3f47d726ae6448", "name": "Very large file: components/AnswerEngineeringModule.tsx (873 lines)", "shortDescription": {"text": "Very large file: components/AnswerEngineeringModule.tsx (873 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa4d734121c69383", "name": "Very large file: components/ComebackEngine.tsx (1406 lines)", "shortDescription": {"text": "Very large file: components/ComebackEngine.tsx (1406 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9dc6bde478b69530", "name": "Very large file: components/TheLearningRadarModule.tsx (916 lines)", "shortDescription": {"text": "Very large file: components/TheLearningRadarModule.tsx (916 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-650ec1c7d462015b", "name": "Very large file: components/PointsOptimizationModule.tsx (819 lines)", "shortDescription": {"text": "Very large file: components/PointsOptimizationModule.tsx (819 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c9e9ac22b1a538f6", "name": "Very large file: components/InnovationZone.tsx (913 lines)", "shortDescription": {"text": "Very large file: components/InnovationZone.tsx (913 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c77b5176c581f7d8", "name": "Very large file: components/FutureFinder.tsx (1462 lines)", "shortDescription": {"text": "Very large file: components/FutureFinder.tsx (1462 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c0d64b30a90a8e3", "name": "Very large file: components/SpacedRepetitionTimetable.tsx (1307 lines)", "shortDescription": {"text": "Very large file: components/SpacedRepetitionTimetable.tsx (1307 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4b4fd7fd257c61d9", "name": "Very large file: components/ExamCrisisManagementModule.tsx (1065 lines)", "shortDescription": {"text": "Very large file: components/ExamCrisisManagementModule.tsx (1065 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a1e7f07995424980", "name": "Very large file: components/AcademicJourneyGame.tsx (1207 lines)", "shortDescription": {"text": "Very large file: components/AcademicJourneyGame.tsx (1207 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c18a8082cf3822d2", "name": "Very large file: components/journeySimulatorData.ts (2166 lines)", "shortDescription": {"text": "Very large file: components/journeySimulatorData.ts (2166 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-af4f21f3c7df24be", "name": "Very large file: components/ExamHallStrategiesModule.tsx (965 lines)", "shortDescription": {"text": "Very large file: components/ExamHallStrategiesModule.tsx (965 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f1fe73bc15bc2dc6", "name": "Very large file: components/journey/scenes/SharedSceneElements.tsx (2045 lines)", "shortDescription": {"text": "Very large file: components/journey/scenes/SharedSceneElements.tsx (2045 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a3ba2b0f9014ae84", "name": "Very large file: components/study/StudySessionView.tsx (1200 lines)", "shortDescription": {"text": "Very large file: components/study/StudySessionView.tsx (1200 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2af1c9aee1836808", "name": "Very large file: components/gc/GCOverview.tsx (2056 lines)", "shortDescription": {"text": "Very large file: components/gc/GCOverview.tsx (2056 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-82f239cd2d9b1697", "name": "Very large file: components/gc/GCStudentDetail.tsx (1452 lines)", "shortDescription": {"text": "Very large file: components/gc/GCStudentDetail.tsx (1452 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "22 test file(s) for 428 source file(s) (ratio 0.05). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 48 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 243 placeholder/mock markers across 70 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bea357a6497a2d5d", "name": "Agent authority lacks a verifier contract: CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6cac32631535ff6a", "name": "Agent authority lacks a verifier contract: .claude/skills/plan/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/plan/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-414038d0042cbb1f", "name": "Agent authority lacks a verifier contract: .claude/skills/verify/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/verify/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e333309dd71ff2f1", "name": "Commented-code block (6 lines) in tailwind.config.ts:28", "shortDescription": {"text": "Commented-code block (6 lines) in tailwind.config.ts:28"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-696de3cfae276e80", "name": "Commented-code block (6 lines) in moduleThemes.ts:96", "shortDescription": {"text": "Commented-code block (6 lines) in moduleThemes.ts:96"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1b39b2e35fcd0733", "name": "Commented-code block (7 lines) in vite.config.ts:51", "shortDescription": {"text": "Commented-code block (7 lines) in vite.config.ts:51"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-663a761f057ee7a0", "name": "Commented-code block (5 lines) in northStarProgressionData.ts:298", "shortDescription": {"text": "Commented-code block (5 lines) in northStarProgressionData.ts:298"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7fe9c8d7418984b7", "name": "Commented-code block (8 lines) in collegeCompassData.ts:528", "shortDescription": {"text": "Commented-code block (8 lines) in collegeCompassData.ts:528"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9b6772f447b54dd4", "name": "Commented-code block (6 lines) in achievementData.ts:467", "shortDescription": {"text": "Commented-code block (6 lines) in achievementData.ts:467"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8ab0731a1de7e790", "name": "Commented-code block (5 lines) in types.ts:116", "shortDescription": {"text": "Commented-code block (5 lines) in types.ts:116"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a6a7b44a63f3fb2c", "name": "Commented-code block (6 lines) in firebase.ts:27", "shortDescription": {"text": "Commented-code block (6 lines) in firebase.ts:27"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fb1b86217b1f2c5e", "name": "Commented-code block (5 lines) in App.tsx:147", "shortDescription": {"text": "Commented-code block (5 lines) in App.tsx:147"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ea6b8df047566400", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/paper-trail/upload.py:82", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/paper-trail/upload.py:82"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-37ee6042510e3f0e", "name": "Commented-code block (7 lines) in utils/authUtils.ts:15", "shortDescription": {"text": "Commented-code block (7 lines) in utils/authUtils.ts:15"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6f6b562761d2fc29", "name": "Commented-code block (7 lines) in contexts/AuthContext.tsx:94", "shortDescription": {"text": "Commented-code block (7 lines) in contexts/AuthContext.tsx:94"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d62815f7dc3ad2c3", "name": "Commented-code block (6 lines) in contexts/ProgressContext.tsx:189", "shortDescription": {"text": "Commented-code block (6 lines) in contexts/ProgressContext.tsx:189"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ae0c49917ed41d5d", "name": "Commented-code block (7 lines) in hooks/useIslandShop.ts:27", "shortDescription": {"text": "Commented-code block (7 lines) in hooks/useIslandShop.ts:27"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1c0512e0940c26a2", "name": "Commented-code block (5 lines) in hooks/useWeeklyChallenge.ts:58", "shortDescription": {"text": "Commented-code block (5 lines) in hooks/useWeeklyChallenge.ts:58"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b9eea3df2a3dabe7", "name": "Commented-code block (5 lines) in components/subjectData.ts:12", "shortDescription": {"text": "Commented-code block (5 lines) in components/subjectData.ts:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d345d4f942496734", "name": "Commented-code block (5 lines) in components/RankUpModal.tsx:366", "shortDescription": {"text": "Commented-code block (5 lines) in components/RankUpModal.tsx:366"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4142a2249fda129e", "name": "Commented-code block (5 lines) in components/Onboarding.tsx:84", "shortDescription": {"text": "Commented-code block (5 lines) in components/Onboarding.tsx:84"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-94e0dade630aca7f", "name": "Commented-code block (6 lines) in components/PullToRefresh.tsx:25", "shortDescription": {"text": "Commented-code block (6 lines) in components/PullToRefresh.tsx:25"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-142f4f57a1e103d8", "name": "Commented-code block (5 lines) in components/LoginPage.tsx:73", "shortDescription": {"text": "Commented-code block (5 lines) in components/LoginPage.tsx:73"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-565cef5aa2d8520e", "name": "Commented-code block (5 lines) in components/YearTransitionFlow.tsx:23", "shortDescription": {"text": "Commented-code block (5 lines) in components/YearTransitionFlow.tsx:23"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1babba04066b2af2", "name": "Commented-code block (5 lines) in components/futureFinderAlgorithm.ts:426", "shortDescription": {"text": "Commented-code block (5 lines) in components/futureFinderAlgorithm.ts:426"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9be346146fef6e5c", "name": "Commented-code block (5 lines) in components/InnovationZone.tsx:24", "shortDescription": {"text": "Commented-code block (5 lines) in components/InnovationZone.tsx:24"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c7f702135f856109", "name": "Commented-code block (5 lines) in components/FutureFinder.tsx:123", "shortDescription": {"text": "Commented-code block (5 lines) in components/FutureFinder.tsx:123"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5faa8ebd87daeac2", "name": "Commented-code block (5 lines) in components/FutureFinderRevamped.tsx:313", "shortDescription": {"text": "Commented-code block (5 lines) in components/FutureFinderRevamped.tsx:313"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2a2353088ab8edb6", "name": "Commented-code block (6 lines) in components/SpacedRepetitionTimetable.tsx:386", "shortDescription": {"text": "Commented-code block (6 lines) in components/SpacedRepetitionTimetable.tsx:386"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-88477ce08e0175c6", "name": "Commented-code block (7 lines) in components/NorthStarOnboarding.tsx:179", "shortDescription": {"text": "Commented-code block (7 lines) in components/NorthStarOnboarding.tsx:179"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-066e457481263fc8", "name": "Commented-code block (5 lines) in components/timetableAlgorithm.ts:602", "shortDescription": {"text": "Commented-code block (5 lines) in components/timetableAlgorithm.ts:602"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-90898545d6c7e994", "name": "Commented-code block (6 lines) in components/AppRouter.tsx:247", "shortDescription": {"text": "Commented-code block (6 lines) in components/AppRouter.tsx:247"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f20b544650044ab5", "name": "Commented-code block (21 lines) in components/subjectExplorerData.ts:11", "shortDescription": {"text": "Commented-code block (21 lines) in components/subjectExplorerData.ts:11"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c7e1d53dd4b58a7a", "name": "Commented-code block (5 lines) in components/ExamReps/index.tsx:78", "shortDescription": {"text": "Commented-code block (5 lines) in components/ExamReps/index.tsx:78"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e2a1cda75f72497e", "name": "Commented-code block (7 lines) in components/gc/GCOverview.tsx:174", "shortDescription": {"text": "Commented-code block (7 lines) in components/gc/GCOverview.tsx:174"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-69b7db865182360b", "name": "Commented-code block (5 lines) in components/gc/GCStudentDetail.tsx:114", "shortDescription": {"text": "Commented-code block (5 lines) in components/gc/GCStudentDetail.tsx:114"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eb3f5e1b29e0b277", "name": "Commented-code block (5 lines) in components/gc/GCKeyEvents.tsx:200", "shortDescription": {"text": "Commented-code block (5 lines) in components/gc/GCKeyEvents.tsx:200"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/24074"}, "properties": {"repository": "alexlinehan17-lab/Nextstepuni-Launch-", "repoUrl": "https://github.com/alexlinehan17-lab/Nextstepuni-Launch-", "branch": "main"}, "results": [{"ruleId": "scanner-f1c90464198a6f91", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-island-public.ts:136"}, "properties": {"repobilityId": "e33ae1623df1b620", "scanner": "scanner-primary", "fingerprint": "f1c90464198a6f91", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8a954aac6518ebd5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ReflectionModal.tsx:207"}, "properties": {"repobilityId": "42007dece64a13e5", "scanner": "scanner-primary", "fingerprint": "8a954aac6518ebd5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8617eac035dd3028", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/YourPossibleLife.tsx:186"}, "properties": {"repobilityId": "fc901d42e0f21a4f", "scanner": "scanner-primary", "fingerprint": "8617eac035dd3028", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fb20fdc296dfa857", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ModuleLayout.tsx:286"}, "properties": {"repobilityId": "f21055dc04cfe627", "scanner": "scanner-primary", "fingerprint": "fb20fdc296dfa857", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-785a7481e307fe03", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ComebackEngine.tsx:810"}, "properties": {"repobilityId": "f12c0354c206506d", "scanner": "scanner-primary", "fingerprint": "785a7481e307fe03", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0699d6f77cee07f8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/TrainingHub.tsx:268"}, "properties": {"repobilityId": "ae7025cf5c8d181f", "scanner": "scanner-primary", "fingerprint": "0699d6f77cee07f8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-783b48298609cd88", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/PointsOptimizationModule.tsx:89"}, "properties": {"repobilityId": "fd0f45b8b70a40c8", "scanner": "scanner-primary", "fingerprint": "783b48298609cd88", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e0e57531bea4dc43", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/FutureFinderResults.tsx:358"}, "properties": {"repobilityId": "84c2ab42f06dade9", "scanner": "scanner-primary", "fingerprint": "e0e57531bea4dc43", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3c2e4e0d88316068", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 components/FutureFinderResults.tsx:244"}, "properties": {"repobilityId": "254f65723bce08fe", "scanner": "scanner-primary", "fingerprint": "3c2e4e0d88316068", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-508493c5633a2ec5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/KnowledgeTree.tsx:423"}, "properties": {"repobilityId": "7d4ab9e182f03b22", "scanner": "scanner-primary", "fingerprint": "508493c5633a2ec5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-efce72fa04325843", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/InnovationZone.tsx:678"}, "properties": {"repobilityId": "b11c9b1e15b1b8ec", "scanner": "scanner-primary", "fingerprint": "efce72fa04325843", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5ca3b30a7f4b6855", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/FutureFinder.tsx:824"}, "properties": {"repobilityId": "cf90b4428d81134c", "scanner": "scanner-primary", "fingerprint": "5ca3b30a7f4b6855", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-31d13390a1fde5d0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/CareerPaths.tsx:74"}, "properties": {"repobilityId": "a1a042773e26bfbc", "scanner": "scanner-primary", "fingerprint": "31d13390a1fde5d0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-703f1a93a37a9807", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/AchievementToast.tsx:59"}, "properties": {"repobilityId": "baed0e638e2860d2", "scanner": "scanner-primary", "fingerprint": "703f1a93a37a9807", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f734f2b425f26355", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/SpacedRepetitionTimetable.tsx:199"}, "properties": {"repobilityId": "7b36ddabd85f553a", "scanner": "scanner-primary", "fingerprint": "f734f2b425f26355", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6c71977cb45d164a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ModuleShowcase.tsx:356"}, "properties": {"repobilityId": "edfe67c9bf32dd15", "scanner": "scanner-primary", "fingerprint": "6c71977cb45d164a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e821aad8f9f24030", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/CAOPointsSimulator.tsx:346"}, "properties": {"repobilityId": "85cfdfe943da16fb", "scanner": "scanner-primary", "fingerprint": "e821aad8f9f24030", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b2da5a6a3d9524fa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/CollegeCompass.tsx:476"}, "properties": {"repobilityId": "14576950335bcef4", "scanner": "scanner-primary", "fingerprint": "b2da5a6a3d9524fa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-478684abc4e4df85", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/GameDayModule.tsx:270"}, "properties": {"repobilityId": "2f6707cb69ebbb17", "scanner": "scanner-primary", "fingerprint": "478684abc4e4df85", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8eaa3d88dc76edf4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/Library.tsx:469"}, "properties": {"repobilityId": "0612721504da2fff", "scanner": "scanner-primary", "fingerprint": "8eaa3d88dc76edf4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4ce62a36b488a9e1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/PointsPassport.tsx:298"}, "properties": {"repobilityId": "0f97b34fbc330897", "scanner": "scanner-primary", "fingerprint": "4ce62a36b488a9e1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e20e746baed91ad3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/AdminDashboard.tsx:93"}, "properties": {"repobilityId": "0e3213452ff40bf5", "scanner": "scanner-primary", "fingerprint": "e20e746baed91ad3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8630d1f372b6215e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ExamHallStrategiesModule.tsx:759"}, "properties": {"repobilityId": "bf6b43ee444ab1a1", "scanner": "scanner-primary", "fingerprint": "8630d1f372b6215e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-373e2786852b8196", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/MasteringTheCreativesModule.tsx:274"}, "properties": {"repobilityId": "7b4df26eb3a4daa5", "scanner": "scanner-primary", "fingerprint": "373e2786852b8196", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bb1c7a26a6cb811c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/PaperTrail/Viewer.tsx:366"}, "properties": {"repobilityId": "816512a2a7d7c61d", "scanner": "scanner-primary", "fingerprint": "bb1c7a26a6cb811c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-af7fbbf1651b0a15", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 components/PaperTrail/Viewer.tsx:332"}, "properties": {"repobilityId": "971ef1a5f6531ba2", "scanner": "scanner-primary", "fingerprint": "af7fbbf1651b0a15", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-26edc04e9a0a9788", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/journey/JourneyView.tsx:213"}, "properties": {"repobilityId": "8a9c3becb2157205", "scanner": "scanner-primary", "fingerprint": "26edc04e9a0a9788", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a86f09c8be2e8fa0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/journey/PeerIslandsList.tsx:233"}, "properties": {"repobilityId": "cef17bdc50f08584", "scanner": "scanner-primary", "fingerprint": "a86f09c8be2e8fa0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-de5018c87a83a620", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/journey/IslandShopDrawer.tsx:135"}, "properties": {"repobilityId": "2cdfe14c890db741", "scanner": "scanner-primary", "fingerprint": "de5018c87a83a620", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-37810d2c18b2a02e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/study/StudySessionView.tsx:706"}, "properties": {"repobilityId": "e59158e78df4a991", "scanner": "scanner-primary", "fingerprint": "37810d2c18b2a02e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-37468005e4c70a8b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ExamReps/index.tsx:280"}, "properties": {"repobilityId": "9faafd5e51a1e58c", "scanner": "scanner-primary", "fingerprint": "37468005e4c70a8b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b7cfbe809d7967c9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/war-room/CoveragePanel.tsx:247"}, "properties": {"repobilityId": "6e05115a098883c6", "scanner": "scanner-primary", "fingerprint": "b7cfbe809d7967c9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e55ef95a55b83da0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/war-room/TrajectoryPanel.tsx:411"}, "properties": {"repobilityId": "b8fa309e6b1a9ae1", "scanner": "scanner-primary", "fingerprint": "e55ef95a55b83da0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b9448b827e1b0409", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/war-room/CountdownPanel.tsx:138"}, "properties": {"repobilityId": "9e798fea98f2629b", "scanner": "scanner-primary", "fingerprint": "b9448b827e1b0409", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7441f5840b80d077", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/gc/GCOverview.tsx:1035"}, "properties": {"repobilityId": "ba639d77e9953acf", "scanner": "scanner-primary", "fingerprint": "7441f5840b80d077", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f4d4e6a153807f6d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/gc/SubjectHealthPanel.tsx:187"}, "properties": {"repobilityId": "4396efe4d0953a4a", "scanner": "scanner-primary", "fingerprint": "f4d4e6a153807f6d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d8fd8e526b6a8197", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/gc/GCStudentDetail.tsx:233"}, "properties": {"repobilityId": "43db95328d8e30f7", "scanner": "scanner-primary", "fingerprint": "d8fd8e526b6a8197", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6a6d1532e263d5c2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/gc/GCKeyEvents.tsx:422"}, "properties": {"repobilityId": "30b83fa5eb78f66d", "scanner": "scanner-primary", "fingerprint": "6a6d1532e263d5c2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-06148e2ebd819eb3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/CatchUpLane/index.tsx:170"}, "properties": {"repobilityId": "d56f2ddb0ad18626", "scanner": "scanner-primary", "fingerprint": "06148e2ebd819eb3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-27b5c9a6e90dcc12", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in integration-map.html:652"}, "properties": {"repobilityId": "b583257a0eec5553", "scanner": "scanner-primary", "fingerprint": "27b5c9a6e90dcc12", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "integration-map.html"}, "region": {"startLine": 652}}}]}, {"ruleId": "scanner-f3ecb1abf6dc1d9d", "level": "error", "message": {"text": "Possible secret in firebase.ts"}, "properties": {"repobilityId": "705e9e0e95ef924b", "scanner": "scanner-primary", "fingerprint": "f3ecb1abf6dc1d9d", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "firebase.ts"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-c491485c384813b8", "level": "error", "message": {"text": "Insecure pattern 'exec_used' in careerPathsData.ts:1400"}, "properties": {"repobilityId": "3329af8fbc5fe7ab", "scanner": "scanner-primary", "fingerprint": "c491485c384813b8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "exec_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "careerPathsData.ts"}, "region": {"startLine": 1400}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c2734109a9076e87", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-bcbed20b74639642", "level": "note", "message": {"text": "Very large file: subjectContentStem.ts (864 lines)"}, "properties": {"repobilityId": "677a9da029e2eeb2", "scanner": "scanner-primary", "fingerprint": "bcbed20b74639642", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0d99550f946f7a87", "level": "note", "message": {"text": "Very large file: curriculum.ts (9338 lines)"}, "properties": {"repobilityId": "8e71b3903d9c6152", "scanner": "scanner-primary", "fingerprint": "0d99550f946f7a87", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2b72de8dddbb08e5", "level": "note", "message": {"text": "Very large file: paperTrailData.ts (3433 lines)"}, "properties": {"repobilityId": "e0a0976de792d87d", "scanner": "scanner-primary", "fingerprint": "2b72de8dddbb08e5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-38b7d5dfadc3fd94", "level": "note", "message": {"text": "Very large file: examRepsData.ts (5444 lines)"}, "properties": {"repobilityId": "6d156d53b7644be0", "scanner": "scanner-primary", "fingerprint": "38b7d5dfadc3fd94", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-859905eaf4cadc2c", "level": "note", "message": {"text": "Very large file: commandWordData.ts (6353 lines)"}, "properties": {"repobilityId": "cd36e8c944ece3d2", "scanner": "scanner-primary", "fingerprint": "859905eaf4cadc2c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9819f271dd40e6f4", "level": "note", "message": {"text": "Very large file: careerPathsData.ts (1801 lines)"}, "properties": {"repobilityId": "a94c65dc0d72d018", "scanner": "scanner-primary", "fingerprint": "9819f271dd40e6f4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-99aa6c17b13c6e63", "level": "note", "message": {"text": "Very large file: components/EmotionalIntelligenceModule.tsx (811 lines)"}, "properties": {"repobilityId": "d6e28bc883c04a87", "scanner": "scanner-primary", "fingerprint": "99aa6c17b13c6e63", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4d770ed05a71bef3", "level": "note", "message": {"text": "Very large file: components/Onboarding.tsx (1468 lines)"}, "properties": {"repobilityId": "867cfea7e49e6ad3", "scanner": "scanner-primary", "fingerprint": "4d770ed05a71bef3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e279bdd5402038a1", "level": "note", "message": {"text": "Very large file: components/futureFinderData.ts (1509 lines)"}, "properties": {"repobilityId": "f78a7b9520144a7b", "scanner": "scanner-primary", "fingerprint": "e279bdd5402038a1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a14b6ccda11aded2", "level": "note", "message": {"text": "Very large file: components/TheContextEffectModule.tsx (864 lines)"}, "properties": {"repobilityId": "367142c786237a52", "scanner": "scanner-primary", "fingerprint": "a14b6ccda11aded2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0b3f47d726ae6448", "level": "note", "message": {"text": "Very large file: components/AnswerEngineeringModule.tsx (873 lines)"}, "properties": {"repobilityId": "7c0e3e747dd316c9", "scanner": "scanner-primary", "fingerprint": "0b3f47d726ae6448", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-aa4d734121c69383", "level": "note", "message": {"text": "Very large file: components/ComebackEngine.tsx (1406 lines)"}, "properties": {"repobilityId": "0b769c704e273e48", "scanner": "scanner-primary", "fingerprint": "aa4d734121c69383", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9dc6bde478b69530", "level": "note", "message": {"text": "Very large file: components/TheLearningRadarModule.tsx (916 lines)"}, "properties": {"repobilityId": "101418579126d9e1", "scanner": "scanner-primary", "fingerprint": "9dc6bde478b69530", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-650ec1c7d462015b", "level": "note", "message": {"text": "Very large file: components/PointsOptimizationModule.tsx (819 lines)"}, "properties": {"repobilityId": "8941091db699a44b", "scanner": "scanner-primary", "fingerprint": "650ec1c7d462015b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c9e9ac22b1a538f6", "level": "note", "message": {"text": "Very large file: components/InnovationZone.tsx (913 lines)"}, "properties": {"repobilityId": "06403490ec4e94b0", "scanner": "scanner-primary", "fingerprint": "c9e9ac22b1a538f6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c77b5176c581f7d8", "level": "note", "message": {"text": "Very large file: components/FutureFinder.tsx (1462 lines)"}, "properties": {"repobilityId": "8a5c183574d5ecd6", "scanner": "scanner-primary", "fingerprint": "c77b5176c581f7d8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2c0d64b30a90a8e3", "level": "note", "message": {"text": "Very large file: components/SpacedRepetitionTimetable.tsx (1307 lines)"}, "properties": {"repobilityId": "cf285b15263e28ec", "scanner": "scanner-primary", "fingerprint": "2c0d64b30a90a8e3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4b4fd7fd257c61d9", "level": "note", "message": {"text": "Very large file: components/ExamCrisisManagementModule.tsx (1065 lines)"}, "properties": {"repobilityId": "c6b73755ce48729c", "scanner": "scanner-primary", "fingerprint": "4b4fd7fd257c61d9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a1e7f07995424980", "level": "note", "message": {"text": "Very large file: components/AcademicJourneyGame.tsx (1207 lines)"}, "properties": {"repobilityId": "aba85ee25fb5b7ec", "scanner": "scanner-primary", "fingerprint": "a1e7f07995424980", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c18a8082cf3822d2", "level": "note", "message": {"text": "Very large file: components/journeySimulatorData.ts (2166 lines)"}, "properties": {"repobilityId": "93ee0963e987faa1", "scanner": "scanner-primary", "fingerprint": "c18a8082cf3822d2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-af4f21f3c7df24be", "level": "note", "message": {"text": "Very large file: components/ExamHallStrategiesModule.tsx (965 lines)"}, "properties": {"repobilityId": "a7d1b08ba8183935", "scanner": "scanner-primary", "fingerprint": "af4f21f3c7df24be", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f1fe73bc15bc2dc6", "level": "note", "message": {"text": "Very large file: components/journey/scenes/SharedSceneElements.tsx (2045 lines)"}, "properties": {"repobilityId": "e5bbd578a30c5264", "scanner": "scanner-primary", "fingerprint": "f1fe73bc15bc2dc6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a3ba2b0f9014ae84", "level": "note", "message": {"text": "Very large file: components/study/StudySessionView.tsx (1200 lines)"}, "properties": {"repobilityId": "d949d191c4aa8f41", "scanner": "scanner-primary", "fingerprint": "a3ba2b0f9014ae84", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2af1c9aee1836808", "level": "note", "message": {"text": "Very large file: components/gc/GCOverview.tsx (2056 lines)"}, "properties": {"repobilityId": "8e9f7d7174873009", "scanner": "scanner-primary", "fingerprint": "2af1c9aee1836808", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-82f239cd2d9b1697", "level": "note", "message": {"text": "Very large file: components/gc/GCStudentDetail.tsx (1452 lines)"}, "properties": {"repobilityId": "86f7b76b4d00a8f6", "scanner": "scanner-primary", "fingerprint": "82f239cd2d9b1697", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "a3f230f1a33af963", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "5319b3b43f5aae4c", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "cbee501e49d5a95f", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "7b9fd4dbc7318a1f", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "0994678cc29d91b9", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-bea357a6497a2d5d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "properties": {"repobilityId": "aae72df3934829ac", "scanner": "scanner-primary", "fingerprint": "bea357a6497a2d5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6cac32631535ff6a", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/plan/SKILL.md"}, "properties": {"repobilityId": "47bba832006ed1f5", "scanner": "scanner-primary", "fingerprint": "6cac32631535ff6a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/plan/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-414038d0042cbb1f", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/verify/SKILL.md"}, "properties": {"repobilityId": "ff7a819c518af141", "scanner": "scanner-primary", "fingerprint": "414038d0042cbb1f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/verify/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e333309dd71ff2f1", "level": "none", "message": {"text": "Commented-code block (6 lines) in tailwind.config.ts:28"}, "properties": {"repobilityId": "5453844c903a0aae", "scanner": "scanner-primary", "fingerprint": "e333309dd71ff2f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-696de3cfae276e80", "level": "none", "message": {"text": "Commented-code block (6 lines) in moduleThemes.ts:96"}, "properties": {"repobilityId": "25cc878eb4dffe3e", "scanner": "scanner-primary", "fingerprint": "696de3cfae276e80", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b39b2e35fcd0733", "level": "none", "message": {"text": "Commented-code block (7 lines) in vite.config.ts:51"}, "properties": {"repobilityId": "6a3b049ccd02b9ed", "scanner": "scanner-primary", "fingerprint": "1b39b2e35fcd0733", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-663a761f057ee7a0", "level": "none", "message": {"text": "Commented-code block (5 lines) in northStarProgressionData.ts:298"}, "properties": {"repobilityId": "985ad9c4063c8e46", "scanner": "scanner-primary", "fingerprint": "663a761f057ee7a0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7fe9c8d7418984b7", "level": "none", "message": {"text": "Commented-code block (8 lines) in collegeCompassData.ts:528"}, "properties": {"repobilityId": "b5babd88a922aa63", "scanner": "scanner-primary", "fingerprint": "7fe9c8d7418984b7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9b6772f447b54dd4", "level": "none", "message": {"text": "Commented-code block (6 lines) in achievementData.ts:467"}, "properties": {"repobilityId": "542621364bb901ba", "scanner": "scanner-primary", "fingerprint": "9b6772f447b54dd4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8ab0731a1de7e790", "level": "none", "message": {"text": "Commented-code block (5 lines) in types.ts:116"}, "properties": {"repobilityId": "b592833f87543110", "scanner": "scanner-primary", "fingerprint": "8ab0731a1de7e790", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a6a7b44a63f3fb2c", "level": "none", "message": {"text": "Commented-code block (6 lines) in firebase.ts:27"}, "properties": {"repobilityId": "3375cf4fa0f73b7e", "scanner": "scanner-primary", "fingerprint": "a6a7b44a63f3fb2c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fb1b86217b1f2c5e", "level": "none", "message": {"text": "Commented-code block (5 lines) in App.tsx:147"}, "properties": {"repobilityId": "3d0932a8c111cb10", "scanner": "scanner-primary", "fingerprint": "fb1b86217b1f2c5e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ea6b8df047566400", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/paper-trail/upload.py:82"}, "properties": {"repobilityId": "acd3eedbe0c407ce", "scanner": "scanner-primary", "fingerprint": "ea6b8df047566400", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-37ee6042510e3f0e", "level": "none", "message": {"text": "Commented-code block (7 lines) in utils/authUtils.ts:15"}, "properties": {"repobilityId": "ff96d44eefd72e86", "scanner": "scanner-primary", "fingerprint": "37ee6042510e3f0e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6f6b562761d2fc29", "level": "none", "message": {"text": "Commented-code block (7 lines) in contexts/AuthContext.tsx:94"}, "properties": {"repobilityId": "4e525ed886bca52a", "scanner": "scanner-primary", "fingerprint": "6f6b562761d2fc29", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d62815f7dc3ad2c3", "level": "none", "message": {"text": "Commented-code block (6 lines) in contexts/ProgressContext.tsx:189"}, "properties": {"repobilityId": "829369282d1f3922", "scanner": "scanner-primary", "fingerprint": "d62815f7dc3ad2c3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ae0c49917ed41d5d", "level": "none", "message": {"text": "Commented-code block (7 lines) in hooks/useIslandShop.ts:27"}, "properties": {"repobilityId": "1cecb049ce30e7e4", "scanner": "scanner-primary", "fingerprint": "ae0c49917ed41d5d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1c0512e0940c26a2", "level": "none", "message": {"text": "Commented-code block (5 lines) in hooks/useWeeklyChallenge.ts:58"}, "properties": {"repobilityId": "1e5ee18ac1e5ab9d", "scanner": "scanner-primary", "fingerprint": "1c0512e0940c26a2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b9eea3df2a3dabe7", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/subjectData.ts:12"}, "properties": {"repobilityId": "79f97b2f5a005a99", "scanner": "scanner-primary", "fingerprint": "b9eea3df2a3dabe7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d345d4f942496734", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/RankUpModal.tsx:366"}, "properties": {"repobilityId": "e5f4931f7e1517d4", "scanner": "scanner-primary", "fingerprint": "d345d4f942496734", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4142a2249fda129e", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/Onboarding.tsx:84"}, "properties": {"repobilityId": "d8d5d94c8c20f335", "scanner": "scanner-primary", "fingerprint": "4142a2249fda129e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-94e0dade630aca7f", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/PullToRefresh.tsx:25"}, "properties": {"repobilityId": "55bafc9099c4827c", "scanner": "scanner-primary", "fingerprint": "94e0dade630aca7f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-142f4f57a1e103d8", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/LoginPage.tsx:73"}, "properties": {"repobilityId": "9a9c09fce6107ca8", "scanner": "scanner-primary", "fingerprint": "142f4f57a1e103d8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-565cef5aa2d8520e", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/YearTransitionFlow.tsx:23"}, "properties": {"repobilityId": "e4c8faf90033c4ec", "scanner": "scanner-primary", "fingerprint": "565cef5aa2d8520e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1babba04066b2af2", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/futureFinderAlgorithm.ts:426"}, "properties": {"repobilityId": "2d31b94fa65e231b", "scanner": "scanner-primary", "fingerprint": "1babba04066b2af2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9be346146fef6e5c", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/InnovationZone.tsx:24"}, "properties": {"repobilityId": "501e56785e5abb45", "scanner": "scanner-primary", "fingerprint": "9be346146fef6e5c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c7f702135f856109", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/FutureFinder.tsx:123"}, "properties": {"repobilityId": "623cc15c2dcbc129", "scanner": "scanner-primary", "fingerprint": "c7f702135f856109", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5faa8ebd87daeac2", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/FutureFinderRevamped.tsx:313"}, "properties": {"repobilityId": "4a499257f2266cd6", "scanner": "scanner-primary", "fingerprint": "5faa8ebd87daeac2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2a2353088ab8edb6", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/SpacedRepetitionTimetable.tsx:386"}, "properties": {"repobilityId": "815bf5cffcb2ba71", "scanner": "scanner-primary", "fingerprint": "2a2353088ab8edb6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-88477ce08e0175c6", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/NorthStarOnboarding.tsx:179"}, "properties": {"repobilityId": "19e4f6ef3c2b9621", "scanner": "scanner-primary", "fingerprint": "88477ce08e0175c6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-066e457481263fc8", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/timetableAlgorithm.ts:602"}, "properties": {"repobilityId": "5e6da9f9806f84ec", "scanner": "scanner-primary", "fingerprint": "066e457481263fc8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-90898545d6c7e994", "level": "none", "message": {"text": "Commented-code block (6 lines) in components/AppRouter.tsx:247"}, "properties": {"repobilityId": "ca2ad51f7e11ead7", "scanner": "scanner-primary", "fingerprint": "90898545d6c7e994", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f20b544650044ab5", "level": "none", "message": {"text": "Commented-code block (21 lines) in components/subjectExplorerData.ts:11"}, "properties": {"repobilityId": "7bc9c3f3c296f4fd", "scanner": "scanner-primary", "fingerprint": "f20b544650044ab5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c7e1d53dd4b58a7a", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/ExamReps/index.tsx:78"}, "properties": {"repobilityId": "df0c4726cc423633", "scanner": "scanner-primary", "fingerprint": "c7e1d53dd4b58a7a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e2a1cda75f72497e", "level": "none", "message": {"text": "Commented-code block (7 lines) in components/gc/GCOverview.tsx:174"}, "properties": {"repobilityId": "7f6a1fff1750ebed", "scanner": "scanner-primary", "fingerprint": "e2a1cda75f72497e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-69b7db865182360b", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/gc/GCStudentDetail.tsx:114"}, "properties": {"repobilityId": "701fd322605cbaa6", "scanner": "scanner-primary", "fingerprint": "69b7db865182360b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eb3f5e1b29e0b277", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/gc/GCKeyEvents.tsx:200"}, "properties": {"repobilityId": "8f60090b83af92f4", "scanner": "scanner-primary", "fingerprint": "eb3f5e1b29e0b277", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}]}]}