{"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-8eedbda5a87cf267", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/layout/top-bar.tsx:111", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/layout/top-bar.tsx:111"}, "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-6863816ef7f1371e", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/layout/sidebar-user-cell.tsx:62", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/layout/sidebar-user-cell.tsx:62"}, "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-173aa856c4cc3dd8", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/schedule/fixed-blocks-section.tsx:218", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/schedule/fixed-blocks-section.tsx:218"}, "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-6c28aec0db0c1f51", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/pickers/base-picker.tsx:294", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/pickers/base-picker.tsx:294"}, "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-e83c255295348913", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 web/src/shared/components/ui/chart.tsx:80", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 web/src/shared/components/ui/chart.tsx:80"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2c880615b3cda29b", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/ui/wizard.tsx:209", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/ui/wizard.tsx:209"}, "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-6f46ac31070436a4", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/ui/time-picker.tsx:176", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/ui/time-picker.tsx:176"}, "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-33cd39a6460c2607", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/ui/select.tsx:230", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/ui/select.tsx:230"}, "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-a1386ccfc8c42d96", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/data-table/column-helpers.tsx:19", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/data-table/column-helpers.tsx:19"}, "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-17fa0b4e3e09873b", "name": "TODO/FIXME marker in shipping code \u2014 web/src/shared/hooks/use-app-defaults.ts:53", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 web/src/shared/hooks/use-app-defaults.ts:53"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1c3cff1eca1e80ba", "name": "TODO/FIXME marker in shipping code \u2014 web/src/app/router.tsx:520", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 web/src/app/router.tsx:520"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9be8d884f3bec4c5", "name": "TODO/FIXME marker in shipping code \u2014 web/src/features/schedule/components/schedule-settings-tab.tsx:2", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 web/src/features/schedule/components/schedule-settings-tab.tsx:2"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dffa00a3176a9008", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/combinations/components/combination-picker.tsx:74", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/combinations/components/combination-picker.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-1e1cc0c0a8fe173b", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/components/dashboard/active-timetable-ca", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/components/dashboard/active-timetable-card.tsx:158"}, "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-f5900d52f1f6c9d0", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/components/editor/subject-pool-panel.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/components/editor/subject-pool-panel.tsx:173"}, "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-92d3c857f10b4788", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/components/editor/teacher-workload-panel", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/components/editor/teacher-workload-panel.tsx:167"}, "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-c7f87eb7b675e178", "name": "TODO/FIXME marker in shipping code \u2014 web/src/features/timetable/components/editor/teacher-workload-panel.tsx:8", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 web/src/features/timetable/components/editor/teacher-workload-panel.tsx:8"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ab74f8ed4cbb9917", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/components/editor/drop-confirm-popover.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/components/editor/drop-confirm-popover.tsx:226"}, "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-d473871d0623325c", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/components/editor/readonly-timetable-gri", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/components/editor/readonly-timetable-grid.tsx:196"}, "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-7c901462e22a20df", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/components/editor/editor-grid.tsx:661", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/components/editor/editor-grid.tsx:661"}, "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-fdb2333e9a0e24de", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/components/editor/last-published-sheet.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/components/editor/last-published-sheet.tsx:112"}, "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-f0baacbc3af463cf", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/pages/timetable-dashboard-page.tsx:333", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/pages/timetable-dashboard-page.tsx:333"}, "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-5cca36cf48c44aa3", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/staff/components/edit-qualifications-dialog.tsx:16", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/staff/components/edit-qualifications-dialog.tsx:165"}, "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-f4fe1b3859507e1d", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/dashboard/pages/superadmin-dashboard-page.tsx:119", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/dashboard/pages/superadmin-dashboard-page.tsx:119"}, "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-0314c3102d260bab", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/platform/pages/tenants-page.tsx:136", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/platform/pages/tenants-page.tsx:136"}, "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-b35bc77f0a4936df", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/students/components/exam-registrations-section.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/students/components/exam-registrations-section.tsx:87"}, "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-59228640c0f47219", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/students/pages/student-profile-page.tsx:304", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/students/pages/student-profile-page.tsx:304"}, "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-a6070fe4277822a7", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/money-desk/components/invoice-picker-for-payment.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/money-desk/components/invoice-picker-for-payment.tsx:250"}, "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-6397052f8980a6aa", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 web/src/features/marketing/components/marketing-layout.tsx:36", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 web/src/features/marketing/components/marketing-layout.tsx:36"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ad75a108019c314d", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/roles/components/permission-matrix.tsx:119", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/roles/components/permission-matrix.tsx:119"}, "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-4d841459bc4010aa", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/roles/components/role-columns.tsx:37", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/roles/components/role-columns.tsx:37"}, "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-7f2d3a88556528b1", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/announcements/pages/announcements-page.tsx:199", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/announcements/pages/announcements-page.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-7d414bd320c02942", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/home/components/teaching-section.tsx:135", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/home/components/teaching-section.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-4943bd71edefaceb", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/home/components/accountant-home.tsx:439", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/home/components/accountant-home.tsx:439"}, "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-73f1a45c4e63519c", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/home/components/head-home.tsx:88", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/home/components/head-home.tsx:88"}, "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-cb2b885c44a2b713", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/academics/components/room-pool-dialog.tsx:117", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/academics/components/room-pool-dialog.tsx:117"}, "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-9a31e3a3a5e74a78", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/academics/components/term-picker.tsx:66", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/academics/components/term-picker.tsx:66"}, "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-32fecf2e70e4bfe4", "name": "TODO/FIXME marker in shipping code \u2014 web/src/features/academics/components/subject-dialog.tsx:205", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 web/src/features/academics/components/subject-dialog.tsx:205"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0e79398a4e49f8c5", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/academics/components/teacher-picker.tsx:94", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/academics/components/teacher-picker.tsx:94"}, "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-1d13994839577199", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/academics/components/academic-year-picker.tsx:51", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/academics/components/academic-year-picker.tsx:51"}, "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-91455bdcf02b36da", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/academics/components/subject-picker.tsx:64", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/academics/components/subject-picker.tsx:64"}, "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-53a6aab3abfb48e2", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/academics/pages/grading-scales-page.tsx:52", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/academics/pages/grading-scales-page.tsx:52"}, "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-8ef67bdbcc14420d", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/onboarding/components/page-grade/staff-picker.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/onboarding/components/page-grade/staff-picker.tsx:84"}, "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-84b1d1ba6979665e", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/onboarding/components/staff/staff-list-block.tsx:2", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/onboarding/components/staff/staff-list-block.tsx:259"}, "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-b0a5202b2ebc1426", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/onboarding/components/tunnel/tunnel-sidebar.tsx:29", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/onboarding/components/tunnel/tunnel-sidebar.tsx:294"}, "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-d1c5c6a68ac57a01", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/recent-activity/components/recent-activity-row.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/recent-activity/components/recent-activity-row.tsx:38"}, "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-e7230d29e627fe62", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/calendar/components/day-popover.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/calendar/components/day-popover.tsx:86"}, "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-7a60ff6b85d48f41", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/calendar/components/calendar-toolbar.tsx:149", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/calendar/components/calendar-toolbar.tsx:149"}, "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-2d3e9020163dda89", "name": "\"active\" state uses light bg in a dark theme \u2014 web/src/features/calendar/components/canon.tsx:137", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 web/src/features/calendar/components/canon.tsx:137"}, "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-30a947e65c61f840", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/calendar/components/agenda-view.tsx:201", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/calendar/components/agenda-view.tsx:201"}, "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-79a201fd72fefade", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/calendar/components/fields/canon-select.tsx:75", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/calendar/components/fields/canon-select.tsx:75"}, "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-11985cbafc159f69", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/calendar/components/fields/canon-date-picker.tsx:1", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/calendar/components/fields/canon-date-picker.tsx:100"}, "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-65b99614d94938c1", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/parents/components/link-guardian-dialog.tsx:288", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/parents/components/link-guardian-dialog.tsx:288"}, "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-ba1de5b1a155402a", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/parents/pages/parent-detail-page.tsx:158", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/parents/pages/parent-detail-page.tsx:158"}, "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-5713f2448b361ac4", "name": "Privileged port 30 in use", "shortDescription": {"text": "Privileged port 30 in use"}, "fullDescription": {"text": "Port 30 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1f66ad88286ca30a", "name": "Dockerfile runs as root: backend/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: backend/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-420bdafef08ebfa2", "name": "Docker base image is tag-pinned but not digest-pinned: mcr.microsoft.com/dotnet/sdk:10.0", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: mcr.microsoft.com/dotnet/sdk:10.0"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0b95a2c41d75a45e", "name": "Docker base image is tag-pinned but not digest-pinned: mcr.microsoft.com/dotnet/aspnet:10.0", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: mcr.microsoft.com/dotnet/aspnet:10.0"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-59a270c509f01944", "name": "Runtime dotenv file present in repo: web/.env.development", "shortDescription": {"text": "Runtime dotenv file present in repo: web/.env.development"}, "fullDescription": {"text": "`web/.env.development` looks like a runtime dotenv file. No high-confidence secret value was matched, but runtime dotenv files often drift into live credentials. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-30c5601732711e12", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/Mwangazza - Logo Family Sheet.html:213", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/Mwangazza - Logo Family Sheet.html:213"}, "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-9e3d0e7c3eac2bb2", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/Mwangazza - Design System.html:14441", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/Mwangazza - Design System.html:14441"}, "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-56ef75357e7c2c0d", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/Mwangazza - ZZ Icon & Favicon.html:374", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/Mwangazza - ZZ Icon & Favicon.html:374"}, "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-57348b72ebf85d80", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/comms.html:882", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/comms.html:882"}, "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-7b6e91fec2b678e0", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/finance.html:754", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/finance.html:754"}, "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-b28b04efc5ed2115", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/attendance.html:903", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/attendance.html:903"}, "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-f4dcf683af05040d", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/home.html:816", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/home.html:816"}, "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-4c1ede56019d0953", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/cal-v3.js:649", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/cal-v3.js:649"}, "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-56ec290a29404d7c", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/marks.html:500", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/marks.html:500"}, "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-ce9cf826ce0a3e7d", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/Timetable/tt-setup.html:1062", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/Timetable/tt-setup.html:1062"}, "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-a512a053ad38e3f7", "name": "Insecure pattern 'dangerous_innerhtml' in docs/design/mwangazza-v1/product/Timetable/Timetable Planner.html:813", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in docs/design/mwangazza-v1/product/Timetable/Timetable Planner.html:813"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d37971f9d45a3518", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/Timetable/Timetable Planner.html:935", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/Timetable/Timetable Planner.html:935"}, "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-5dfeb35e8642513b", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/assets/wordmark.js:107", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/assets/wordmark.js:107"}, "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-84cea69cb1f62e32", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/assets/ecosystem.js:14", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/assets/ecosystem.js:14"}, "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-641c9f520ade345b", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/assets/craft.js:27", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/assets/craft.js:27"}, "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-975620df8cd872e7", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mobile/pages/SMART Mobile Design System v7.html:1643", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mobile/pages/SMART Mobile Design System v7.html:1643"}, "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-e353037813370420", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mobile/pages/Nomi_v6.html:4742", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mobile/pages/Nomi_v6.html:4742"}, "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-c0d02692c82f71d0", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/web/SMART-Web-Design-System-v2.html:14419", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/web/SMART-Web-Design-System-v2.html:14419"}, "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-43ee0edcc1c0b0b8", "name": "Insecure pattern 'dangerous_innerhtml' in web/src/shared/components/ui/chart.tsx:80", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in web/src/shared/components/ui/chart.tsx:80"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ed94c6b43a543d0c", "name": "Insecure pattern 'dangerous_innerhtml' in web/src/features/marketing/components/marketing-layout.tsx:36", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in web/src/features/marketing/components/marketing-layout.tsx:36"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a23fdac1b63d38a4", "name": "Possible secret in .github/workflows/ci.yml", "shortDescription": {"text": "Possible secret in .github/workflows/ci.yml"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-65aa740cba4a4a73", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 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": "low", "confidence": 1.0}}, {"id": "scanner-27924aa79fa4a517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "pnpm/action-setup@v6 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-f2285fe1e868b87b", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "subosito/flutter-action@v2 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-1a87be555e19cdc5", "name": "Very large file: docs/design/mwangazza-v1/design-canvas.jsx (974 lines)", "shortDescription": {"text": "Very large file: docs/design/mwangazza-v1/design-canvas.jsx (974 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-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-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 232 placeholder/mock markers across 108 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-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-773afa36a024d850", "name": "Agent authority lacks a verifier contract: .claude/commands/handoff.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/handoff.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-c76bd5794b4ff2b2", "name": "Commented-code block (7 lines) in docs/design/mwangazza-v1/design-canvas.jsx:4", "shortDescription": {"text": "Commented-code block (7 lines) in docs/design/mwangazza-v1/design-canvas.jsx:4"}, "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-81cbf598d6bdff4e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 docs/design/mwangazza-v1/design-canvas.jsx:136", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 docs/design/mwangazza-v1/design-canvas.jsx:136"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e4c506dbd5002d1e", "name": "Commented-code block (5 lines) in docs/design/mwangazza-v1/mobile/identity-screens.jsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in docs/design/mwangazza-v1/mobile/identity-screens.jsx:1"}, "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-006c226053cfa5e4", "name": "Commented-code block (6 lines) in docs/design/mobile/scripts/student-polish.js:57", "shortDescription": {"text": "Commented-code block (6 lines) in docs/design/mobile/scripts/student-polish.js:57"}, "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-383948a13ebb961f", "name": "Commented-code block (6 lines) in docs/design/mobile/scripts/polish.js:147", "shortDescription": {"text": "Commented-code block (6 lines) in docs/design/mobile/scripts/polish.js: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-f183c4978522e01b", "name": "Commented-code block (7 lines) in web/src/shared/components/schedule/fixed-blocks-section.tsx:51", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/shared/components/schedule/fixed-blocks-section.tsx: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-9aa1f0d78ef0fe3a", "name": "Commented-code block (6 lines) in web/src/shared/components/ui/calendar.tsx:9", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/shared/components/ui/calendar.tsx:9"}, "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-c619e1ee769ac262", "name": "Commented-code block (7 lines) in web/src/shared/components/ui/date-range-picker.tsx:12", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/shared/components/ui/date-range-picker.tsx: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-97c1f7fedcf4ac56", "name": "Commented-code block (7 lines) in web/src/shared/components/ui/sub-stepper.tsx:5", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/shared/components/ui/sub-stepper.tsx:5"}, "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-daf821ca1d5c7e39", "name": "Commented-code block (6 lines) in web/src/shared/components/ui/radio-group.tsx:11", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/shared/components/ui/radio-group.tsx: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-f21ade7df73c0f2e", "name": "Commented-code block (6 lines) in web/src/shared/components/ui/button.tsx:7", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/shared/components/ui/button.tsx:7"}, "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-493662b3dbf9682f", "name": "Commented-code block (7 lines) in web/src/shared/components/ui/form-field.tsx:11", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/shared/components/ui/form-field.tsx: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-0b40754f1a0c8590", "name": "Commented-code block (10 lines) in web/src/shared/components/ui/phone-input.tsx:14", "shortDescription": {"text": "Commented-code block (10 lines) in web/src/shared/components/ui/phone-input.tsx:14"}, "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-0478e20cbdafae18", "name": "Commented-code block (6 lines) in web/src/shared/components/ui/wizard.tsx:11", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/shared/components/ui/wizard.tsx: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-84abd6397ff0311e", "name": "Commented-code block (6 lines) in web/src/shared/components/ui/time-picker.tsx:15", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/shared/components/ui/time-picker.tsx: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-fe3e176dab3e360d", "name": "Commented-code block (6 lines) in web/src/shared/components/ui/date-picker.tsx:14", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/shared/components/ui/date-picker.tsx:14"}, "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-f4967812ad1f5d84", "name": "Commented-code block (6 lines) in web/src/shared/components/ui/select.tsx:10", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/shared/components/ui/select.tsx:10"}, "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-adfbbd72c4a21ff4", "name": "Commented-code block (6 lines) in web/src/shared/components/ui/info-hint.tsx:7", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/shared/components/ui/info-hint.tsx:7"}, "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-4531f1b0676237b6", "name": "Commented-code block (5 lines) in web/src/shared/components/ui/__tests__/time-picker.test.tsx:302", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/shared/components/ui/__tests__/time-picker.test.tsx:302"}, "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-d059e57db3a657cb", "name": "Commented-code block (6 lines) in web/src/shared/components/command-palette/use-global-search.ts:172", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/shared/components/command-palette/use-global-search.ts:172"}, "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-d0421cd87aabfcd5", "name": "Commented-code block (7 lines) in web/src/shared/components/command-palette/command-palette.tsx:71", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/shared/components/command-palette/command-palette.tsx:71"}, "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-4545ea5ae7e119b2", "name": "Commented-code block (7 lines) in web/src/shared/components/command-palette/__tests__/command-palette.test.tsx:11", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/shared/components/command-palette/__tests__/command-palette.test.tsx: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-b88d044fdc11f075", "name": "Commented-code block (5 lines) in web/src/shared/components/bulk-import/__tests__/bulk-import-dialog.test.tsx:407", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/shared/components/bulk-import/__tests__/bulk-import-dialog.test.tsx:407"}, "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-b273d2a40f883aee", "name": "Commented-code block (6 lines) in web/src/shared/components/mwangazza/brief.tsx:12", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/shared/components/mwangazza/brief.tsx: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-fc0fab5539440a88", "name": "Commented-code block (5 lines) in web/src/shared/components/mwangazza/docket.tsx:5", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/shared/components/mwangazza/docket.tsx:5"}, "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-8891061f16d7b23c", "name": "Commented-code block (6 lines) in web/src/shared/components/mwangazza/rail-figure.tsx:5", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/shared/components/mwangazza/rail-figure.tsx:5"}, "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-c96b111ae990fc02", "name": "Commented-code block (7 lines) in web/src/shared/lib/api-client.ts:19", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/shared/lib/api-client.ts:19"}, "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-af87bd31efdaf893", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/shared/lib/chunk-reload.ts:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/shared/lib/chunk-reload.ts:20"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-00047d1576db3352", "name": "Commented-code block (5 lines) in web/src/shared/lib/format.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/shared/lib/format.ts:1"}, "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-64557cbedefe5496", "name": "Commented-code block (6 lines) in web/src/shared/lib/__tests__/api-client.test.ts:129", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/shared/lib/__tests__/api-client.test.ts:129"}, "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-05738433db5f295f", "name": "Commented-code block (7 lines) in web/src/app/router.tsx:131", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/app/router.tsx:131"}, "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-54d70e351ddda574", "name": "Commented-code block (9 lines) in web/src/app/__tests__/router.test.tsx:22", "shortDescription": {"text": "Commented-code block (9 lines) in web/src/app/__tests__/router.test.tsx:22"}, "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-d94c5aae80e49743", "name": "Commented-code block (6 lines) in web/src/app/layouts/authenticated-shell.tsx:34", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/app/layouts/authenticated-shell.tsx:34"}, "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-6ad77df5e518b2d6", "name": "Commented-code block (7 lines) in web/src/app/layouts/__tests__/authenticated-shell.test.tsx:133", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/app/layouts/__tests__/authenticated-shell.test.tsx:133"}, "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-16d1d4f1f57381b3", "name": "Commented-code block (5 lines) in web/src/features/settings/hooks/mutations.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/settings/hooks/mutations.ts:7"}, "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-e6e55a76e6b470e1", "name": "Commented-code block (5 lines) in web/src/features/schedule/schemas.ts:12", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/schedule/schemas.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-953816d769298cd1", "name": "Commented-code block (5 lines) in web/src/features/schedule/components/schedule-settings-tab.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/schedule/components/schedule-settings-tab.tsx:1"}, "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-115a916701814284", "name": "Commented-code block (6 lines) in web/src/features/auth/types/auth.schemas.ts:16", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/auth/types/auth.schemas.ts:16"}, "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-1d088330bcc4e86f", "name": "Commented-code block (5 lines) in web/src/features/auth/types/__tests__/auth.schemas.test.ts:57", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/auth/types/__tests__/auth.schemas.test.ts:57"}, "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-37148dc96bb4823c", "name": "Commented-code block (6 lines) in web/src/features/auth/stores/__tests__/auth.store.test.ts:194", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/auth/stores/__tests__/auth.store.test.ts:194"}, "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-d537ea725e86690b", "name": "Commented-code block (6 lines) in web/src/features/auth/api/mutations.ts:94", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/auth/api/mutations.ts: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-3ba07e8c6e824fe8", "name": "Commented-code block (5 lines) in web/src/features/auth/lib/return-to.ts:31", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/auth/lib/return-to.ts:31"}, "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-7853615e041815d5", "name": "Commented-code block (5 lines) in web/src/features/auth/pages/login-page.tsx:80", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/auth/pages/login-page.tsx:80"}, "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-38e9fdcab2bb8266", "name": "Commented-code block (5 lines) in web/src/features/auth/pages/__tests__/login-page.test.tsx:17", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/auth/pages/__tests__/login-page.test.tsx:17"}, "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-218af2fd5471606d", "name": "Commented-code block (5 lines) in web/src/features/exams/pages/__tests__/exam-detail-page.test.tsx:11", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/exams/pages/__tests__/exam-detail-page.test.tsx: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-4afc7c0906be88f3", "name": "Commented-code block (6 lines) in web/src/features/timetable/components/editor/drop-confirm-popover.tsx:186", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/timetable/components/editor/drop-confirm-popover.tsx:186"}, "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-531e07117bf09bc0", "name": "Commented-code block (6 lines) in web/src/features/timetable/components/editor/editor-grid.tsx:248", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/timetable/components/editor/editor-grid.tsx:248"}, "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-de812521ddbcbe48", "name": "Commented-code block (5 lines) in web/src/features/timetable/components/editor/__tests__/teacher-workload-panel.test.tsx", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/timetable/components/editor/__tests__/teacher-workload-panel.test.tsx:62"}, "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-ce6fba9a78d7a65a", "name": "Commented-code block (9 lines) in web/src/features/timetable/lib/slot-room-priority.test.ts:67", "shortDescription": {"text": "Commented-code block (9 lines) in web/src/features/timetable/lib/slot-room-priority.test.ts:67"}, "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-bb96dcb4a2ba3a8a", "name": "Commented-code block (9 lines) in web/src/features/timetable/pages/timetable-page.tsx:184", "shortDescription": {"text": "Commented-code block (9 lines) in web/src/features/timetable/pages/timetable-page.tsx:184"}, "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-a471d784af197771", "name": "Commented-code block (8 lines) in web/src/features/staff/components/reset-staff-password-dialog.tsx:25", "shortDescription": {"text": "Commented-code block (8 lines) in web/src/features/staff/components/reset-staff-password-dialog.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-9db3faa5b73d6ea5", "name": "Commented-code block (8 lines) in web/src/features/staff/components/__tests__/create-staff-dialog.test.tsx:69", "shortDescription": {"text": "Commented-code block (8 lines) in web/src/features/staff/components/__tests__/create-staff-dialog.test.tsx:69"}, "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-5b03583cfc8e51c7", "name": "Commented-code block (5 lines) in web/src/features/staff/pages/staff-list-page.tsx:61", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/staff/pages/staff-list-page.tsx:61"}, "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-5536a5343269cdc9", "name": "Commented-code block (5 lines) in web/src/features/staff/pages/__tests__/staff-list-page.test.tsx:230", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/staff/pages/__tests__/staff-list-page.test.tsx:230"}, "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-01712fd6aa7e4ca3", "name": "Commented-code block (6 lines) in web/src/features/staff/pages/__tests__/staff-list-page.lifecycle.test.tsx:23", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/staff/pages/__tests__/staff-list-page.lifecycle.test.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-bcfec6288baeb15b", "name": "Commented-code block (6 lines) in web/src/features/staff/hooks/mutations.ts:16", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/staff/hooks/mutations.ts:16"}, "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-1f1d6e4a0e3ef210", "name": "Commented-code block (5 lines) in web/src/features/trash/api/mutations.ts:100", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/trash/api/mutations.ts:100"}, "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-b2bd6c13db349b0f", "name": "Commented-code block (5 lines) in web/src/features/platform/components/__tests__/create-tenant-dialog.test.tsx:11", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/platform/components/__tests__/create-tenant-dialog.test.tsx: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-8517029919bc0302", "name": "Commented-code block (6 lines) in web/src/features/platform/pilots/types.ts:6", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/platform/pilots/types.ts:6"}, "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-46d2b2e9cb84250f", "name": "Commented-code block (5 lines) in web/src/features/platform/pages/tenant-detail-page.tsx:486", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/platform/pages/tenant-detail-page.tsx:486"}, "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-101c445a9b0e2bc9", "name": "Commented-code block (8 lines) in web/src/features/platform/hooks/mutations.ts:16", "shortDescription": {"text": "Commented-code block (8 lines) in web/src/features/platform/hooks/mutations.ts:16"}, "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-7f75963471ee4340", "name": "Commented-code block (5 lines) in web/src/features/students/exam-profile-meta.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/students/exam-profile-meta.ts:4"}, "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-156e9bab3e5ea5ab", "name": "Commented-code block (6 lines) in web/src/features/students/pages/__tests__/student-list-page.lifecycle.test.tsx:23", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/students/pages/__tests__/student-list-page.lifecycle.test.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-ad4ff15defcc60ed", "name": "Commented-code block (5 lines) in web/src/features/finance/components/generate-invoices-dialog.tsx:88", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/finance/components/generate-invoices-dialog.tsx:88"}, "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-0fee4251c9833545", "name": "Commented-code block (6 lines) in web/src/features/finance/pages/__tests__/invoices-tab.test.tsx:14", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/finance/pages/__tests__/invoices-tab.test.tsx:14"}, "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-9d96bd174905bbf2", "name": "Commented-code block (5 lines) in web/src/features/finance/pages/__tests__/fee-structures-tab.test.tsx:14", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/finance/pages/__tests__/fee-structures-tab.test.tsx:14"}, "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-bcb0c45c2f5c4165", "name": "Commented-code block (9 lines) in web/src/features/finance/hooks/queries.ts:60", "shortDescription": {"text": "Commented-code block (9 lines) in web/src/features/finance/hooks/queries.ts:60"}, "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-9a72eb3d66559b52", "name": "Commented-code block (6 lines) in web/src/features/finance/hooks/mutations.ts:14", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/finance/hooks/mutations.ts:14"}, "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-266455a8fc93edf1", "name": "Commented-code block (6 lines) in web/src/features/money-desk/types.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/money-desk/types.ts:1"}, "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-6f3fa7226c52d1e1", "name": "Commented-code block (5 lines) in web/src/features/money-desk/components/record-payment-dialog.tsx:30", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/money-desk/components/record-payment-dialog.tsx:30"}, "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-6d4b82733ff3cb2b", "name": "Commented-code block (6 lines) in web/src/features/money-desk/components/invoice-picker-for-payment.tsx:18", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/money-desk/components/invoice-picker-for-payment.tsx:18"}, "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-2495239c0e643884", "name": "Commented-code block (6 lines) in web/src/features/money-desk/components/void-payment-dialog.tsx:22", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/money-desk/components/void-payment-dialog.tsx:22"}, "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-f1ef4b9c9cc36869", "name": "Commented-code block (6 lines) in web/src/features/money-desk/components/__tests__/record-payment-dialog.test.tsx:8", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/money-desk/components/__tests__/record-payment-dialog.test.tsx:8"}, "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-328c02a55f7e0286", "name": "Commented-code block (6 lines) in web/src/features/money-desk/hooks/mutations.ts:7", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/money-desk/hooks/mutations.ts:7"}, "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-69f2d49c9d763f17", "name": "Commented-code block (5 lines) in web/src/features/marketing/types/index.ts:68", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/marketing/types/index.ts:68"}, "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-01091c8631814370", "name": "Commented-code block (5 lines) in web/src/features/marketing/components/curriculum-dag.tsx:295", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/marketing/components/curriculum-dag.tsx:295"}, "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-3758af17811ce2f4", "name": "Commented-code block (7 lines) in web/src/features/marketing/components/synthetic-parent-app.tsx:110", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/features/marketing/components/synthetic-parent-app.tsx:110"}, "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-73fe2c19e5a8dcc2", "name": "Commented-code block (9 lines) in web/src/features/marketing/components/__tests__/contact-form.test.tsx:20", "shortDescription": {"text": "Commented-code block (9 lines) in web/src/features/marketing/components/__tests__/contact-form.test.tsx:20"}, "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-76e84bdcc9422831", "name": "Commented-code block (7 lines) in web/src/features/roles/hooks/queries.ts:17", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/features/roles/hooks/queries.ts:17"}, "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-58d9f9e814cc5b58", "name": "Commented-code block (7 lines) in web/src/features/roles/hooks/mutations.ts:7", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/features/roles/hooks/mutations.ts:7"}, "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-810ac9cdbdbfc1b8", "name": "Commented-code block (5 lines) in web/src/features/roles/hooks/__tests__/queries.test.ts:27", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/roles/hooks/__tests__/queries.test.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-bea64e7d1d3d57e1", "name": "Commented-code block (6 lines) in web/src/features/home/components/teaching-section.tsx:12", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/home/components/teaching-section.tsx: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-841156ba24c82560", "name": "Commented-code block (5 lines) in web/src/features/home/components/accountant-home.tsx:46", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/home/components/accountant-home.tsx:46"}, "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-c23379cb129b18d1", "name": "Commented-code block (5 lines) in web/src/features/home/components/head-home.tsx:28", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/home/components/head-home.tsx: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-787e805c4be91f47", "name": "Commented-code block (5 lines) in web/src/features/home/components/teacher-home.tsx:28", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/home/components/teacher-home.tsx: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-d90ed2749ee028fc", "name": "Commented-code block (5 lines) in web/src/features/academics/subject-icons.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/academics/subject-icons.ts:1"}, "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-12ab6849646fa340", "name": "Commented-code block (5 lines) in web/src/features/academics/types.ts:90", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/academics/types.ts:90"}, "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-9e535a752607eec3", "name": "Commented-code block (7 lines) in web/src/features/academics/components/subject-dialog.tsx:201", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/features/academics/components/subject-dialog.tsx:201"}, "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-5bcac1c59d0a02bd", "name": "Commented-code block (5 lines) in web/src/features/academics/components/__tests__/grade-level-dialog.test.tsx:10", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/academics/components/__tests__/grade-level-dialog.test.tsx:10"}, "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-75a344b296fbbc82", "name": "Commented-code block (6 lines) in web/src/features/academics/pages/academics-page.tsx:25", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/academics/pages/academics-page.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-fa4f50c77243ac3b", "name": "Commented-code block (8 lines) in web/src/features/academics/hooks/mutations.ts:193", "shortDescription": {"text": "Commented-code block (8 lines) in web/src/features/academics/hooks/mutations.ts:193"}, "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-3421b64d0878095e", "name": "Commented-code block (5 lines) in web/src/features/onboarding/schemas.ts:11", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/schemas.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-f685a07959ddb240", "name": "Commented-code block (5 lines) in web/src/features/onboarding/task-ids.ts:14", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/task-ids.ts:14"}, "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-b9543a778d100211", "name": "Commented-code block (7 lines) in web/src/features/onboarding/page-registry.ts:27", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/features/onboarding/page-registry.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-fbb25bcfc0a5bc36", "name": "Commented-code block (7 lines) in web/src/features/onboarding/__tests__/page-registry.test.ts:22", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/features/onboarding/__tests__/page-registry.test.ts:22"}, "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-3deb4a507b58423a", "name": "Commented-code block (5 lines) in web/src/features/onboarding/fixtures/onboarding-status.ts:63", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/fixtures/onboarding-status.ts:63"}, "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-17c06e6ff48a611a", "name": "Commented-code block (6 lines) in web/src/features/onboarding/components/academic-year-form.tsx:609", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/onboarding/components/academic-year-form.tsx:609"}, "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-5efb816a1903bfe1", "name": "Commented-code block (5 lines) in web/src/features/onboarding/components/students-form.tsx:71", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/students-form.tsx:71"}, "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-adfb417a00da515e", "name": "Commented-code block (5 lines) in web/src/features/onboarding/components/__tests__/academic-year-form.test.tsx:141", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/__tests__/academic-year-form.test.tsx:141"}, "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-097ad7dcd7d2c023", "name": "Commented-code block (7 lines) in web/src/features/onboarding/components/__tests__/students-form.test.tsx:160", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/features/onboarding/components/__tests__/students-form.test.tsx:160"}, "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-452bb81a6d4b4207", "name": "Commented-code block (5 lines) in web/src/features/onboarding/components/teaching/welcome-screen.tsx:5", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/teaching/welcome-screen.tsx:5"}, "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-0c650da271c2ca3f", "name": "Commented-code block (6 lines) in web/src/features/onboarding/components/teaching/staff-import-teaching.tsx:14", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/onboarding/components/teaching/staff-import-teaching.tsx:14"}, "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-a3b817c4483d40c9", "name": "Commented-code block (6 lines) in web/src/features/onboarding/components/teaching/roles-teaching.tsx:5", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/onboarding/components/teaching/roles-teaching.tsx:5"}, "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-58a6355931c709b4", "name": "Commented-code block (6 lines) in web/src/features/onboarding/components/page-grade/subject-card.tsx:11", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/onboarding/components/page-grade/subject-card.tsx: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-db5653661124f914", "name": "Commented-code block (5 lines) in web/src/features/onboarding/components/page-grade/grade-combinations-section.tsx:124", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/page-grade/grade-combinations-section.tsx:124"}, "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-58b4d8758120922e", "name": "Commented-code block (5 lines) in web/src/features/onboarding/components/page-grade/grade-subjects-section.tsx:161", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/page-grade/grade-subjects-section.tsx:161"}, "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-6ec40d44ee243627", "name": "Commented-code block (5 lines) in web/src/features/onboarding/components/page-grade/sections-explainer.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/page-grade/sections-explainer.tsx:3"}, "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-645cb558297d7c25", "name": "Commented-code block (8 lines) in web/src/features/onboarding/components/page-grade/grade-sections-section.tsx:231", "shortDescription": {"text": "Commented-code block (8 lines) in web/src/features/onboarding/components/page-grade/grade-sections-section.tsx:231"}, "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-7b7d6d6f30475903", "name": "Commented-code block (6 lines) in web/src/features/onboarding/components/page-grade/grade-explainer.tsx:18", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/onboarding/components/page-grade/grade-explainer.tsx:18"}, "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-8b0eb6431c6c69df", "name": "Commented-code block (5 lines) in web/src/features/onboarding/components/page-grade/subject-teacher-explainer.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/page-grade/subject-teacher-explainer.tsx:3"}, "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-0990a2eb29fe6cf9", "name": "Commented-code block (5 lines) in web/src/features/onboarding/components/page-grade/__tests__/grade-subjects-section.tes", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/page-grade/__tests__/grade-subjects-section.test.tsx:13"}, "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-55c995d89f931d7b", "name": "Commented-code block (5 lines) in web/src/features/onboarding/components/page-grade/__tests__/grade-combinations-section", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/page-grade/__tests__/grade-combinations-section.test.tsx:14"}, "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-981d5825a341e725", "name": "Commented-code block (5 lines) in web/src/features/onboarding/components/staff/add-staff-modal.tsx:65", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/staff/add-staff-modal.tsx:65"}, "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-95ee5e151e134842", "name": "Commented-code block (6 lines) in web/src/features/onboarding/components/staff/staff-list-block.tsx:63", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/onboarding/components/staff/staff-list-block.tsx:63"}, "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-9f603f9c1128efdc", "name": "Commented-code block (6 lines) in web/src/features/onboarding/components/staff/unified-staff-form.tsx:18", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/onboarding/components/staff/unified-staff-form.tsx:18"}, "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-f16456bdb99f784c", "name": "Commented-code block (5 lines) in web/src/features/onboarding/components/staff/__tests__/add-staff-modal.test.tsx:9", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/staff/__tests__/add-staff-modal.test.tsx:9"}, "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-a6dc7331be337354", "name": "Commented-code block (8 lines) in web/src/features/onboarding/components/staff/__tests__/staff-list-block.test.tsx:284", "shortDescription": {"text": "Commented-code block (8 lines) in web/src/features/onboarding/components/staff/__tests__/staff-list-block.test.tsx:284"}, "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-b2d8a3a3d39ca44f", "name": "Commented-code block (6 lines) in web/src/features/onboarding/components/staff/__tests__/unified-staff-form.test.tsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/onboarding/components/staff/__tests__/unified-staff-form.test.tsx:1"}, "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-09360f5d7307e8b4", "name": "Commented-code block (6 lines) in web/src/features/onboarding/components/tunnel/tunnel-page-content.tsx:63", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/onboarding/components/tunnel/tunnel-page-content.tsx:63"}, "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-8f5859e11f1b313c", "name": "Commented-code block (7 lines) in web/src/features/onboarding/components/tunnel/tunnel-sidebar.tsx:34", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/features/onboarding/components/tunnel/tunnel-sidebar.tsx:34"}, "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-b08a6830fac84371", "name": "Commented-code block (5 lines) in web/src/features/onboarding/components/tunnel/save-and-continue-modal.tsx:77", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/tunnel/save-and-continue-modal.tsx:77"}, "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-52d47da6cdb953b1", "name": "Commented-code block (7 lines) in web/src/features/onboarding/components/tunnel/__tests__/tunnel-page-content.test.tsx:1", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/features/onboarding/components/tunnel/__tests__/tunnel-page-content.test.tsx:16"}, "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-4fe0e97dbd6b1e0b", "name": "Commented-code block (5 lines) in web/src/features/onboarding/components/identity/curriculum-block.tsx:17", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/identity/curriculum-block.tsx:17"}, "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-8b10e739790158e2", "name": "Commented-code block (5 lines) in web/src/features/onboarding/components/identity/unified-identity-form.tsx:326", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/identity/unified-identity-form.tsx:326"}, "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-25b92c4b5301f128", "name": "Commented-code block (5 lines) in web/src/features/onboarding/components/identity/__tests__/curriculum-block.test.tsx:90", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/identity/__tests__/curriculum-block.test.tsx:90"}, "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-a0cf11f89c4a0ab6", "name": "Commented-code block (5 lines) in web/src/features/onboarding/lib/programme-bands.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/lib/programme-bands.ts:6"}, "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-0377a29b7c7a208b", "name": "Commented-code block (7 lines) in web/src/features/onboarding/lib/subject-scope.ts:16", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/features/onboarding/lib/subject-scope.ts:16"}, "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-ddd3f67381ebc0db", "name": "Commented-code block (6 lines) in web/src/features/onboarding/lib/__tests__/subject-scope.test.ts:165", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/onboarding/lib/__tests__/subject-scope.test.ts:165"}, "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-4f53d7a845dcae53", "name": "Commented-code block (5 lines) in web/src/features/onboarding/lib/__tests__/programme-bands.test.ts:8", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/lib/__tests__/programme-bands.test.ts:8"}, "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-3eb692a51f6faa1c", "name": "Commented-code block (5 lines) in web/src/features/onboarding/pages/page-grade.tsx:151", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/pages/page-grade.tsx:151"}, "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-76757d90b87c706f", "name": "Commented-code block (8 lines) in web/src/features/onboarding/pages/__tests__/page-grade.test.tsx:10", "shortDescription": {"text": "Commented-code block (8 lines) in web/src/features/onboarding/pages/__tests__/page-grade.test.tsx:10"}, "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-cc80a0f3b8c3c2f6", "name": "Commented-code block (7 lines) in web/src/features/onboarding/hooks/queries.ts:13", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/features/onboarding/hooks/queries.ts:13"}, "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-8ac1ddb98e05938c", "name": "Commented-code block (5 lines) in web/src/features/onboarding/hooks/__tests__/use-completion-effect.test.ts:59", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/hooks/__tests__/use-completion-effect.test.ts:59"}, "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-6aa3396ce2751daa", "name": "Commented-code block (7 lines) in web/src/features/onboarding/hooks/__tests__/mutations.test.tsx:13", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/features/onboarding/hooks/__tests__/mutations.test.tsx:13"}, "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-82e3ea17963cc495", "name": "Commented-code block (8 lines) in web/src/features/onboarding/hooks/__tests__/use-page-registry-stability.test.ts:10", "shortDescription": {"text": "Commented-code block (8 lines) in web/src/features/onboarding/hooks/__tests__/use-page-registry-stability.test.ts:10"}, "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-a4ce21f973bb9bbb", "name": "Commented-code block (5 lines) in web/src/features/accreditations/types.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/accreditations/types.ts:5"}, "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-24097cace2194509", "name": "Commented-code block (5 lines) in web/src/features/accreditations/hooks/mutations.ts:26", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/accreditations/hooks/mutations.ts:26"}, "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-20da4074552b6815", "name": "Commented-code block (7 lines) in web/src/features/accreditations/hooks/__tests__/mutations.test.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/features/accreditations/hooks/__tests__/mutations.test.tsx:3"}, "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-d7dbe4905d9bf568", "name": "Commented-code block (5 lines) in web/src/features/calendar/components/calendar-brief.tsx:30", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/calendar/components/calendar-brief.tsx:30"}, "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-df6d595010ea05bc", "name": "Commented-code block (5 lines) in web/src/features/calendar/components/empty-guidance.tsx:4", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/calendar/components/empty-guidance.tsx:4"}, "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-e84a79c753dfcc25", "name": "Commented-code block (7 lines) in web/src/features/calendar/components/calendar-toolbar.tsx:26", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/features/calendar/components/calendar-toolbar.tsx:26"}, "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-e71732a67da767a7", "name": "Commented-code block (6 lines) in web/src/features/calendar/components/import-dialogs.tsx:19", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/calendar/components/import-dialogs.tsx:19"}, "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-2d3335336a0ef62b", "name": "Commented-code block (10 lines) in web/src/features/calendar/components/canon.tsx:10", "shortDescription": {"text": "Commented-code block (10 lines) in web/src/features/calendar/components/canon.tsx:10"}, "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-940d56d0cefb7532", "name": "Commented-code block (6 lines) in web/src/features/calendar/components/event-display.ts:16", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/calendar/components/event-display.ts:16"}, "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-b9c0b8e4ad749c06", "name": "Commented-code block (8 lines) in web/src/features/calendar/components/event-detail-sheet.tsx:30", "shortDescription": {"text": "Commented-code block (8 lines) in web/src/features/calendar/components/event-detail-sheet.tsx:30"}, "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-4a4cc5fe0e30f10f", "name": "Commented-code block (5 lines) in web/src/features/calendar/components/agenda-view.tsx:17", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/calendar/components/agenda-view.tsx:17"}, "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-7a69622b3744ad0e", "name": "Commented-code block (7 lines) in web/src/features/calendar/components/event-form-sheet.tsx:43", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/features/calendar/components/event-form-sheet.tsx:43"}, "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-89f009f1dbbe0adc", "name": "Commented-code block (7 lines) in web/src/features/calendar/components/month-grid.tsx:21", "shortDescription": {"text": "Commented-code block (7 lines) in web/src/features/calendar/components/month-grid.tsx:21"}, "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-eed2f2115d6dd523", "name": "Commented-code block (5 lines) in web/src/features/calendar/components/fields/canon-select.tsx:12", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/calendar/components/fields/canon-select.tsx: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-c783f4d15269799b", "name": "Commented-code block (5 lines) in web/src/features/calendar/components/fields/canon-date-picker.tsx:21", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/calendar/components/fields/canon-date-picker.tsx:21"}, "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-3e6c8f87c492def4", "name": "Commented-code block (8 lines) in web/src/features/calendar/components/fields/canon-field.tsx:5", "shortDescription": {"text": "Commented-code block (8 lines) in web/src/features/calendar/components/fields/canon-field.tsx:5"}, "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-9a8f104970da8f3a", "name": "Commented-code block (9 lines) in web/src/features/calendar/lib/calendar-date.ts:3", "shortDescription": {"text": "Commented-code block (9 lines) in web/src/features/calendar/lib/calendar-date.ts:3"}, "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-402145b26a297e1e", "name": "Commented-code block (8 lines) in web/src/features/calendar/pages/calendar-page.tsx:32", "shortDescription": {"text": "Commented-code block (8 lines) in web/src/features/calendar/pages/calendar-page.tsx:32"}, "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-2c250d827b29d2e2", "name": "Commented-code block (5 lines) in web/src/features/parents/components/mpesa-payment-dialog.tsx:50", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/parents/components/mpesa-payment-dialog.tsx:50"}, "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-25b6d9ffb70b0fda", "name": "Commented-code block (5 lines) in web/src/features/parents/components/invite-parent-dialog.tsx:64", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/parents/components/invite-parent-dialog.tsx:64"}, "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-f1d1d7297dfaa5ea", "name": "Commented-code block (6 lines) in web/src/features/parents/components/__tests__/invite-parent-dialog.test.tsx:11", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/parents/components/__tests__/invite-parent-dialog.test.tsx: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-7136e59f9bf84fd9", "name": "Commented-code block (6 lines) in web/src/features/parents/components/__tests__/mpesa-payment-dialog.test.tsx:6", "shortDescription": {"text": "Commented-code block (6 lines) in web/src/features/parents/components/__tests__/mpesa-payment-dialog.test.tsx:6"}, "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-91b7105e73b440fb", "name": "Commented-code block (5 lines) in web/src/features/parents/pages/parents-page.tsx:96", "shortDescription": {"text": "Commented-code block (5 lines) in web/src/features/parents/pages/parents-page.tsx: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-1b5a76780c3df9aa", "name": "1 env vars used in code but missing from .env.example", "shortDescription": {"text": "1 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `DEV`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f864d3283254fba3", "name": "Unused endpoint: PUT /school/details", "shortDescription": {"text": "Unused endpoint: PUT /school/details"}, "fullDescription": {"text": "`web/src/features/settings/hooks/mutations.ts` declares `PUT /school/details` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cae255e9fc3a38c9", "name": "Unused endpoint: PUT /school/settings", "shortDescription": {"text": "Unused endpoint: PUT /school/settings"}, "fullDescription": {"text": "`web/src/features/settings/hooks/mutations.ts` declares `PUT /school/settings` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4319f9d88fc0e6a4", "name": "Unused endpoint: PUT /schedule/settings", "shortDescription": {"text": "Unused endpoint: PUT /schedule/settings"}, "fullDescription": {"text": "`web/src/features/schedule/hooks/mutations.ts` declares `PUT /schedule/settings` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e2fe5b92648ca462", "name": "Unused endpoint: POST /auth/forgot-password", "shortDescription": {"text": "Unused endpoint: POST /auth/forgot-password"}, "fullDescription": {"text": "`web/src/features/auth/api/mutations.ts` declares `POST /auth/forgot-password` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-381b444c9a6856bb", "name": "Unused endpoint: POST /auth/resend-invitation", "shortDescription": {"text": "Unused endpoint: POST /auth/resend-invitation"}, "fullDescription": {"text": "`web/src/features/auth/api/mutations.ts` declares `POST /auth/resend-invitation` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c059f57186114027", "name": "Unused endpoint: POST /auth/logout", "shortDescription": {"text": "Unused endpoint: POST /auth/logout"}, "fullDescription": {"text": "`web/src/features/auth/api/mutations.ts` declares `POST /auth/logout` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5843b92b9bb78a4f", "name": "Unused endpoint: POST /finance/invoices/generate", "shortDescription": {"text": "Unused endpoint: POST /finance/invoices/generate"}, "fullDescription": {"text": "`web/src/features/finance/hooks/mutations.ts` declares `POST /finance/invoices/generate` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f8e3b1ec38031f42", "name": "Unused endpoint: POST /contact", "shortDescription": {"text": "Unused endpoint: POST /contact"}, "fullDescription": {"text": "`web/src/features/marketing/lib/contact-api.ts` declares `POST /contact` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c79544905cc1cf65", "name": "Unused endpoint: POST /school/onboarding/position", "shortDescription": {"text": "Unused endpoint: POST /school/onboarding/position"}, "fullDescription": {"text": "`web/src/features/onboarding/hooks/mutations.ts` declares `POST /school/onboarding/position` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-184802727859a0b7", "name": "Unused endpoint: POST /school/onboarding/dismiss", "shortDescription": {"text": "Unused endpoint: POST /school/onboarding/dismiss"}, "fullDescription": {"text": "`web/src/features/onboarding/hooks/mutations.ts` declares `POST /school/onboarding/dismiss` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-45d44d7c1d4f91c2", "name": "Unused endpoint: POST /school/onboarding/complete", "shortDescription": {"text": "Unused endpoint: POST /school/onboarding/complete"}, "fullDescription": {"text": "`web/src/features/onboarding/hooks/mutations.ts` declares `POST /school/onboarding/complete` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a33b303f2427db7e", "name": "Unused endpoint: POST /school/onboarding/resume", "shortDescription": {"text": "Unused endpoint: POST /school/onboarding/resume"}, "fullDescription": {"text": "`web/src/features/onboarding/hooks/mutations.ts` declares `POST /school/onboarding/resume` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/20682"}, "properties": {"repository": "syntax-tz/smart", "repoUrl": "https://github.com/syntax-tz/smart", "branch": "main"}, "results": [{"ruleId": "scanner-8eedbda5a87cf267", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/layout/top-bar.tsx:111"}, "properties": {"repobilityId": "d7a23cc56eeacf05", "scanner": "scanner-primary", "fingerprint": "8eedbda5a87cf267", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6863816ef7f1371e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/layout/sidebar-user-cell.tsx:62"}, "properties": {"repobilityId": "392b92740609eb6d", "scanner": "scanner-primary", "fingerprint": "6863816ef7f1371e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-173aa856c4cc3dd8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/schedule/fixed-blocks-section.tsx:218"}, "properties": {"repobilityId": "e276c190231a2470", "scanner": "scanner-primary", "fingerprint": "173aa856c4cc3dd8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6c28aec0db0c1f51", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/pickers/base-picker.tsx:294"}, "properties": {"repobilityId": "1d42492effecb6c0", "scanner": "scanner-primary", "fingerprint": "6c28aec0db0c1f51", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e83c255295348913", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 web/src/shared/components/ui/chart.tsx:80"}, "properties": {"repobilityId": "47b580c9eb08565f", "scanner": "scanner-primary", "fingerprint": "e83c255295348913", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-2c880615b3cda29b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/ui/wizard.tsx:209"}, "properties": {"repobilityId": "254d1fb592486ca2", "scanner": "scanner-primary", "fingerprint": "2c880615b3cda29b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6f46ac31070436a4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/ui/time-picker.tsx:176"}, "properties": {"repobilityId": "09b5f7c073198d4f", "scanner": "scanner-primary", "fingerprint": "6f46ac31070436a4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-33cd39a6460c2607", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/ui/select.tsx:230"}, "properties": {"repobilityId": "73df16fc5d74c2f6", "scanner": "scanner-primary", "fingerprint": "33cd39a6460c2607", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a1386ccfc8c42d96", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/shared/components/data-table/column-helpers.tsx:19"}, "properties": {"repobilityId": "ebfea4c7e78d07a9", "scanner": "scanner-primary", "fingerprint": "a1386ccfc8c42d96", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-17fa0b4e3e09873b", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 web/src/shared/hooks/use-app-defaults.ts:53"}, "properties": {"repobilityId": "24429b6ecaecdb57", "scanner": "scanner-primary", "fingerprint": "17fa0b4e3e09873b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-1c3cff1eca1e80ba", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 web/src/app/router.tsx:520"}, "properties": {"repobilityId": "5ea61e29d74fa287", "scanner": "scanner-primary", "fingerprint": "1c3cff1eca1e80ba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-9be8d884f3bec4c5", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 web/src/features/schedule/components/schedule-settings-tab.tsx:2"}, "properties": {"repobilityId": "3f23983c4d10120b", "scanner": "scanner-primary", "fingerprint": "9be8d884f3bec4c5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-dffa00a3176a9008", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/combinations/components/combination-picker.tsx:74"}, "properties": {"repobilityId": "e4946817df758d89", "scanner": "scanner-primary", "fingerprint": "dffa00a3176a9008", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1e1cc0c0a8fe173b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/components/dashboard/active-timetable-card.tsx:158"}, "properties": {"repobilityId": "8e7a7acc0bad7789", "scanner": "scanner-primary", "fingerprint": "1e1cc0c0a8fe173b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f5900d52f1f6c9d0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/components/editor/subject-pool-panel.tsx:173"}, "properties": {"repobilityId": "780f1c0ee2d0a0fb", "scanner": "scanner-primary", "fingerprint": "f5900d52f1f6c9d0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-92d3c857f10b4788", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/components/editor/teacher-workload-panel.tsx:167"}, "properties": {"repobilityId": "1f2cf4db91fc5329", "scanner": "scanner-primary", "fingerprint": "92d3c857f10b4788", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c7f87eb7b675e178", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 web/src/features/timetable/components/editor/teacher-workload-panel.tsx:8"}, "properties": {"repobilityId": "199df056635e2f50", "scanner": "scanner-primary", "fingerprint": "c7f87eb7b675e178", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-ab74f8ed4cbb9917", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/components/editor/drop-confirm-popover.tsx:226"}, "properties": {"repobilityId": "6dfe92c5d4d16bcb", "scanner": "scanner-primary", "fingerprint": "ab74f8ed4cbb9917", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d473871d0623325c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/components/editor/readonly-timetable-grid.tsx:196"}, "properties": {"repobilityId": "aea56f273d655d19", "scanner": "scanner-primary", "fingerprint": "d473871d0623325c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7c901462e22a20df", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/components/editor/editor-grid.tsx:661"}, "properties": {"repobilityId": "0a9d969381c9ed69", "scanner": "scanner-primary", "fingerprint": "7c901462e22a20df", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fdb2333e9a0e24de", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/components/editor/last-published-sheet.tsx:112"}, "properties": {"repobilityId": "2415d825f99e5e7b", "scanner": "scanner-primary", "fingerprint": "fdb2333e9a0e24de", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f0baacbc3af463cf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/timetable/pages/timetable-dashboard-page.tsx:333"}, "properties": {"repobilityId": "49e51ba4088d61eb", "scanner": "scanner-primary", "fingerprint": "f0baacbc3af463cf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5cca36cf48c44aa3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/staff/components/edit-qualifications-dialog.tsx:165"}, "properties": {"repobilityId": "0867eca477b5e00b", "scanner": "scanner-primary", "fingerprint": "5cca36cf48c44aa3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f4fe1b3859507e1d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/dashboard/pages/superadmin-dashboard-page.tsx:119"}, "properties": {"repobilityId": "21211ffde189048d", "scanner": "scanner-primary", "fingerprint": "f4fe1b3859507e1d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0314c3102d260bab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/platform/pages/tenants-page.tsx:136"}, "properties": {"repobilityId": "77e9f883b22d83e0", "scanner": "scanner-primary", "fingerprint": "0314c3102d260bab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b35bc77f0a4936df", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/students/components/exam-registrations-section.tsx:87"}, "properties": {"repobilityId": "b1279650ff19d756", "scanner": "scanner-primary", "fingerprint": "b35bc77f0a4936df", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-59228640c0f47219", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/students/pages/student-profile-page.tsx:304"}, "properties": {"repobilityId": "4e38560b8c31d603", "scanner": "scanner-primary", "fingerprint": "59228640c0f47219", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a6070fe4277822a7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/money-desk/components/invoice-picker-for-payment.tsx:250"}, "properties": {"repobilityId": "7e80ee2692e9c3d1", "scanner": "scanner-primary", "fingerprint": "a6070fe4277822a7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6397052f8980a6aa", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 web/src/features/marketing/components/marketing-layout.tsx:36"}, "properties": {"repobilityId": "e9f233c68302693c", "scanner": "scanner-primary", "fingerprint": "6397052f8980a6aa", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-ad75a108019c314d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/roles/components/permission-matrix.tsx:119"}, "properties": {"repobilityId": "02e6c92cd88d9500", "scanner": "scanner-primary", "fingerprint": "ad75a108019c314d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4d841459bc4010aa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/roles/components/role-columns.tsx:37"}, "properties": {"repobilityId": "526976d67b69ca53", "scanner": "scanner-primary", "fingerprint": "4d841459bc4010aa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7f2d3a88556528b1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/announcements/pages/announcements-page.tsx:199"}, "properties": {"repobilityId": "9bbe343a3df9db7b", "scanner": "scanner-primary", "fingerprint": "7f2d3a88556528b1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7d414bd320c02942", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/home/components/teaching-section.tsx:135"}, "properties": {"repobilityId": "5b70637a06e1cf61", "scanner": "scanner-primary", "fingerprint": "7d414bd320c02942", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4943bd71edefaceb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/home/components/accountant-home.tsx:439"}, "properties": {"repobilityId": "f2b878d342d6b6e9", "scanner": "scanner-primary", "fingerprint": "4943bd71edefaceb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-73f1a45c4e63519c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/home/components/head-home.tsx:88"}, "properties": {"repobilityId": "54d28c30d75afc23", "scanner": "scanner-primary", "fingerprint": "73f1a45c4e63519c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cb2b885c44a2b713", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/academics/components/room-pool-dialog.tsx:117"}, "properties": {"repobilityId": "8620583bc7ec1762", "scanner": "scanner-primary", "fingerprint": "cb2b885c44a2b713", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9a31e3a3a5e74a78", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/academics/components/term-picker.tsx:66"}, "properties": {"repobilityId": "a7fe7a3b6e2cceaf", "scanner": "scanner-primary", "fingerprint": "9a31e3a3a5e74a78", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-32fecf2e70e4bfe4", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 web/src/features/academics/components/subject-dialog.tsx:205"}, "properties": {"repobilityId": "f0027e445e660e46", "scanner": "scanner-primary", "fingerprint": "32fecf2e70e4bfe4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-0e79398a4e49f8c5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/academics/components/teacher-picker.tsx:94"}, "properties": {"repobilityId": "a28f9eb897dafca3", "scanner": "scanner-primary", "fingerprint": "0e79398a4e49f8c5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1d13994839577199", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/academics/components/academic-year-picker.tsx:51"}, "properties": {"repobilityId": "c18c0d3739765b14", "scanner": "scanner-primary", "fingerprint": "1d13994839577199", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-91455bdcf02b36da", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/academics/components/subject-picker.tsx:64"}, "properties": {"repobilityId": "6efe4c79467e1fe7", "scanner": "scanner-primary", "fingerprint": "91455bdcf02b36da", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-53a6aab3abfb48e2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/academics/pages/grading-scales-page.tsx:52"}, "properties": {"repobilityId": "b0fc7c59c5eebd03", "scanner": "scanner-primary", "fingerprint": "53a6aab3abfb48e2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8ef67bdbcc14420d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/onboarding/components/page-grade/staff-picker.tsx:84"}, "properties": {"repobilityId": "8d9f62c8d76fffeb", "scanner": "scanner-primary", "fingerprint": "8ef67bdbcc14420d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-84b1d1ba6979665e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/onboarding/components/staff/staff-list-block.tsx:259"}, "properties": {"repobilityId": "d65bd75f211c10a2", "scanner": "scanner-primary", "fingerprint": "84b1d1ba6979665e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b0a5202b2ebc1426", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/onboarding/components/tunnel/tunnel-sidebar.tsx:294"}, "properties": {"repobilityId": "116842c35e7c625b", "scanner": "scanner-primary", "fingerprint": "b0a5202b2ebc1426", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d1c5c6a68ac57a01", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/recent-activity/components/recent-activity-row.tsx:38"}, "properties": {"repobilityId": "023a1485fb64c73b", "scanner": "scanner-primary", "fingerprint": "d1c5c6a68ac57a01", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e7230d29e627fe62", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/calendar/components/day-popover.tsx:86"}, "properties": {"repobilityId": "a26f49052afbbec5", "scanner": "scanner-primary", "fingerprint": "e7230d29e627fe62", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7a60ff6b85d48f41", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/calendar/components/calendar-toolbar.tsx:149"}, "properties": {"repobilityId": "e51f9b03083d6015", "scanner": "scanner-primary", "fingerprint": "7a60ff6b85d48f41", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2d3e9020163dda89", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 web/src/features/calendar/components/canon.tsx:137"}, "properties": {"repobilityId": "4919bf40bfc88bfc", "scanner": "scanner-primary", "fingerprint": "2d3e9020163dda89", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-30a947e65c61f840", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/calendar/components/agenda-view.tsx:201"}, "properties": {"repobilityId": "6018d08d9e528829", "scanner": "scanner-primary", "fingerprint": "30a947e65c61f840", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-79a201fd72fefade", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/calendar/components/fields/canon-select.tsx:75"}, "properties": {"repobilityId": "adb73e465c7d2560", "scanner": "scanner-primary", "fingerprint": "79a201fd72fefade", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-11985cbafc159f69", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/calendar/components/fields/canon-date-picker.tsx:100"}, "properties": {"repobilityId": "43250ade4d5d5880", "scanner": "scanner-primary", "fingerprint": "11985cbafc159f69", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-65b99614d94938c1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/parents/components/link-guardian-dialog.tsx:288"}, "properties": {"repobilityId": "33467e999072e5f3", "scanner": "scanner-primary", "fingerprint": "65b99614d94938c1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ba1de5b1a155402a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/features/parents/pages/parent-detail-page.tsx:158"}, "properties": {"repobilityId": "c31fb731fbb1b563", "scanner": "scanner-primary", "fingerprint": "ba1de5b1a155402a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5713f2448b361ac4", "level": "warning", "message": {"text": "Privileged port 30 in use"}, "properties": {"repobilityId": "54f172e7d16fc662", "scanner": "scanner-primary", "fingerprint": "5713f2448b361ac4", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/codeql.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1f66ad88286ca30a", "level": "warning", "message": {"text": "Dockerfile runs as root: backend/Dockerfile"}, "properties": {"repobilityId": "7afd2b0e8a8c9eeb", "scanner": "scanner-primary", "fingerprint": "1f66ad88286ca30a", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-420bdafef08ebfa2", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: mcr.microsoft.com/dotnet/sdk:10.0"}, "properties": {"repobilityId": "af15a5d7030bdfbc", "scanner": "scanner-primary", "fingerprint": "420bdafef08ebfa2", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0b95a2c41d75a45e", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: mcr.microsoft.com/dotnet/aspnet:10.0"}, "properties": {"repobilityId": "ab80a3a8620ebd42", "scanner": "scanner-primary", "fingerprint": "0b95a2c41d75a45e", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/Dockerfile"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-59a270c509f01944", "level": "error", "message": {"text": "Runtime dotenv file present in repo: web/.env.development"}, "properties": {"repobilityId": "50b3c3bdc53dbcf5", "scanner": "scanner-primary", "fingerprint": "59a270c509f01944", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web/.env.development"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-30c5601732711e12", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/Mwangazza - Logo Family Sheet.html:213"}, "properties": {"repobilityId": "8b0d9b912ae7c571", "scanner": "scanner-primary", "fingerprint": "30c5601732711e12", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design/mwangazza-v1/Mwangazza - Logo Family Sheet.html"}, "region": {"startLine": 213}}}]}, {"ruleId": "scanner-9e3d0e7c3eac2bb2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/Mwangazza - Design System.html:14441"}, "properties": {"repobilityId": "8ea7e5e0adfd5aa0", "scanner": "scanner-primary", "fingerprint": "9e3d0e7c3eac2bb2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design/mwangazza-v1/Mwangazza - Design System.html"}, "region": {"startLine": 14441}}}]}, {"ruleId": "scanner-56ef75357e7c2c0d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/Mwangazza - ZZ Icon & Favicon.html:374"}, "properties": {"repobilityId": "dee16c83929c9ce9", "scanner": "scanner-primary", "fingerprint": "56ef75357e7c2c0d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design/mwangazza-v1/Mwangazza - ZZ Icon & Favicon.html"}, "region": {"startLine": 374}}}]}, {"ruleId": "scanner-57348b72ebf85d80", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/comms.html:882"}, "properties": {"repobilityId": "6bf15be56fcd2cc8", "scanner": "scanner-primary", "fingerprint": "57348b72ebf85d80", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design/mwangazza-v1/product/comms.html"}, "region": {"startLine": 882}}}]}, {"ruleId": "scanner-7b6e91fec2b678e0", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/finance.html:754"}, "properties": {"repobilityId": "81d157591843833e", "scanner": "scanner-primary", "fingerprint": "7b6e91fec2b678e0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design/mwangazza-v1/product/finance.html"}, "region": {"startLine": 754}}}]}, {"ruleId": "scanner-b28b04efc5ed2115", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/attendance.html:903"}, "properties": {"repobilityId": "7ddbd9c452bdfe9a", "scanner": "scanner-primary", "fingerprint": "b28b04efc5ed2115", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design/mwangazza-v1/product/attendance.html"}, "region": {"startLine": 903}}}]}, {"ruleId": "scanner-f4dcf683af05040d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/home.html:816"}, "properties": {"repobilityId": "bc9d45ded85bb970", "scanner": "scanner-primary", "fingerprint": "f4dcf683af05040d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design/mwangazza-v1/product/home.html"}, "region": {"startLine": 816}}}]}, {"ruleId": "scanner-4c1ede56019d0953", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/cal-v3.js:649"}, "properties": {"repobilityId": "d511bb4a6c7193bb", "scanner": "scanner-primary", "fingerprint": "4c1ede56019d0953", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design/mwangazza-v1/product/cal-v3.js"}, "region": {"startLine": 649}}}]}, {"ruleId": "scanner-56ec290a29404d7c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/marks.html:500"}, "properties": {"repobilityId": "c382d697b5b5f59a", "scanner": "scanner-primary", "fingerprint": "56ec290a29404d7c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design/mwangazza-v1/product/marks.html"}, "region": {"startLine": 500}}}]}, {"ruleId": "scanner-ce9cf826ce0a3e7d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/Timetable/tt-setup.html:1062"}, "properties": {"repobilityId": "6b8a3a4114b0036b", "scanner": "scanner-primary", "fingerprint": "ce9cf826ce0a3e7d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design/mwangazza-v1/product/Timetable/tt-setup.html"}, "region": {"startLine": 1062}}}]}, {"ruleId": "scanner-a512a053ad38e3f7", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in docs/design/mwangazza-v1/product/Timetable/Timetable Planner.html:813"}, "properties": {"repobilityId": "bbe7a18b3ce5339e", "scanner": "scanner-primary", "fingerprint": "a512a053ad38e3f7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design/mwangazza-v1/product/Timetable/Timetable Planner.html"}, "region": {"startLine": 813}}}]}, {"ruleId": "scanner-d37971f9d45a3518", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/product/Timetable/Timetable Planner.html:935"}, "properties": {"repobilityId": "0b61aa09090caa81", "scanner": "scanner-primary", "fingerprint": "d37971f9d45a3518", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design/mwangazza-v1/product/Timetable/Timetable Planner.html"}, "region": {"startLine": 935}}}]}, {"ruleId": "scanner-5dfeb35e8642513b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/assets/wordmark.js:107"}, "properties": {"repobilityId": "561309fb490689f2", "scanner": "scanner-primary", "fingerprint": "5dfeb35e8642513b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design/mwangazza-v1/assets/wordmark.js"}, "region": {"startLine": 107}}}]}, {"ruleId": "scanner-84cea69cb1f62e32", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/assets/ecosystem.js:14"}, "properties": {"repobilityId": "e4eaa0da61b91d40", "scanner": "scanner-primary", "fingerprint": "84cea69cb1f62e32", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design/mwangazza-v1/assets/ecosystem.js"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-641c9f520ade345b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mwangazza-v1/assets/craft.js:27"}, "properties": {"repobilityId": "3ca404a2671654df", "scanner": "scanner-primary", "fingerprint": "641c9f520ade345b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design/mwangazza-v1/assets/craft.js"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-975620df8cd872e7", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mobile/pages/SMART Mobile Design System v7.html:1643"}, "properties": {"repobilityId": "b5e60904d588a3b8", "scanner": "scanner-primary", "fingerprint": "975620df8cd872e7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design/mobile/pages/SMART Mobile Design System v7.html"}, "region": {"startLine": 1643}}}]}, {"ruleId": "scanner-e353037813370420", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/mobile/pages/Nomi_v6.html:4742"}, "properties": {"repobilityId": "9cc2ac25144cd23c", "scanner": "scanner-primary", "fingerprint": "e353037813370420", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design/mobile/pages/Nomi_v6.html"}, "region": {"startLine": 4742}}}]}, {"ruleId": "scanner-c0d02692c82f71d0", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design/web/SMART-Web-Design-System-v2.html:14419"}, "properties": {"repobilityId": "3791e9e0be85b186", "scanner": "scanner-primary", "fingerprint": "c0d02692c82f71d0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design/web/SMART-Web-Design-System-v2.html"}, "region": {"startLine": 14419}}}]}, {"ruleId": "scanner-43ee0edcc1c0b0b8", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in web/src/shared/components/ui/chart.tsx:80"}, "properties": {"repobilityId": "c49c77a49da68368", "scanner": "scanner-primary", "fingerprint": "43ee0edcc1c0b0b8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web/src/shared/components/ui/chart.tsx"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-ed94c6b43a543d0c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in web/src/features/marketing/components/marketing-layout.tsx:36"}, "properties": {"repobilityId": "4a8685cfbb1c86cd", "scanner": "scanner-primary", "fingerprint": "ed94c6b43a543d0c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web/src/features/marketing/components/marketing-layout.tsx"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-a23fdac1b63d38a4", "level": "error", "message": {"text": "Possible secret in .github/workflows/ci.yml"}, "properties": {"repobilityId": "409275dc891ac1b3", "scanner": "scanner-primary", "fingerprint": "a23fdac1b63d38a4", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 152}}}]}, {"ruleId": "scanner-65aa740cba4a4a73", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f72e4b498f09201b", "scanner": "scanner-primary", "fingerprint": "65aa740cba4a4a73", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/codeql.yml"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-65aa740cba4a4a73", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "7640466c92034bac", "scanner": "scanner-primary", "fingerprint": "65aa740cba4a4a73", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/codeql.yml"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-65aa740cba4a4a73", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "3130c0a2c5ea460e", "scanner": "scanner-primary", "fingerprint": "65aa740cba4a4a73", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/codeql.yml"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "9e5617d449b061f6", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4a63b1fd6887cae9", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "9e5617d449b061f6", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4a63b1fd6887cae9", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "44cf79ac43fac5f2", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 104}}}]}, {"ruleId": "scanner-f2285fe1e868b87b", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d61da7cf6657d87e", "scanner": "scanner-primary", "fingerprint": "f2285fe1e868b87b", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/mobile-ci.yml"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-1a87be555e19cdc5", "level": "note", "message": {"text": "Very large file: docs/design/mwangazza-v1/design-canvas.jsx (974 lines)"}, "properties": {"repobilityId": "fc881d60e9faac7a", "scanner": "scanner-primary", "fingerprint": "1a87be555e19cdc5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "efe36f78e3c8bc2f", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "3d0f6e7588077278", "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": "cb430e414dd6807c", "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": "00b400381bb8e848", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "4cd6447af089f781", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "f9ec2dfdf1531bcb", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-773afa36a024d850", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/handoff.md"}, "properties": {"repobilityId": "a1e5204626bd8fc5", "scanner": "scanner-primary", "fingerprint": "773afa36a024d850", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/handoff.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c76bd5794b4ff2b2", "level": "none", "message": {"text": "Commented-code block (7 lines) in docs/design/mwangazza-v1/design-canvas.jsx:4"}, "properties": {"repobilityId": "8e5ef66bc525578e", "scanner": "scanner-primary", "fingerprint": "c76bd5794b4ff2b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-81cbf598d6bdff4e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 docs/design/mwangazza-v1/design-canvas.jsx:136"}, "properties": {"repobilityId": "c118c6099d0fcc9f", "scanner": "scanner-primary", "fingerprint": "81cbf598d6bdff4e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e4c506dbd5002d1e", "level": "none", "message": {"text": "Commented-code block (5 lines) in docs/design/mwangazza-v1/mobile/identity-screens.jsx:1"}, "properties": {"repobilityId": "1b6660d177ad85ba", "scanner": "scanner-primary", "fingerprint": "e4c506dbd5002d1e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-006c226053cfa5e4", "level": "none", "message": {"text": "Commented-code block (6 lines) in docs/design/mobile/scripts/student-polish.js:57"}, "properties": {"repobilityId": "812f8423b3d8f94f", "scanner": "scanner-primary", "fingerprint": "006c226053cfa5e4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-383948a13ebb961f", "level": "none", "message": {"text": "Commented-code block (6 lines) in docs/design/mobile/scripts/polish.js:147"}, "properties": {"repobilityId": "c402b4c71e765d11", "scanner": "scanner-primary", "fingerprint": "383948a13ebb961f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f183c4978522e01b", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/shared/components/schedule/fixed-blocks-section.tsx:51"}, "properties": {"repobilityId": "259ed04008e6f420", "scanner": "scanner-primary", "fingerprint": "f183c4978522e01b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9aa1f0d78ef0fe3a", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/shared/components/ui/calendar.tsx:9"}, "properties": {"repobilityId": "db354601f5dd241a", "scanner": "scanner-primary", "fingerprint": "9aa1f0d78ef0fe3a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c619e1ee769ac262", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/shared/components/ui/date-range-picker.tsx:12"}, "properties": {"repobilityId": "f658479037197399", "scanner": "scanner-primary", "fingerprint": "c619e1ee769ac262", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-97c1f7fedcf4ac56", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/shared/components/ui/sub-stepper.tsx:5"}, "properties": {"repobilityId": "b0322884a9f5e59b", "scanner": "scanner-primary", "fingerprint": "97c1f7fedcf4ac56", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-daf821ca1d5c7e39", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/shared/components/ui/radio-group.tsx:11"}, "properties": {"repobilityId": "7cd7edfd4b8b2548", "scanner": "scanner-primary", "fingerprint": "daf821ca1d5c7e39", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f21ade7df73c0f2e", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/shared/components/ui/button.tsx:7"}, "properties": {"repobilityId": "26cf63978afac74b", "scanner": "scanner-primary", "fingerprint": "f21ade7df73c0f2e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-493662b3dbf9682f", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/shared/components/ui/form-field.tsx:11"}, "properties": {"repobilityId": "54b89a93195eeee0", "scanner": "scanner-primary", "fingerprint": "493662b3dbf9682f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0b40754f1a0c8590", "level": "none", "message": {"text": "Commented-code block (10 lines) in web/src/shared/components/ui/phone-input.tsx:14"}, "properties": {"repobilityId": "3da303b5cda9425b", "scanner": "scanner-primary", "fingerprint": "0b40754f1a0c8590", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0478e20cbdafae18", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/shared/components/ui/wizard.tsx:11"}, "properties": {"repobilityId": "c90b85bb8fd793a8", "scanner": "scanner-primary", "fingerprint": "0478e20cbdafae18", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-84abd6397ff0311e", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/shared/components/ui/time-picker.tsx:15"}, "properties": {"repobilityId": "20c7b0105e743ae3", "scanner": "scanner-primary", "fingerprint": "84abd6397ff0311e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe3e176dab3e360d", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/shared/components/ui/date-picker.tsx:14"}, "properties": {"repobilityId": "36cdea03d3c08237", "scanner": "scanner-primary", "fingerprint": "fe3e176dab3e360d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f4967812ad1f5d84", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/shared/components/ui/select.tsx:10"}, "properties": {"repobilityId": "4fb6ce7179ae3790", "scanner": "scanner-primary", "fingerprint": "f4967812ad1f5d84", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-adfbbd72c4a21ff4", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/shared/components/ui/info-hint.tsx:7"}, "properties": {"repobilityId": "61dd3be03d6a72f6", "scanner": "scanner-primary", "fingerprint": "adfbbd72c4a21ff4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4531f1b0676237b6", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/shared/components/ui/__tests__/time-picker.test.tsx:302"}, "properties": {"repobilityId": "1b2f4e883dd7a5bd", "scanner": "scanner-primary", "fingerprint": "4531f1b0676237b6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d059e57db3a657cb", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/shared/components/command-palette/use-global-search.ts:172"}, "properties": {"repobilityId": "cea11e16a7a1b765", "scanner": "scanner-primary", "fingerprint": "d059e57db3a657cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d0421cd87aabfcd5", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/shared/components/command-palette/command-palette.tsx:71"}, "properties": {"repobilityId": "e4cffad69a2fc7fb", "scanner": "scanner-primary", "fingerprint": "d0421cd87aabfcd5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4545ea5ae7e119b2", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/shared/components/command-palette/__tests__/command-palette.test.tsx:11"}, "properties": {"repobilityId": "8226681cde187052", "scanner": "scanner-primary", "fingerprint": "4545ea5ae7e119b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b88d044fdc11f075", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/shared/components/bulk-import/__tests__/bulk-import-dialog.test.tsx:407"}, "properties": {"repobilityId": "6e743c33145d0f81", "scanner": "scanner-primary", "fingerprint": "b88d044fdc11f075", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b273d2a40f883aee", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/shared/components/mwangazza/brief.tsx:12"}, "properties": {"repobilityId": "3f42f0a58a56752c", "scanner": "scanner-primary", "fingerprint": "b273d2a40f883aee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fc0fab5539440a88", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/shared/components/mwangazza/docket.tsx:5"}, "properties": {"repobilityId": "c5a85b800e1c9562", "scanner": "scanner-primary", "fingerprint": "fc0fab5539440a88", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8891061f16d7b23c", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/shared/components/mwangazza/rail-figure.tsx:5"}, "properties": {"repobilityId": "b7de0106ca81d7bb", "scanner": "scanner-primary", "fingerprint": "8891061f16d7b23c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c96b111ae990fc02", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/shared/lib/api-client.ts:19"}, "properties": {"repobilityId": "6f3afda371e750bb", "scanner": "scanner-primary", "fingerprint": "c96b111ae990fc02", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-af87bd31efdaf893", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/shared/lib/chunk-reload.ts:20"}, "properties": {"repobilityId": "94abd38190cdebe8", "scanner": "scanner-primary", "fingerprint": "af87bd31efdaf893", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-00047d1576db3352", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/shared/lib/format.ts:1"}, "properties": {"repobilityId": "52e8c299f1947f1f", "scanner": "scanner-primary", "fingerprint": "00047d1576db3352", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-64557cbedefe5496", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/shared/lib/__tests__/api-client.test.ts:129"}, "properties": {"repobilityId": "63f6fdd93ee5bc5d", "scanner": "scanner-primary", "fingerprint": "64557cbedefe5496", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-05738433db5f295f", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/app/router.tsx:131"}, "properties": {"repobilityId": "83d4d2dd7030390b", "scanner": "scanner-primary", "fingerprint": "05738433db5f295f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-54d70e351ddda574", "level": "none", "message": {"text": "Commented-code block (9 lines) in web/src/app/__tests__/router.test.tsx:22"}, "properties": {"repobilityId": "2c694b27fd70268f", "scanner": "scanner-primary", "fingerprint": "54d70e351ddda574", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d94c5aae80e49743", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/app/layouts/authenticated-shell.tsx:34"}, "properties": {"repobilityId": "bcbac5ca0fdbde0b", "scanner": "scanner-primary", "fingerprint": "d94c5aae80e49743", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6ad77df5e518b2d6", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/app/layouts/__tests__/authenticated-shell.test.tsx:133"}, "properties": {"repobilityId": "85ae0d8a8ba45aae", "scanner": "scanner-primary", "fingerprint": "6ad77df5e518b2d6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-16d1d4f1f57381b3", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/settings/hooks/mutations.ts:7"}, "properties": {"repobilityId": "97fa627119a497b1", "scanner": "scanner-primary", "fingerprint": "16d1d4f1f57381b3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e6e55a76e6b470e1", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/schedule/schemas.ts:12"}, "properties": {"repobilityId": "bd792220330d8064", "scanner": "scanner-primary", "fingerprint": "e6e55a76e6b470e1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-953816d769298cd1", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/schedule/components/schedule-settings-tab.tsx:1"}, "properties": {"repobilityId": "de181edd6c334134", "scanner": "scanner-primary", "fingerprint": "953816d769298cd1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-115a916701814284", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/auth/types/auth.schemas.ts:16"}, "properties": {"repobilityId": "83a444b238bc61fa", "scanner": "scanner-primary", "fingerprint": "115a916701814284", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1d088330bcc4e86f", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/auth/types/__tests__/auth.schemas.test.ts:57"}, "properties": {"repobilityId": "874e6fe47f4e3168", "scanner": "scanner-primary", "fingerprint": "1d088330bcc4e86f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-37148dc96bb4823c", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/auth/stores/__tests__/auth.store.test.ts:194"}, "properties": {"repobilityId": "ca30c06c1b57a210", "scanner": "scanner-primary", "fingerprint": "37148dc96bb4823c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d537ea725e86690b", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/auth/api/mutations.ts:94"}, "properties": {"repobilityId": "9f8f1cb15b6c3362", "scanner": "scanner-primary", "fingerprint": "d537ea725e86690b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3ba07e8c6e824fe8", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/auth/lib/return-to.ts:31"}, "properties": {"repobilityId": "48519ddb2d1b96bc", "scanner": "scanner-primary", "fingerprint": "3ba07e8c6e824fe8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7853615e041815d5", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/auth/pages/login-page.tsx:80"}, "properties": {"repobilityId": "d93cfcb689ec9637", "scanner": "scanner-primary", "fingerprint": "7853615e041815d5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-38e9fdcab2bb8266", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/auth/pages/__tests__/login-page.test.tsx:17"}, "properties": {"repobilityId": "3dc741e7bce863a1", "scanner": "scanner-primary", "fingerprint": "38e9fdcab2bb8266", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-218af2fd5471606d", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/exams/pages/__tests__/exam-detail-page.test.tsx:11"}, "properties": {"repobilityId": "db27f0a310e35e5f", "scanner": "scanner-primary", "fingerprint": "218af2fd5471606d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4afc7c0906be88f3", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/timetable/components/editor/drop-confirm-popover.tsx:186"}, "properties": {"repobilityId": "8f1d92a1ec1f9a6f", "scanner": "scanner-primary", "fingerprint": "4afc7c0906be88f3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-531e07117bf09bc0", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/timetable/components/editor/editor-grid.tsx:248"}, "properties": {"repobilityId": "7d97a2dc39c0d4f8", "scanner": "scanner-primary", "fingerprint": "531e07117bf09bc0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-de812521ddbcbe48", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/timetable/components/editor/__tests__/teacher-workload-panel.test.tsx:62"}, "properties": {"repobilityId": "be087ff4d423ffda", "scanner": "scanner-primary", "fingerprint": "de812521ddbcbe48", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ce6fba9a78d7a65a", "level": "none", "message": {"text": "Commented-code block (9 lines) in web/src/features/timetable/lib/slot-room-priority.test.ts:67"}, "properties": {"repobilityId": "012e5eb5ac925854", "scanner": "scanner-primary", "fingerprint": "ce6fba9a78d7a65a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bb96dcb4a2ba3a8a", "level": "none", "message": {"text": "Commented-code block (9 lines) in web/src/features/timetable/pages/timetable-page.tsx:184"}, "properties": {"repobilityId": "1b81046291b5bb2f", "scanner": "scanner-primary", "fingerprint": "bb96dcb4a2ba3a8a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a471d784af197771", "level": "none", "message": {"text": "Commented-code block (8 lines) in web/src/features/staff/components/reset-staff-password-dialog.tsx:25"}, "properties": {"repobilityId": "d8594cf8bc7f10f0", "scanner": "scanner-primary", "fingerprint": "a471d784af197771", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9db3faa5b73d6ea5", "level": "none", "message": {"text": "Commented-code block (8 lines) in web/src/features/staff/components/__tests__/create-staff-dialog.test.tsx:69"}, "properties": {"repobilityId": "8c8ccf4e5b9170cf", "scanner": "scanner-primary", "fingerprint": "9db3faa5b73d6ea5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5b03583cfc8e51c7", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/staff/pages/staff-list-page.tsx:61"}, "properties": {"repobilityId": "30f23cc183a9ff75", "scanner": "scanner-primary", "fingerprint": "5b03583cfc8e51c7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5536a5343269cdc9", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/staff/pages/__tests__/staff-list-page.test.tsx:230"}, "properties": {"repobilityId": "5223aa82f0fd50bd", "scanner": "scanner-primary", "fingerprint": "5536a5343269cdc9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-01712fd6aa7e4ca3", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/staff/pages/__tests__/staff-list-page.lifecycle.test.tsx:23"}, "properties": {"repobilityId": "c0ec82715c7b6172", "scanner": "scanner-primary", "fingerprint": "01712fd6aa7e4ca3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bcfec6288baeb15b", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/staff/hooks/mutations.ts:16"}, "properties": {"repobilityId": "dac6dc741b90f569", "scanner": "scanner-primary", "fingerprint": "bcfec6288baeb15b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f1d6e4a0e3ef210", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/trash/api/mutations.ts:100"}, "properties": {"repobilityId": "d4f066db198357cc", "scanner": "scanner-primary", "fingerprint": "1f1d6e4a0e3ef210", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b2bd6c13db349b0f", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/platform/components/__tests__/create-tenant-dialog.test.tsx:11"}, "properties": {"repobilityId": "18618f610d975e77", "scanner": "scanner-primary", "fingerprint": "b2bd6c13db349b0f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8517029919bc0302", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/platform/pilots/types.ts:6"}, "properties": {"repobilityId": "13d07bcb51a36a20", "scanner": "scanner-primary", "fingerprint": "8517029919bc0302", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-46d2b2e9cb84250f", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/platform/pages/tenant-detail-page.tsx:486"}, "properties": {"repobilityId": "64e90efd7551bfdf", "scanner": "scanner-primary", "fingerprint": "46d2b2e9cb84250f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-101c445a9b0e2bc9", "level": "none", "message": {"text": "Commented-code block (8 lines) in web/src/features/platform/hooks/mutations.ts:16"}, "properties": {"repobilityId": "44b0a46dfa467456", "scanner": "scanner-primary", "fingerprint": "101c445a9b0e2bc9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7f75963471ee4340", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/students/exam-profile-meta.ts:4"}, "properties": {"repobilityId": "a11d5e27692cf59c", "scanner": "scanner-primary", "fingerprint": "7f75963471ee4340", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-156e9bab3e5ea5ab", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/students/pages/__tests__/student-list-page.lifecycle.test.tsx:23"}, "properties": {"repobilityId": "db039dc821e49db5", "scanner": "scanner-primary", "fingerprint": "156e9bab3e5ea5ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ad4ff15defcc60ed", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/finance/components/generate-invoices-dialog.tsx:88"}, "properties": {"repobilityId": "7e62de2f1853f46f", "scanner": "scanner-primary", "fingerprint": "ad4ff15defcc60ed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0fee4251c9833545", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/finance/pages/__tests__/invoices-tab.test.tsx:14"}, "properties": {"repobilityId": "5abf08a29b4dde8a", "scanner": "scanner-primary", "fingerprint": "0fee4251c9833545", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9d96bd174905bbf2", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/finance/pages/__tests__/fee-structures-tab.test.tsx:14"}, "properties": {"repobilityId": "8888086a72642be0", "scanner": "scanner-primary", "fingerprint": "9d96bd174905bbf2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bcb0c45c2f5c4165", "level": "none", "message": {"text": "Commented-code block (9 lines) in web/src/features/finance/hooks/queries.ts:60"}, "properties": {"repobilityId": "5be0d3cee3e9e63e", "scanner": "scanner-primary", "fingerprint": "bcb0c45c2f5c4165", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9a72eb3d66559b52", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/finance/hooks/mutations.ts:14"}, "properties": {"repobilityId": "45e2125f4f36b532", "scanner": "scanner-primary", "fingerprint": "9a72eb3d66559b52", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-266455a8fc93edf1", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/money-desk/types.ts:1"}, "properties": {"repobilityId": "51bfe19bb149b104", "scanner": "scanner-primary", "fingerprint": "266455a8fc93edf1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6f3fa7226c52d1e1", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/money-desk/components/record-payment-dialog.tsx:30"}, "properties": {"repobilityId": "a586e1ba712b227d", "scanner": "scanner-primary", "fingerprint": "6f3fa7226c52d1e1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6d4b82733ff3cb2b", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/money-desk/components/invoice-picker-for-payment.tsx:18"}, "properties": {"repobilityId": "65b7e0ae4c4a0225", "scanner": "scanner-primary", "fingerprint": "6d4b82733ff3cb2b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2495239c0e643884", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/money-desk/components/void-payment-dialog.tsx:22"}, "properties": {"repobilityId": "967fa7f0534ba979", "scanner": "scanner-primary", "fingerprint": "2495239c0e643884", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f1ef4b9c9cc36869", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/money-desk/components/__tests__/record-payment-dialog.test.tsx:8"}, "properties": {"repobilityId": "68a456ec445b0fb2", "scanner": "scanner-primary", "fingerprint": "f1ef4b9c9cc36869", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-328c02a55f7e0286", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/money-desk/hooks/mutations.ts:7"}, "properties": {"repobilityId": "a2d39efa7810fd4e", "scanner": "scanner-primary", "fingerprint": "328c02a55f7e0286", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-69f2d49c9d763f17", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/marketing/types/index.ts:68"}, "properties": {"repobilityId": "34a32f05631b4f0e", "scanner": "scanner-primary", "fingerprint": "69f2d49c9d763f17", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-01091c8631814370", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/marketing/components/curriculum-dag.tsx:295"}, "properties": {"repobilityId": "4e28888a833490ac", "scanner": "scanner-primary", "fingerprint": "01091c8631814370", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3758af17811ce2f4", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/features/marketing/components/synthetic-parent-app.tsx:110"}, "properties": {"repobilityId": "e374eea09471e459", "scanner": "scanner-primary", "fingerprint": "3758af17811ce2f4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-73fe2c19e5a8dcc2", "level": "none", "message": {"text": "Commented-code block (9 lines) in web/src/features/marketing/components/__tests__/contact-form.test.tsx:20"}, "properties": {"repobilityId": "9d5e80051ccf128b", "scanner": "scanner-primary", "fingerprint": "73fe2c19e5a8dcc2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-76e84bdcc9422831", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/features/roles/hooks/queries.ts:17"}, "properties": {"repobilityId": "e43ae119698502f7", "scanner": "scanner-primary", "fingerprint": "76e84bdcc9422831", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-58d9f9e814cc5b58", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/features/roles/hooks/mutations.ts:7"}, "properties": {"repobilityId": "4a6c78ea78a34145", "scanner": "scanner-primary", "fingerprint": "58d9f9e814cc5b58", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-810ac9cdbdbfc1b8", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/roles/hooks/__tests__/queries.test.ts:27"}, "properties": {"repobilityId": "3a82d87c49d8a340", "scanner": "scanner-primary", "fingerprint": "810ac9cdbdbfc1b8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bea64e7d1d3d57e1", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/home/components/teaching-section.tsx:12"}, "properties": {"repobilityId": "3795bf70e67f26b3", "scanner": "scanner-primary", "fingerprint": "bea64e7d1d3d57e1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-841156ba24c82560", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/home/components/accountant-home.tsx:46"}, "properties": {"repobilityId": "1a36f44e1ec437fc", "scanner": "scanner-primary", "fingerprint": "841156ba24c82560", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c23379cb129b18d1", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/home/components/head-home.tsx:28"}, "properties": {"repobilityId": "6cc630ea3fa17cb7", "scanner": "scanner-primary", "fingerprint": "c23379cb129b18d1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-787e805c4be91f47", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/home/components/teacher-home.tsx:28"}, "properties": {"repobilityId": "0b3d1566d88e127d", "scanner": "scanner-primary", "fingerprint": "787e805c4be91f47", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d90ed2749ee028fc", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/academics/subject-icons.ts:1"}, "properties": {"repobilityId": "aa20526454a0e281", "scanner": "scanner-primary", "fingerprint": "d90ed2749ee028fc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-12ab6849646fa340", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/academics/types.ts:90"}, "properties": {"repobilityId": "463e6903f8aafbea", "scanner": "scanner-primary", "fingerprint": "12ab6849646fa340", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e535a752607eec3", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/features/academics/components/subject-dialog.tsx:201"}, "properties": {"repobilityId": "a66ccb5592c2df2b", "scanner": "scanner-primary", "fingerprint": "9e535a752607eec3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5bcac1c59d0a02bd", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/academics/components/__tests__/grade-level-dialog.test.tsx:10"}, "properties": {"repobilityId": "fc74a2e097eed7f7", "scanner": "scanner-primary", "fingerprint": "5bcac1c59d0a02bd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-75a344b296fbbc82", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/academics/pages/academics-page.tsx:25"}, "properties": {"repobilityId": "cacfa84d4a4aed0d", "scanner": "scanner-primary", "fingerprint": "75a344b296fbbc82", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fa4f50c77243ac3b", "level": "none", "message": {"text": "Commented-code block (8 lines) in web/src/features/academics/hooks/mutations.ts:193"}, "properties": {"repobilityId": "c06910aa03de7cba", "scanner": "scanner-primary", "fingerprint": "fa4f50c77243ac3b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3421b64d0878095e", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/schemas.ts:11"}, "properties": {"repobilityId": "91df60464846b626", "scanner": "scanner-primary", "fingerprint": "3421b64d0878095e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f685a07959ddb240", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/task-ids.ts:14"}, "properties": {"repobilityId": "7eed9543f682a525", "scanner": "scanner-primary", "fingerprint": "f685a07959ddb240", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b9543a778d100211", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/features/onboarding/page-registry.ts:27"}, "properties": {"repobilityId": "c7e149fa668abb72", "scanner": "scanner-primary", "fingerprint": "b9543a778d100211", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fbb25bcfc0a5bc36", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/features/onboarding/__tests__/page-registry.test.ts:22"}, "properties": {"repobilityId": "4f4c0d11965d5fd8", "scanner": "scanner-primary", "fingerprint": "fbb25bcfc0a5bc36", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3deb4a507b58423a", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/fixtures/onboarding-status.ts:63"}, "properties": {"repobilityId": "7f0f612d5c1ed2aa", "scanner": "scanner-primary", "fingerprint": "3deb4a507b58423a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-17c06e6ff48a611a", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/onboarding/components/academic-year-form.tsx:609"}, "properties": {"repobilityId": "2563e2b69cbbc4f6", "scanner": "scanner-primary", "fingerprint": "17c06e6ff48a611a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5efb816a1903bfe1", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/students-form.tsx:71"}, "properties": {"repobilityId": "ad4233bd734a4770", "scanner": "scanner-primary", "fingerprint": "5efb816a1903bfe1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-adfb417a00da515e", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/__tests__/academic-year-form.test.tsx:141"}, "properties": {"repobilityId": "dbe68adbdf218e6c", "scanner": "scanner-primary", "fingerprint": "adfb417a00da515e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-097ad7dcd7d2c023", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/features/onboarding/components/__tests__/students-form.test.tsx:160"}, "properties": {"repobilityId": "fa9c6fb066d3a0a1", "scanner": "scanner-primary", "fingerprint": "097ad7dcd7d2c023", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-452bb81a6d4b4207", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/teaching/welcome-screen.tsx:5"}, "properties": {"repobilityId": "27d99e64085379e4", "scanner": "scanner-primary", "fingerprint": "452bb81a6d4b4207", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0c650da271c2ca3f", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/onboarding/components/teaching/staff-import-teaching.tsx:14"}, "properties": {"repobilityId": "d96f815b6e2359b1", "scanner": "scanner-primary", "fingerprint": "0c650da271c2ca3f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a3b817c4483d40c9", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/onboarding/components/teaching/roles-teaching.tsx:5"}, "properties": {"repobilityId": "9a16845f75597fba", "scanner": "scanner-primary", "fingerprint": "a3b817c4483d40c9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-58a6355931c709b4", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/onboarding/components/page-grade/subject-card.tsx:11"}, "properties": {"repobilityId": "b4e8e56b7bb193f2", "scanner": "scanner-primary", "fingerprint": "58a6355931c709b4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-db5653661124f914", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/page-grade/grade-combinations-section.tsx:124"}, "properties": {"repobilityId": "3550ef216f56eb7b", "scanner": "scanner-primary", "fingerprint": "db5653661124f914", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-58b4d8758120922e", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/page-grade/grade-subjects-section.tsx:161"}, "properties": {"repobilityId": "ae085b05c26a2daa", "scanner": "scanner-primary", "fingerprint": "58b4d8758120922e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6ec40d44ee243627", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/page-grade/sections-explainer.tsx:3"}, "properties": {"repobilityId": "aa60fee1fc727fdc", "scanner": "scanner-primary", "fingerprint": "6ec40d44ee243627", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-645cb558297d7c25", "level": "none", "message": {"text": "Commented-code block (8 lines) in web/src/features/onboarding/components/page-grade/grade-sections-section.tsx:231"}, "properties": {"repobilityId": "cdb13f1a0a2401dd", "scanner": "scanner-primary", "fingerprint": "645cb558297d7c25", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b7d6d6f30475903", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/onboarding/components/page-grade/grade-explainer.tsx:18"}, "properties": {"repobilityId": "dcc410fa502c8a46", "scanner": "scanner-primary", "fingerprint": "7b7d6d6f30475903", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8b0eb6431c6c69df", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/page-grade/subject-teacher-explainer.tsx:3"}, "properties": {"repobilityId": "54d87d2b1778c20b", "scanner": "scanner-primary", "fingerprint": "8b0eb6431c6c69df", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0990a2eb29fe6cf9", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/page-grade/__tests__/grade-subjects-section.test.tsx:13"}, "properties": {"repobilityId": "a5263a34f932812e", "scanner": "scanner-primary", "fingerprint": "0990a2eb29fe6cf9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-55c995d89f931d7b", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/page-grade/__tests__/grade-combinations-section.test.tsx:14"}, "properties": {"repobilityId": "0d495e6908a8d4d2", "scanner": "scanner-primary", "fingerprint": "55c995d89f931d7b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-981d5825a341e725", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/staff/add-staff-modal.tsx:65"}, "properties": {"repobilityId": "8fd46257a335fe12", "scanner": "scanner-primary", "fingerprint": "981d5825a341e725", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-95ee5e151e134842", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/onboarding/components/staff/staff-list-block.tsx:63"}, "properties": {"repobilityId": "3e7ed8ecb79cd760", "scanner": "scanner-primary", "fingerprint": "95ee5e151e134842", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9f603f9c1128efdc", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/onboarding/components/staff/unified-staff-form.tsx:18"}, "properties": {"repobilityId": "55b99af954225e6e", "scanner": "scanner-primary", "fingerprint": "9f603f9c1128efdc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f16456bdb99f784c", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/staff/__tests__/add-staff-modal.test.tsx:9"}, "properties": {"repobilityId": "3343b45e0227bdcb", "scanner": "scanner-primary", "fingerprint": "f16456bdb99f784c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a6dc7331be337354", "level": "none", "message": {"text": "Commented-code block (8 lines) in web/src/features/onboarding/components/staff/__tests__/staff-list-block.test.tsx:284"}, "properties": {"repobilityId": "27c2aef0154f1a4e", "scanner": "scanner-primary", "fingerprint": "a6dc7331be337354", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b2d8a3a3d39ca44f", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/onboarding/components/staff/__tests__/unified-staff-form.test.tsx:1"}, "properties": {"repobilityId": "6c6f8e1e825667fd", "scanner": "scanner-primary", "fingerprint": "b2d8a3a3d39ca44f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-09360f5d7307e8b4", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/onboarding/components/tunnel/tunnel-page-content.tsx:63"}, "properties": {"repobilityId": "304173b5321cc2fb", "scanner": "scanner-primary", "fingerprint": "09360f5d7307e8b4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8f5859e11f1b313c", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/features/onboarding/components/tunnel/tunnel-sidebar.tsx:34"}, "properties": {"repobilityId": "50df281f89784b12", "scanner": "scanner-primary", "fingerprint": "8f5859e11f1b313c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b08a6830fac84371", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/tunnel/save-and-continue-modal.tsx:77"}, "properties": {"repobilityId": "5b30f323bb1cba16", "scanner": "scanner-primary", "fingerprint": "b08a6830fac84371", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-52d47da6cdb953b1", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/features/onboarding/components/tunnel/__tests__/tunnel-page-content.test.tsx:16"}, "properties": {"repobilityId": "483c95e9a9c18313", "scanner": "scanner-primary", "fingerprint": "52d47da6cdb953b1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4fe0e97dbd6b1e0b", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/identity/curriculum-block.tsx:17"}, "properties": {"repobilityId": "fabb43945e33f5a8", "scanner": "scanner-primary", "fingerprint": "4fe0e97dbd6b1e0b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8b10e739790158e2", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/identity/unified-identity-form.tsx:326"}, "properties": {"repobilityId": "f8d83872d5f4155b", "scanner": "scanner-primary", "fingerprint": "8b10e739790158e2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-25b92c4b5301f128", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/components/identity/__tests__/curriculum-block.test.tsx:90"}, "properties": {"repobilityId": "b882f3afbc573e9d", "scanner": "scanner-primary", "fingerprint": "25b92c4b5301f128", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a0cf11f89c4a0ab6", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/lib/programme-bands.ts:6"}, "properties": {"repobilityId": "ccc56667cb81835b", "scanner": "scanner-primary", "fingerprint": "a0cf11f89c4a0ab6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0377a29b7c7a208b", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/features/onboarding/lib/subject-scope.ts:16"}, "properties": {"repobilityId": "cfdafe47ed0d243b", "scanner": "scanner-primary", "fingerprint": "0377a29b7c7a208b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ddd3f67381ebc0db", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/onboarding/lib/__tests__/subject-scope.test.ts:165"}, "properties": {"repobilityId": "b013fca9b2602f88", "scanner": "scanner-primary", "fingerprint": "ddd3f67381ebc0db", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4f53d7a845dcae53", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/lib/__tests__/programme-bands.test.ts:8"}, "properties": {"repobilityId": "8c7c566c81c9885c", "scanner": "scanner-primary", "fingerprint": "4f53d7a845dcae53", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3eb692a51f6faa1c", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/pages/page-grade.tsx:151"}, "properties": {"repobilityId": "4d66d784fd1bc763", "scanner": "scanner-primary", "fingerprint": "3eb692a51f6faa1c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-76757d90b87c706f", "level": "none", "message": {"text": "Commented-code block (8 lines) in web/src/features/onboarding/pages/__tests__/page-grade.test.tsx:10"}, "properties": {"repobilityId": "bfa4498f92d8d4b0", "scanner": "scanner-primary", "fingerprint": "76757d90b87c706f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cc80a0f3b8c3c2f6", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/features/onboarding/hooks/queries.ts:13"}, "properties": {"repobilityId": "9a3b142214417b72", "scanner": "scanner-primary", "fingerprint": "cc80a0f3b8c3c2f6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8ac1ddb98e05938c", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/onboarding/hooks/__tests__/use-completion-effect.test.ts:59"}, "properties": {"repobilityId": "e3b8404995723172", "scanner": "scanner-primary", "fingerprint": "8ac1ddb98e05938c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6aa3396ce2751daa", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/features/onboarding/hooks/__tests__/mutations.test.tsx:13"}, "properties": {"repobilityId": "e0a0b7fb368370ae", "scanner": "scanner-primary", "fingerprint": "6aa3396ce2751daa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-82e3ea17963cc495", "level": "none", "message": {"text": "Commented-code block (8 lines) in web/src/features/onboarding/hooks/__tests__/use-page-registry-stability.test.ts:10"}, "properties": {"repobilityId": "ccda7280e39c6714", "scanner": "scanner-primary", "fingerprint": "82e3ea17963cc495", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a4ce21f973bb9bbb", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/accreditations/types.ts:5"}, "properties": {"repobilityId": "8cad0a5f31f8cd39", "scanner": "scanner-primary", "fingerprint": "a4ce21f973bb9bbb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-24097cace2194509", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/accreditations/hooks/mutations.ts:26"}, "properties": {"repobilityId": "a514b93378cf4cad", "scanner": "scanner-primary", "fingerprint": "24097cace2194509", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-20da4074552b6815", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/features/accreditations/hooks/__tests__/mutations.test.tsx:3"}, "properties": {"repobilityId": "ee7a76e3f4cfef7d", "scanner": "scanner-primary", "fingerprint": "20da4074552b6815", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d7dbe4905d9bf568", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/calendar/components/calendar-brief.tsx:30"}, "properties": {"repobilityId": "0de6a9b39c50367a", "scanner": "scanner-primary", "fingerprint": "d7dbe4905d9bf568", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-df6d595010ea05bc", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/calendar/components/empty-guidance.tsx:4"}, "properties": {"repobilityId": "6baef7ab7e1161b4", "scanner": "scanner-primary", "fingerprint": "df6d595010ea05bc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e84a79c753dfcc25", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/features/calendar/components/calendar-toolbar.tsx:26"}, "properties": {"repobilityId": "b23978c72fb4b841", "scanner": "scanner-primary", "fingerprint": "e84a79c753dfcc25", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e71732a67da767a7", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/calendar/components/import-dialogs.tsx:19"}, "properties": {"repobilityId": "2f3f690e13111ef7", "scanner": "scanner-primary", "fingerprint": "e71732a67da767a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2d3335336a0ef62b", "level": "none", "message": {"text": "Commented-code block (10 lines) in web/src/features/calendar/components/canon.tsx:10"}, "properties": {"repobilityId": "73ee68b5bf36d11b", "scanner": "scanner-primary", "fingerprint": "2d3335336a0ef62b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-940d56d0cefb7532", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/calendar/components/event-display.ts:16"}, "properties": {"repobilityId": "a4752aabb97896fc", "scanner": "scanner-primary", "fingerprint": "940d56d0cefb7532", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b9c0b8e4ad749c06", "level": "none", "message": {"text": "Commented-code block (8 lines) in web/src/features/calendar/components/event-detail-sheet.tsx:30"}, "properties": {"repobilityId": "31000ed54383c03e", "scanner": "scanner-primary", "fingerprint": "b9c0b8e4ad749c06", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4a4cc5fe0e30f10f", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/calendar/components/agenda-view.tsx:17"}, "properties": {"repobilityId": "c21b31bc13eb8bbe", "scanner": "scanner-primary", "fingerprint": "4a4cc5fe0e30f10f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7a69622b3744ad0e", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/features/calendar/components/event-form-sheet.tsx:43"}, "properties": {"repobilityId": "9a79092df0206f11", "scanner": "scanner-primary", "fingerprint": "7a69622b3744ad0e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-89f009f1dbbe0adc", "level": "none", "message": {"text": "Commented-code block (7 lines) in web/src/features/calendar/components/month-grid.tsx:21"}, "properties": {"repobilityId": "3abba80d5e47a5ea", "scanner": "scanner-primary", "fingerprint": "89f009f1dbbe0adc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eed2f2115d6dd523", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/calendar/components/fields/canon-select.tsx:12"}, "properties": {"repobilityId": "e09b11cd992079a3", "scanner": "scanner-primary", "fingerprint": "eed2f2115d6dd523", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c783f4d15269799b", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/calendar/components/fields/canon-date-picker.tsx:21"}, "properties": {"repobilityId": "6e66ca2348982206", "scanner": "scanner-primary", "fingerprint": "c783f4d15269799b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3e6c8f87c492def4", "level": "none", "message": {"text": "Commented-code block (8 lines) in web/src/features/calendar/components/fields/canon-field.tsx:5"}, "properties": {"repobilityId": "0e48cde6bef3f990", "scanner": "scanner-primary", "fingerprint": "3e6c8f87c492def4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9a8f104970da8f3a", "level": "none", "message": {"text": "Commented-code block (9 lines) in web/src/features/calendar/lib/calendar-date.ts:3"}, "properties": {"repobilityId": "ae8ce2054d903e2b", "scanner": "scanner-primary", "fingerprint": "9a8f104970da8f3a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-402145b26a297e1e", "level": "none", "message": {"text": "Commented-code block (8 lines) in web/src/features/calendar/pages/calendar-page.tsx:32"}, "properties": {"repobilityId": "715fffa08bec1b78", "scanner": "scanner-primary", "fingerprint": "402145b26a297e1e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2c250d827b29d2e2", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/parents/components/mpesa-payment-dialog.tsx:50"}, "properties": {"repobilityId": "96886fe0395f8eef", "scanner": "scanner-primary", "fingerprint": "2c250d827b29d2e2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-25b6d9ffb70b0fda", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/parents/components/invite-parent-dialog.tsx:64"}, "properties": {"repobilityId": "d7837802914878bf", "scanner": "scanner-primary", "fingerprint": "25b6d9ffb70b0fda", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f1d1d7297dfaa5ea", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/parents/components/__tests__/invite-parent-dialog.test.tsx:11"}, "properties": {"repobilityId": "e7dd77020b062bf3", "scanner": "scanner-primary", "fingerprint": "f1d1d7297dfaa5ea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7136e59f9bf84fd9", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/src/features/parents/components/__tests__/mpesa-payment-dialog.test.tsx:6"}, "properties": {"repobilityId": "73b51382d3086914", "scanner": "scanner-primary", "fingerprint": "7136e59f9bf84fd9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-91b7105e73b440fb", "level": "none", "message": {"text": "Commented-code block (5 lines) in web/src/features/parents/pages/parents-page.tsx:96"}, "properties": {"repobilityId": "4fb1b8364e164e17", "scanner": "scanner-primary", "fingerprint": "91b7105e73b440fb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b5a76780c3df9aa", "level": "none", "message": {"text": "1 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "d04379b337b44a15", "scanner": "scanner-primary", "fingerprint": "1b5a76780c3df9aa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-f864d3283254fba3", "level": "note", "message": {"text": "Unused endpoint: PUT /school/details"}, "properties": {"repobilityId": "b6e703460ff851bd", "scanner": "scanner-primary", "fingerprint": "f864d3283254fba3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cae255e9fc3a38c9", "level": "note", "message": {"text": "Unused endpoint: PUT /school/settings"}, "properties": {"repobilityId": "65af9a377c6016e2", "scanner": "scanner-primary", "fingerprint": "cae255e9fc3a38c9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4319f9d88fc0e6a4", "level": "note", "message": {"text": "Unused endpoint: PUT /schedule/settings"}, "properties": {"repobilityId": "11fa451505af4e0a", "scanner": "scanner-primary", "fingerprint": "4319f9d88fc0e6a4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e2fe5b92648ca462", "level": "note", "message": {"text": "Unused endpoint: POST /auth/forgot-password"}, "properties": {"repobilityId": "245e485720488eef", "scanner": "scanner-primary", "fingerprint": "e2fe5b92648ca462", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-381b444c9a6856bb", "level": "note", "message": {"text": "Unused endpoint: POST /auth/resend-invitation"}, "properties": {"repobilityId": "f05b24f096b68fb1", "scanner": "scanner-primary", "fingerprint": "381b444c9a6856bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c059f57186114027", "level": "note", "message": {"text": "Unused endpoint: POST /auth/logout"}, "properties": {"repobilityId": "a4aec050867091df", "scanner": "scanner-primary", "fingerprint": "c059f57186114027", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5843b92b9bb78a4f", "level": "note", "message": {"text": "Unused endpoint: POST /finance/invoices/generate"}, "properties": {"repobilityId": "34f9ed3f94cf218d", "scanner": "scanner-primary", "fingerprint": "5843b92b9bb78a4f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f8e3b1ec38031f42", "level": "note", "message": {"text": "Unused endpoint: POST /contact"}, "properties": {"repobilityId": "c333e6662ca4da8a", "scanner": "scanner-primary", "fingerprint": "f8e3b1ec38031f42", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c79544905cc1cf65", "level": "note", "message": {"text": "Unused endpoint: POST /school/onboarding/position"}, "properties": {"repobilityId": "a83ca902f84d027a", "scanner": "scanner-primary", "fingerprint": "c79544905cc1cf65", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-184802727859a0b7", "level": "note", "message": {"text": "Unused endpoint: POST /school/onboarding/dismiss"}, "properties": {"repobilityId": "398c918926f63b72", "scanner": "scanner-primary", "fingerprint": "184802727859a0b7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-45d44d7c1d4f91c2", "level": "note", "message": {"text": "Unused endpoint: POST /school/onboarding/complete"}, "properties": {"repobilityId": "6e2a68825d4cff02", "scanner": "scanner-primary", "fingerprint": "45d44d7c1d4f91c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a33b303f2427db7e", "level": "note", "message": {"text": "Unused endpoint: POST /school/onboarding/resume"}, "properties": {"repobilityId": "de9fc1fa77ed25b6", "scanner": "scanner-primary", "fingerprint": "a33b303f2427db7e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}