{"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-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b996754355b4be1b", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-form-notification/index.ts:532", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-form-notification/index.ts:532"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7e173b2d6aaaf46c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/__tests__/components/BulletinPostCard.test.tsx:64", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/__tests__/components/BulletinPostCard.test.tsx:64"}, "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-fa82277423096dd2", "name": "\"active\" state uses light bg in a dark theme \u2014 src/components/settings/EmbedTokenManager.tsx:168", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/components/settings/EmbedTokenManager.tsx:168"}, "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-3a6f52f341a91781", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/AppHeader.tsx:551", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/AppHeader.tsx:551"}, "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-27916755af626652", "name": "\"active\" state uses light bg in a dark theme \u2014 src/components/layout/AppHeader.tsx:781", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/components/layout/AppHeader.tsx:781"}, "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-cfbf0f452566d076", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/TeacherCard.tsx:284", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/TeacherCard.tsx:284"}, "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-ed7f1298565d9c11", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/DraggableEntry.tsx:61", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/DraggableEntry.tsx:61"}, "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-56fe9b88f06c86c3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/StudentSearchInput.tsx:126", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/StudentSearchInput.tsx:126"}, "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-c80d73c66f8b975f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/StudentCard.tsx:137", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/StudentCard.tsx:137"}, "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-e9403076d1329efc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/ScheduleCell.tsx:102", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/ScheduleCell.tsx:102"}, "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-3b8104011676fcdf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/DayCell.tsx:73", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/DayCell.tsx:73"}, "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-48bcc2cd65a7adbb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/PendingTransfersBoard.tsx:143", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/PendingTransfersBoard.tsx:143"}, "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-7eacd52e2428532e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/GroupCard.tsx:47", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/GroupCard.tsx:47"}, "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-10bfb00716e99be2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/UnassignedEntriesPool.tsx:67", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/UnassignedEntriesPool.tsx:67"}, "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-967f87135adf245c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/DroppableCell.tsx:64", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/DroppableCell.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-0c1efa8da85edcf8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/KoushuPeriodCard.tsx:79", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/KoushuPeriodCard.tsx:79"}, "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-468d5b95d927f40d", "name": "Icon-only button without accessible name \u2014 src/components/ordering/StudentSelector.tsx:82", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/ordering/StudentSelector.tsx:82"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d0b838c2ae611b09", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ordering/MaterialCard.tsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ordering/MaterialCard.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-aad2f9330524730b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ordering/TextbookCatalog.tsx:354", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ordering/TextbookCatalog.tsx:354"}, "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-79ab4ee85278b159", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ordering/OrderStatusSection.tsx:348", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ordering/OrderStatusSection.tsx:348"}, "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-96d31f1a95d6364a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/notifications/NotificationFeed.tsx:860", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/notifications/NotificationFeed.tsx:860"}, "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-02752e7c8638c98b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/course-progress/CourseProgressTable.tsx:984", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/course-progress/CourseProgressTable.tsx:984"}, "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-02cfb6c305181e39", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/course-progress/CourseProgressDashboard.tsx:594", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/course-progress/CourseProgressDashboard.tsx:594"}, "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-e54cfb381483f376", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/course-schedule/ScheduleGanttChart.tsx:517", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/course-schedule/ScheduleGanttChart.tsx:517"}, "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-b7a52c0d98a00ec7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/course-schedule/ScheduleBoard.tsx:271", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/course-schedule/ScheduleBoard.tsx:271"}, "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-cfc3b9bc40e1b1f7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/test-prep/TestPrepProposalsList.tsx:214", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/test-prep/TestPrepProposalsList.tsx:214"}, "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-b0b49b21d466fa46", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/proposals/ProposalList.tsx:433", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/proposals/ProposalList.tsx:433"}, "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-c12f30515a3864b1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/proposals/ProposalPrintView.tsx:267", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/proposals/ProposalPrintView.tsx:267"}, "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-b11cd12fc31e2b80", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/quick-links/QuickLinksBar.tsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/quick-links/QuickLinksBar.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-0d9ff1ecf6022bf1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/students/ImportNottaModal.tsx:167", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/students/ImportNottaModal.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-5117a25c4dda1750", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/students/StudentForm.tsx:343", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/students/StudentForm.tsx:343"}, "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-d09dc7ff39d81f06", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/students/StudentDetailModal.tsx:394", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/students/StudentDetailModal.tsx:394"}, "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-1b89017131ba0893", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/progress/SessionFeed.tsx:872", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/progress/SessionFeed.tsx:872"}, "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-e1ebfd6c2610e504", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/progress/SessionRecordingPanel.tsx:315", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/progress/SessionRecordingPanel.tsx:315"}, "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-9f2af7ed66488083", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/inquiries/InquiryReminders.tsx:168", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/inquiries/InquiryReminders.tsx:168"}, "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-59f933f19b21f053", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/monthly-tasks/TaskProgressWidget.tsx:518", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/monthly-tasks/TaskProgressWidget.tsx:518"}, "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-54850af483fc1d83", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/monthly-tasks/TaskListPanel.tsx:472", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/monthly-tasks/TaskListPanel.tsx:472"}, "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-7f4ff2130d1ba046", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/monthly-tasks/TemplateDialog.tsx:245", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/monthly-tasks/TemplateDialog.tsx:245"}, "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-bceef1d0175f62fa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/monthly-tasks/AlertSidebar.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/monthly-tasks/AlertSidebar.tsx:92"}, "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-e12deed8e5606388", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/monthly-tasks/TaskPool.tsx:274", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/monthly-tasks/TaskPool.tsx:274"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-93b27301f4b4f9af", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/monthly-tasks/TaskSummaryPanel.tsx:289", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/monthly-tasks/TaskSummaryPanel.tsx:289"}, "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-5db7645b1da4523d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/alerts/AlertItem.tsx:85", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/alerts/AlertItem.tsx:85"}, "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-9c92b3810fd27e14", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/bulletin/BulletinPostCard.tsx:70", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/bulletin/BulletinPostCard.tsx:70"}, "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-bef2cee3396ac81a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/bulletin/BulletinPostCard.tsx:84", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/bulletin/BulletinPostCard.tsx:84"}, "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-18467e80a8a3b3ae", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/portal/PortalMenuCard.tsx:58", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/portal/PortalMenuCard.tsx:58"}, "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-81bf28b54a2f48cd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/teacher-badges/TrainingMastersPanel.tsx:190", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/teacher-badges/TrainingMastersPanel.tsx:190"}, "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-3ca4981115e16f81", "name": "\"active\" state uses light bg in a dark theme \u2014 src/components/teacher-badges/TrainingMastersPanel.tsx:193", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/components/teacher-badges/TrainingMastersPanel.tsx:193"}, "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-499600f20b699690", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/contexts/ThemeContext.tsx:90", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/contexts/ThemeContext.tsx:90"}, "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-28bcc08cda966537", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:65", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:65"}, "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-756979d996f1ddce", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/schedule/page.tsx:2094", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/schedule/page.tsx:2094"}, "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-a799363b7906d6f3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/schedule/regular-patterns/match/page.tsx:496", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/schedule/regular-patterns/match/page.tsx:496"}, "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-a0b6bfc6e89b854a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/inquiry/[schoolCode]/page.tsx:74", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/inquiry/[schoolCode]/page.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-016d154afc27043e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/users/page.tsx:568", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/users/page.tsx:568"}, "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-7093c53165fda46f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/home-mock/page.tsx:713", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/home-mock/page.tsx:713"}, "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-a831559a08c2b479", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/my-schedule/page.tsx:431", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/my-schedule/page.tsx:431"}, "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-18eb3313db45a998", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/admin/users/[userId]/route.ts:283", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/admin/users/[userId]/route.ts:283"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-65bc8a6d9ae1c18d", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/admin/impersonate/route.ts:86", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/admin/impersonate/route.ts:86"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e2fc337f60e994ff", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/portal/form-responses/route.ts:269", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/portal/form-responses/route.ts:269"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ed38d962c310db87", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/resend/route.ts:158", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/resend/route.ts:158"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a1e52e7acf83e61f", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/slack/notta/route.ts:160", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/slack/notta/route.ts:160"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a1175c2c7f73fea0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/responses/page.tsx:877", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/responses/page.tsx:877"}, "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-7e4fa78f7ac7a723", "name": "Icon-only button without accessible name \u2014 src/app/students/[studentId]/progress/NewProgressPage.tsx:2063", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/students/[studentId]/progress/NewProgressPage.tsx:2063"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bb04aa410b04edc2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/students/[studentId]/progress/NewProgressPage.tsx:607", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/students/[studentId]/progress/NewProgressPage.tsx:607"}, "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-266969b0698f5f47", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/students/[studentId]/lesson-reports/page.tsx:311", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/students/[studentId]/lesson-reports/page.tsx:311"}, "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-e066f891ebec6cc8", "name": "Icon-only button without accessible name \u2014 src/app/students/progress-mockup/page.tsx:1573", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/students/progress-mockup/page.tsx:1573"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-67616bac2b01fc0b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/students/progress-mockup/page.tsx:349", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/students/progress-mockup/page.tsx:349"}, "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-d7180342dd302af5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/booking/[token]/BookingClient.tsx:329", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/booking/[token]/BookingClient.tsx:329"}, "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-03b278ab326c74be", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/inquiries/[id]/page.tsx:841", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/inquiries/[id]/page.tsx:841"}, "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-52189c50129dc7db", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/inquiries/templates/page.tsx:321", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/inquiries/templates/page.tsx:321"}, "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-53c109d699621e29", "name": "Icon-only button without accessible name \u2014 src/app/admin/teachers/[teacherId]/page.tsx:1064", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/admin/teachers/[teacherId]/page.tsx:1064"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8f53b712c7b0a1ef", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/teachers/[teacherId]/page.tsx:303", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/teachers/[teacherId]/page.tsx:303"}, "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-ee2072995566d056", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/teachers/[teacherId]/edit/page.tsx:846", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/teachers/[teacherId]/edit/page.tsx:846"}, "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-a300d34e77dfa090", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/teacher-badges/page.tsx:254", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/teacher-badges/page.tsx:254"}, "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-e06ecc66cd5ab199", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/mockup/progress/page.tsx:267", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/mockup/progress/page.tsx:267"}, "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-ff4f41b6de2f942c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/portal/[schoolCode]/page.tsx:95", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/portal/[schoolCode]/page.tsx:95"}, "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-f15aff0773ac693a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/my/badges/page.tsx:149", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/my/badges/page.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-188fef9478b7c497", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/courses/page.tsx:749", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/courses/page.tsx:749"}, "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-a34594671b9b5240", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/courses/proposals/page.tsx:532", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/courses/proposals/page.tsx:532"}, "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-dbb41ab353713fb3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/courses/[courseId]/apply/page.tsx:274", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/courses/[courseId]/apply/page.tsx:274"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-44571b0ad7654f4c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/courses/progress/mockup/page.tsx:316", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/courses/progress/mockup/page.tsx:316"}, "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-480212f94bcf22d7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/lesson-reports/pending/page.tsx:199", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/lesson-reports/pending/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-20598dee045365f3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/transcriptions/page.tsx:190", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/transcriptions/page.tsx:190"}, "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-88bf72f4edea533e", "name": "Stray `console.log` in TS/JS \u2014 src/lib/google-calendar.ts:408", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/google-calendar.ts:408"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0e63446e156c5d2d", "name": "Stray `console.log` in TS/JS \u2014 src/lib/server/booking.ts:211", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/server/booking.ts:211"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f9f1470a40888872", "name": "Insecure pattern 'node_child_process' in scripts/list-folder-children.mjs:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/list-folder-children.mjs:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ac46b01474ab0508", "name": "Insecure pattern 'node_child_process' in scripts/audit-sheets.mjs:5", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/audit-sheets.mjs:5"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ebb7c3661c1a37d5", "name": "Insecure pattern 'node_child_process' in scripts/tmp-tabs.mjs:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/tmp-tabs.mjs:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d6033913ef4d4f46", "name": "Insecure pattern 'node_child_process' in scripts/peek-kana.mjs:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/peek-kana.mjs:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2c10a576f2e0ece5", "name": "Insecure pattern 'node_child_process' in scripts/import-grades.mjs:10", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/import-grades.mjs:10"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c642f8979eebb777", "name": "Insecure pattern 'node_child_process' in scripts/peek-grade-tab.mjs:3", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/peek-grade-tab.mjs:3"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a3e82b79e494c201", "name": "Insecure pattern 'node_child_process' in scripts/import-interviews.mjs:4", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/import-interviews.mjs:4"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-98cb21220a68eb9b", "name": "Possible secret in src/__tests__/integration/rls-helpers.ts", "shortDescription": {"text": "Possible secret in src/__tests__/integration/rls-helpers.ts"}, "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-d4efa5ba866ca509", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/bulletin/BulletinPostCard.tsx:84", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/bulletin/BulletinPostCard.tsx:84"}, "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-4a227c46cf03965e", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:65", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:65"}, "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-ecc198525fc7ec9f", "name": "Insecure pattern 'cors_wildcard' in src/app/api/inquiry-import/push/route.ts:28", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/inquiry-import/push/route.ts:28"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c27d3580898efc45", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/app/students/[studentId]/progress/LegacyProgressPage.tsx:390", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/app/students/[studentId]/progress/LegacyProgressPage.tsx:390"}, "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-27924aa79fa4a517", "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@v4 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-43a7db5851459099", "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@v4 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-4334da81ebddf9b9", "name": "Very large file: src/types/database.ts (4521 lines)", "shortDescription": {"text": "Very large file: src/types/database.ts (4521 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-cebfc78045ec1237", "name": "Very large file: src/components/proposals/ProposalEditor.tsx (1953 lines)", "shortDescription": {"text": "Very large file: src/components/proposals/ProposalEditor.tsx (1953 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-94076c0957d23d34", "name": "Very large file: src/components/billing/BillingTable.tsx (988 lines)", "shortDescription": {"text": "Very large file: src/components/billing/BillingTable.tsx (988 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-e5d9c422728cd68a", "name": "Very large file: src/app/schedule/page.tsx (2136 lines)", "shortDescription": {"text": "Very large file: src/app/schedule/page.tsx (2136 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-8414185f5e57a406", "name": "Very large file: src/app/help/page.tsx (2580 lines)", "shortDescription": {"text": "Very large file: src/app/help/page.tsx (2580 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-f408a5e3213f9800", "name": "Very large file: src/app/home-mock/page.tsx (1205 lines)", "shortDescription": {"text": "Very large file: src/app/home-mock/page.tsx (1205 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-75c020f90b86f3ab", "name": "Very large file: src/app/api/courses/prep/route.ts (1613 lines)", "shortDescription": {"text": "Very large file: src/app/api/courses/prep/route.ts (1613 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-9cb623af1a1e841a", "name": "Very large file: src/app/students/[studentId]/progress/NewProgressPage.tsx (3375 lines)", "shortDescription": {"text": "Very large file: src/app/students/[studentId]/progress/NewProgressPage.tsx (3375 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-e137be0678c1b18a", "name": "Very large file: src/app/students/[studentId]/progress/LegacyProgressPage.tsx (2238 lines)", "shortDescription": {"text": "Very large file: src/app/students/[studentId]/progress/LegacyProgressPage.tsx (2238 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-0fe367e15e2913e2", "name": "Very large file: src/app/students/progress-mockup/page.tsx (2018 lines)", "shortDescription": {"text": "Very large file: src/app/students/progress-mockup/page.tsx (2018 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-fbcfe620dc4d2ea4", "name": "Very large file: src/app/admin/attendance/page.tsx (1250 lines)", "shortDescription": {"text": "Very large file: src/app/admin/attendance/page.tsx (1250 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-74e77ea3dab1d610", "name": "Very large file: src/app/admin/teachers/[teacherId]/page.tsx (1221 lines)", "shortDescription": {"text": "Very large file: src/app/admin/teachers/[teacherId]/page.tsx (1221 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-f50e09f5b9db463b", "name": "Very large file: src/app/mockup/progress/page.tsx (1547 lines)", "shortDescription": {"text": "Very large file: src/app/mockup/progress/page.tsx (1547 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-d08f2d5f1785ca2f", "name": "Very large file: src/app/courses/progress/page.tsx (1215 lines)", "shortDescription": {"text": "Very large file: src/app/courses/progress/page.tsx (1215 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-2645a566e0a4e927", "name": "Very large file: src/lib/api/schedule.ts (1935 lines)", "shortDescription": {"text": "Very large file: src/lib/api/schedule.ts (1935 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-ff2796cdc31dfd2d", "name": "Very large file: src/lib/api/alerts.ts (1412 lines)", "shortDescription": {"text": "Very large file: src/lib/api/alerts.ts (1412 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "52 test file(s) for 665 source file(s) (ratio 0.08). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 124 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 506 placeholder/mock markers across 155 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-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "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-505bc666a82f9849", "name": "Agent instruction/config may expose a secret: .claude/settings.local.json", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/settings.local.json"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2c5f98b152cddb6d", "name": "Agent authority lacks a verifier contract: .claude/launch.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "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-2803a25c3b9c590f", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-backup-sheet-as-csv/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-backup-sheet-as-csv/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d4af2b61907c07fa", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-expense-tracker/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-expense-tracker/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f27a9a409e804759", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-find-large-files/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-find-large-files/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1c5cd89d0cc0b59c", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-email-drive-link/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-email-drive-link/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d8b8094cae7d1ae2", "name": "Agent authority lacks a verifier contract: .claude/skills/gws-workflow-meeting-prep/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-workflow-meeting-prep/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e51d5665c7bdb259", "name": "Agent authority lacks a verifier contract: .claude/skills/gws-gmail-triage/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-gmail-triage/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7a4ff6ed0ee4883b", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-watch-drive-changes/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-watch-drive-changes/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-41e576ce1b3be594", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-feedback-form/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-feedback-form/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0f4a357e2c6e6643", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-save-email-attachments/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-save-email-attachments/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4e88b1020bd060c2", "name": "Agent authority lacks a verifier contract: .claude/skills/gws-gmail-reply/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-gmail-reply/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-66dc22a821027931", "name": "Agent authority lacks a verifier contract: .claude/skills/gws-workflow-email-to-task/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-workflow-email-to-task/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-970bf87354bba185", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-compare-sheet-tabs/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-compare-sheet-tabs/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9f06fcb20305451", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-draft-email-from-doc/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-draft-email-from-doc/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-53cacddc3900254f", "name": "Agent authority lacks a verifier contract: .claude/skills/impeccable/reference/typography.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/impeccable/reference/typography.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-21f0f532fa067b01", "name": "Agent authority lacks a verifier contract: .claude/skills/persona-content-creator/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/persona-content-creator/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-97a9509df2e95bb9", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-review-meet-participants/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-review-meet-participants/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-12738ae4d73b2562", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-bulk-download-folder/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-bulk-download-folder/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ac50aae98140333f", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-collect-form-responses/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-collect-form-responses/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-788a1004d3013894", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-log-deal-update/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-log-deal-update/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c751e26bd5011e7b", "name": "Agent authority lacks a verifier contract: .claude/skills/gws-events-renew/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-events-renew/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-366d86a87db21a0e", "name": "Agent authority lacks a verifier contract: .claude/skills/gws-sheets-append/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-sheets-append/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fc6338dcec660375", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-meet-space/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-meet-space/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2b3d4550595fe08e", "name": "Agent authority lacks a verifier contract: .claude/skills/gws-drive-upload/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-drive-upload/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7d48192fd9827519", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-save-email-to-doc/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-save-email-to-doc/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f2c0ec6d988f2177", "name": "Agent authority lacks a verifier contract: .claude/skills/persona-project-manager/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/persona-project-manager/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-77aa3452aa361733", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-shared-drive/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-shared-drive/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4cefc1c30ed0b461", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-sync-contacts-to-sheet/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-sync-contacts-to-sheet/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8c2f1113573e629a", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-presentation/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-presentation/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-48b708c3e825375c", "name": "Agent authority lacks a verifier contract: .claude/skills/gws-workflow-standup-report/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-workflow-standup-report/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a07ca31135981464", "name": "Agent authority lacks a verifier contract: .claude/skills/gws-calendar-agenda/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-calendar-agenda/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9863dc66a3abbbb9", "name": "Agent authority lacks a verifier contract: .claude/skills/gws-gmail-send/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-gmail-send/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-03a4bb623cf6f395", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-find-free-time/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-find-free-time/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9a270254e905702d", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-events-from-sheet/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-events-from-sheet/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-501deb7ce9aee78b", "name": "Agent authority lacks a verifier contract: .claude/skills/gws-gmail-forward/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-gmail-forward/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cc887ab39d593f1d", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-send-team-announcement/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-send-team-announcement/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c8d3e864d9d7bb97", "name": "Agent authority lacks a verifier contract: .claude/skills/gws-events-subscribe/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-events-subscribe/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-48b6f16bd487d1be", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-task-list/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-task-list/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b3b1634cee466b24", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-doc-from-template/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-doc-from-template/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bbf38cf469629795", "name": "Agent authority lacks a verifier contract: .claude/skills/gws-docs-write/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-docs-write/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1d8bea48fd2b508f", "name": "Agent authority lacks a verifier contract: .claude/skills/gws-gmail-reply-all/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-gmail-reply-all/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-890c9be5e0c3353f", "name": "Agent authority lacks a verifier contract: .claude/skills/gws-calendar-insert/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-calendar-insert/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bcef3a535fb161a8", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-review-overdue-tasks/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-review-overdue-tasks/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-54493136be3a5112", "name": "Agent authority lacks a verifier contract: .claude/skills/gws-script-push/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-script-push/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-01a0899c205c94d1", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-label-and-archive-emails/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-label-and-archive-emails/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ff46188a9391a53d", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-post-mortem-setup/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-post-mortem-setup/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-89f89b1be3ae16cb", "name": "Agent authority lacks a verifier contract: .claude/skills/gws-sheets-read/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-sheets-read/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0fd7b0892932ab15", "name": "Agent authority lacks a verifier contract: .claude/skills/gws-chat-send/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-chat-send/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e895e62f303ac8a9", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-plan-weekly-schedule/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-plan-weekly-schedule/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dc2db75f9c0205e8", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-forward-labeled-emails/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-forward-labeled-emails/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-00a8761a6c3bf5ba", "name": "Agent authority lacks a verifier contract: .claude/skills/gws-workflow-weekly-digest/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-workflow-weekly-digest/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7873cdc471ac6077", "name": "Agent authority lacks a verifier contract: .claude/skills/persona-exec-assistant/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/persona-exec-assistant/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c7a169ca03a668dd", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-share-doc-and-notify/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-share-doc-and-notify/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8c2cf8d50cd297ca", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-reschedule-meeting/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-reschedule-meeting/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fa5ae7c1a9c643e2", "name": "Agent authority lacks a verifier contract: .claude/skills/persona-team-lead/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/persona-team-lead/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-eb1dbe5a97b0a868", "name": "Agent authority lacks a verifier contract: .claude/skills/gws-gmail-watch/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-gmail-watch/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-85030ed68f1a3d36", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-generate-report-from-sheet/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-generate-report-from-sheet/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-78e63cf6f9a1f54d", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-classroom-course/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-classroom-course/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1f2fca15376fe1e7", "name": "Agent authority lacks a verifier contract: .claude/skills/recipe-copy-sheet-for-new-month/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-copy-sheet-for-new-month/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2bd88225a7ebc81b", "name": "Agent authority lacks a verifier contract: .claude/skills/gws-gmail-read/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-gmail-read/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-81ef89ed766877b7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-form-notification/index.ts:52", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-form-notification/index.ts:52"}, "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-ffa40eb792d5b69e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-inquiry-mail/index.ts:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-inquiry-mail/index.ts:59"}, "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-46a70e21be6c8c53", "name": "Commented-code block (5 lines) in src/components/course-progress/CourseProgressTable.tsx:290", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/course-progress/CourseProgressTable.tsx:290"}, "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-4d8c27f1edd456b8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ui/PushNotificationButton.tsx:66", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ui/PushNotificationButton.tsx:66"}, "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-f81632499baa32e0", "name": "Commented-code block (6 lines) in src/components/proposals/ProposalEditor.tsx:282", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/proposals/ProposalEditor.tsx:282"}, "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-59ca9d05caade7ab", "name": "Legacy-named symbol `keyOld` in src/components/students/StudentDetailModal.tsx:175", "shortDescription": {"text": "Legacy-named symbol `keyOld` in src/components/students/StudentDetailModal.tsx:175"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-83de938dec2fb819", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/monthly-tasks/TaskProgressWidget.tsx:210", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/monthly-tasks/TaskProgressWidget.tsx:210"}, "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-90af952ec5959538", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/monthly-tasks/MonthlyTaskPage.tsx:117", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/monthly-tasks/MonthlyTaskPage.tsx:117"}, "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-14a5238b0ac31ce6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/scores/MockPasteImportModal.tsx:277", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/scores/MockPasteImportModal.tsx:277"}, "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-b06041fc131bd08c", "name": "Commented-code block (5 lines) in src/app/schedule/page.tsx:1590", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/schedule/page.tsx:1590"}, "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-928198fbd8d5fccc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/seasonal-shift-student/[settingId]/page.tsx:84", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/seasonal-shift-student/[settingId]/page.tsx:84"}, "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-441473069f357902", "name": "Commented-code block (7 lines) in src/app/api/webhooks/resend/route.ts:41", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/webhooks/resend/route.ts:41"}, "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-095e9ddc2487d5b3", "name": "Commented-code block (6 lines) in src/app/students/[studentId]/progress/NewProgressPage.tsx:3089", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/students/[studentId]/progress/NewProgressPage.tsx:3089"}, "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-eb6dfd8fddc119fe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/inquiries/connect/page.tsx:43", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/inquiries/connect/page.tsx:43"}, "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-011cf414e3087ae1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/portal/[schoolCode]/student-dashboard/page.tsx:85", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/portal/[schoolCode]/student-dashboard/page.tsx:85"}, "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-ded17fe69a6eac9c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/courses/progress/page.tsx:528", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/courses/progress/page.tsx:528"}, "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-fbe87261f29d3511", "name": "Commented-code block (5 lines) in src/app/courses/progress/mockup/page.tsx:270", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/courses/progress/mockup/page.tsx:270"}, "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-c795e4a3af0a9e2a", "name": "Commented-code block (9 lines) in src/lib/teacher-tier.ts:1", "shortDescription": {"text": "Commented-code block (9 lines) in src/lib/teacher-tier.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-c1748de0adc3dd24", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api/auth.ts:394", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api/auth.ts:394"}, "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-671637ab67d05d5f", "name": "Commented-code block (6 lines) in src/lib/api/schedule.ts:778", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/api/schedule.ts:778"}, "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-2b77637707269935", "name": "Commented-code block (5 lines) in src/lib/api/seasonalCourses.ts:752", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/api/seasonalCourses.ts:752"}, "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-eb6efaceeb689f1f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api/coursePrepApi.ts:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api/coursePrepApi.ts:24"}, "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-1590c2c3857f0fb7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api/monthlyTasks.ts:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api/monthlyTasks.ts:17"}, "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-1a2b7554826ff69e", "name": "Commented-code block (5 lines) in src/lib/api/pattern-matching.ts:253", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/api/pattern-matching.ts:253"}, "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-77dc8098c8ffa683", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api/test-prep-proposals.ts:253", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api/test-prep-proposals.ts:253"}, "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}}]}}, "automationDetails": {"id": "repobility/19061"}, "properties": {"repository": "schoolie-nagayama-tech/school-management", "repoUrl": "https://github.com/schoolie-nagayama-tech/school-management", "branch": "main"}, "results": [{"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-b996754355b4be1b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send-form-notification/index.ts:532"}, "properties": {"repobilityId": "e0837a38d28e37c9", "scanner": "scanner-primary", "fingerprint": "b996754355b4be1b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7e173b2d6aaaf46c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/__tests__/components/BulletinPostCard.test.tsx:64"}, "properties": {"repobilityId": "8fbb73abea1781a0", "scanner": "scanner-primary", "fingerprint": "7e173b2d6aaaf46c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-fa82277423096dd2", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/components/settings/EmbedTokenManager.tsx:168"}, "properties": {"repobilityId": "51279927477c19bc", "scanner": "scanner-primary", "fingerprint": "fa82277423096dd2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-3a6f52f341a91781", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/AppHeader.tsx:551"}, "properties": {"repobilityId": "4eda6460ceb09c9e", "scanner": "scanner-primary", "fingerprint": "3a6f52f341a91781", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-27916755af626652", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/components/layout/AppHeader.tsx:781"}, "properties": {"repobilityId": "c7f0b259508a4761", "scanner": "scanner-primary", "fingerprint": "27916755af626652", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-cfbf0f452566d076", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/TeacherCard.tsx:284"}, "properties": {"repobilityId": "8f7820c587195f31", "scanner": "scanner-primary", "fingerprint": "cfbf0f452566d076", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ed7f1298565d9c11", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/DraggableEntry.tsx:61"}, "properties": {"repobilityId": "ec08369da4a6a160", "scanner": "scanner-primary", "fingerprint": "ed7f1298565d9c11", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-56fe9b88f06c86c3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/StudentSearchInput.tsx:126"}, "properties": {"repobilityId": "dd809f12bda0b1f5", "scanner": "scanner-primary", "fingerprint": "56fe9b88f06c86c3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c80d73c66f8b975f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/StudentCard.tsx:137"}, "properties": {"repobilityId": "f7f20c1497fe2fb2", "scanner": "scanner-primary", "fingerprint": "c80d73c66f8b975f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e9403076d1329efc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/ScheduleCell.tsx:102"}, "properties": {"repobilityId": "f4bc11aaf1259828", "scanner": "scanner-primary", "fingerprint": "e9403076d1329efc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3b8104011676fcdf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/DayCell.tsx:73"}, "properties": {"repobilityId": "c4f157eb133dde6a", "scanner": "scanner-primary", "fingerprint": "3b8104011676fcdf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-48bcc2cd65a7adbb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/PendingTransfersBoard.tsx:143"}, "properties": {"repobilityId": "bfd0358ff55ab15b", "scanner": "scanner-primary", "fingerprint": "48bcc2cd65a7adbb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7eacd52e2428532e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/GroupCard.tsx:47"}, "properties": {"repobilityId": "0faab3a5b9ec3936", "scanner": "scanner-primary", "fingerprint": "7eacd52e2428532e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-10bfb00716e99be2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/UnassignedEntriesPool.tsx:67"}, "properties": {"repobilityId": "600d4aeabb192b06", "scanner": "scanner-primary", "fingerprint": "10bfb00716e99be2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-967f87135adf245c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/DroppableCell.tsx:64"}, "properties": {"repobilityId": "b96670198771a37d", "scanner": "scanner-primary", "fingerprint": "967f87135adf245c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0c1efa8da85edcf8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/KoushuPeriodCard.tsx:79"}, "properties": {"repobilityId": "1df8df5e3ba7f782", "scanner": "scanner-primary", "fingerprint": "0c1efa8da85edcf8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-468d5b95d927f40d", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/ordering/StudentSelector.tsx:82"}, "properties": {"repobilityId": "91bdc9afc64c150e", "scanner": "scanner-primary", "fingerprint": "468d5b95d927f40d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-d0b838c2ae611b09", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ordering/MaterialCard.tsx:84"}, "properties": {"repobilityId": "a5337bde38f349a7", "scanner": "scanner-primary", "fingerprint": "d0b838c2ae611b09", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aad2f9330524730b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ordering/TextbookCatalog.tsx:354"}, "properties": {"repobilityId": "16077f6c6a8b0de0", "scanner": "scanner-primary", "fingerprint": "aad2f9330524730b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-79ab4ee85278b159", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ordering/OrderStatusSection.tsx:348"}, "properties": {"repobilityId": "3bfe7c1e97dbe846", "scanner": "scanner-primary", "fingerprint": "79ab4ee85278b159", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-96d31f1a95d6364a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/notifications/NotificationFeed.tsx:860"}, "properties": {"repobilityId": "d56d0c2713b64fca", "scanner": "scanner-primary", "fingerprint": "96d31f1a95d6364a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-02752e7c8638c98b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/course-progress/CourseProgressTable.tsx:984"}, "properties": {"repobilityId": "253502f2a243c16e", "scanner": "scanner-primary", "fingerprint": "02752e7c8638c98b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-02cfb6c305181e39", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/course-progress/CourseProgressDashboard.tsx:594"}, "properties": {"repobilityId": "7dd0010fe02ad558", "scanner": "scanner-primary", "fingerprint": "02cfb6c305181e39", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e54cfb381483f376", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/course-schedule/ScheduleGanttChart.tsx:517"}, "properties": {"repobilityId": "07e9a72d9d03510c", "scanner": "scanner-primary", "fingerprint": "e54cfb381483f376", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b7a52c0d98a00ec7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/course-schedule/ScheduleBoard.tsx:271"}, "properties": {"repobilityId": "3a0e00ff3c0ce1b8", "scanner": "scanner-primary", "fingerprint": "b7a52c0d98a00ec7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cfc3b9bc40e1b1f7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/test-prep/TestPrepProposalsList.tsx:214"}, "properties": {"repobilityId": "64714c67a2ad53ef", "scanner": "scanner-primary", "fingerprint": "cfc3b9bc40e1b1f7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b0b49b21d466fa46", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/proposals/ProposalList.tsx:433"}, "properties": {"repobilityId": "11cec00971c770fc", "scanner": "scanner-primary", "fingerprint": "b0b49b21d466fa46", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c12f30515a3864b1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/proposals/ProposalPrintView.tsx:267"}, "properties": {"repobilityId": "382c9661f1827b09", "scanner": "scanner-primary", "fingerprint": "c12f30515a3864b1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b11cd12fc31e2b80", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/quick-links/QuickLinksBar.tsx:84"}, "properties": {"repobilityId": "f7f7ddae7ae41f70", "scanner": "scanner-primary", "fingerprint": "b11cd12fc31e2b80", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0d9ff1ecf6022bf1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/students/ImportNottaModal.tsx:167"}, "properties": {"repobilityId": "59133e39df50f618", "scanner": "scanner-primary", "fingerprint": "0d9ff1ecf6022bf1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5117a25c4dda1750", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/students/StudentForm.tsx:343"}, "properties": {"repobilityId": "a8bab632236481a8", "scanner": "scanner-primary", "fingerprint": "5117a25c4dda1750", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d09dc7ff39d81f06", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/students/StudentDetailModal.tsx:394"}, "properties": {"repobilityId": "cc96acea59e94317", "scanner": "scanner-primary", "fingerprint": "d09dc7ff39d81f06", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1b89017131ba0893", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/progress/SessionFeed.tsx:872"}, "properties": {"repobilityId": "5e1f11168bc7ec04", "scanner": "scanner-primary", "fingerprint": "1b89017131ba0893", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e1ebfd6c2610e504", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/progress/SessionRecordingPanel.tsx:315"}, "properties": {"repobilityId": "ed80732ebd102196", "scanner": "scanner-primary", "fingerprint": "e1ebfd6c2610e504", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9f2af7ed66488083", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/inquiries/InquiryReminders.tsx:168"}, "properties": {"repobilityId": "0350371d9f8f5620", "scanner": "scanner-primary", "fingerprint": "9f2af7ed66488083", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-59f933f19b21f053", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/monthly-tasks/TaskProgressWidget.tsx:518"}, "properties": {"repobilityId": "d021be6e262ffaa7", "scanner": "scanner-primary", "fingerprint": "59f933f19b21f053", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-54850af483fc1d83", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/monthly-tasks/TaskListPanel.tsx:472"}, "properties": {"repobilityId": "401eddc0b8982ada", "scanner": "scanner-primary", "fingerprint": "54850af483fc1d83", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7f4ff2130d1ba046", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/monthly-tasks/TemplateDialog.tsx:245"}, "properties": {"repobilityId": "9013d26441bf0eed", "scanner": "scanner-primary", "fingerprint": "7f4ff2130d1ba046", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bceef1d0175f62fa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/monthly-tasks/AlertSidebar.tsx:92"}, "properties": {"repobilityId": "6300f73ef70068ab", "scanner": "scanner-primary", "fingerprint": "bceef1d0175f62fa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e12deed8e5606388", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/monthly-tasks/TaskPool.tsx:274"}, "properties": {"repobilityId": "09b6646cd8f08a53", "scanner": "scanner-primary", "fingerprint": "e12deed8e5606388", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-93b27301f4b4f9af", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/monthly-tasks/TaskSummaryPanel.tsx:289"}, "properties": {"repobilityId": "36b34e261dd1391a", "scanner": "scanner-primary", "fingerprint": "93b27301f4b4f9af", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5db7645b1da4523d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/alerts/AlertItem.tsx:85"}, "properties": {"repobilityId": "3c03c3aea96cdd22", "scanner": "scanner-primary", "fingerprint": "5db7645b1da4523d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9c92b3810fd27e14", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/bulletin/BulletinPostCard.tsx:70"}, "properties": {"repobilityId": "9bb499efde47a6fc", "scanner": "scanner-primary", "fingerprint": "9c92b3810fd27e14", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bef2cee3396ac81a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/bulletin/BulletinPostCard.tsx:84"}, "properties": {"repobilityId": "9fb89c6294b3cc1b", "scanner": "scanner-primary", "fingerprint": "bef2cee3396ac81a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-18467e80a8a3b3ae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/portal/PortalMenuCard.tsx:58"}, "properties": {"repobilityId": "a9a6c0a9214a3d57", "scanner": "scanner-primary", "fingerprint": "18467e80a8a3b3ae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-81bf28b54a2f48cd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/teacher-badges/TrainingMastersPanel.tsx:190"}, "properties": {"repobilityId": "74439ac253a99fa2", "scanner": "scanner-primary", "fingerprint": "81bf28b54a2f48cd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3ca4981115e16f81", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/components/teacher-badges/TrainingMastersPanel.tsx:193"}, "properties": {"repobilityId": "1dbf89a70f5099bf", "scanner": "scanner-primary", "fingerprint": "3ca4981115e16f81", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-499600f20b699690", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/contexts/ThemeContext.tsx:90"}, "properties": {"repobilityId": "6379e6216a2efe6c", "scanner": "scanner-primary", "fingerprint": "499600f20b699690", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-28bcc08cda966537", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:65"}, "properties": {"repobilityId": "0d72350965068f5b", "scanner": "scanner-primary", "fingerprint": "28bcc08cda966537", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-756979d996f1ddce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/schedule/page.tsx:2094"}, "properties": {"repobilityId": "2b57702e6b3668e2", "scanner": "scanner-primary", "fingerprint": "756979d996f1ddce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a799363b7906d6f3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/schedule/regular-patterns/match/page.tsx:496"}, "properties": {"repobilityId": "b4002763f10c287f", "scanner": "scanner-primary", "fingerprint": "a799363b7906d6f3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a0b6bfc6e89b854a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/inquiry/[schoolCode]/page.tsx:74"}, "properties": {"repobilityId": "5eadf2d0417dd4d4", "scanner": "scanner-primary", "fingerprint": "a0b6bfc6e89b854a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-016d154afc27043e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/users/page.tsx:568"}, "properties": {"repobilityId": "a8d4f64109672f73", "scanner": "scanner-primary", "fingerprint": "016d154afc27043e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7093c53165fda46f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/home-mock/page.tsx:713"}, "properties": {"repobilityId": "0d4b162d2b1cbb21", "scanner": "scanner-primary", "fingerprint": "7093c53165fda46f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a831559a08c2b479", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/my-schedule/page.tsx:431"}, "properties": {"repobilityId": "266c2abade863159", "scanner": "scanner-primary", "fingerprint": "a831559a08c2b479", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-18eb3313db45a998", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/admin/users/[userId]/route.ts:283"}, "properties": {"repobilityId": "72a4338be5eebc29", "scanner": "scanner-primary", "fingerprint": "18eb3313db45a998", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-65bc8a6d9ae1c18d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/admin/impersonate/route.ts:86"}, "properties": {"repobilityId": "c31bbc14bcab0c3e", "scanner": "scanner-primary", "fingerprint": "65bc8a6d9ae1c18d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e2fc337f60e994ff", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/portal/form-responses/route.ts:269"}, "properties": {"repobilityId": "8ef76b2cc8f782f3", "scanner": "scanner-primary", "fingerprint": "e2fc337f60e994ff", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ed38d962c310db87", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/resend/route.ts:158"}, "properties": {"repobilityId": "289e3b516851cb75", "scanner": "scanner-primary", "fingerprint": "ed38d962c310db87", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a1e52e7acf83e61f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/slack/notta/route.ts:160"}, "properties": {"repobilityId": "c2ff1942a266a747", "scanner": "scanner-primary", "fingerprint": "a1e52e7acf83e61f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a1175c2c7f73fea0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/responses/page.tsx:877"}, "properties": {"repobilityId": "2cc6682063c18937", "scanner": "scanner-primary", "fingerprint": "a1175c2c7f73fea0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7e4fa78f7ac7a723", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/students/[studentId]/progress/NewProgressPage.tsx:2063"}, "properties": {"repobilityId": "7dc565a12e5170e6", "scanner": "scanner-primary", "fingerprint": "7e4fa78f7ac7a723", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-bb04aa410b04edc2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/students/[studentId]/progress/NewProgressPage.tsx:607"}, "properties": {"repobilityId": "4237f2438503eec5", "scanner": "scanner-primary", "fingerprint": "bb04aa410b04edc2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-266969b0698f5f47", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/students/[studentId]/lesson-reports/page.tsx:311"}, "properties": {"repobilityId": "97d9b060eb374149", "scanner": "scanner-primary", "fingerprint": "266969b0698f5f47", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e066f891ebec6cc8", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/students/progress-mockup/page.tsx:1573"}, "properties": {"repobilityId": "3bb6c619638a2455", "scanner": "scanner-primary", "fingerprint": "e066f891ebec6cc8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-67616bac2b01fc0b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/students/progress-mockup/page.tsx:349"}, "properties": {"repobilityId": "3aa1f9d73d782627", "scanner": "scanner-primary", "fingerprint": "67616bac2b01fc0b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d7180342dd302af5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/booking/[token]/BookingClient.tsx:329"}, "properties": {"repobilityId": "8691fd7499273b5d", "scanner": "scanner-primary", "fingerprint": "d7180342dd302af5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-03b278ab326c74be", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/inquiries/[id]/page.tsx:841"}, "properties": {"repobilityId": "aeaf2a4295022d69", "scanner": "scanner-primary", "fingerprint": "03b278ab326c74be", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-52189c50129dc7db", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/inquiries/templates/page.tsx:321"}, "properties": {"repobilityId": "fd1b83c363f4b406", "scanner": "scanner-primary", "fingerprint": "52189c50129dc7db", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-53c109d699621e29", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/admin/teachers/[teacherId]/page.tsx:1064"}, "properties": {"repobilityId": "2feda9f81fd41d5d", "scanner": "scanner-primary", "fingerprint": "53c109d699621e29", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-8f53b712c7b0a1ef", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/teachers/[teacherId]/page.tsx:303"}, "properties": {"repobilityId": "9b887ee73f9e8816", "scanner": "scanner-primary", "fingerprint": "8f53b712c7b0a1ef", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ee2072995566d056", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/teachers/[teacherId]/edit/page.tsx:846"}, "properties": {"repobilityId": "a4f6ccba0f0a6d42", "scanner": "scanner-primary", "fingerprint": "ee2072995566d056", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a300d34e77dfa090", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/teacher-badges/page.tsx:254"}, "properties": {"repobilityId": "1a81ef097883a91b", "scanner": "scanner-primary", "fingerprint": "a300d34e77dfa090", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e06ecc66cd5ab199", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/mockup/progress/page.tsx:267"}, "properties": {"repobilityId": "683ed5ba4a170fc4", "scanner": "scanner-primary", "fingerprint": "e06ecc66cd5ab199", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ff4f41b6de2f942c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/portal/[schoolCode]/page.tsx:95"}, "properties": {"repobilityId": "0ba05b98355e7f11", "scanner": "scanner-primary", "fingerprint": "ff4f41b6de2f942c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f15aff0773ac693a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/my/badges/page.tsx:149"}, "properties": {"repobilityId": "8b00daf5bec9c23e", "scanner": "scanner-primary", "fingerprint": "f15aff0773ac693a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-188fef9478b7c497", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/courses/page.tsx:749"}, "properties": {"repobilityId": "55b8a45c1244b3a6", "scanner": "scanner-primary", "fingerprint": "188fef9478b7c497", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a34594671b9b5240", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/courses/proposals/page.tsx:532"}, "properties": {"repobilityId": "644b278f7d2cb74f", "scanner": "scanner-primary", "fingerprint": "a34594671b9b5240", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dbb41ab353713fb3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/courses/[courseId]/apply/page.tsx:274"}, "properties": {"repobilityId": "27aeae1ee781f3bb", "scanner": "scanner-primary", "fingerprint": "dbb41ab353713fb3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-44571b0ad7654f4c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/courses/progress/mockup/page.tsx:316"}, "properties": {"repobilityId": "6c562de17369a444", "scanner": "scanner-primary", "fingerprint": "44571b0ad7654f4c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-480212f94bcf22d7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/lesson-reports/pending/page.tsx:199"}, "properties": {"repobilityId": "3b37668a5c6a875b", "scanner": "scanner-primary", "fingerprint": "480212f94bcf22d7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-20598dee045365f3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/transcriptions/page.tsx:190"}, "properties": {"repobilityId": "3a670d8ba3402b02", "scanner": "scanner-primary", "fingerprint": "20598dee045365f3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-88bf72f4edea533e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/google-calendar.ts:408"}, "properties": {"repobilityId": "d7cc0e466a3bbb41", "scanner": "scanner-primary", "fingerprint": "88bf72f4edea533e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0e63446e156c5d2d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/server/booking.ts:211"}, "properties": {"repobilityId": "f7890efeae1288aa", "scanner": "scanner-primary", "fingerprint": "0e63446e156c5d2d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f9f1470a40888872", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/list-folder-children.mjs:2"}, "properties": {"repobilityId": "5f95a6098890862c", "scanner": "scanner-primary", "fingerprint": "f9f1470a40888872", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/list-folder-children.mjs"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-ac46b01474ab0508", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/audit-sheets.mjs:5"}, "properties": {"repobilityId": "0a6c00a72b9961f6", "scanner": "scanner-primary", "fingerprint": "ac46b01474ab0508", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/audit-sheets.mjs"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-ebb7c3661c1a37d5", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/tmp-tabs.mjs:2"}, "properties": {"repobilityId": "8fdbdadfb9f279c5", "scanner": "scanner-primary", "fingerprint": "ebb7c3661c1a37d5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/tmp-tabs.mjs"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-d6033913ef4d4f46", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/peek-kana.mjs:2"}, "properties": {"repobilityId": "969be68d9fc30c0a", "scanner": "scanner-primary", "fingerprint": "d6033913ef4d4f46", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/peek-kana.mjs"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-2c10a576f2e0ece5", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/import-grades.mjs:10"}, "properties": {"repobilityId": "cf951c8234911dc9", "scanner": "scanner-primary", "fingerprint": "2c10a576f2e0ece5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/import-grades.mjs"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-c642f8979eebb777", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/peek-grade-tab.mjs:3"}, "properties": {"repobilityId": "b650b0a77417cbc1", "scanner": "scanner-primary", "fingerprint": "c642f8979eebb777", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/peek-grade-tab.mjs"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-a3e82b79e494c201", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/import-interviews.mjs:4"}, "properties": {"repobilityId": "2a70690242e3ecd0", "scanner": "scanner-primary", "fingerprint": "a3e82b79e494c201", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/import-interviews.mjs"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-98cb21220a68eb9b", "level": "error", "message": {"text": "Possible secret in src/__tests__/integration/rls-helpers.ts"}, "properties": {"repobilityId": "88494c3871eec415", "scanner": "scanner-primary", "fingerprint": "98cb21220a68eb9b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/__tests__/integration/rls-helpers.ts"}, "region": {"startLine": 68}}}]}, {"ruleId": "scanner-d4efa5ba866ca509", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/bulletin/BulletinPostCard.tsx:84"}, "properties": {"repobilityId": "1cff1faf6bee9262", "scanner": "scanner-primary", "fingerprint": "d4efa5ba866ca509", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/bulletin/BulletinPostCard.tsx"}, "region": {"startLine": 84}}}]}, {"ruleId": "scanner-4a227c46cf03965e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:65"}, "properties": {"repobilityId": "0bca654fa2052eb0", "scanner": "scanner-primary", "fingerprint": "4a227c46cf03965e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/layout.tsx"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-ecc198525fc7ec9f", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/inquiry-import/push/route.ts:28"}, "properties": {"repobilityId": "82e94b0345077d0d", "scanner": "scanner-primary", "fingerprint": "ecc198525fc7ec9f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/inquiry-import/push/route.ts"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-c27d3580898efc45", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/app/students/[studentId]/progress/LegacyProgressPage.tsx:390"}, "properties": {"repobilityId": "88f29a1d51f43a49", "scanner": "scanner-primary", "fingerprint": "c27d3580898efc45", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/students/[studentId]/progress/LegacyProgressPage.tsx"}, "region": {"startLine": 390}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae16880318b99912", "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": 14}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "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": 17}}}]}, {"ruleId": "scanner-43a7db5851459099", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "eb07d320a23f861f", "scanner": "scanner-primary", "fingerprint": "43a7db5851459099", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/integration.yml"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-43a7db5851459099", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4e1d04948bac2a8b", "scanner": "scanner-primary", "fingerprint": "43a7db5851459099", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/integration.yml"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-43a7db5851459099", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2758caad6ef61002", "scanner": "scanner-primary", "fingerprint": "43a7db5851459099", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/integration.yml"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-4334da81ebddf9b9", "level": "note", "message": {"text": "Very large file: src/types/database.ts (4521 lines)"}, "properties": {"repobilityId": "a3b95ecee12e4f2c", "scanner": "scanner-primary", "fingerprint": "4334da81ebddf9b9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cebfc78045ec1237", "level": "note", "message": {"text": "Very large file: src/components/proposals/ProposalEditor.tsx (1953 lines)"}, "properties": {"repobilityId": "f5b2b4044a2bcec8", "scanner": "scanner-primary", "fingerprint": "cebfc78045ec1237", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-94076c0957d23d34", "level": "note", "message": {"text": "Very large file: src/components/billing/BillingTable.tsx (988 lines)"}, "properties": {"repobilityId": "72947fac5b0bf96a", "scanner": "scanner-primary", "fingerprint": "94076c0957d23d34", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e5d9c422728cd68a", "level": "note", "message": {"text": "Very large file: src/app/schedule/page.tsx (2136 lines)"}, "properties": {"repobilityId": "f0ea6404b0f87171", "scanner": "scanner-primary", "fingerprint": "e5d9c422728cd68a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8414185f5e57a406", "level": "note", "message": {"text": "Very large file: src/app/help/page.tsx (2580 lines)"}, "properties": {"repobilityId": "613099c0e49c2918", "scanner": "scanner-primary", "fingerprint": "8414185f5e57a406", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f408a5e3213f9800", "level": "note", "message": {"text": "Very large file: src/app/home-mock/page.tsx (1205 lines)"}, "properties": {"repobilityId": "6764aaafddb92169", "scanner": "scanner-primary", "fingerprint": "f408a5e3213f9800", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-75c020f90b86f3ab", "level": "note", "message": {"text": "Very large file: src/app/api/courses/prep/route.ts (1613 lines)"}, "properties": {"repobilityId": "d3cc012cf2b43a43", "scanner": "scanner-primary", "fingerprint": "75c020f90b86f3ab", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9cb623af1a1e841a", "level": "note", "message": {"text": "Very large file: src/app/students/[studentId]/progress/NewProgressPage.tsx (3375 lines)"}, "properties": {"repobilityId": "cd3d462c19212c03", "scanner": "scanner-primary", "fingerprint": "9cb623af1a1e841a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e137be0678c1b18a", "level": "note", "message": {"text": "Very large file: src/app/students/[studentId]/progress/LegacyProgressPage.tsx (2238 lines)"}, "properties": {"repobilityId": "82857dd16c0a6e50", "scanner": "scanner-primary", "fingerprint": "e137be0678c1b18a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0fe367e15e2913e2", "level": "note", "message": {"text": "Very large file: src/app/students/progress-mockup/page.tsx (2018 lines)"}, "properties": {"repobilityId": "b0151c7ef0bb9f5b", "scanner": "scanner-primary", "fingerprint": "0fe367e15e2913e2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fbcfe620dc4d2ea4", "level": "note", "message": {"text": "Very large file: src/app/admin/attendance/page.tsx (1250 lines)"}, "properties": {"repobilityId": "ca1d22690ee31559", "scanner": "scanner-primary", "fingerprint": "fbcfe620dc4d2ea4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-74e77ea3dab1d610", "level": "note", "message": {"text": "Very large file: src/app/admin/teachers/[teacherId]/page.tsx (1221 lines)"}, "properties": {"repobilityId": "5e1014ff516fddba", "scanner": "scanner-primary", "fingerprint": "74e77ea3dab1d610", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f50e09f5b9db463b", "level": "note", "message": {"text": "Very large file: src/app/mockup/progress/page.tsx (1547 lines)"}, "properties": {"repobilityId": "951574fb1a67f44d", "scanner": "scanner-primary", "fingerprint": "f50e09f5b9db463b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d08f2d5f1785ca2f", "level": "note", "message": {"text": "Very large file: src/app/courses/progress/page.tsx (1215 lines)"}, "properties": {"repobilityId": "b8b643be9e48d9a9", "scanner": "scanner-primary", "fingerprint": "d08f2d5f1785ca2f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2645a566e0a4e927", "level": "note", "message": {"text": "Very large file: src/lib/api/schedule.ts (1935 lines)"}, "properties": {"repobilityId": "a578790b9347db1b", "scanner": "scanner-primary", "fingerprint": "2645a566e0a4e927", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ff2796cdc31dfd2d", "level": "note", "message": {"text": "Very large file: src/lib/api/alerts.ts (1412 lines)"}, "properties": {"repobilityId": "6d75bf444b282635", "scanner": "scanner-primary", "fingerprint": "ff2796cdc31dfd2d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "ccbe21c7b1f042df", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "f69cdb2f725fe733", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "eb8b8b3e45c6d7a9", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "422bcb6ded6fef8d", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "84775004394b4031", "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": "830470f241ed1ba3", "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": "ca6adc9f4d846a2d", "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": "fe87169c91baf540", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-505bc666a82f9849", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/settings.local.json"}, "properties": {"repobilityId": "777970b0fce0a93b", "scanner": "scanner-primary", "fingerprint": "505bc666a82f9849", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.local.json"}, "region": {"startLine": 86}}}]}, {"ruleId": "scanner-2c5f98b152cddb6d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "properties": {"repobilityId": "0de48c0f4ab303d8", "scanner": "scanner-primary", "fingerprint": "2c5f98b152cddb6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/launch.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2803a25c3b9c590f", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-backup-sheet-as-csv/SKILL.md"}, "properties": {"repobilityId": "93ee70ec95227ecd", "scanner": "scanner-primary", "fingerprint": "2803a25c3b9c590f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-backup-sheet-as-csv/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d4af2b61907c07fa", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-expense-tracker/SKILL.md"}, "properties": {"repobilityId": "9ec4e0aa490a11b2", "scanner": "scanner-primary", "fingerprint": "d4af2b61907c07fa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-create-expense-tracker/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f27a9a409e804759", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-find-large-files/SKILL.md"}, "properties": {"repobilityId": "b7c87b9cea928828", "scanner": "scanner-primary", "fingerprint": "f27a9a409e804759", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-find-large-files/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1c5cd89d0cc0b59c", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-email-drive-link/SKILL.md"}, "properties": {"repobilityId": "044b9fc8a725769c", "scanner": "scanner-primary", "fingerprint": "1c5cd89d0cc0b59c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-email-drive-link/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d8b8094cae7d1ae2", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-workflow-meeting-prep/SKILL.md"}, "properties": {"repobilityId": "bdfc0d4f98668dd3", "scanner": "scanner-primary", "fingerprint": "d8b8094cae7d1ae2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gws-workflow-meeting-prep/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e51d5665c7bdb259", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-gmail-triage/SKILL.md"}, "properties": {"repobilityId": "7d6753ea34b999a4", "scanner": "scanner-primary", "fingerprint": "e51d5665c7bdb259", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gws-gmail-triage/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7a4ff6ed0ee4883b", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-watch-drive-changes/SKILL.md"}, "properties": {"repobilityId": "359db5ada1b236c2", "scanner": "scanner-primary", "fingerprint": "7a4ff6ed0ee4883b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-watch-drive-changes/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-41e576ce1b3be594", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-feedback-form/SKILL.md"}, "properties": {"repobilityId": "b53160c4ac955bc3", "scanner": "scanner-primary", "fingerprint": "41e576ce1b3be594", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-create-feedback-form/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0f4a357e2c6e6643", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-save-email-attachments/SKILL.md"}, "properties": {"repobilityId": "5037f41538c4ee35", "scanner": "scanner-primary", "fingerprint": "0f4a357e2c6e6643", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-save-email-attachments/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4e88b1020bd060c2", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-gmail-reply/SKILL.md"}, "properties": {"repobilityId": "3bb347be1a431d42", "scanner": "scanner-primary", "fingerprint": "4e88b1020bd060c2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gws-gmail-reply/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-66dc22a821027931", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-workflow-email-to-task/SKILL.md"}, "properties": {"repobilityId": "147cd140964c8b4e", "scanner": "scanner-primary", "fingerprint": "66dc22a821027931", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gws-workflow-email-to-task/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-970bf87354bba185", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-compare-sheet-tabs/SKILL.md"}, "properties": {"repobilityId": "df701c775e82d4ea", "scanner": "scanner-primary", "fingerprint": "970bf87354bba185", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-compare-sheet-tabs/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b9f06fcb20305451", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-draft-email-from-doc/SKILL.md"}, "properties": {"repobilityId": "6b7f2992562734ae", "scanner": "scanner-primary", "fingerprint": "b9f06fcb20305451", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-draft-email-from-doc/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-53cacddc3900254f", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/impeccable/reference/typography.md"}, "properties": {"repobilityId": "f590d4201208b574", "scanner": "scanner-primary", "fingerprint": "53cacddc3900254f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/impeccable/reference/typography.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-21f0f532fa067b01", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/persona-content-creator/SKILL.md"}, "properties": {"repobilityId": "22d020ac076dcb58", "scanner": "scanner-primary", "fingerprint": "21f0f532fa067b01", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/persona-content-creator/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-97a9509df2e95bb9", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-review-meet-participants/SKILL.md"}, "properties": {"repobilityId": "fbcc51e4f606c62b", "scanner": "scanner-primary", "fingerprint": "97a9509df2e95bb9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-review-meet-participants/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-12738ae4d73b2562", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-bulk-download-folder/SKILL.md"}, "properties": {"repobilityId": "3f5b83714e6b0afb", "scanner": "scanner-primary", "fingerprint": "12738ae4d73b2562", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-bulk-download-folder/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ac50aae98140333f", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-collect-form-responses/SKILL.md"}, "properties": {"repobilityId": "94f89c20faf16641", "scanner": "scanner-primary", "fingerprint": "ac50aae98140333f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-collect-form-responses/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-788a1004d3013894", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-log-deal-update/SKILL.md"}, "properties": {"repobilityId": "c903381a44f373d7", "scanner": "scanner-primary", "fingerprint": "788a1004d3013894", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-log-deal-update/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c751e26bd5011e7b", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-events-renew/SKILL.md"}, "properties": {"repobilityId": "e835562784c04833", "scanner": "scanner-primary", "fingerprint": "c751e26bd5011e7b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gws-events-renew/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-366d86a87db21a0e", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-sheets-append/SKILL.md"}, "properties": {"repobilityId": "008827a03b348647", "scanner": "scanner-primary", "fingerprint": "366d86a87db21a0e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gws-sheets-append/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fc6338dcec660375", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-meet-space/SKILL.md"}, "properties": {"repobilityId": "9c6db53331e8cea9", "scanner": "scanner-primary", "fingerprint": "fc6338dcec660375", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-create-meet-space/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2b3d4550595fe08e", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-drive-upload/SKILL.md"}, "properties": {"repobilityId": "3cf8a7cb52872984", "scanner": "scanner-primary", "fingerprint": "2b3d4550595fe08e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gws-drive-upload/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7d48192fd9827519", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-save-email-to-doc/SKILL.md"}, "properties": {"repobilityId": "60c6bdc850f88adb", "scanner": "scanner-primary", "fingerprint": "7d48192fd9827519", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-save-email-to-doc/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f2c0ec6d988f2177", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/persona-project-manager/SKILL.md"}, "properties": {"repobilityId": "55749e0653d52e24", "scanner": "scanner-primary", "fingerprint": "f2c0ec6d988f2177", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/persona-project-manager/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-77aa3452aa361733", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-shared-drive/SKILL.md"}, "properties": {"repobilityId": "986fe0313ff477f9", "scanner": "scanner-primary", "fingerprint": "77aa3452aa361733", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-create-shared-drive/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4cefc1c30ed0b461", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-sync-contacts-to-sheet/SKILL.md"}, "properties": {"repobilityId": "5cf5db3508debed8", "scanner": "scanner-primary", "fingerprint": "4cefc1c30ed0b461", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-sync-contacts-to-sheet/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8c2f1113573e629a", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-presentation/SKILL.md"}, "properties": {"repobilityId": "4a3f2fbf2a38c362", "scanner": "scanner-primary", "fingerprint": "8c2f1113573e629a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-create-presentation/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-48b708c3e825375c", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-workflow-standup-report/SKILL.md"}, "properties": {"repobilityId": "eda7bcf614b1cf01", "scanner": "scanner-primary", "fingerprint": "48b708c3e825375c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gws-workflow-standup-report/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a07ca31135981464", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-calendar-agenda/SKILL.md"}, "properties": {"repobilityId": "c56dfec83251ccb1", "scanner": "scanner-primary", "fingerprint": "a07ca31135981464", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gws-calendar-agenda/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9863dc66a3abbbb9", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-gmail-send/SKILL.md"}, "properties": {"repobilityId": "a0d0f89641bcbc7c", "scanner": "scanner-primary", "fingerprint": "9863dc66a3abbbb9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gws-gmail-send/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-03a4bb623cf6f395", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-find-free-time/SKILL.md"}, "properties": {"repobilityId": "adf25f03229ac4f6", "scanner": "scanner-primary", "fingerprint": "03a4bb623cf6f395", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-find-free-time/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9a270254e905702d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-events-from-sheet/SKILL.md"}, "properties": {"repobilityId": "453d8c192eeb6762", "scanner": "scanner-primary", "fingerprint": "9a270254e905702d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-create-events-from-sheet/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-501deb7ce9aee78b", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-gmail-forward/SKILL.md"}, "properties": {"repobilityId": "4eb559881b108b7b", "scanner": "scanner-primary", "fingerprint": "501deb7ce9aee78b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gws-gmail-forward/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cc887ab39d593f1d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-send-team-announcement/SKILL.md"}, "properties": {"repobilityId": "5ce911eeaaeb9a29", "scanner": "scanner-primary", "fingerprint": "cc887ab39d593f1d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-send-team-announcement/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c8d3e864d9d7bb97", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-events-subscribe/SKILL.md"}, "properties": {"repobilityId": "b92014f73ff585d6", "scanner": "scanner-primary", "fingerprint": "c8d3e864d9d7bb97", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gws-events-subscribe/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-48b6f16bd487d1be", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-task-list/SKILL.md"}, "properties": {"repobilityId": "87c811c266fab3e4", "scanner": "scanner-primary", "fingerprint": "48b6f16bd487d1be", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-create-task-list/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b3b1634cee466b24", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-doc-from-template/SKILL.md"}, "properties": {"repobilityId": "b51603de86bcb7b9", "scanner": "scanner-primary", "fingerprint": "b3b1634cee466b24", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-create-doc-from-template/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bbf38cf469629795", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-docs-write/SKILL.md"}, "properties": {"repobilityId": "8316e8ff82b5f06d", "scanner": "scanner-primary", "fingerprint": "bbf38cf469629795", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gws-docs-write/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1d8bea48fd2b508f", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-gmail-reply-all/SKILL.md"}, "properties": {"repobilityId": "13e3b6b4dc5f878e", "scanner": "scanner-primary", "fingerprint": "1d8bea48fd2b508f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gws-gmail-reply-all/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-890c9be5e0c3353f", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-calendar-insert/SKILL.md"}, "properties": {"repobilityId": "3fa08d8a915ccf27", "scanner": "scanner-primary", "fingerprint": "890c9be5e0c3353f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gws-calendar-insert/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bcef3a535fb161a8", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-review-overdue-tasks/SKILL.md"}, "properties": {"repobilityId": "76838946d5bda2d6", "scanner": "scanner-primary", "fingerprint": "bcef3a535fb161a8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-review-overdue-tasks/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-54493136be3a5112", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-script-push/SKILL.md"}, "properties": {"repobilityId": "7b42f46318caae59", "scanner": "scanner-primary", "fingerprint": "54493136be3a5112", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gws-script-push/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-01a0899c205c94d1", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-label-and-archive-emails/SKILL.md"}, "properties": {"repobilityId": "9166c502fed39b22", "scanner": "scanner-primary", "fingerprint": "01a0899c205c94d1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-label-and-archive-emails/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ff46188a9391a53d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-post-mortem-setup/SKILL.md"}, "properties": {"repobilityId": "ac3ddd59ba3e8cdd", "scanner": "scanner-primary", "fingerprint": "ff46188a9391a53d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-post-mortem-setup/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-89f89b1be3ae16cb", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-sheets-read/SKILL.md"}, "properties": {"repobilityId": "4463cfb6dd6c8e1e", "scanner": "scanner-primary", "fingerprint": "89f89b1be3ae16cb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gws-sheets-read/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0fd7b0892932ab15", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-chat-send/SKILL.md"}, "properties": {"repobilityId": "41be473a08669d53", "scanner": "scanner-primary", "fingerprint": "0fd7b0892932ab15", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gws-chat-send/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e895e62f303ac8a9", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-plan-weekly-schedule/SKILL.md"}, "properties": {"repobilityId": "1141610781cef21a", "scanner": "scanner-primary", "fingerprint": "e895e62f303ac8a9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-plan-weekly-schedule/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-dc2db75f9c0205e8", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-forward-labeled-emails/SKILL.md"}, "properties": {"repobilityId": "10a6cac0d436e826", "scanner": "scanner-primary", "fingerprint": "dc2db75f9c0205e8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-forward-labeled-emails/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-00a8761a6c3bf5ba", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-workflow-weekly-digest/SKILL.md"}, "properties": {"repobilityId": "6a0585d93f3827fe", "scanner": "scanner-primary", "fingerprint": "00a8761a6c3bf5ba", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gws-workflow-weekly-digest/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7873cdc471ac6077", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/persona-exec-assistant/SKILL.md"}, "properties": {"repobilityId": "ca66850ce090e600", "scanner": "scanner-primary", "fingerprint": "7873cdc471ac6077", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/persona-exec-assistant/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c7a169ca03a668dd", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-share-doc-and-notify/SKILL.md"}, "properties": {"repobilityId": "2b928fe2c39cc0dc", "scanner": "scanner-primary", "fingerprint": "c7a169ca03a668dd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-share-doc-and-notify/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8c2cf8d50cd297ca", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-reschedule-meeting/SKILL.md"}, "properties": {"repobilityId": "7260867c53b653a5", "scanner": "scanner-primary", "fingerprint": "8c2cf8d50cd297ca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-reschedule-meeting/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fa5ae7c1a9c643e2", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/persona-team-lead/SKILL.md"}, "properties": {"repobilityId": "1164f21da9742881", "scanner": "scanner-primary", "fingerprint": "fa5ae7c1a9c643e2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/persona-team-lead/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-eb1dbe5a97b0a868", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-gmail-watch/SKILL.md"}, "properties": {"repobilityId": "7ebeea8addfa853b", "scanner": "scanner-primary", "fingerprint": "eb1dbe5a97b0a868", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gws-gmail-watch/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-85030ed68f1a3d36", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-generate-report-from-sheet/SKILL.md"}, "properties": {"repobilityId": "f6b74508e0adef7a", "scanner": "scanner-primary", "fingerprint": "85030ed68f1a3d36", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-generate-report-from-sheet/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-78e63cf6f9a1f54d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-create-classroom-course/SKILL.md"}, "properties": {"repobilityId": "93d52e47ce195041", "scanner": "scanner-primary", "fingerprint": "78e63cf6f9a1f54d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-create-classroom-course/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1f2fca15376fe1e7", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/recipe-copy-sheet-for-new-month/SKILL.md"}, "properties": {"repobilityId": "3484c9ab698bc624", "scanner": "scanner-primary", "fingerprint": "1f2fca15376fe1e7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/recipe-copy-sheet-for-new-month/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2bd88225a7ebc81b", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gws-gmail-read/SKILL.md"}, "properties": {"repobilityId": "ad2f97bcfdb6af4e", "scanner": "scanner-primary", "fingerprint": "2bd88225a7ebc81b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gws-gmail-read/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-81ef89ed766877b7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-form-notification/index.ts:52"}, "properties": {"repobilityId": "810ac23137d72220", "scanner": "scanner-primary", "fingerprint": "81ef89ed766877b7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ffa40eb792d5b69e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/send-inquiry-mail/index.ts:59"}, "properties": {"repobilityId": "4a8972ced564f919", "scanner": "scanner-primary", "fingerprint": "ffa40eb792d5b69e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-46a70e21be6c8c53", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/course-progress/CourseProgressTable.tsx:290"}, "properties": {"repobilityId": "2f9b3002a9474d89", "scanner": "scanner-primary", "fingerprint": "46a70e21be6c8c53", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4d8c27f1edd456b8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ui/PushNotificationButton.tsx:66"}, "properties": {"repobilityId": "54dd331618d22577", "scanner": "scanner-primary", "fingerprint": "4d8c27f1edd456b8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f81632499baa32e0", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/proposals/ProposalEditor.tsx:282"}, "properties": {"repobilityId": "01089b48c45580c1", "scanner": "scanner-primary", "fingerprint": "f81632499baa32e0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-59ca9d05caade7ab", "level": "note", "message": {"text": "Legacy-named symbol `keyOld` in src/components/students/StudentDetailModal.tsx:175"}, "properties": {"repobilityId": "3f252dc860bc0196", "scanner": "scanner-primary", "fingerprint": "59ca9d05caade7ab", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-83de938dec2fb819", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/monthly-tasks/TaskProgressWidget.tsx:210"}, "properties": {"repobilityId": "0eb0ba72071156b5", "scanner": "scanner-primary", "fingerprint": "83de938dec2fb819", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-90af952ec5959538", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/monthly-tasks/MonthlyTaskPage.tsx:117"}, "properties": {"repobilityId": "1add5a31d5cd01a3", "scanner": "scanner-primary", "fingerprint": "90af952ec5959538", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-14a5238b0ac31ce6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/scores/MockPasteImportModal.tsx:277"}, "properties": {"repobilityId": "2eb2fc8f4dcad4eb", "scanner": "scanner-primary", "fingerprint": "14a5238b0ac31ce6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b06041fc131bd08c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/schedule/page.tsx:1590"}, "properties": {"repobilityId": "50b7d90774418c0b", "scanner": "scanner-primary", "fingerprint": "b06041fc131bd08c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-928198fbd8d5fccc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/seasonal-shift-student/[settingId]/page.tsx:84"}, "properties": {"repobilityId": "bbc71b0858251452", "scanner": "scanner-primary", "fingerprint": "928198fbd8d5fccc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-441473069f357902", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/webhooks/resend/route.ts:41"}, "properties": {"repobilityId": "dfde96680cbb37d5", "scanner": "scanner-primary", "fingerprint": "441473069f357902", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-095e9ddc2487d5b3", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/students/[studentId]/progress/NewProgressPage.tsx:3089"}, "properties": {"repobilityId": "ebd132a0b6a5fdb8", "scanner": "scanner-primary", "fingerprint": "095e9ddc2487d5b3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eb6dfd8fddc119fe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/inquiries/connect/page.tsx:43"}, "properties": {"repobilityId": "b9657d6207eaebb4", "scanner": "scanner-primary", "fingerprint": "eb6dfd8fddc119fe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-011cf414e3087ae1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/portal/[schoolCode]/student-dashboard/page.tsx:85"}, "properties": {"repobilityId": "0d306dfaac1a4eb3", "scanner": "scanner-primary", "fingerprint": "011cf414e3087ae1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ded17fe69a6eac9c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/courses/progress/page.tsx:528"}, "properties": {"repobilityId": "3a17fa90b9eb8e9b", "scanner": "scanner-primary", "fingerprint": "ded17fe69a6eac9c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fbe87261f29d3511", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/courses/progress/mockup/page.tsx:270"}, "properties": {"repobilityId": "81520a9546d05b84", "scanner": "scanner-primary", "fingerprint": "fbe87261f29d3511", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c795e4a3af0a9e2a", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/lib/teacher-tier.ts:1"}, "properties": {"repobilityId": "18508a62c7cd2cb4", "scanner": "scanner-primary", "fingerprint": "c795e4a3af0a9e2a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c1748de0adc3dd24", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api/auth.ts:394"}, "properties": {"repobilityId": "a3bc0030a044b65b", "scanner": "scanner-primary", "fingerprint": "c1748de0adc3dd24", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-671637ab67d05d5f", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/api/schedule.ts:778"}, "properties": {"repobilityId": "4325155f8e99a762", "scanner": "scanner-primary", "fingerprint": "671637ab67d05d5f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2b77637707269935", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/api/seasonalCourses.ts:752"}, "properties": {"repobilityId": "42be4d8d9932b955", "scanner": "scanner-primary", "fingerprint": "2b77637707269935", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eb6efaceeb689f1f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api/coursePrepApi.ts:24"}, "properties": {"repobilityId": "0679220334bae74b", "scanner": "scanner-primary", "fingerprint": "eb6efaceeb689f1f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1590c2c3857f0fb7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api/monthlyTasks.ts:17"}, "properties": {"repobilityId": "1fd0f5c4f08ac062", "scanner": "scanner-primary", "fingerprint": "1590c2c3857f0fb7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1a2b7554826ff69e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/api/pattern-matching.ts:253"}, "properties": {"repobilityId": "2074ac90e7600387", "scanner": "scanner-primary", "fingerprint": "1a2b7554826ff69e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-77dc8098c8ffa683", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api/test-prep-proposals.ts:253"}, "properties": {"repobilityId": "23f7ad3ded0d0a15", "scanner": "scanner-primary", "fingerprint": "77dc8098c8ffa683", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}]}]}