{"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-c3bf51567c399414", "name": "Possibly dead Python function: handle_starttag", "shortDescription": {"text": "Possibly dead Python function: handle_starttag"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-842ae5eebacf4e85", "name": "Possibly dead Python function: handle_endtag", "shortDescription": {"text": "Possibly dead Python function: handle_endtag"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2b474ac3ba357b4a", "name": "Possibly dead Python function: handle_data", "shortDescription": {"text": "Possibly dead Python function: handle_data"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"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-7c2eeb914ca6e1ec", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 docs/delivery/features/student-progress/design-handoff/hw3/app-mob", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 docs/delivery/features/student-progress/design-handoff/hw3/app-mobile.jsx:20"}, "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-847a85910533dc2e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 docs/delivery/features/student-progress/design-handoff/hw3/app.jsx", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 docs/delivery/features/student-progress/design-handoff/hw3/app.jsx:20"}, "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-bdcd2529a8a6b7d0", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 docs/delivery/features/student-progress/design-handoff/report/app-", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 docs/delivery/features/student-progress/design-handoff/report/app-mobile.jsx:16"}, "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-c0797976705464bf", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 docs/delivery/features/student-progress/design-handoff/report/app.", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 docs/delivery/features/student-progress/design-handoff/report/app.jsx:20"}, "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-66e07bbd0a19ecfc", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 docs/delivery/features/student-progress/design-handoff/hero2/compo", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 docs/delivery/features/student-progress/design-handoff/hero2/components.jsx:36"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9e9adeaf1ba55a88", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 docs/delivery/features/student-progress/design-handoff/usp/app-mob", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 docs/delivery/features/student-progress/design-handoff/usp/app-mobile.jsx:24"}, "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-f95fe87c33630145", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 docs/delivery/features/student-progress/design-handoff/usp/app.jsx", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 docs/delivery/features/student-progress/design-handoff/usp/app.jsx:21"}, "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-0dcec36cfe2c966c", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/tutor-progress-api/index.ts:256", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/tutor-progress-api/index.ts:256"}, "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-d604cde45b3118a5", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/setup-telegram-webhook/index.ts:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/setup-telegram-webhook/index.ts:24"}, "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-2b1517e9aa750444", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/homework-api/guided_ai.ts:1984", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/homework-api/guided_ai.ts:1984"}, "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-fcdcffe312ccbc22", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/homework-api/index.ts:810", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/homework-api/index.ts:810"}, "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-d8ae82ad49d06e10", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/rag-competitor-bot/index.ts:68", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/rag-competitor-bot/index.ts:68"}, "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-99fd7b1d032df6d8", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/mock-exam-student-api/index.ts:1933", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/mock-exam-student-api/index.ts:1933"}, "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-a7bca9304fabfe16", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/mock-exam-tutor-api/index.ts:3562", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/mock-exam-tutor-api/index.ts:3562"}, "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-3c34e618ffabf92a", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/telegram-login-token/index.ts:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/telegram-login-token/index.ts:51"}, "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-0a5f057bf4d30a9e", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/student-lessons-api/index.ts:579", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/student-lessons-api/index.ts:579"}, "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-84fe599a772a878f", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/tutor-manual-add-student/index.ts:293", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/tutor-manual-add-student/index.ts:293"}, "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-889d81af91af44e8", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/yookassa-create-payment/index.ts:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/yookassa-create-payment/index.ts:57"}, "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-9d26bca785ffebe7", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/chat/index.ts:925", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/chat/index.ts:925"}, "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-da038d40ed94489f", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/homework-reminder/index.ts:305", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/homework-reminder/index.ts:305"}, "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-1e3edc50bac0377d", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/rag-bot-setup-webhook/index.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/rag-bot-setup-webhook/index.ts:25"}, "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-044a433bec6016d1", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/telegram-scheduled-reminder/index.ts:76", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/telegram-scheduled-reminder/index.ts:76"}, "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-a1b51861c4a697dc", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/telegram-scheduled-broadcast/index.ts:66", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/telegram-scheduled-broadcast/index.ts:66"}, "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-35a6914ee5d17ade", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/telegram-broadcast/index.ts:148", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/telegram-broadcast/index.ts:148"}, "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-bed304710942b6ae", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/lesson-materials-api/index.ts:400", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/lesson-materials-api/index.ts:400"}, "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-40b0cec199795e13", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/oauth-google-callback/index.ts:213", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/oauth-google-callback/index.ts:213"}, "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-95bedd29478700ae", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/yookassa-webhook/index.ts:73", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/yookassa-webhook/index.ts:73"}, "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-0aa176fe455df099", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/assign-tutor-role/index.ts:103", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/assign-tutor-role/index.ts:103"}, "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-c3158d586039848e", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/telegram-auth/index.ts:68", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/telegram-auth/index.ts:68"}, "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-657cce0b51f56356", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/telegram-bot/index.ts:775", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/telegram-bot/index.ts:775"}, "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-97d7cdb0f7e3492e", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/auth-email-hook/index.ts:265", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/auth-email-hook/index.ts:265"}, "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-3e557803de6701b9", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/_shared/voice-transcribe.ts:115", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/_shared/voice-transcribe.ts:115"}, "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-f46ef382a30c0cba", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/_shared/subscription-limits.ts:69", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/_shared/subscription-limits.ts:69"}, "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-136b66344eba4118", "name": "Stray `console.log` in TS/JS \u2014 public/service-worker.js:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 public/service-worker.js:13"}, "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-234d4cbd093d9dc1", "name": "Stray `console.log` in TS/JS \u2014 src/registerServiceWorker.ts:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/registerServiceWorker.ts:29"}, "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-e08c6db864fed3be", "name": "Stray `console.log` in TS/JS \u2014 src/utils/chatCache.ts:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/chatCache.ts:44"}, "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-c0d01e1b8d9276c5", "name": "Stray `console.log` in TS/JS \u2014 src/utils/analytics.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/analytics.ts:22"}, "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-13ee930c1e032270", "name": "Stray `console.log` in TS/JS \u2014 src/utils/performanceMetrics.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/performanceMetrics.ts:48"}, "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-30befef2b64d11fa", "name": "Stray `console.log` in TS/JS \u2014 src/utils/retryWithBackoff.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/retryWithBackoff.ts:32"}, "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-6de25892be1871d0", "name": "Stray `console.log` in TS/JS \u2014 src/utils/pyodide.ts:74", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/pyodide.ts:74"}, "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-3e26da2cf4d2e465", "name": "Stray `console.log` in TS/JS \u2014 src/utils/messageBatcher.ts:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/messageBatcher.ts:67"}, "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-968df17f23d25e0c", "name": "Stray `console.log` in TS/JS \u2014 src/components/TelegramLoginButton.tsx:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/TelegramLoginButton.tsx:50"}, "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-b9d5631ea6dac888", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ChatSidebar.tsx:110", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ChatSidebar.tsx:110"}, "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-92b5f3b8f34cbf04", "name": "Stray `console.log` in TS/JS \u2014 src/components/ChatSidebar.tsx:96", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/ChatSidebar.tsx:96"}, "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-0bafdf21999513b5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/CustomChatItem.tsx:160", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CustomChatItem.tsx:160"}, "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-20f8c3edcbde8653", "name": "Stray `console.log` in TS/JS \u2014 src/components/TutorTelegramLoginButton.tsx:159", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/TutorTelegramLoginButton.tsx:159"}, "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-d4fe2dc9a599d5e2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/student/schedule/LessonFeedItem.tsx:73", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/student/schedule/LessonFeedItem.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-d715833c383836f0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/student/homework-problem/NumericAnswerComposer.tsx:1", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/student/homework-problem/NumericAnswerComposer.tsx:123"}, "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-57d177ae809840b8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/student/homework-problem/ComposerMobile.tsx:97", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/student/homework-problem/ComposerMobile.tsx:97"}, "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-338e5257ba662e0a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/student/homework-problem/SubmitSheet.tsx:521", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/student/homework-problem/SubmitSheet.tsx:521"}, "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-9bfe0f45283f4bc0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/student/homework-problem/SubmitCtaBar.tsx:74", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/student/homework-problem/SubmitCtaBar.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-7b19a0f688801571", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/GuidedThreadViewer.tsx:879", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/GuidedThreadViewer.tsx:879"}, "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-febb8771f08d5976", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/StudentCard.tsx:117", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/StudentCard.tsx:117"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c5fa909fbd36cb4b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/KBPickerSheet.tsx:385", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/KBPickerSheet.tsx:385"}, "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-78cb6805cd491c3d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/schedule/LessonMaterialsDrawer.tsx:50", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/schedule/LessonMaterialsDrawer.tsx:50"}, "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-297355e67dfb4350", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/schedule/PostLessonSheet.tsx:98", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/schedule/PostLessonSheet.tsx:98"}, "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-02bccf6b73f59dd5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/schedule/ConfirmLessonsSheet.tsx:290", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/schedule/ConfirmLessonsSheet.tsx:290"}, "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-d2e59bc7134423ea", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/schedule/LessonMaterialsPanel.tsx:121", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/schedule/LessonMaterialsPanel.tsx:121"}, "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-3d1990809b122a41", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/homework-create/HWMaterialsSection.tsx:141", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/homework-create/HWMaterialsSection.tsx:141"}, "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-bd00392d78c49522", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/homework-create/HWSubmitSuccess.tsx:39", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/homework-create/HWSubmitSuccess.tsx:39"}, "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-6d45a8d0d4c984b2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/homework-create/HWAssignSection.tsx:588", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/homework-create/HWAssignSection.tsx:588"}, "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-b0d3e429118b53a5", "name": "\"active\" state uses light bg in a dark theme \u2014 src/components/tutor/results/RemindStudentDialog.tsx:235", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/components/tutor/results/RemindStudentDialog.tsx:235"}, "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-28b450c0f71af491", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/results/HeatmapGrid.tsx:225", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/results/HeatmapGrid.tsx:225"}, "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-d413a46d477f35df", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/results/ResultsActionBlock.tsx:117", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/results/ResultsActionBlock.tsx:117"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-00ed388db888035f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/results/ResultsHeader.tsx:112", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/results/ResultsHeader.tsx:112"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1ee985879ddd10d9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/students/StudentProgressPanel.tsx:76", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/students/StudentProgressPanel.tsx:76"}, "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-488b5c9188c39feb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/students/ParentReportDialog.tsx:450", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/students/ParentReportDialog.tsx:450"}, "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-be25a3f431247129", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/homework-reuse/ShareLinkDialog.tsx:410", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/homework-reuse/ShareLinkDialog.tsx:410"}, "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-61a58693c3bf252a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/home/StudentsAtRiskBlock.tsx:77", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/home/StudentsAtRiskBlock.tsx:77"}, "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-465514dbb3cf72a8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/mock-exams/MockExamHeatmap.tsx:264", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/mock-exams/MockExamHeatmap.tsx:264"}, "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-3fa265551cf11e5b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/profile/LoginProvidersSection.tsx:376", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/profile/LoginProvidersSection.tsx:376"}, "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-a84a5c44e4aa03bf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/chrome/SideNav.tsx:290", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/chrome/SideNav.tsx:290"}, "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-84a9fb9e69196a0a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/homework/GuidedChatMessage.tsx:427", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/homework/GuidedChatMessage.tsx:427"}, "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-ba1b880557b54e29", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/homework/GuidedChatInput.tsx:145", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/homework/GuidedChatInput.tsx:145"}, "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-7bde20113cb39735", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/homework/ThreadAttachments.tsx:63", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/homework/ThreadAttachments.tsx:63"}, "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-dcf360cb040f05f8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/homework/GuidedHomeworkWorkspace.tsx:1673", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/homework/GuidedHomeworkWorkspace.tsx:1673"}, "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-62308b1ca442120b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/AdminMockExams.tsx:107", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/AdminMockExams.tsx:107"}, "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-d40bd38fd05480da", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/homework/AdminTutorAssignmentList.tsx:81", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/homework/AdminTutorAssignmentList.tsx:81"}, "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-a165f3ef87664060", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/homework/AdminHWThreadView.tsx:671", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/homework/AdminHWThreadView.tsx:671"}, "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-8d4c6948a379da4e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/homework/AdminTutorList.tsx:252", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/homework/AdminTutorList.tsx:252"}, "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-6e3befc68918c732", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/homework/AdminAssignmentStudentList.tsx:77", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/homework/AdminAssignmentStudentList.tsx:77"}, "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-a6add573f700b5ab", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/business/AtRiskTutorsTable.tsx:82", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/business/AtRiskTutorsTable.tsx:82"}, "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-dec31047bf6bec97", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/discovery/MorningReviewQueue.tsx:72", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/discovery/MorningReviewQueue.tsx:72"}, "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-e05c957274c09362", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/kb/MoveToFolderModal.tsx:59", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/kb/MoveToFolderModal.tsx:59"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b8fb415ec65d6eab", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/kb/TopicCard.tsx:30", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/kb/TopicCard.tsx:30"}, "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-daf36df97ee84209", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/kb/MaterialCard.tsx:38", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/kb/MaterialCard.tsx:38"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-58447d1ce0e839b2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/kb/SubtopicManager.tsx:98", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/kb/SubtopicManager.tsx:98"}, "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-2d24566ab7d90ee5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/kb/FolderCard.tsx:37", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/kb/FolderCard.tsx:37"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f255f3785abd778e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/kb/CopyToFolderModal.tsx:62", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/kb/CopyToFolderModal.tsx:62"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a68d0017035c87df", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/kb/KBSearchDropdown.tsx:91", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/kb/KBSearchDropdown.tsx:91"}, "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-ac3ae9ce09565c2f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/kb/ui/MathText.tsx:92", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/kb/ui/MathText.tsx:92"}, "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-c5209a2feb5ea3ba", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/miniapp/RecentSolutionsList.tsx:69", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/miniapp/RecentSolutionsList.tsx:69"}, "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-b96312557ee31b5d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/diagnostic/DiagnosticResult.tsx:155", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/diagnostic/DiagnosticResult.tsx:155"}, "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-1c87db5d75e9133f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Chat.tsx:1820", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Chat.tsx:1820"}, "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-a5105c052a36dbb9", "name": "Stray `console.log` in TS/JS \u2014 src/pages/Chat.tsx:114", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/pages/Chat.tsx:114"}, "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-f1c15a595a6a25b2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/PublicHomeworkShare.tsx:120", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/PublicHomeworkShare.tsx:120"}, "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-063dabedf9108c9f", "name": "Stray `console.log` in TS/JS \u2014 src/pages/MiniAppSolution.tsx:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/pages/MiniAppSolution.tsx:67"}, "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-10129bc1c31cf852", "name": "Stray `console.log` in TS/JS \u2014 src/pages/Practice.tsx:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/pages/Practice.tsx:23"}, "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-2ec222d1c7bcc53c", "name": "Stray `console.log` in TS/JS \u2014 src/pages/MiniApp.tsx:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/pages/MiniApp.tsx:22"}, "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-9212923f9b5647af", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/PublicStudentReport.tsx:40", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/PublicStudentReport.tsx:40"}, "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-164b2404bfbc90bb", "name": "\"active\" state uses light bg in a dark theme \u2014 src/pages/InstallApp.tsx:246", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/pages/InstallApp.tsx:246"}, "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-2bef40ab557c270c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/student/HomeworkProblem.tsx:1401", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/student/HomeworkProblem.tsx:1401"}, "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-55765f474eb86a86", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/student/LessonDetail.tsx:66", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/student/LessonDetail.tsx:66"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-05a2e17611b86ff5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/tutor/TutorSchedule.tsx:326", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/tutor/TutorSchedule.tsx:326"}, "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-48fe93dcb7ce5fb9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/tutor/TutorStudentProfile.tsx:769", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/tutor/TutorStudentProfile.tsx:769"}, "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-f7e6a1fa66dff674", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/tutor/TutorPayments.tsx:90", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/tutor/TutorPayments.tsx:90"}, "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-38c237ad6a145266", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/tutor/TutorHomeworkDetail.tsx:373", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/tutor/TutorHomeworkDetail.tsx:373"}, "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-6bedf7d5db587fab", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/tutor/students/StudentsProgressOverview.tsx:98", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/tutor/students/StudentsProgressOverview.tsx:98"}, "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-9950e121b9c31f63", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/tutor/mock-exams/TutorMockExamReview.tsx:2296", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/tutor/mock-exams/TutorMockExamReview.tsx:2296"}, "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-e5440d0b16afb05f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/tutor/mock-exams/TutorMockExamDetail.tsx:262", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/tutor/mock-exams/TutorMockExamDetail.tsx:262"}, "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-e4638d79a725f4e6", "name": "Stray `console.log` in TS/JS \u2014 src/hooks/usePractice.ts:141", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/usePractice.ts:141"}, "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-14a1181020f8bfaa", "name": "Insecure pattern 'weak_hash' in kb_pipeline_diagram.html:218", "shortDescription": {"text": "Insecure pattern 'weak_hash' in kb_pipeline_diagram.html:218"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-61e62063c4e7712b", "name": "Insecure pattern 'dangerous_innerhtml' in docs/delivery/features/student-progress/design-handoff/hw3/app-mobile.jsx:20", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in docs/delivery/features/student-progress/design-handoff/hw3/app-mobile.jsx:20"}, "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-aaee7f9842fd9ffc", "name": "Insecure pattern 'dangerous_innerhtml' in docs/delivery/features/student-progress/design-handoff/hw3/app.jsx:20", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in docs/delivery/features/student-progress/design-handoff/hw3/app.jsx:20"}, "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-b66bf4a61f1b8469", "name": "Insecure pattern 'dangerous_innerhtml' in docs/delivery/features/student-progress/design-handoff/report/app-mobile.jsx:1", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in docs/delivery/features/student-progress/design-handoff/report/app-mobile.jsx:16"}, "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-d6f077e5e6307f36", "name": "Insecure pattern 'dangerous_innerhtml' in docs/delivery/features/student-progress/design-handoff/report/app.jsx:20", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in docs/delivery/features/student-progress/design-handoff/report/app.jsx:20"}, "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-278d7dc3237491b1", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/delivery/features/student-progress/design-handoff/flow/flow.js:42", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/delivery/features/student-progress/design-handoff/flow/flow.js:42"}, "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-1026cc645c081ec1", "name": "Insecure pattern 'dangerous_innerhtml' in docs/delivery/features/student-progress/design-handoff/hero2/components.jsx:36", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in docs/delivery/features/student-progress/design-handoff/hero2/components.jsx:36"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fdaf8a92462a6fc4", "name": "Insecure pattern 'dangerous_innerhtml' in docs/delivery/features/student-progress/design-handoff/usp/app-mobile.jsx:24", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in docs/delivery/features/student-progress/design-handoff/usp/app-mobile.jsx:24"}, "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-e3e31c2d06a11864", "name": "Insecure pattern 'dangerous_innerhtml' in docs/delivery/features/student-progress/design-handoff/usp/app.jsx:21", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in docs/delivery/features/student-progress/design-handoff/usp/app.jsx:21"}, "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-4d6fe75392de40e5", "name": "Insecure pattern 'weak_hash' in docs/delivery/features/kb/kb_pipeline_diagram.html:218", "shortDescription": {"text": "Insecure pattern 'weak_hash' in docs/delivery/features/kb/kb_pipeline_diagram.html:218"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ffd0e097e9f5e5a5", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/design-system/handoff-dashboard/tutor-kit/primitives.jsx:12", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design-system/handoff-dashboard/tutor-kit/primitives.jsx:12"}, "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-5331acc1cce5c5dc", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/design_handoff_homework_chat/student-kit/primitives.jsx:12", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design_handoff_homework_chat/student-kit/primitives.jsx:12"}, "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-f9e1bbb66d9226fc", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/discovery/prototypes/student-card-balance-mockup.html:324", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/discovery/prototypes/student-card-balance-mockup.html:324"}, "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-f4cc6889b98fd93e", "name": "Possible secret in docs/discovery/prototypes/phase0-prototype.html", "shortDescription": {"text": "Possible secret in docs/discovery/prototypes/phase0-prototype.html"}, "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-2c38f609a2274b6f", "name": "Insecure pattern 'dangerous_innerhtml' in docs/discovery/prototypes/phase0-prototype.html:3", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in docs/discovery/prototypes/phase0-prototype.html:3"}, "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-996c11f293584404", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/discovery/prototypes/phase0-prototype.html:3", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/discovery/prototypes/phase0-prototype.html:3"}, "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-4d0e26b485df6e71", "name": "Insecure pattern 'node_child_process' in scripts/smoke-check.mjs:5", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/smoke-check.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-1bd7e49088b5fa1c", "name": "Insecure pattern 'node_child_process' in .claude/hooks/check-supabase-url.mjs:11", "shortDescription": {"text": "Insecure pattern 'node_child_process' in .claude/hooks/check-supabase-url.mjs:11"}, "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-d6b253bcd2a82964", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/mock-exam-public/index.ts:60", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/mock-exam-public/index.ts:60"}, "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-5fc882a98ba1a4ac", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/setup-telegram-webhook/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/setup-telegram-webhook/index.ts:4"}, "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-d2a9a3083eddb5d1", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/rag-competitor-bot/index.ts:172", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/rag-competitor-bot/index.ts:172"}, "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-69402f47c5606274", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/oauth-google-init/index.ts:23", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/oauth-google-init/index.ts:23"}, "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-98b4627855313ca1", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-homework/index.ts:7", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-homework/index.ts:7"}, "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-fb860b9208916096", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/telegram-login-token/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/telegram-login-token/index.ts:4"}, "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-05f668959f09fef1", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/tutor-manual-add-student/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/tutor-manual-add-student/index.ts:4"}, "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-206489ff5e2ed117", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/yookassa-create-payment/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/yookassa-create-payment/index.ts:4"}, "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-893486603f18f601", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/chat/index.ts:17", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/chat/index.ts:17"}, "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-b56261e0711a28ae", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/student-account/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/student-account/index.ts:4"}, "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-0b20bacaa9ca28fd", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-product-discovery/index.ts:5", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-product-discovery/index.ts:5"}, "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-478c711f2fd78ea2", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/public-student-report/index.ts:21", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/public-student-report/index.ts:21"}, "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-6ce1b68e17f8d79d", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-crm/index.ts:5", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-crm/index.ts:5"}, "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-63ab5b05071fb1d9", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/claim-invite/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/claim-invite/index.ts:4"}, "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-aa5071cf5882bb7b", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/homework-reminder/index.ts:19", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/homework-reminder/index.ts:19"}, "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-646271ee95db31b6", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/public-homework-share/index.ts:7", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/public-homework-share/index.ts:7"}, "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-8f4f0cdfbb1abbc8", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/notify-booking/index.ts:9", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/notify-booking/index.ts:9"}, "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-d3e5cb1d5b3c5219", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/rag-bot-setup-webhook/index.ts:15", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/rag-bot-setup-webhook/index.ts:15"}, "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-cce9050b246ea1dd", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/telegram-scheduled-reminder/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/telegram-scheduled-reminder/index.ts:4"}, "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-f89a9fc0e508c1eb", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/trainer-submit/index.ts:11", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/trainer-submit/index.ts:11"}, "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-789be16b8f92592a", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/telegram-scheduled-broadcast/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/telegram-scheduled-broadcast/index.ts:4"}, "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-dc94f04e34c0a3f6", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/telegram-broadcast/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/telegram-broadcast/index.ts:4"}, "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-7840a9a146d72048", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/push-subscribe/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/push-subscribe/index.ts:4"}, "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-4f1656123e1f2300", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/invite-preview/index.ts:23", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/invite-preview/index.ts:23"}, "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-de1eac7212f05a9c", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/telegram-webapp-recent-solutions/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/telegram-webapp-recent-solutions/index.ts:4"}, "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-37511a80dc13a61c", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/payment-reminder/index.ts:19", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/payment-reminder/index.ts:19"}, "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-99ba9731fd4a6b25", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/oauth-google-callback/index.ts:23", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/oauth-google-callback/index.ts:23"}, "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-520ccefce2139359", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/email-verify/index.ts:49", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/email-verify/index.ts:49"}, "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-a7c006bdadfb5428", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/yookassa-webhook/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/yookassa-webhook/index.ts:4"}, "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-97f7c0ff0ec347e8", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/assign-tutor-role/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/assign-tutor-role/index.ts:4"}, "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-c55ed954c680ce4e", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-business-dashboard/index.ts:5", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-business-dashboard/index.ts:5"}, "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-1893acb946d9d212", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/tutor-account/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/tutor-account/index.ts:4"}, "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-15f887e7fa18cba8", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-analytics/index.ts:5", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-analytics/index.ts:5"}, "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-a7d4fda5c7949899", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/telegram-auth/index.ts:5", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/telegram-auth/index.ts:5"}, "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-7d44562c5cbf2f8d", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/tutor-update-student/index.ts:4", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/tutor-update-student/index.ts:4"}, "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-4a77bff49893a006", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/telegram-bot/index.ts:15", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/telegram-bot/index.ts:15"}, "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-a26a4a88f9df8c05", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/auth-email-hook/index.ts:14", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/auth-email-hook/index.ts:14"}, "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-a199e89af2a7fa4a", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-mock-exams/index.ts:5", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-mock-exams/index.ts:5"}, "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-a17a2f8b36d6ecfa", "name": "Insecure pattern 'direct_innerhtml_assignment' in SokratAI/docs/delivery/features/mock-exams-v1/mockup.html:779", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in SokratAI/docs/delivery/features/mock-exams-v1/mockup.html:779"}, "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-75257757730a65bf", "name": "Insecure pattern 'local_storage_auth_token' in src/components/tutor/profile/LoginProvidersSection.tsx:134", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in src/components/tutor/profile/LoginProvidersSection.tsx:134"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bc92dacf55d74a9b", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/kb/ui/MathText.tsx:92", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/kb/ui/MathText.tsx:92"}, "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-c33ef2f118475999", "name": "Possible secret in src/lib/tutors.ts", "shortDescription": {"text": "Possible secret in src/lib/tutors.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-3b47ecb59115b400", "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-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-3e9ad3d956975d51", "name": "Very large file: docs/design-system/handoff-dashboard/tutor-kit/students-split.jsx (878 lines)", "shortDescription": {"text": "Very large file: docs/design-system/handoff-dashboard/tutor-kit/students-split.jsx (878 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-52f8578180964fb7", "name": "Very large file: pitch-mfti-yc-2026-05-15/tmp.cjs (1130 lines)", "shortDescription": {"text": "Very large file: pitch-mfti-yc-2026-05-15/tmp.cjs (1130 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-41a4ff952f4d27b2", "name": "Very large file: pitch-mfti-yc-2026-05-15/build-deck.cjs (1131 lines)", "shortDescription": {"text": "Very large file: pitch-mfti-yc-2026-05-15/build-deck.cjs (1131 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-a525ca31d1386516", "name": "Very large file: supabase/functions/homework-api/guided_ai.ts (2492 lines)", "shortDescription": {"text": "Very large file: supabase/functions/homework-api/guided_ai.ts (2492 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-48250310f8875790", "name": "Very large file: supabase/functions/homework-api/index.ts (9908 lines)", "shortDescription": {"text": "Very large file: supabase/functions/homework-api/index.ts (9908 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-bcb28b96cf0f9618", "name": "Very large file: supabase/functions/mock-exam-student-api/index.ts (2040 lines)", "shortDescription": {"text": "Very large file: supabase/functions/mock-exam-student-api/index.ts (2040 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-8c754d4ec465fd32", "name": "Very large file: supabase/functions/mock-exam-tutor-api/index.ts (3745 lines)", "shortDescription": {"text": "Very large file: supabase/functions/mock-exam-tutor-api/index.ts (3745 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-178b7d7d1e03a3fc", "name": "Very large file: supabase/functions/mock-exam-grade/index.ts (1949 lines)", "shortDescription": {"text": "Very large file: supabase/functions/mock-exam-grade/index.ts (1949 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-1f76a4fe17796e22", "name": "Very large file: supabase/functions/chat/index.ts (2009 lines)", "shortDescription": {"text": "Very large file: supabase/functions/chat/index.ts (2009 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-2bbabef0b961527f", "name": "Very large file: supabase/functions/telegram-bot/index.ts (7254 lines)", "shortDescription": {"text": "Very large file: supabase/functions/telegram-bot/index.ts (7254 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-5a83bde80f0eb48d", "name": "Very large file: src/integrations/supabase/types.ts (4614 lines)", "shortDescription": {"text": "Very large file: src/integrations/supabase/types.ts (4614 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-bd8a30388ff70927", "name": "Very large file: src/components/homework/GuidedHomeworkWorkspace.tsx (1987 lines)", "shortDescription": {"text": "Very large file: src/components/homework/GuidedHomeworkWorkspace.tsx (1987 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-0a80595ca6660d88", "name": "Very large file: src/lib/tutorHomeworkApi.ts (1434 lines)", "shortDescription": {"text": "Very large file: src/lib/tutorHomeworkApi.ts (1434 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-9a5d3292d8d03297", "name": "Very large file: src/lib/formulaEngine/egorFormulas.ts (920 lines)", "shortDescription": {"text": "Very large file: src/lib/formulaEngine/egorFormulas.ts (920 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-03cfeb47a4688f39", "name": "Very large file: src/lib/formulaEngine/formulas.generated.ts (2135 lines)", "shortDescription": {"text": "Very large file: src/lib/formulaEngine/formulas.generated.ts (2135 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-8b4c498efca41045", "name": "Very large file: src/pages/Chat.tsx (2102 lines)", "shortDescription": {"text": "Very large file: src/pages/Chat.tsx (2102 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-472ff0bfc223ad39", "name": "Very large file: src/pages/student/HomeworkProblem.tsx (2038 lines)", "shortDescription": {"text": "Very large file: src/pages/student/HomeworkProblem.tsx (2038 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-ec7849bd876c2cad", "name": "Very large file: src/pages/student/StudentMockExam.tsx (1901 lines)", "shortDescription": {"text": "Very large file: src/pages/student/StudentMockExam.tsx (1901 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-63fcdfa44debf173", "name": "Very large file: src/pages/student/StudentMockExamResult.tsx (1228 lines)", "shortDescription": {"text": "Very large file: src/pages/student/StudentMockExamResult.tsx (1228 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-bf93bc8c74927d2f", "name": "Very large file: src/pages/tutor/TutorSchedule.tsx (4709 lines)", "shortDescription": {"text": "Very large file: src/pages/tutor/TutorSchedule.tsx (4709 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-6ad1225e65b2022f", "name": "Very large file: src/pages/tutor/TutorStudentProfile.tsx (1237 lines)", "shortDescription": {"text": "Very large file: src/pages/tutor/TutorStudentProfile.tsx (1237 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-a52a8b1904967df9", "name": "Very large file: src/pages/tutor/TutorHomeworkCreate.tsx (1951 lines)", "shortDescription": {"text": "Very large file: src/pages/tutor/TutorHomeworkCreate.tsx (1951 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-607b536acea98a9f", "name": "Very large file: src/pages/tutor/mock-exams/TutorMockExamReview.tsx (2522 lines)", "shortDescription": {"text": "Very large file: src/pages/tutor/mock-exams/TutorMockExamReview.tsx (2522 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": "4 test file(s) for 664 source file(s) (ratio 0.01). 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 486 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 653 placeholder/mock markers across 154 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-11825279136b53a3", "name": "CI is configured but no tests are detected", "shortDescription": {"text": "CI is configured but no tests are detected"}, "fullDescription": {"text": "A CI pipeline exists, but the scan found no test files to gate. Opus labeled this generated-code pattern as config theater: release machinery exists, but it has little behavioral signal."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "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, tests. 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-cc55229a7a3c078d", "name": "Agent authority lacks a verifier contract: .mcp.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .mcp.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-122f91b7f2906dc4", "name": "Agent authority lacks a verifier contract: .claude/settings.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.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-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-46fd2dc6edd03fa4", "name": "Agent instruction/config may expose a secret: .claude/rules/96-auth-ru-bypass.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/rules/96-auth-ru-bypass.md"}, "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-3465c65a63d729e6", "name": "Agent instruction/config may expose a secret: .claude/agents/kb-explorer.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/agents/kb-explorer.md"}, "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-0e2085a6c822223d", "name": "Agent authority lacks a verifier contract: .claude/skills/teach-impeccable/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/teach-impeccable/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-02875fabd4cc1074", "name": "Agent authority lacks a verifier contract: .claude/skills/ajtbd-job-graph/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/ajtbd-job-graph/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-4ae7e791ff78a01b", "name": "Agent authority lacks a verifier contract: .claude/skills/ajtbd-recruit/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/ajtbd-recruit/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-67fe1fa0e15c7a68", "name": "Agent authority lacks a verifier contract: .claude/skills/ajtbd-b2b-segments/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/ajtbd-b2b-segments/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-166bc115e99b9e76", "name": "Agent authority lacks a verifier contract: .claude/skills/ajtbd-b2c-segments/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/ajtbd-b2c-segments/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-e6017f8b98e43971", "name": "Agent authority lacks a verifier contract: .claude/skills/ajtbd-research/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/ajtbd-research/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-0a17195ae9e37fb0", "name": "Agent authority lacks a verifier contract: .claude/skills/ajtbd-landing/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/ajtbd-landing/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-19b52a57c33f2eac", "name": "Agent instruction/config may expose a secret: .claude/plans/compressed-sparking-spindle-review-prompt.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/plans/compressed-sparking-spindle-review-prompt.md"}, "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-20f77f35124d625f", "name": "Commented-code block (5 lines) in vite.config.ts:59", "shortDescription": {"text": "Commented-code block (5 lines) in vite.config.ts:59"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-77418c27ba2bc5ef", "name": "Commented-code block (5 lines) in vite.config.ts.timestamp-1779353619296-3e79d6724b0fe.mjs:45", "shortDescription": {"text": "Commented-code block (5 lines) in vite.config.ts.timestamp-1779353619296-3e79d6724b0fe.mjs:45"}, "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-affb7f30ba22a986", "name": "`fetch()` without try/.catch or AbortSignal \u2014 docs/delivery/engineering/architecture/cloudflare-proxy-worker.js:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 docs/delivery/engineering/architecture/cloudflare-proxy-worker.js:26"}, "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-acf1250d643357a9", "name": "Commented-code block (6 lines) in scripts/test-mockexam-contact-type.mjs:10", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/test-mockexam-contact-type.mjs:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e78b2e0b04f09759", "name": "Commented-code block (5 lines) in scripts/test-mockexam-checker.mjs:95", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/test-mockexam-checker.mjs:95"}, "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-4d64402afd0ab9a8", "name": "Commented-code block (7 lines) in scripts/test-criteria-templates.mjs:4", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/test-criteria-templates.mjs:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-81ed93bf8a506ee8", "name": "Commented-code block (5 lines) in scripts/smoke-check.mjs:391", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/smoke-check.mjs:391"}, "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-bddfd5f170ad6d33", "name": "Commented-code block (6 lines) in scripts/structure-mock-exam.py:60", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/structure-mock-exam.py:60"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-871a40e5592d7766", "name": "Commented-code block (5 lines) in .claude/hooks/check-supabase-url.mjs:2", "shortDescription": {"text": "Commented-code block (5 lines) in .claude/hooks/check-supabase-url.mjs:2"}, "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-74c61660af566957", "name": "Legacy-named symbol `project_mock_exams_v1` in supabase/functions/mock-exam-public/index.ts:545", "shortDescription": {"text": "Legacy-named symbol `project_mock_exams_v1` in supabase/functions/mock-exam-public/index.ts:545"}, "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-6de57a8ff4764964", "name": "Commented-code block (7 lines) in supabase/functions/mock-exam-public/index.ts:3", "shortDescription": {"text": "Commented-code block (7 lines) in supabase/functions/mock-exam-public/index.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b48867ebe1264d52", "name": "Commented-code block (6 lines) in supabase/functions/tutor-progress-api/index.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/tutor-progress-api/index.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5eedc75432f182fd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/setup-telegram-webhook/index.ts:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/setup-telegram-webhook/index.ts:27"}, "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-548736de31c1df40", "name": "Commented-code block (5 lines) in supabase/functions/homework-api/guided_ai.ts:110", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/homework-api/guided_ai.ts:110"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1d96b680d432d07a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/homework-api/guided_ai.ts:989", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/homework-api/guided_ai.ts:989"}, "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-2859f65aa7ec1071", "name": "Legacy-named symbol `payloadLegacy` in supabase/functions/homework-api/index.ts:7161", "shortDescription": {"text": "Legacy-named symbol `payloadLegacy` in supabase/functions/homework-api/index.ts:7161"}, "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-facff0961c85f513", "name": "Commented-code block (5 lines) in supabase/functions/homework-api/index.ts:1395", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/homework-api/index.ts:1395"}, "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-a8f89c1b3a37653e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/homework-api/index.ts:2061", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/homework-api/index.ts:2061"}, "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-cf57836136f211bc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/rag-competitor-bot/index.ts:103", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/rag-competitor-bot/index.ts:103"}, "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-85352af6905755e1", "name": "Commented-code block (13 lines) in supabase/functions/oauth-google-init/index.ts:106", "shortDescription": {"text": "Commented-code block (13 lines) in supabase/functions/oauth-google-init/index.ts:106"}, "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-c7145af14b31194e", "name": "Commented-code block (5 lines) in supabase/functions/mock-exam-student-api/index.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/mock-exam-student-api/index.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-49bc2fa42404eb5d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/mock-exam-student-api/index.ts:131", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/mock-exam-student-api/index.ts:131"}, "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-419e9f112dff6688", "name": "Commented-code block (5 lines) in supabase/functions/mock-exam-tutor-api/index.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/mock-exam-tutor-api/index.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-4712dc498d8381c2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/mock-exam-tutor-api/index.ts:182", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/mock-exam-tutor-api/index.ts:182"}, "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-df35c7d1131128f1", "name": "Commented-code block (6 lines) in supabase/functions/mock-exam-grade/index.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/mock-exam-grade/index.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0162174acd478e69", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/mock-exam-grade/index.ts:216", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/mock-exam-grade/index.ts:216"}, "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-aff88cdeaecde90f", "name": "Commented-code block (5 lines) in supabase/functions/student-lessons-api/index.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/student-lessons-api/index.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6ac8bf569b1db2f6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/yookassa-create-payment/index.ts:140", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/yookassa-create-payment/index.ts:140"}, "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-6d2525549023d5e6", "name": "Commented-code block (6 lines) in supabase/functions/chat/index.ts:1280", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/chat/index.ts:1280"}, "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-6b4d49efbd31ecbf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/chat/index.ts:147", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/chat/index.ts:147"}, "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-b3d456a8fba4f043", "name": "Commented-code block (8 lines) in supabase/functions/public-student-report/index.ts:5", "shortDescription": {"text": "Commented-code block (8 lines) in supabase/functions/public-student-report/index.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0811083d4279bd37", "name": "Commented-code block (5 lines) in supabase/functions/homework-reminder/index.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/homework-reminder/index.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ee016f48e5e0c648", "name": "Commented-code block (5 lines) in supabase/functions/public-homework-share/index.ts:21", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/public-homework-share/index.ts:21"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b338951db094cbe9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/rag-bot-setup-webhook/index.ts:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/rag-bot-setup-webhook/index.ts:27"}, "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-94c7d175c0587886", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/telegram-broadcast/index.ts:219", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/telegram-broadcast/index.ts:219"}, "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-6b36297f0538ca50", "name": "Commented-code block (9 lines) in supabase/functions/invite-preview/index.ts:1", "shortDescription": {"text": "Commented-code block (9 lines) in supabase/functions/invite-preview/index.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-9ea16dd9e58489fd", "name": "Commented-code block (6 lines) in supabase/functions/lesson-materials-api/index.ts:4", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/lesson-materials-api/index.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dd8270b1e8ba9a76", "name": "Commented-code block (5 lines) in supabase/functions/oauth-google-callback/index.ts:278", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/oauth-google-callback/index.ts:278"}, "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-1bf33a85110e81af", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/oauth-google-callback/index.ts:171", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/oauth-google-callback/index.ts:171"}, "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-3b312ecc03590a66", "name": "Commented-code block (6 lines) in supabase/functions/email-verify/index.ts:106", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/email-verify/index.ts:106"}, "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-45e5caece2c2838a", "name": "Commented-code block (6 lines) in supabase/functions/tutor-account/index.ts:124", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/tutor-account/index.ts:124"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6a4e4ec68196b32b", "name": "Commented-code block (11 lines) in supabase/functions/telegram-bot/index.ts:1480", "shortDescription": {"text": "Commented-code block (11 lines) in supabase/functions/telegram-bot/index.ts:1480"}, "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-3a4b706aeeabf237", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/telegram-bot/index.ts:475", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/telegram-bot/index.ts:475"}, "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-b196d1d6f9d060ba", "name": "Commented-code block (5 lines) in supabase/functions/auth-email-hook/index.ts:44", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/auth-email-hook/index.ts:44"}, "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-6b67f91130241c93", "name": "Commented-code block (6 lines) in supabase/functions/_shared/image-domains.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/_shared/image-domains.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-e99dd02d64a98bf4", "name": "Commented-code block (5 lines) in supabase/functions/_shared/student-progress-build.ts:263", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/_shared/student-progress-build.ts:263"}, "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-fd0200af34260144", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/_shared/push-sender.ts:314", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/_shared/push-sender.ts:314"}, "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-f274a08f8fa9b719", "name": "Commented-code block (5 lines) in supabase/functions/_shared/subscription-limits.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/_shared/subscription-limits.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d9c8adbab6dd3b9b", "name": "Commented-code block (5 lines) in supabase/functions/_shared/mock-exam-part1-checker.ts:161", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/_shared/mock-exam-part1-checker.ts:161"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-df6c84f362d942f0", "name": "Commented-code block (5 lines) in supabase/functions/_shared/mock-exam-prompts.ts:252", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/_shared/mock-exam-prompts.ts:252"}, "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-3011c8cb9aa17539", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/_shared/proxy-url.ts:52", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/_shared/proxy-url.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-8a8c3290fdfc3f37", "name": "Commented-code block (6 lines) in supabase/functions/_shared/subject-rubrics/index.ts:66", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/_shared/subject-rubrics/index.ts:66"}, "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-254f6a6b5175c9d4", "name": "Commented-code block (6 lines) in supabase/functions/_shared/subject-rubrics/languages-ege.ts:206", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/_shared/subject-rubrics/languages-ege.ts:206"}, "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-beb38089a4aff4c5", "name": "Commented-code block (5 lines) in supabase/functions/_shared/subject-rubrics/cefr-detector.ts:26", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/_shared/subject-rubrics/cefr-detector.ts:26"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7223a7d3e8577a51", "name": "Commented-code block (11 lines) in public/service-worker.js:67", "shortDescription": {"text": "Commented-code block (11 lines) in public/service-worker.js:67"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b2c188e88488ad76", "name": "Commented-code block (5 lines) in SokratAI/HomeworkResultsV2Mock.jsx:4", "shortDescription": {"text": "Commented-code block (5 lines) in SokratAI/HomeworkResultsV2Mock.jsx:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3ef3faf77728ebd8", "name": "Commented-code block (5 lines) in src/registerServiceWorker.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/registerServiceWorker.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-78dea1f224e73b00", "name": "Commented-code block (5 lines) in src/App.tsx:32", "shortDescription": {"text": "Commented-code block (5 lines) in src/App.tsx:32"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a1f375b562b5926f", "name": "Legacy-named symbol `fetch_catalog_tasks_v2` in src/integrations/supabase/types.ts:4040", "shortDescription": {"text": "Legacy-named symbol `fetch_catalog_tasks_v2` in src/integrations/supabase/types.ts:4040"}, "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-31f99fb733fe913e", "name": "Commented-code block (7 lines) in src/components/TutorGuard.tsx:198", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/TutorGuard.tsx:198"}, "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-98fd3c837378c461", "name": "Commented-code block (6 lines) in src/components/AuthGuard.tsx:51", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/AuthGuard.tsx:51"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-84c223916b6019ea", "name": "Commented-code block (5 lines) in src/components/TutorTelegramLoginButton.tsx:123", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/TutorTelegramLoginButton.tsx:123"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bfd1d551cc8b3348", "name": "Commented-code block (13 lines) in src/components/student/useMockExamAutoSave.ts:9", "shortDescription": {"text": "Commented-code block (13 lines) in src/components/student/useMockExamAutoSave.ts:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eb664df4bb0f3be2", "name": "Commented-code block (5 lines) in src/components/student/mock-exam/MarkdownTaskText.tsx:20", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/student/mock-exam/MarkdownTaskText.tsx:20"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-822e464a0010f998", "name": "Commented-code block (7 lines) in src/components/student/homework-problem/SubmitSheet.tsx:161", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/student/homework-problem/SubmitSheet.tsx:161"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-644fc7d6c561b24f", "name": "Commented-code block (5 lines) in src/components/student/homework-problem/TaskImagesGallery.tsx:64", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/student/homework-problem/TaskImagesGallery.tsx:64"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0784d5f380c4e596", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/student/homework-problem/TaskImagesGallery.tsx:64", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/student/homework-problem/TaskImagesGallery.tsx:64"}, "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-a0db454e3f46879c", "name": "Commented-code block (9 lines) in src/components/student/homework-problem/StepIndicator.tsx:55", "shortDescription": {"text": "Commented-code block (9 lines) in src/components/student/homework-problem/StepIndicator.tsx:55"}, "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-4fba2fc73d8b9d1e", "name": "Commented-code block (5 lines) in src/components/common/UserAvatar.tsx:54", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/common/UserAvatar.tsx:54"}, "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-7da4a1b04e60499e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/tutor/AddStudentDialog.tsx:95", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/tutor/AddStudentDialog.tsx:95"}, "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-910e1abbf1815dc5", "name": "Commented-code block (6 lines) in src/components/tutor/GuidedThreadViewer.tsx:146", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/tutor/GuidedThreadViewer.tsx:146"}, "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-691d3501bc779622", "name": "Commented-code block (7 lines) in src/components/tutor/StudentCard.tsx:58", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/tutor/StudentCard.tsx:58"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0851a16243243a2b", "name": "Commented-code block (5 lines) in src/components/tutor/schedule/LessonMaterialsDrawer.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/tutor/schedule/LessonMaterialsDrawer.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4418f220c07fdf05", "name": "Commented-code block (6 lines) in src/components/tutor/schedule/PostLessonSheet.tsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/tutor/schedule/PostLessonSheet.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ac508adca6fcc42a", "name": "Commented-code block (5 lines) in src/components/tutor/schedule/ConfirmLessonsSheet.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/tutor/schedule/ConfirmLessonsSheet.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0078fa27e5fd83a8", "name": "Commented-code block (5 lines) in src/components/tutor/schedule/LessonMaterialsPanel.tsx:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/tutor/schedule/LessonMaterialsPanel.tsx:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-06f0d3625e8fcf67", "name": "Commented-code block (5 lines) in src/components/tutor/schedule/MonthIncomeStrip.tsx:8", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/tutor/schedule/MonthIncomeStrip.tsx:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e5f35c3cd83a98c2", "name": "Commented-code block (5 lines) in src/components/tutor/homework-create/HWTaskCard.tsx:905", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/tutor/homework-create/HWTaskCard.tsx:905"}, "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-223e244358fb9772", "name": "Commented-code block (5 lines) in src/components/tutor/results/heatmapStyles.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/tutor/results/heatmapStyles.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9e670f1244d9b8db", "name": "Commented-code block (5 lines) in src/components/tutor/results/EditScoreDialog.tsx:35", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/tutor/results/EditScoreDialog.tsx:35"}, "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-a27398036a7cdaeb", "name": "Commented-code block (8 lines) in src/components/tutor/students/LedgerFeed.tsx:25", "shortDescription": {"text": "Commented-code block (8 lines) in src/components/tutor/students/LedgerFeed.tsx:25"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e67896ca08f1d821", "name": "Commented-code block (6 lines) in src/components/tutor/students/ParentReportDialog.tsx:57", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/tutor/students/ParentReportDialog.tsx:57"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-56c314c09b49daa7", "name": "Commented-code block (6 lines) in src/components/tutor/homework-reuse/SaveAsTemplateDialog.tsx:177", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/tutor/homework-reuse/SaveAsTemplateDialog.tsx:177"}, "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-a99fd94554cef7be", "name": "Commented-code block (5 lines) in src/components/tutor/home/StudentsActivityBlock.tsx:198", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/tutor/home/StudentsActivityBlock.tsx:198"}, "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-1ea7f261455d4ae9", "name": "Commented-code block (7 lines) in src/components/tutor/home/primitives/ChatRow.tsx:32", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/tutor/home/primitives/ChatRow.tsx:32"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bdb5ba25c1e8d968", "name": "Commented-code block (13 lines) in src/components/tutor/mock-exams/MockExamVariantPreviewSheet.tsx:7", "shortDescription": {"text": "Commented-code block (13 lines) in src/components/tutor/mock-exams/MockExamVariantPreviewSheet.tsx:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b8d22287ad64cfb5", "name": "Commented-code block (8 lines) in src/components/tutor/mock-exams/Part1TaskDrillDownDialog.tsx:10", "shortDescription": {"text": "Commented-code block (8 lines) in src/components/tutor/mock-exams/Part1TaskDrillDownDialog.tsx:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0c0f9301c7d91972", "name": "Commented-code block (5 lines) in src/components/tutor/mock-exams/mockHeatmapStyles.ts:12", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/tutor/mock-exams/mockHeatmapStyles.ts:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c84073f38566def3", "name": "Commented-code block (6 lines) in src/components/tutor/mock-exams/LeadLinkSuccessDialog.tsx:9", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/tutor/mock-exams/LeadLinkSuccessDialog.tsx:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3258f774e1134680", "name": "Commented-code block (8 lines) in src/components/tutor/mock-exams/MockExamHeatmap.tsx:10", "shortDescription": {"text": "Commented-code block (8 lines) in src/components/tutor/mock-exams/MockExamHeatmap.tsx:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a3c822ea3ca284a3", "name": "Commented-code block (8 lines) in src/components/tutor/mock-exams/MockExamInviteLinksSection.tsx:8", "shortDescription": {"text": "Commented-code block (8 lines) in src/components/tutor/mock-exams/MockExamInviteLinksSection.tsx:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-71d8105139a8b7fe", "name": "Commented-code block (5 lines) in src/components/tutor/profile/LoginProvidersSection.tsx:148", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/tutor/profile/LoginProvidersSection.tsx:148"}, "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-215935ac25a7339e", "name": "Commented-code block (5 lines) in src/components/tutor/chrome/SideNav.tsx:82", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/tutor/chrome/SideNav.tsx:82"}, "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-616e445b7af85705", "name": "Commented-code block (5 lines) in src/components/homework/GuidedChatMessage.tsx:112", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/homework/GuidedChatMessage.tsx:112"}, "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-ec1b448c75888dcc", "name": "Commented-code block (5 lines) in src/components/homework/CriteriaBreakdownTable.tsx:65", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/homework/CriteriaBreakdownTable.tsx:65"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e76164d5ba5bbfcd", "name": "Commented-code block (8 lines) in src/components/homework/GuidedHomeworkWorkspace.tsx:589", "shortDescription": {"text": "Commented-code block (8 lines) in src/components/homework/GuidedHomeworkWorkspace.tsx:589"}, "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-86c036ac628ff710", "name": "Commented-code block (5 lines) in src/components/sections/tutor/SocialProof.tsx:252", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/sections/tutor/SocialProof.tsx:252"}, "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-46c4fd16f9c294ff", "name": "Commented-code block (6 lines) in src/components/kb/HWDrawer.tsx:258", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/kb/HWDrawer.tsx:258"}, "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-a7a9f327de1dad8b", "name": "Commented-code block (5 lines) in src/lib/subjectHelpers.ts:41", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/subjectHelpers.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-89384ab4e67557fc", "name": "Commented-code block (8 lines) in src/lib/studentMockExamApi.ts:6", "shortDescription": {"text": "Commented-code block (8 lines) in src/lib/studentMockExamApi.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d7c2727872f79150", "name": "Commented-code block (6 lines) in src/lib/homeworkTelemetry.ts:74", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/homeworkTelemetry.ts:74"}, "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-f08ae3ca37857944", "name": "Legacy-named symbol `pending_consent_v1` in src/lib/consent.ts:13", "shortDescription": {"text": "Legacy-named symbol `pending_consent_v1` in src/lib/consent.ts:13"}, "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-8e22653024f3f8ea", "name": "Commented-code block (5 lines) in src/lib/mockExamPublicApi.ts:232", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/mockExamPublicApi.ts:232"}, "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-1297a2dfbb6c7c25", "name": "Commented-code block (6 lines) in src/lib/studentHomeworkApi.ts:109", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/studentHomeworkApi.ts:109"}, "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-e04276afb7a7332a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/studentHomeworkApi.ts:96", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/studentHomeworkApi.ts:96"}, "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-9a15b9e809d11881", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/streamChat.ts:129", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/streamChat.ts:129"}, "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-aa38e9e1b6e873d6", "name": "Commented-code block (5 lines) in src/lib/tutors.ts:860", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/tutors.ts:860"}, "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-ec79fa6abb445ac1", "name": "Commented-code block (5 lines) in src/lib/studentScheduleApi.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/studentScheduleApi.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f3d553d2b5c1b829", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/studentScheduleApi.ts:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/studentScheduleApi.ts:28"}, "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-1d82db9f6b67e293", "name": "Commented-code block (5 lines) in src/lib/tutorHomeworkApi.ts:1167", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/tutorHomeworkApi.ts:1167"}, "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-eb36b1a5b897f3e2", "name": "Commented-code block (5 lines) in src/lib/supabaseClient.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/supabaseClient.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1ca1650236824d98", "name": "Commented-code block (5 lines) in src/lib/lessonMaterialsApi.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/lessonMaterialsApi.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-41f8d4f19d79d8ab", "name": "Commented-code block (8 lines) in src/lib/imageCompression.ts:66", "shortDescription": {"text": "Commented-code block (8 lines) in src/lib/imageCompression.ts:66"}, "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-e649f2901a3b83cf", "name": "Commented-code block (5 lines) in src/lib/kbModeratorApi.ts:15", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/kbModeratorApi.ts:15"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-746559873468fae6", "name": "Commented-code block (10 lines) in src/lib/mockExamPart1Checker.ts:8", "shortDescription": {"text": "Commented-code block (10 lines) in src/lib/mockExamPart1Checker.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-01a1b6df8d5bf7d1", "name": "Legacy-named symbol `\u041c\u0435\u0445\u0430\u043d\u0438\u043a\u0430_v1` in src/lib/formulaEngine/egorFormulas.ts:6", "shortDescription": {"text": "Legacy-named symbol `\u041c\u0435\u0445\u0430\u043d\u0438\u043a\u0430_v1` in src/lib/formulaEngine/egorFormulas.ts:6"}, "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-eaa907af77537aac", "name": "Commented-code block (5 lines) in src/lib/formulaEngine/questionGenerator.ts:11", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/formulaEngine/questionGenerator.ts:11"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1cd51e5a5f8d4a42", "name": "Commented-code block (10 lines) in src/pages/PublicMockInvite.tsx:6", "shortDescription": {"text": "Commented-code block (10 lines) in src/pages/PublicMockInvite.tsx:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5898b5415f1e32a7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/Chat.tsx:951", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/Chat.tsx:951"}, "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-bda626ab7831d7c6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/Profile.tsx:233", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/Profile.tsx:233"}, "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-e20aa379de4a4b02", "name": "Commented-code block (5 lines) in src/pages/RegisterTutor.tsx:101", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/RegisterTutor.tsx:101"}, "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-a3ae4deebf56aadd", "name": "Commented-code block (8 lines) in src/pages/TutorSignupTrial.tsx:218", "shortDescription": {"text": "Commented-code block (8 lines) in src/pages/TutorSignupTrial.tsx:218"}, "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-3589ac445c2e3638", "name": "Commented-code block (6 lines) in src/pages/StudentHomeworkDetail.tsx:66", "shortDescription": {"text": "Commented-code block (6 lines) in src/pages/StudentHomeworkDetail.tsx:66"}, "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-205ae3896aaecc96", "name": "Commented-code block (6 lines) in src/pages/PublicMockResult.tsx:11", "shortDescription": {"text": "Commented-code block (6 lines) in src/pages/PublicMockResult.tsx:11"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1780c66c4fd13240", "name": "Commented-code block (5 lines) in src/pages/SignUp.tsx:140", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/SignUp.tsx:140"}, "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-19b1fda22a6b5710", "name": "Commented-code block (6 lines) in src/pages/student/HomeworkProblem.tsx:132", "shortDescription": {"text": "Commented-code block (6 lines) in src/pages/student/HomeworkProblem.tsx:132"}, "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-78f0e0022cce302b", "name": "Commented-code block (7 lines) in src/pages/student/StudentMockExam.tsx:986", "shortDescription": {"text": "Commented-code block (7 lines) in src/pages/student/StudentMockExam.tsx:986"}, "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-02f833181ff6295c", "name": "Commented-code block (5 lines) in src/pages/student/StudentMockExams.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/student/StudentMockExams.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2f68deb4d39d4f72", "name": "Commented-code block (6 lines) in src/pages/student/StudentMockExamResult.tsx:6", "shortDescription": {"text": "Commented-code block (6 lines) in src/pages/student/StudentMockExamResult.tsx:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-49f5ced7ac6520c3", "name": "Commented-code block (6 lines) in src/pages/tutor/TutorHomeworkTemplates.tsx:53", "shortDescription": {"text": "Commented-code block (6 lines) in src/pages/tutor/TutorHomeworkTemplates.tsx:53"}, "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-0bc1e000c47f1430", "name": "Commented-code block (6 lines) in src/pages/tutor/TutorPayments.tsx:32", "shortDescription": {"text": "Commented-code block (6 lines) in src/pages/tutor/TutorPayments.tsx:32"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a82cea150c8a13a0", "name": "Commented-code block (5 lines) in src/pages/tutor/TutorHomeworkCreate.tsx:37", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/tutor/TutorHomeworkCreate.tsx:37"}, "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-680a8c5d721176f6", "name": "Commented-code block (5 lines) in src/pages/tutor/TutorHomework.tsx:35", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/tutor/TutorHomework.tsx:35"}, "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-b342105fb8dfc3bb", "name": "Commented-code block (7 lines) in src/pages/tutor/TutorHomeworkDetail.tsx:512", "shortDescription": {"text": "Commented-code block (7 lines) in src/pages/tutor/TutorHomeworkDetail.tsx:512"}, "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-e30146f8ab110dae", "name": "Commented-code block (6 lines) in src/pages/tutor/students/StudentsProgressOverview.tsx:13", "shortDescription": {"text": "Commented-code block (6 lines) in src/pages/tutor/students/StudentsProgressOverview.tsx:13"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b1f8e09f21945ec4", "name": "Commented-code block (7 lines) in src/pages/tutor/mock-exams/TutorMockExams.tsx:8", "shortDescription": {"text": "Commented-code block (7 lines) in src/pages/tutor/mock-exams/TutorMockExams.tsx:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-736f4f4e8e5fadbc", "name": "Commented-code block (5 lines) in src/pages/tutor/mock-exams/TutorMockExamCreate.tsx:8", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/tutor/mock-exams/TutorMockExamCreate.tsx:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e1798b8b182c6b96", "name": "Commented-code block (9 lines) in src/pages/tutor/mock-exams/TutorMockExamReview.tsx:3", "shortDescription": {"text": "Commented-code block (9 lines) in src/pages/tutor/mock-exams/TutorMockExamReview.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2969088a1cbc0b21", "name": "Commented-code block (5 lines) in src/pages/tutor/mock-exams/TutorMockExamDetail.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/tutor/mock-exams/TutorMockExamDetail.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-553bc6b4cff17092", "name": "Commented-code block (5 lines) in src/hooks/useMockExamAssignment.ts:31", "shortDescription": {"text": "Commented-code block (5 lines) in src/hooks/useMockExamAssignment.ts:31"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2e236c17fbae0614", "name": "Commented-code block (7 lines) in src/hooks/useTutorStudentActivity.ts:155", "shortDescription": {"text": "Commented-code block (7 lines) in src/hooks/useTutorStudentActivity.ts:155"}, "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-6ddb95db109ccf3c", "name": "Commented-code block (5 lines) in src/hooks/useSubmitSolution.ts:31", "shortDescription": {"text": "Commented-code block (5 lines) in src/hooks/useSubmitSolution.ts:31"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c4c848b533c23d11", "name": "Commented-code block (5 lines) in src/hooks/useStudentMockExamResult.ts:56", "shortDescription": {"text": "Commented-code block (5 lines) in src/hooks/useStudentMockExamResult.ts:56"}, "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-b89df0b42c2a5714", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useNetworkStatus.ts:52", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useNetworkStatus.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-2996b69fb58f6874", "name": "Legacy-named symbol `fetch_catalog_tasks_v2` in src/hooks/useKnowledgeBase.ts:77", "shortDescription": {"text": "Legacy-named symbol `fetch_catalog_tasks_v2` in src/hooks/useKnowledgeBase.ts:77"}, "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-dfa09ce7a864a2fc", "name": "Commented-code block (6 lines) in src/hooks/useUserIdentities.ts:55", "shortDescription": {"text": "Commented-code block (6 lines) in src/hooks/useUserIdentities.ts:55"}, "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-02f706d8a2e7bd89", "name": "Commented-code block (9 lines) in src/hooks/useTutorHomeData.ts:85", "shortDescription": {"text": "Commented-code block (9 lines) in src/hooks/useTutorHomeData.ts:85"}, "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-7f1bec1fd65c0879", "name": "Frontend route `/reset-password` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/reset-password` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6cbf0d2dc1b6508c", "name": "Frontend route `/homework/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/homework/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f9b069cf73f645b8", "name": "Frontend route `/student/homework/:hwId/problem/:taskId` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/student/homework/:hwId/problem/:taskId` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c9e2f4cc73251cde", "name": "Frontend route `/student/schedule/:lessonId` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/student/schedule/:lessonId` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d727c2fa5b4d7978", "name": "Frontend route `/student/mock-exams/:id/result` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/student/mock-exams/:id/result` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ab9db712022bfd6b", "name": "Frontend route `/student/mock-exams/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/student/mock-exams/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6db0055b34958619", "name": "Frontend route `/p/mock-invite/:slug` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/p/mock-invite/:slug` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9110dd08714038a", "name": "Frontend route `/p/mock-result/:slug` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/p/mock-result/:slug` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6ee8c30419e7ef41", "name": "Frontend route `/p/report/:slug` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/p/report/:slug` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-33b8bdeb15f0a585", "name": "Frontend route `/p/:slug` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/p/:slug` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ad0a932c33ea5f15", "name": "Frontend route `/trainer` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/trainer` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4e198c6b17b71328", "name": "Frontend route `/miniapp` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/miniapp` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4a63af6126c5d77c", "name": "Frontend route `/miniapp/solution/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/miniapp/solution/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3d47341344301241", "name": "Frontend route `/admin` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/admin` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-930256c88f43a86f", "name": "Frontend route `/retention-analysis` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/retention-analysis` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7bc5a7aa514c1edd", "name": "Frontend route `/tutor` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/tutor` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27525ec45210c5d4", "name": "Frontend route `home` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `home` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cef386312d50c26d", "name": "Frontend route `dashboard` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `dashboard` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-001baaf21927e532", "name": "Frontend route `schedule` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `schedule` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fe417df543c07af9", "name": "Frontend route `students` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `students` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8369326f80e3d196", "name": "Frontend route `students/:tutorStudentId/progress` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `students/:tutorStudentId/progress` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f2a29606b67a1c1e", "name": "Frontend route `students/:tutorStudentId` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `students/:tutorStudentId` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a8d0c9b0ace55e37", "name": "Frontend route `payments` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `payments` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-11feb210c2f50b50", "name": "Frontend route `profile` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `profile` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-88402d345d90c066", "name": "Frontend route `homework/templates` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `homework/templates` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6af7b156e5c74bc7", "name": "Frontend route `homework/create` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `homework/create` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4ac8e7b14a0ce380", "name": "Frontend route `homework/:id/edit` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `homework/:id/edit` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-de48742bcaca2279", "name": "Frontend route `homework/:id/preview` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `homework/:id/preview` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-be491add49ab7fc4", "name": "Frontend route `homework/:id/results` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `homework/:id/results` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-28f98f7d4c708861", "name": "Frontend route `homework/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `homework/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-43df1d2b3c3fe2db", "name": "Frontend route `homework` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `homework` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8793560e1b0480b9", "name": "Frontend route `mock-exams/new` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `mock-exams/new` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-88d85e5a18a2febe", "name": "Frontend route `mock-exams/:id/review/:studentId` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `mock-exams/:id/review/:studentId` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-721b2c44aeea749a", "name": "Frontend route `mock-exams/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `mock-exams/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-74c158e2b33b5962", "name": "Frontend route `mock-exams` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `mock-exams` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a49c2b061a44e4d7", "name": "Frontend route `assistant` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `assistant` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-51499f5efdb5692c", "name": "Frontend route `knowledge/topic/:topicId` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `knowledge/topic/:topicId` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c572c119e5fdca97", "name": "Frontend route `knowledge/folder/:folderId` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `knowledge/folder/:folderId` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d4605c937c150b17", "name": "Frontend route `knowledge` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `knowledge` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4981be79e8b50a1e", "name": "Frontend route `/book/:bookingLink` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/book/:bookingLink` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7f0f564db75b3338", "name": "Frontend route `/invite/:inviteCode` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/invite/:inviteCode` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0ee297dfdaea62bb", "name": "Frontend route `/install` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/install` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/22391"}, "properties": {"repository": "Vladimir03/sokratai", "repoUrl": "https://github.com/Vladimir03/sokratai", "branch": "main"}, "results": [{"ruleId": "scanner-c3bf51567c399414", "level": "note", "message": {"text": "Possibly dead Python function: handle_starttag"}, "properties": {"repobilityId": "3bf216d149959ebf", "scanner": "scanner-primary", "fingerprint": "c3bf51567c399414", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/parse_telegram_export.py:16"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-842ae5eebacf4e85", "level": "note", "message": {"text": "Possibly dead Python function: handle_endtag"}, "properties": {"repobilityId": "7eb6f3decafc1766", "scanner": "scanner-primary", "fingerprint": "842ae5eebacf4e85", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/parse_telegram_export.py:64"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2b474ac3ba357b4a", "level": "note", "message": {"text": "Possibly dead Python function: handle_data"}, "properties": {"repobilityId": "3a673a278f4fc1e6", "scanner": "scanner-primary", "fingerprint": "2b474ac3ba357b4a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/parse_telegram_export.py:89"}, "region": {"startLine": 1}}}]}, {"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-7c2eeb914ca6e1ec", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 docs/delivery/features/student-progress/design-handoff/hw3/app-mobile.jsx:20"}, "properties": {"repobilityId": "45250af493fc7cf5", "scanner": "scanner-primary", "fingerprint": "7c2eeb914ca6e1ec", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-847a85910533dc2e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 docs/delivery/features/student-progress/design-handoff/hw3/app.jsx:20"}, "properties": {"repobilityId": "a3a2e1cacb62a188", "scanner": "scanner-primary", "fingerprint": "847a85910533dc2e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-bdcd2529a8a6b7d0", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 docs/delivery/features/student-progress/design-handoff/report/app-mobile.jsx:16"}, "properties": {"repobilityId": "f5d09044d408a581", "scanner": "scanner-primary", "fingerprint": "bdcd2529a8a6b7d0", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c0797976705464bf", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 docs/delivery/features/student-progress/design-handoff/report/app.jsx:20"}, "properties": {"repobilityId": "3cab0904dd8162ab", "scanner": "scanner-primary", "fingerprint": "c0797976705464bf", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-66e07bbd0a19ecfc", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 docs/delivery/features/student-progress/design-handoff/hero2/components.jsx:36"}, "properties": {"repobilityId": "2b7334e4906022ea", "scanner": "scanner-primary", "fingerprint": "66e07bbd0a19ecfc", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9e9adeaf1ba55a88", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 docs/delivery/features/student-progress/design-handoff/usp/app-mobile.jsx:24"}, "properties": {"repobilityId": "d831026042ae4d8f", "scanner": "scanner-primary", "fingerprint": "9e9adeaf1ba55a88", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f95fe87c33630145", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 docs/delivery/features/student-progress/design-handoff/usp/app.jsx:21"}, "properties": {"repobilityId": "ddc9144c4769fcc0", "scanner": "scanner-primary", "fingerprint": "f95fe87c33630145", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0dcec36cfe2c966c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/tutor-progress-api/index.ts:256"}, "properties": {"repobilityId": "0ddcc66a1fbce77a", "scanner": "scanner-primary", "fingerprint": "0dcec36cfe2c966c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d604cde45b3118a5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/setup-telegram-webhook/index.ts:24"}, "properties": {"repobilityId": "1c81b9afaf2752fc", "scanner": "scanner-primary", "fingerprint": "d604cde45b3118a5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2b1517e9aa750444", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/homework-api/guided_ai.ts:1984"}, "properties": {"repobilityId": "caf9cbdcb76c2046", "scanner": "scanner-primary", "fingerprint": "2b1517e9aa750444", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fcdcffe312ccbc22", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/homework-api/index.ts:810"}, "properties": {"repobilityId": "f3dfa69716ef656b", "scanner": "scanner-primary", "fingerprint": "fcdcffe312ccbc22", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d8ae82ad49d06e10", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/rag-competitor-bot/index.ts:68"}, "properties": {"repobilityId": "162efa37297f0cd3", "scanner": "scanner-primary", "fingerprint": "d8ae82ad49d06e10", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-99fd7b1d032df6d8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/mock-exam-student-api/index.ts:1933"}, "properties": {"repobilityId": "92142cc00467498e", "scanner": "scanner-primary", "fingerprint": "99fd7b1d032df6d8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a7bca9304fabfe16", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/mock-exam-tutor-api/index.ts:3562"}, "properties": {"repobilityId": "005d8fcd17ac0bc8", "scanner": "scanner-primary", "fingerprint": "a7bca9304fabfe16", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3c34e618ffabf92a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/telegram-login-token/index.ts:51"}, "properties": {"repobilityId": "a563353be0604034", "scanner": "scanner-primary", "fingerprint": "3c34e618ffabf92a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0a5f057bf4d30a9e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/student-lessons-api/index.ts:579"}, "properties": {"repobilityId": "47e102cc59139ebe", "scanner": "scanner-primary", "fingerprint": "0a5f057bf4d30a9e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-84fe599a772a878f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/tutor-manual-add-student/index.ts:293"}, "properties": {"repobilityId": "584fa8be01645dad", "scanner": "scanner-primary", "fingerprint": "84fe599a772a878f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-889d81af91af44e8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/yookassa-create-payment/index.ts:57"}, "properties": {"repobilityId": "1fb6c032b6766038", "scanner": "scanner-primary", "fingerprint": "889d81af91af44e8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9d26bca785ffebe7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/chat/index.ts:925"}, "properties": {"repobilityId": "15849d0e2fded78c", "scanner": "scanner-primary", "fingerprint": "9d26bca785ffebe7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-da038d40ed94489f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/homework-reminder/index.ts:305"}, "properties": {"repobilityId": "625a3c66db5829c7", "scanner": "scanner-primary", "fingerprint": "da038d40ed94489f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1e3edc50bac0377d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/rag-bot-setup-webhook/index.ts:25"}, "properties": {"repobilityId": "448cb3f9179047b6", "scanner": "scanner-primary", "fingerprint": "1e3edc50bac0377d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-044a433bec6016d1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/telegram-scheduled-reminder/index.ts:76"}, "properties": {"repobilityId": "32ff423b5162051f", "scanner": "scanner-primary", "fingerprint": "044a433bec6016d1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a1b51861c4a697dc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/telegram-scheduled-broadcast/index.ts:66"}, "properties": {"repobilityId": "27e55cd96a3d7f8b", "scanner": "scanner-primary", "fingerprint": "a1b51861c4a697dc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-35a6914ee5d17ade", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/telegram-broadcast/index.ts:148"}, "properties": {"repobilityId": "f0b442118fe34f85", "scanner": "scanner-primary", "fingerprint": "35a6914ee5d17ade", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bed304710942b6ae", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/lesson-materials-api/index.ts:400"}, "properties": {"repobilityId": "2e7a56aef80d030c", "scanner": "scanner-primary", "fingerprint": "bed304710942b6ae", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-40b0cec199795e13", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/oauth-google-callback/index.ts:213"}, "properties": {"repobilityId": "aa9bc5a60dbc549c", "scanner": "scanner-primary", "fingerprint": "40b0cec199795e13", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-95bedd29478700ae", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/yookassa-webhook/index.ts:73"}, "properties": {"repobilityId": "373c80653db66cac", "scanner": "scanner-primary", "fingerprint": "95bedd29478700ae", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0aa176fe455df099", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/assign-tutor-role/index.ts:103"}, "properties": {"repobilityId": "884bed155c00f2d7", "scanner": "scanner-primary", "fingerprint": "0aa176fe455df099", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c3158d586039848e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/telegram-auth/index.ts:68"}, "properties": {"repobilityId": "6b91bb4791d8d567", "scanner": "scanner-primary", "fingerprint": "c3158d586039848e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-657cce0b51f56356", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/telegram-bot/index.ts:775"}, "properties": {"repobilityId": "152dbdee60fe1d08", "scanner": "scanner-primary", "fingerprint": "657cce0b51f56356", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-97d7cdb0f7e3492e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/auth-email-hook/index.ts:265"}, "properties": {"repobilityId": "febfb37bd73a7c9a", "scanner": "scanner-primary", "fingerprint": "97d7cdb0f7e3492e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3e557803de6701b9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/_shared/voice-transcribe.ts:115"}, "properties": {"repobilityId": "1753ad463679f5c8", "scanner": "scanner-primary", "fingerprint": "3e557803de6701b9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f46ef382a30c0cba", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/_shared/subscription-limits.ts:69"}, "properties": {"repobilityId": "4f37eef728e5b21a", "scanner": "scanner-primary", "fingerprint": "f46ef382a30c0cba", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-136b66344eba4118", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 public/service-worker.js:13"}, "properties": {"repobilityId": "6fcfbf0115e29d81", "scanner": "scanner-primary", "fingerprint": "136b66344eba4118", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-234d4cbd093d9dc1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/registerServiceWorker.ts:29"}, "properties": {"repobilityId": "3c2d4f7ab70a6c6b", "scanner": "scanner-primary", "fingerprint": "234d4cbd093d9dc1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e08c6db864fed3be", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/chatCache.ts:44"}, "properties": {"repobilityId": "f21794f0ce6322d5", "scanner": "scanner-primary", "fingerprint": "e08c6db864fed3be", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c0d01e1b8d9276c5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/analytics.ts:22"}, "properties": {"repobilityId": "07f8c33b0dcb7d2a", "scanner": "scanner-primary", "fingerprint": "c0d01e1b8d9276c5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-13ee930c1e032270", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/performanceMetrics.ts:48"}, "properties": {"repobilityId": "c16c5afdb54f07b5", "scanner": "scanner-primary", "fingerprint": "13ee930c1e032270", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-30befef2b64d11fa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/retryWithBackoff.ts:32"}, "properties": {"repobilityId": "d4f70252f03bc7ac", "scanner": "scanner-primary", "fingerprint": "30befef2b64d11fa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6de25892be1871d0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/pyodide.ts:74"}, "properties": {"repobilityId": "48a3612fe67610b7", "scanner": "scanner-primary", "fingerprint": "6de25892be1871d0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3e26da2cf4d2e465", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/messageBatcher.ts:67"}, "properties": {"repobilityId": "56a0a75039c28bbb", "scanner": "scanner-primary", "fingerprint": "3e26da2cf4d2e465", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-968df17f23d25e0c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/TelegramLoginButton.tsx:50"}, "properties": {"repobilityId": "da6cc56797e70d5f", "scanner": "scanner-primary", "fingerprint": "968df17f23d25e0c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b9d5631ea6dac888", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ChatSidebar.tsx:110"}, "properties": {"repobilityId": "0ade62ea059b4019", "scanner": "scanner-primary", "fingerprint": "b9d5631ea6dac888", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-92b5f3b8f34cbf04", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/ChatSidebar.tsx:96"}, "properties": {"repobilityId": "267d3ccb29f73986", "scanner": "scanner-primary", "fingerprint": "92b5f3b8f34cbf04", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0bafdf21999513b5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CustomChatItem.tsx:160"}, "properties": {"repobilityId": "3d58ebb11474c095", "scanner": "scanner-primary", "fingerprint": "0bafdf21999513b5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-20f8c3edcbde8653", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/TutorTelegramLoginButton.tsx:159"}, "properties": {"repobilityId": "6c13d1d8097fa87d", "scanner": "scanner-primary", "fingerprint": "20f8c3edcbde8653", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d4fe2dc9a599d5e2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/student/schedule/LessonFeedItem.tsx:73"}, "properties": {"repobilityId": "1134981a45cb692c", "scanner": "scanner-primary", "fingerprint": "d4fe2dc9a599d5e2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d715833c383836f0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/student/homework-problem/NumericAnswerComposer.tsx:123"}, "properties": {"repobilityId": "f2b457aa634e96b9", "scanner": "scanner-primary", "fingerprint": "d715833c383836f0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-57d177ae809840b8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/student/homework-problem/ComposerMobile.tsx:97"}, "properties": {"repobilityId": "a76c23f3b9d31c47", "scanner": "scanner-primary", "fingerprint": "57d177ae809840b8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-338e5257ba662e0a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/student/homework-problem/SubmitSheet.tsx:521"}, "properties": {"repobilityId": "a4cb5bbba59c07b5", "scanner": "scanner-primary", "fingerprint": "338e5257ba662e0a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9bfe0f45283f4bc0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/student/homework-problem/SubmitCtaBar.tsx:74"}, "properties": {"repobilityId": "e8f639e15677cba2", "scanner": "scanner-primary", "fingerprint": "9bfe0f45283f4bc0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7b19a0f688801571", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/GuidedThreadViewer.tsx:879"}, "properties": {"repobilityId": "0d0a4e7e1600db64", "scanner": "scanner-primary", "fingerprint": "7b19a0f688801571", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-febb8771f08d5976", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/StudentCard.tsx:117"}, "properties": {"repobilityId": "d4ffd0376640b8a3", "scanner": "scanner-primary", "fingerprint": "febb8771f08d5976", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c5fa909fbd36cb4b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/KBPickerSheet.tsx:385"}, "properties": {"repobilityId": "aac33ba209c0df84", "scanner": "scanner-primary", "fingerprint": "c5fa909fbd36cb4b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-78cb6805cd491c3d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/schedule/LessonMaterialsDrawer.tsx:50"}, "properties": {"repobilityId": "ab2832414ad50f7d", "scanner": "scanner-primary", "fingerprint": "78cb6805cd491c3d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-297355e67dfb4350", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/schedule/PostLessonSheet.tsx:98"}, "properties": {"repobilityId": "6cb30ed56a64ad03", "scanner": "scanner-primary", "fingerprint": "297355e67dfb4350", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-02bccf6b73f59dd5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/schedule/ConfirmLessonsSheet.tsx:290"}, "properties": {"repobilityId": "d734ada8261cbad7", "scanner": "scanner-primary", "fingerprint": "02bccf6b73f59dd5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d2e59bc7134423ea", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/schedule/LessonMaterialsPanel.tsx:121"}, "properties": {"repobilityId": "1ad8cc5dce6f6b12", "scanner": "scanner-primary", "fingerprint": "d2e59bc7134423ea", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3d1990809b122a41", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/homework-create/HWMaterialsSection.tsx:141"}, "properties": {"repobilityId": "ceaab63dbe685411", "scanner": "scanner-primary", "fingerprint": "3d1990809b122a41", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bd00392d78c49522", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/homework-create/HWSubmitSuccess.tsx:39"}, "properties": {"repobilityId": "fbc256c2fb45b5d7", "scanner": "scanner-primary", "fingerprint": "bd00392d78c49522", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6d45a8d0d4c984b2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/homework-create/HWAssignSection.tsx:588"}, "properties": {"repobilityId": "c6f9eb996ebf9592", "scanner": "scanner-primary", "fingerprint": "6d45a8d0d4c984b2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b0d3e429118b53a5", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/components/tutor/results/RemindStudentDialog.tsx:235"}, "properties": {"repobilityId": "d8cdf38b712f4f1e", "scanner": "scanner-primary", "fingerprint": "b0d3e429118b53a5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-28b450c0f71af491", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/results/HeatmapGrid.tsx:225"}, "properties": {"repobilityId": "d3e5e480d8a0d45d", "scanner": "scanner-primary", "fingerprint": "28b450c0f71af491", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d413a46d477f35df", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/results/ResultsActionBlock.tsx:117"}, "properties": {"repobilityId": "86ab04804d17dffd", "scanner": "scanner-primary", "fingerprint": "d413a46d477f35df", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-00ed388db888035f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/results/ResultsHeader.tsx:112"}, "properties": {"repobilityId": "204f0925147ca118", "scanner": "scanner-primary", "fingerprint": "00ed388db888035f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1ee985879ddd10d9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/students/StudentProgressPanel.tsx:76"}, "properties": {"repobilityId": "1f72d69ce346d4ef", "scanner": "scanner-primary", "fingerprint": "1ee985879ddd10d9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-488b5c9188c39feb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/students/ParentReportDialog.tsx:450"}, "properties": {"repobilityId": "24d9406045286a6b", "scanner": "scanner-primary", "fingerprint": "488b5c9188c39feb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-be25a3f431247129", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/homework-reuse/ShareLinkDialog.tsx:410"}, "properties": {"repobilityId": "ed77b89d9002d3fa", "scanner": "scanner-primary", "fingerprint": "be25a3f431247129", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-61a58693c3bf252a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/home/StudentsAtRiskBlock.tsx:77"}, "properties": {"repobilityId": "b59132017efcd775", "scanner": "scanner-primary", "fingerprint": "61a58693c3bf252a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-465514dbb3cf72a8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/mock-exams/MockExamHeatmap.tsx:264"}, "properties": {"repobilityId": "497836418a5e297d", "scanner": "scanner-primary", "fingerprint": "465514dbb3cf72a8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3fa265551cf11e5b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/profile/LoginProvidersSection.tsx:376"}, "properties": {"repobilityId": "9e9e8dd5772fbc5d", "scanner": "scanner-primary", "fingerprint": "3fa265551cf11e5b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a84a5c44e4aa03bf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tutor/chrome/SideNav.tsx:290"}, "properties": {"repobilityId": "81db88bbae0b9d05", "scanner": "scanner-primary", "fingerprint": "a84a5c44e4aa03bf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-84a9fb9e69196a0a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/homework/GuidedChatMessage.tsx:427"}, "properties": {"repobilityId": "9f8bff5e25d2efb4", "scanner": "scanner-primary", "fingerprint": "84a9fb9e69196a0a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ba1b880557b54e29", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/homework/GuidedChatInput.tsx:145"}, "properties": {"repobilityId": "dfbb5854b8c02890", "scanner": "scanner-primary", "fingerprint": "ba1b880557b54e29", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7bde20113cb39735", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/homework/ThreadAttachments.tsx:63"}, "properties": {"repobilityId": "ae7625f95ea68490", "scanner": "scanner-primary", "fingerprint": "7bde20113cb39735", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dcf360cb040f05f8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/homework/GuidedHomeworkWorkspace.tsx:1673"}, "properties": {"repobilityId": "64bf449227709ccb", "scanner": "scanner-primary", "fingerprint": "dcf360cb040f05f8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-62308b1ca442120b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/AdminMockExams.tsx:107"}, "properties": {"repobilityId": "cd94546057de3542", "scanner": "scanner-primary", "fingerprint": "62308b1ca442120b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d40bd38fd05480da", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/homework/AdminTutorAssignmentList.tsx:81"}, "properties": {"repobilityId": "a2487c6ffa33914c", "scanner": "scanner-primary", "fingerprint": "d40bd38fd05480da", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a165f3ef87664060", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/homework/AdminHWThreadView.tsx:671"}, "properties": {"repobilityId": "afe0b97881fda869", "scanner": "scanner-primary", "fingerprint": "a165f3ef87664060", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8d4c6948a379da4e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/homework/AdminTutorList.tsx:252"}, "properties": {"repobilityId": "1c681a8556030e59", "scanner": "scanner-primary", "fingerprint": "8d4c6948a379da4e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6e3befc68918c732", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/homework/AdminAssignmentStudentList.tsx:77"}, "properties": {"repobilityId": "4a3d144c4dc46e9d", "scanner": "scanner-primary", "fingerprint": "6e3befc68918c732", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a6add573f700b5ab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/business/AtRiskTutorsTable.tsx:82"}, "properties": {"repobilityId": "a1f04c92ab995498", "scanner": "scanner-primary", "fingerprint": "a6add573f700b5ab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dec31047bf6bec97", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/discovery/MorningReviewQueue.tsx:72"}, "properties": {"repobilityId": "a56d3cffc8f38885", "scanner": "scanner-primary", "fingerprint": "dec31047bf6bec97", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e05c957274c09362", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/kb/MoveToFolderModal.tsx:59"}, "properties": {"repobilityId": "623c3bb3f7506322", "scanner": "scanner-primary", "fingerprint": "e05c957274c09362", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b8fb415ec65d6eab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/kb/TopicCard.tsx:30"}, "properties": {"repobilityId": "b39d30d8a35b8d84", "scanner": "scanner-primary", "fingerprint": "b8fb415ec65d6eab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-daf36df97ee84209", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/kb/MaterialCard.tsx:38"}, "properties": {"repobilityId": "4cd1bfcfba688364", "scanner": "scanner-primary", "fingerprint": "daf36df97ee84209", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-58447d1ce0e839b2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/kb/SubtopicManager.tsx:98"}, "properties": {"repobilityId": "8432fd25d4f1cce1", "scanner": "scanner-primary", "fingerprint": "58447d1ce0e839b2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2d24566ab7d90ee5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/kb/FolderCard.tsx:37"}, "properties": {"repobilityId": "9ef40e42561bce84", "scanner": "scanner-primary", "fingerprint": "2d24566ab7d90ee5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f255f3785abd778e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/kb/CopyToFolderModal.tsx:62"}, "properties": {"repobilityId": "4b9db95019a4bc04", "scanner": "scanner-primary", "fingerprint": "f255f3785abd778e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a68d0017035c87df", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/kb/KBSearchDropdown.tsx:91"}, "properties": {"repobilityId": "92be31b12ad264aa", "scanner": "scanner-primary", "fingerprint": "a68d0017035c87df", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ac3ae9ce09565c2f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/kb/ui/MathText.tsx:92"}, "properties": {"repobilityId": "1317fcf26028c2fa", "scanner": "scanner-primary", "fingerprint": "ac3ae9ce09565c2f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c5209a2feb5ea3ba", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/miniapp/RecentSolutionsList.tsx:69"}, "properties": {"repobilityId": "c8ddca6329afd74c", "scanner": "scanner-primary", "fingerprint": "c5209a2feb5ea3ba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b96312557ee31b5d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/diagnostic/DiagnosticResult.tsx:155"}, "properties": {"repobilityId": "d6ed360bf1704b1d", "scanner": "scanner-primary", "fingerprint": "b96312557ee31b5d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1c87db5d75e9133f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Chat.tsx:1820"}, "properties": {"repobilityId": "2209c167571641b2", "scanner": "scanner-primary", "fingerprint": "1c87db5d75e9133f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a5105c052a36dbb9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/pages/Chat.tsx:114"}, "properties": {"repobilityId": "c81d2215648da14b", "scanner": "scanner-primary", "fingerprint": "a5105c052a36dbb9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f1c15a595a6a25b2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/PublicHomeworkShare.tsx:120"}, "properties": {"repobilityId": "9208766d6e1d97cc", "scanner": "scanner-primary", "fingerprint": "f1c15a595a6a25b2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-063dabedf9108c9f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/pages/MiniAppSolution.tsx:67"}, "properties": {"repobilityId": "157070508b16aa0d", "scanner": "scanner-primary", "fingerprint": "063dabedf9108c9f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-10129bc1c31cf852", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/pages/Practice.tsx:23"}, "properties": {"repobilityId": "cdd3b607cbc551ae", "scanner": "scanner-primary", "fingerprint": "10129bc1c31cf852", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2ec222d1c7bcc53c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/pages/MiniApp.tsx:22"}, "properties": {"repobilityId": "1d3422bd69051d44", "scanner": "scanner-primary", "fingerprint": "2ec222d1c7bcc53c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9212923f9b5647af", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/PublicStudentReport.tsx:40"}, "properties": {"repobilityId": "2e74b859120fbc56", "scanner": "scanner-primary", "fingerprint": "9212923f9b5647af", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-164b2404bfbc90bb", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/pages/InstallApp.tsx:246"}, "properties": {"repobilityId": "6970830c862473e4", "scanner": "scanner-primary", "fingerprint": "164b2404bfbc90bb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-2bef40ab557c270c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/student/HomeworkProblem.tsx:1401"}, "properties": {"repobilityId": "eefb84e25c87a59a", "scanner": "scanner-primary", "fingerprint": "2bef40ab557c270c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-55765f474eb86a86", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/student/LessonDetail.tsx:66"}, "properties": {"repobilityId": "eda65234aa283179", "scanner": "scanner-primary", "fingerprint": "55765f474eb86a86", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-05a2e17611b86ff5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/tutor/TutorSchedule.tsx:326"}, "properties": {"repobilityId": "6821f9d69e269f44", "scanner": "scanner-primary", "fingerprint": "05a2e17611b86ff5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-48fe93dcb7ce5fb9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/tutor/TutorStudentProfile.tsx:769"}, "properties": {"repobilityId": "e9f4b87cfbfd2123", "scanner": "scanner-primary", "fingerprint": "48fe93dcb7ce5fb9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f7e6a1fa66dff674", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/tutor/TutorPayments.tsx:90"}, "properties": {"repobilityId": "bc833f8407062ede", "scanner": "scanner-primary", "fingerprint": "f7e6a1fa66dff674", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-38c237ad6a145266", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/tutor/TutorHomeworkDetail.tsx:373"}, "properties": {"repobilityId": "6d6a07b1f9f6c24c", "scanner": "scanner-primary", "fingerprint": "38c237ad6a145266", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6bedf7d5db587fab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/tutor/students/StudentsProgressOverview.tsx:98"}, "properties": {"repobilityId": "da23ca6b44d6fb07", "scanner": "scanner-primary", "fingerprint": "6bedf7d5db587fab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9950e121b9c31f63", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/tutor/mock-exams/TutorMockExamReview.tsx:2296"}, "properties": {"repobilityId": "ca88168a713486e0", "scanner": "scanner-primary", "fingerprint": "9950e121b9c31f63", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e5440d0b16afb05f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/tutor/mock-exams/TutorMockExamDetail.tsx:262"}, "properties": {"repobilityId": "2cf8a20165c57513", "scanner": "scanner-primary", "fingerprint": "e5440d0b16afb05f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e4638d79a725f4e6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/usePractice.ts:141"}, "properties": {"repobilityId": "0f4e0ec2d47a4c44", "scanner": "scanner-primary", "fingerprint": "e4638d79a725f4e6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-14a1181020f8bfaa", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in kb_pipeline_diagram.html:218"}, "properties": {"repobilityId": "bd78c8cdeea29f69", "scanner": "scanner-primary", "fingerprint": "14a1181020f8bfaa", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "kb_pipeline_diagram.html"}, "region": {"startLine": 218}}}]}, {"ruleId": "scanner-61e62063c4e7712b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in docs/delivery/features/student-progress/design-handoff/hw3/app-mobile.jsx:20"}, "properties": {"repobilityId": "182ca7530ecd591a", "scanner": "scanner-primary", "fingerprint": "61e62063c4e7712b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/delivery/features/student-progress/design-handoff/hw3/app-mobile.jsx"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-aaee7f9842fd9ffc", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in docs/delivery/features/student-progress/design-handoff/hw3/app.jsx:20"}, "properties": {"repobilityId": "d06f28d8f275bce5", "scanner": "scanner-primary", "fingerprint": "aaee7f9842fd9ffc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/delivery/features/student-progress/design-handoff/hw3/app.jsx"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-b66bf4a61f1b8469", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in docs/delivery/features/student-progress/design-handoff/report/app-mobile.jsx:16"}, "properties": {"repobilityId": "328af9dfac74860e", "scanner": "scanner-primary", "fingerprint": "b66bf4a61f1b8469", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/delivery/features/student-progress/design-handoff/report/app-mobile.jsx"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-d6f077e5e6307f36", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in docs/delivery/features/student-progress/design-handoff/report/app.jsx:20"}, "properties": {"repobilityId": "df9eaabe86ee2bd4", "scanner": "scanner-primary", "fingerprint": "d6f077e5e6307f36", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/delivery/features/student-progress/design-handoff/report/app.jsx"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-278d7dc3237491b1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/delivery/features/student-progress/design-handoff/flow/flow.js:42"}, "properties": {"repobilityId": "41c5503d42b12a1e", "scanner": "scanner-primary", "fingerprint": "278d7dc3237491b1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/delivery/features/student-progress/design-handoff/flow/flow.js"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-1026cc645c081ec1", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in docs/delivery/features/student-progress/design-handoff/hero2/components.jsx:36"}, "properties": {"repobilityId": "ec42cd7c71b82bcb", "scanner": "scanner-primary", "fingerprint": "1026cc645c081ec1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/delivery/features/student-progress/design-handoff/hero2/components.jsx"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-fdaf8a92462a6fc4", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in docs/delivery/features/student-progress/design-handoff/usp/app-mobile.jsx:24"}, "properties": {"repobilityId": "942b0fde4ec2c69f", "scanner": "scanner-primary", "fingerprint": "fdaf8a92462a6fc4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/delivery/features/student-progress/design-handoff/usp/app-mobile.jsx"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-e3e31c2d06a11864", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in docs/delivery/features/student-progress/design-handoff/usp/app.jsx:21"}, "properties": {"repobilityId": "fd769dd0bc5bd24a", "scanner": "scanner-primary", "fingerprint": "e3e31c2d06a11864", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/delivery/features/student-progress/design-handoff/usp/app.jsx"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-4d6fe75392de40e5", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in docs/delivery/features/kb/kb_pipeline_diagram.html:218"}, "properties": {"repobilityId": "484d73edd9466436", "scanner": "scanner-primary", "fingerprint": "4d6fe75392de40e5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/delivery/features/kb/kb_pipeline_diagram.html"}, "region": {"startLine": 218}}}]}, {"ruleId": "scanner-ffd0e097e9f5e5a5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design-system/handoff-dashboard/tutor-kit/primitives.jsx:12"}, "properties": {"repobilityId": "6bc609b574d4cd65", "scanner": "scanner-primary", "fingerprint": "ffd0e097e9f5e5a5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design-system/handoff-dashboard/tutor-kit/primitives.jsx"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-5331acc1cce5c5dc", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/design_handoff_homework_chat/student-kit/primitives.jsx:12"}, "properties": {"repobilityId": "41c1c09b041d02e9", "scanner": "scanner-primary", "fingerprint": "5331acc1cce5c5dc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/design_handoff_homework_chat/student-kit/primitives.jsx"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-f9e1bbb66d9226fc", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/discovery/prototypes/student-card-balance-mockup.html:324"}, "properties": {"repobilityId": "ac85646b4dbe8533", "scanner": "scanner-primary", "fingerprint": "f9e1bbb66d9226fc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/discovery/prototypes/student-card-balance-mockup.html"}, "region": {"startLine": 324}}}]}, {"ruleId": "scanner-f4cc6889b98fd93e", "level": "error", "message": {"text": "Possible secret in docs/discovery/prototypes/phase0-prototype.html"}, "properties": {"repobilityId": "6b15b8ff25b9182d", "scanner": "scanner-primary", "fingerprint": "f4cc6889b98fd93e", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/discovery/prototypes/phase0-prototype.html"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-f4cc6889b98fd93e", "level": "error", "message": {"text": "Possible secret in docs/discovery/prototypes/phase0-prototype.html"}, "properties": {"repobilityId": "6b15b8ff25b9182d", "scanner": "scanner-primary", "fingerprint": "f4cc6889b98fd93e", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/discovery/prototypes/phase0-prototype.html"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-2c38f609a2274b6f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in docs/discovery/prototypes/phase0-prototype.html:3"}, "properties": {"repobilityId": "249cdba827bb3523", "scanner": "scanner-primary", "fingerprint": "2c38f609a2274b6f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/discovery/prototypes/phase0-prototype.html"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-996c11f293584404", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/discovery/prototypes/phase0-prototype.html:3"}, "properties": {"repobilityId": "8cfc817ad19d80c7", "scanner": "scanner-primary", "fingerprint": "996c11f293584404", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/discovery/prototypes/phase0-prototype.html"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-4d0e26b485df6e71", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/smoke-check.mjs:5"}, "properties": {"repobilityId": "2b1fca00f9562ab9", "scanner": "scanner-primary", "fingerprint": "4d0e26b485df6e71", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/smoke-check.mjs"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-1bd7e49088b5fa1c", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in .claude/hooks/check-supabase-url.mjs:11"}, "properties": {"repobilityId": "ab01fd6736bd0118", "scanner": "scanner-primary", "fingerprint": "1bd7e49088b5fa1c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/hooks/check-supabase-url.mjs"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-d6b253bcd2a82964", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/mock-exam-public/index.ts:60"}, "properties": {"repobilityId": "dce18b234233dfc4", "scanner": "scanner-primary", "fingerprint": "d6b253bcd2a82964", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/mock-exam-public/index.ts"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-5fc882a98ba1a4ac", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/setup-telegram-webhook/index.ts:4"}, "properties": {"repobilityId": "7c31d553ff2d49be", "scanner": "scanner-primary", "fingerprint": "5fc882a98ba1a4ac", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/setup-telegram-webhook/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-d2a9a3083eddb5d1", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/rag-competitor-bot/index.ts:172"}, "properties": {"repobilityId": "a8a5b6bce938303d", "scanner": "scanner-primary", "fingerprint": "d2a9a3083eddb5d1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/rag-competitor-bot/index.ts"}, "region": {"startLine": 172}}}]}, {"ruleId": "scanner-69402f47c5606274", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/oauth-google-init/index.ts:23"}, "properties": {"repobilityId": "03062300eab6e5d7", "scanner": "scanner-primary", "fingerprint": "69402f47c5606274", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/oauth-google-init/index.ts"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-98b4627855313ca1", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-homework/index.ts:7"}, "properties": {"repobilityId": "d97cf9cf5c843334", "scanner": "scanner-primary", "fingerprint": "98b4627855313ca1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/admin-homework/index.ts"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-fb860b9208916096", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/telegram-login-token/index.ts:4"}, "properties": {"repobilityId": "0b67424183df668a", "scanner": "scanner-primary", "fingerprint": "fb860b9208916096", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/telegram-login-token/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-05f668959f09fef1", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/tutor-manual-add-student/index.ts:4"}, "properties": {"repobilityId": "5487a9123abc6a9c", "scanner": "scanner-primary", "fingerprint": "05f668959f09fef1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/tutor-manual-add-student/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-206489ff5e2ed117", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/yookassa-create-payment/index.ts:4"}, "properties": {"repobilityId": "c42d28dbedf18cfb", "scanner": "scanner-primary", "fingerprint": "206489ff5e2ed117", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/yookassa-create-payment/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-893486603f18f601", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/chat/index.ts:17"}, "properties": {"repobilityId": "cccadaace3895c36", "scanner": "scanner-primary", "fingerprint": "893486603f18f601", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/chat/index.ts"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-b56261e0711a28ae", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/student-account/index.ts:4"}, "properties": {"repobilityId": "84aaba4444398edd", "scanner": "scanner-primary", "fingerprint": "b56261e0711a28ae", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/student-account/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-0b20bacaa9ca28fd", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-product-discovery/index.ts:5"}, "properties": {"repobilityId": "039e8a85a2ebf980", "scanner": "scanner-primary", "fingerprint": "0b20bacaa9ca28fd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/admin-product-discovery/index.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-478c711f2fd78ea2", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/public-student-report/index.ts:21"}, "properties": {"repobilityId": "b08601cb718c334c", "scanner": "scanner-primary", "fingerprint": "478c711f2fd78ea2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/public-student-report/index.ts"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-6ce1b68e17f8d79d", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-crm/index.ts:5"}, "properties": {"repobilityId": "4b57ee50f62dac21", "scanner": "scanner-primary", "fingerprint": "6ce1b68e17f8d79d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/admin-crm/index.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-63ab5b05071fb1d9", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/claim-invite/index.ts:4"}, "properties": {"repobilityId": "cd6f4ff77cc9283a", "scanner": "scanner-primary", "fingerprint": "63ab5b05071fb1d9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/claim-invite/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-aa5071cf5882bb7b", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/homework-reminder/index.ts:19"}, "properties": {"repobilityId": "e175051bab6cb7f7", "scanner": "scanner-primary", "fingerprint": "aa5071cf5882bb7b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/homework-reminder/index.ts"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-646271ee95db31b6", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/public-homework-share/index.ts:7"}, "properties": {"repobilityId": "a0c5bfb8a5757dc9", "scanner": "scanner-primary", "fingerprint": "646271ee95db31b6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/public-homework-share/index.ts"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-8f4f0cdfbb1abbc8", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/notify-booking/index.ts:9"}, "properties": {"repobilityId": "d5ce8833d2eb1bb0", "scanner": "scanner-primary", "fingerprint": "8f4f0cdfbb1abbc8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/notify-booking/index.ts"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-d3e5cb1d5b3c5219", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/rag-bot-setup-webhook/index.ts:15"}, "properties": {"repobilityId": "b8300dafcf7666c7", "scanner": "scanner-primary", "fingerprint": "d3e5cb1d5b3c5219", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/rag-bot-setup-webhook/index.ts"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-cce9050b246ea1dd", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/telegram-scheduled-reminder/index.ts:4"}, "properties": {"repobilityId": "62da47ce5d05dd46", "scanner": "scanner-primary", "fingerprint": "cce9050b246ea1dd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/telegram-scheduled-reminder/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-f89a9fc0e508c1eb", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/trainer-submit/index.ts:11"}, "properties": {"repobilityId": "2c118443f23f5abf", "scanner": "scanner-primary", "fingerprint": "f89a9fc0e508c1eb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/trainer-submit/index.ts"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-789be16b8f92592a", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/telegram-scheduled-broadcast/index.ts:4"}, "properties": {"repobilityId": "d4a4ff3b7d1282a3", "scanner": "scanner-primary", "fingerprint": "789be16b8f92592a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/telegram-scheduled-broadcast/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-dc94f04e34c0a3f6", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/telegram-broadcast/index.ts:4"}, "properties": {"repobilityId": "f9e821bb48fca013", "scanner": "scanner-primary", "fingerprint": "dc94f04e34c0a3f6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/telegram-broadcast/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-7840a9a146d72048", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/push-subscribe/index.ts:4"}, "properties": {"repobilityId": "b5441474e8b57414", "scanner": "scanner-primary", "fingerprint": "7840a9a146d72048", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/push-subscribe/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-4f1656123e1f2300", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/invite-preview/index.ts:23"}, "properties": {"repobilityId": "ea1217f16b16e127", "scanner": "scanner-primary", "fingerprint": "4f1656123e1f2300", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/invite-preview/index.ts"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-de1eac7212f05a9c", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/telegram-webapp-recent-solutions/index.ts:4"}, "properties": {"repobilityId": "a870a24acdc0a2e3", "scanner": "scanner-primary", "fingerprint": "de1eac7212f05a9c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/telegram-webapp-recent-solutions/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-37511a80dc13a61c", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/payment-reminder/index.ts:19"}, "properties": {"repobilityId": "aff280edcbb7e8c9", "scanner": "scanner-primary", "fingerprint": "37511a80dc13a61c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/payment-reminder/index.ts"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-99ba9731fd4a6b25", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/oauth-google-callback/index.ts:23"}, "properties": {"repobilityId": "09a62da36529d8b1", "scanner": "scanner-primary", "fingerprint": "99ba9731fd4a6b25", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/oauth-google-callback/index.ts"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-520ccefce2139359", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/email-verify/index.ts:49"}, "properties": {"repobilityId": "76fd7c36d4af1905", "scanner": "scanner-primary", "fingerprint": "520ccefce2139359", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/email-verify/index.ts"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-a7c006bdadfb5428", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/yookassa-webhook/index.ts:4"}, "properties": {"repobilityId": "02a5d3b63aff37d6", "scanner": "scanner-primary", "fingerprint": "a7c006bdadfb5428", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/yookassa-webhook/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-97f7c0ff0ec347e8", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/assign-tutor-role/index.ts:4"}, "properties": {"repobilityId": "2bc1ca557a2b9c8a", "scanner": "scanner-primary", "fingerprint": "97f7c0ff0ec347e8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/assign-tutor-role/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-c55ed954c680ce4e", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-business-dashboard/index.ts:5"}, "properties": {"repobilityId": "5053a27c9506ceb3", "scanner": "scanner-primary", "fingerprint": "c55ed954c680ce4e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/admin-business-dashboard/index.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-1893acb946d9d212", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/tutor-account/index.ts:4"}, "properties": {"repobilityId": "20f6591d7c2c2326", "scanner": "scanner-primary", "fingerprint": "1893acb946d9d212", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/tutor-account/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-15f887e7fa18cba8", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-analytics/index.ts:5"}, "properties": {"repobilityId": "6dc1aaaad4c1b7f2", "scanner": "scanner-primary", "fingerprint": "15f887e7fa18cba8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/admin-analytics/index.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-a7d4fda5c7949899", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/telegram-auth/index.ts:5"}, "properties": {"repobilityId": "bd778f85fb81c616", "scanner": "scanner-primary", "fingerprint": "a7d4fda5c7949899", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/telegram-auth/index.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-7d44562c5cbf2f8d", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/tutor-update-student/index.ts:4"}, "properties": {"repobilityId": "5cace7a4b83a8291", "scanner": "scanner-primary", "fingerprint": "7d44562c5cbf2f8d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/tutor-update-student/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-4a77bff49893a006", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/telegram-bot/index.ts:15"}, "properties": {"repobilityId": "99cd09d67cbb51e3", "scanner": "scanner-primary", "fingerprint": "4a77bff49893a006", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/telegram-bot/index.ts"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-a26a4a88f9df8c05", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/auth-email-hook/index.ts:14"}, "properties": {"repobilityId": "249fc31148305b77", "scanner": "scanner-primary", "fingerprint": "a26a4a88f9df8c05", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/auth-email-hook/index.ts"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-a199e89af2a7fa4a", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/admin-mock-exams/index.ts:5"}, "properties": {"repobilityId": "ef410ea7d66d49f7", "scanner": "scanner-primary", "fingerprint": "a199e89af2a7fa4a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/admin-mock-exams/index.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-a17a2f8b36d6ecfa", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in SokratAI/docs/delivery/features/mock-exams-v1/mockup.html:779"}, "properties": {"repobilityId": "bd0c4657e27d66b8", "scanner": "scanner-primary", "fingerprint": "a17a2f8b36d6ecfa", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "SokratAI/docs/delivery/features/mock-exams-v1/mockup.html"}, "region": {"startLine": 779}}}]}, {"ruleId": "scanner-75257757730a65bf", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in src/components/tutor/profile/LoginProvidersSection.tsx:134"}, "properties": {"repobilityId": "d15eb36305a690c7", "scanner": "scanner-primary", "fingerprint": "75257757730a65bf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/tutor/profile/LoginProvidersSection.tsx"}, "region": {"startLine": 134}}}]}, {"ruleId": "scanner-bc92dacf55d74a9b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/kb/ui/MathText.tsx:92"}, "properties": {"repobilityId": "057a59d3b3c0d241", "scanner": "scanner-primary", "fingerprint": "bc92dacf55d74a9b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/kb/ui/MathText.tsx"}, "region": {"startLine": 92}}}]}, {"ruleId": "scanner-c33ef2f118475999", "level": "error", "message": {"text": "Possible secret in src/lib/tutors.ts"}, "properties": {"repobilityId": "42ff13b9df7d2b07", "scanner": "scanner-primary", "fingerprint": "c33ef2f118475999", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/tutors.ts"}, "region": {"startLine": 503}}}]}, {"ruleId": "scanner-3b47ecb59115b400", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "7c7986b5002bcf35", "scanner": "scanner-primary", "fingerprint": "3b47ecb59115b400", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-supabase-functions.yml"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-3b47ecb59115b400", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2c0f6fe5791dcfe2", "scanner": "scanner-primary", "fingerprint": "3b47ecb59115b400", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-supabase-functions.yml"}, "region": {"startLine": 21}}}]}, {"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": 23}}}]}, {"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": 26}}}]}, {"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": 55}}}]}, {"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": 58}}}]}, {"ruleId": "scanner-3e9ad3d956975d51", "level": "note", "message": {"text": "Very large file: docs/design-system/handoff-dashboard/tutor-kit/students-split.jsx (878 lines)"}, "properties": {"repobilityId": "1710e80045cfb67d", "scanner": "scanner-primary", "fingerprint": "3e9ad3d956975d51", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-52f8578180964fb7", "level": "note", "message": {"text": "Very large file: pitch-mfti-yc-2026-05-15/tmp.cjs (1130 lines)"}, "properties": {"repobilityId": "c4be86e24b36fa92", "scanner": "scanner-primary", "fingerprint": "52f8578180964fb7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-41a4ff952f4d27b2", "level": "note", "message": {"text": "Very large file: pitch-mfti-yc-2026-05-15/build-deck.cjs (1131 lines)"}, "properties": {"repobilityId": "e2d74ec5e3b3989d", "scanner": "scanner-primary", "fingerprint": "41a4ff952f4d27b2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a525ca31d1386516", "level": "note", "message": {"text": "Very large file: supabase/functions/homework-api/guided_ai.ts (2492 lines)"}, "properties": {"repobilityId": "8cb1d8e3f60a9195", "scanner": "scanner-primary", "fingerprint": "a525ca31d1386516", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-48250310f8875790", "level": "note", "message": {"text": "Very large file: supabase/functions/homework-api/index.ts (9908 lines)"}, "properties": {"repobilityId": "a0f3b303d71f8d32", "scanner": "scanner-primary", "fingerprint": "48250310f8875790", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bcb28b96cf0f9618", "level": "note", "message": {"text": "Very large file: supabase/functions/mock-exam-student-api/index.ts (2040 lines)"}, "properties": {"repobilityId": "797d23f2d39f65e0", "scanner": "scanner-primary", "fingerprint": "bcb28b96cf0f9618", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8c754d4ec465fd32", "level": "note", "message": {"text": "Very large file: supabase/functions/mock-exam-tutor-api/index.ts (3745 lines)"}, "properties": {"repobilityId": "6253dcf9e81b6284", "scanner": "scanner-primary", "fingerprint": "8c754d4ec465fd32", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-178b7d7d1e03a3fc", "level": "note", "message": {"text": "Very large file: supabase/functions/mock-exam-grade/index.ts (1949 lines)"}, "properties": {"repobilityId": "9a75342ebc063cc9", "scanner": "scanner-primary", "fingerprint": "178b7d7d1e03a3fc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1f76a4fe17796e22", "level": "note", "message": {"text": "Very large file: supabase/functions/chat/index.ts (2009 lines)"}, "properties": {"repobilityId": "55dfbf3b800ac3d2", "scanner": "scanner-primary", "fingerprint": "1f76a4fe17796e22", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2bbabef0b961527f", "level": "note", "message": {"text": "Very large file: supabase/functions/telegram-bot/index.ts (7254 lines)"}, "properties": {"repobilityId": "faa08680347d7819", "scanner": "scanner-primary", "fingerprint": "2bbabef0b961527f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5a83bde80f0eb48d", "level": "note", "message": {"text": "Very large file: src/integrations/supabase/types.ts (4614 lines)"}, "properties": {"repobilityId": "ede8ac5264027534", "scanner": "scanner-primary", "fingerprint": "5a83bde80f0eb48d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bd8a30388ff70927", "level": "note", "message": {"text": "Very large file: src/components/homework/GuidedHomeworkWorkspace.tsx (1987 lines)"}, "properties": {"repobilityId": "5e3755b5996dfa6f", "scanner": "scanner-primary", "fingerprint": "bd8a30388ff70927", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0a80595ca6660d88", "level": "note", "message": {"text": "Very large file: src/lib/tutorHomeworkApi.ts (1434 lines)"}, "properties": {"repobilityId": "3b2ab32544808323", "scanner": "scanner-primary", "fingerprint": "0a80595ca6660d88", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9a5d3292d8d03297", "level": "note", "message": {"text": "Very large file: src/lib/formulaEngine/egorFormulas.ts (920 lines)"}, "properties": {"repobilityId": "da0a49057a72771f", "scanner": "scanner-primary", "fingerprint": "9a5d3292d8d03297", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-03cfeb47a4688f39", "level": "note", "message": {"text": "Very large file: src/lib/formulaEngine/formulas.generated.ts (2135 lines)"}, "properties": {"repobilityId": "0abec152789ea9e5", "scanner": "scanner-primary", "fingerprint": "03cfeb47a4688f39", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8b4c498efca41045", "level": "note", "message": {"text": "Very large file: src/pages/Chat.tsx (2102 lines)"}, "properties": {"repobilityId": "c522a3c6d7f3fa0e", "scanner": "scanner-primary", "fingerprint": "8b4c498efca41045", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-472ff0bfc223ad39", "level": "note", "message": {"text": "Very large file: src/pages/student/HomeworkProblem.tsx (2038 lines)"}, "properties": {"repobilityId": "ee600505c307e9d3", "scanner": "scanner-primary", "fingerprint": "472ff0bfc223ad39", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ec7849bd876c2cad", "level": "note", "message": {"text": "Very large file: src/pages/student/StudentMockExam.tsx (1901 lines)"}, "properties": {"repobilityId": "d297e2b55bae731f", "scanner": "scanner-primary", "fingerprint": "ec7849bd876c2cad", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-63fcdfa44debf173", "level": "note", "message": {"text": "Very large file: src/pages/student/StudentMockExamResult.tsx (1228 lines)"}, "properties": {"repobilityId": "1657f39f3766fc2a", "scanner": "scanner-primary", "fingerprint": "63fcdfa44debf173", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bf93bc8c74927d2f", "level": "note", "message": {"text": "Very large file: src/pages/tutor/TutorSchedule.tsx (4709 lines)"}, "properties": {"repobilityId": "b3cb62d13e2506fa", "scanner": "scanner-primary", "fingerprint": "bf93bc8c74927d2f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6ad1225e65b2022f", "level": "note", "message": {"text": "Very large file: src/pages/tutor/TutorStudentProfile.tsx (1237 lines)"}, "properties": {"repobilityId": "8dab4587b5857185", "scanner": "scanner-primary", "fingerprint": "6ad1225e65b2022f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a52a8b1904967df9", "level": "note", "message": {"text": "Very large file: src/pages/tutor/TutorHomeworkCreate.tsx (1951 lines)"}, "properties": {"repobilityId": "3ce5bd2240b6f9bb", "scanner": "scanner-primary", "fingerprint": "a52a8b1904967df9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-607b536acea98a9f", "level": "note", "message": {"text": "Very large file: src/pages/tutor/mock-exams/TutorMockExamReview.tsx (2522 lines)"}, "properties": {"repobilityId": "436e540965caf0a9", "scanner": "scanner-primary", "fingerprint": "607b536acea98a9f", "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": "48f111dd6ed36db4", "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": "d6c44b93ac62b868", "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": "07af5708eacecbde", "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": "34c368d5310c3f1e", "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": "52822b2de3d721f8", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-11825279136b53a3", "level": "warning", "message": {"text": "CI is configured but no tests are detected"}, "properties": {"repobilityId": "ce16e16c9632829c", "scanner": "scanner-primary", "fingerprint": "11825279136b53a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "ci", "config-theater", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "c9687f3a5b65b36e", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "41780bf634fe025f", "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": "949cedf21f909895", "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": "97cc4e2b684e951b", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-cc55229a7a3c078d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .mcp.json"}, "properties": {"repobilityId": "51942fb3d5b8b5b4", "scanner": "scanner-primary", "fingerprint": "cc55229a7a3c078d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "mcp_config"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".mcp.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-122f91b7f2906dc4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "properties": {"repobilityId": "a2967269048b6a9d", "scanner": "scanner-primary", "fingerprint": "122f91b7f2906dc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 1}}}]}, {"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-46fd2dc6edd03fa4", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/rules/96-auth-ru-bypass.md"}, "properties": {"repobilityId": "5c828e1df06a75d9", "scanner": "scanner-primary", "fingerprint": "46fd2dc6edd03fa4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/rules/96-auth-ru-bypass.md"}, "region": {"startLine": 257}}}]}, {"ruleId": "scanner-3465c65a63d729e6", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/agents/kb-explorer.md"}, "properties": {"repobilityId": "a238590aebfb50a5", "scanner": "scanner-primary", "fingerprint": "3465c65a63d729e6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/agents/kb-explorer.md"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-0e2085a6c822223d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/teach-impeccable/SKILL.md"}, "properties": {"repobilityId": "cee41dede246b44b", "scanner": "scanner-primary", "fingerprint": "0e2085a6c822223d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/teach-impeccable/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-02875fabd4cc1074", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/ajtbd-job-graph/SKILL.md"}, "properties": {"repobilityId": "3585d9e2848abb7a", "scanner": "scanner-primary", "fingerprint": "02875fabd4cc1074", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/ajtbd-job-graph/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4ae7e791ff78a01b", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/ajtbd-recruit/SKILL.md"}, "properties": {"repobilityId": "5bce974f72def221", "scanner": "scanner-primary", "fingerprint": "4ae7e791ff78a01b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/ajtbd-recruit/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-67fe1fa0e15c7a68", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/ajtbd-b2b-segments/SKILL.md"}, "properties": {"repobilityId": "f4602dda31c8b502", "scanner": "scanner-primary", "fingerprint": "67fe1fa0e15c7a68", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/ajtbd-b2b-segments/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-166bc115e99b9e76", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/ajtbd-b2c-segments/SKILL.md"}, "properties": {"repobilityId": "2db8de5afd77bed5", "scanner": "scanner-primary", "fingerprint": "166bc115e99b9e76", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/ajtbd-b2c-segments/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e6017f8b98e43971", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/ajtbd-research/SKILL.md"}, "properties": {"repobilityId": "ed64d940eacabda5", "scanner": "scanner-primary", "fingerprint": "e6017f8b98e43971", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/ajtbd-research/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0a17195ae9e37fb0", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/ajtbd-landing/SKILL.md"}, "properties": {"repobilityId": "be64747c07207712", "scanner": "scanner-primary", "fingerprint": "0a17195ae9e37fb0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/ajtbd-landing/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-19b52a57c33f2eac", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/plans/compressed-sparking-spindle-review-prompt.md"}, "properties": {"repobilityId": "8080635395e5034b", "scanner": "scanner-primary", "fingerprint": "19b52a57c33f2eac", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/plans/compressed-sparking-spindle-review-prompt.md"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-20f77f35124d625f", "level": "none", "message": {"text": "Commented-code block (5 lines) in vite.config.ts:59"}, "properties": {"repobilityId": "dcce9a2f4b19c7b2", "scanner": "scanner-primary", "fingerprint": "20f77f35124d625f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-77418c27ba2bc5ef", "level": "none", "message": {"text": "Commented-code block (5 lines) in vite.config.ts.timestamp-1779353619296-3e79d6724b0fe.mjs:45"}, "properties": {"repobilityId": "14b06da985c1de1a", "scanner": "scanner-primary", "fingerprint": "77418c27ba2bc5ef", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-affb7f30ba22a986", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 docs/delivery/engineering/architecture/cloudflare-proxy-worker.js:26"}, "properties": {"repobilityId": "cf18f14ddebbb57b", "scanner": "scanner-primary", "fingerprint": "affb7f30ba22a986", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-acf1250d643357a9", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/test-mockexam-contact-type.mjs:10"}, "properties": {"repobilityId": "581de47904ad3999", "scanner": "scanner-primary", "fingerprint": "acf1250d643357a9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e78b2e0b04f09759", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/test-mockexam-checker.mjs:95"}, "properties": {"repobilityId": "5c53c1bfa5d73213", "scanner": "scanner-primary", "fingerprint": "e78b2e0b04f09759", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4d64402afd0ab9a8", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/test-criteria-templates.mjs:4"}, "properties": {"repobilityId": "26270de6d55e30bb", "scanner": "scanner-primary", "fingerprint": "4d64402afd0ab9a8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-81ed93bf8a506ee8", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/smoke-check.mjs:391"}, "properties": {"repobilityId": "676faabdf5a33813", "scanner": "scanner-primary", "fingerprint": "81ed93bf8a506ee8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bddfd5f170ad6d33", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/structure-mock-exam.py:60"}, "properties": {"repobilityId": "9e843118e0e6fc1d", "scanner": "scanner-primary", "fingerprint": "bddfd5f170ad6d33", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-871a40e5592d7766", "level": "none", "message": {"text": "Commented-code block (5 lines) in .claude/hooks/check-supabase-url.mjs:2"}, "properties": {"repobilityId": "e272493b4515d284", "scanner": "scanner-primary", "fingerprint": "871a40e5592d7766", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-74c61660af566957", "level": "note", "message": {"text": "Legacy-named symbol `project_mock_exams_v1` in supabase/functions/mock-exam-public/index.ts:545"}, "properties": {"repobilityId": "9029fef603e59c49", "scanner": "scanner-primary", "fingerprint": "74c61660af566957", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6de57a8ff4764964", "level": "none", "message": {"text": "Commented-code block (7 lines) in supabase/functions/mock-exam-public/index.ts:3"}, "properties": {"repobilityId": "283b5a6c245042fd", "scanner": "scanner-primary", "fingerprint": "6de57a8ff4764964", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b48867ebe1264d52", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/tutor-progress-api/index.ts:3"}, "properties": {"repobilityId": "c1fbd2e4aa4275ef", "scanner": "scanner-primary", "fingerprint": "b48867ebe1264d52", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5eedc75432f182fd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/setup-telegram-webhook/index.ts:27"}, "properties": {"repobilityId": "75927714c9b5ef99", "scanner": "scanner-primary", "fingerprint": "5eedc75432f182fd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-548736de31c1df40", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/homework-api/guided_ai.ts:110"}, "properties": {"repobilityId": "6ddcd1ebb6e14c03", "scanner": "scanner-primary", "fingerprint": "548736de31c1df40", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1d96b680d432d07a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/homework-api/guided_ai.ts:989"}, "properties": {"repobilityId": "87ecdcfb51603bd1", "scanner": "scanner-primary", "fingerprint": "1d96b680d432d07a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2859f65aa7ec1071", "level": "note", "message": {"text": "Legacy-named symbol `payloadLegacy` in supabase/functions/homework-api/index.ts:7161"}, "properties": {"repobilityId": "d3fa2e0063282d70", "scanner": "scanner-primary", "fingerprint": "2859f65aa7ec1071", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-facff0961c85f513", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/homework-api/index.ts:1395"}, "properties": {"repobilityId": "0d6c7c593af17697", "scanner": "scanner-primary", "fingerprint": "facff0961c85f513", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a8f89c1b3a37653e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/homework-api/index.ts:2061"}, "properties": {"repobilityId": "74dfc25e77c20aa5", "scanner": "scanner-primary", "fingerprint": "a8f89c1b3a37653e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cf57836136f211bc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/rag-competitor-bot/index.ts:103"}, "properties": {"repobilityId": "edde2d708f2517d1", "scanner": "scanner-primary", "fingerprint": "cf57836136f211bc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-85352af6905755e1", "level": "none", "message": {"text": "Commented-code block (13 lines) in supabase/functions/oauth-google-init/index.ts:106"}, "properties": {"repobilityId": "a4d1baacda4cc56b", "scanner": "scanner-primary", "fingerprint": "85352af6905755e1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c7145af14b31194e", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/mock-exam-student-api/index.ts:1"}, "properties": {"repobilityId": "872896293dea6b26", "scanner": "scanner-primary", "fingerprint": "c7145af14b31194e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-49bc2fa42404eb5d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/mock-exam-student-api/index.ts:131"}, "properties": {"repobilityId": "9c06b99a437d2736", "scanner": "scanner-primary", "fingerprint": "49bc2fa42404eb5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-419e9f112dff6688", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/mock-exam-tutor-api/index.ts:1"}, "properties": {"repobilityId": "9552bc446b85817f", "scanner": "scanner-primary", "fingerprint": "419e9f112dff6688", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4712dc498d8381c2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/mock-exam-tutor-api/index.ts:182"}, "properties": {"repobilityId": "aaa9dca66c33af63", "scanner": "scanner-primary", "fingerprint": "4712dc498d8381c2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-df35c7d1131128f1", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/mock-exam-grade/index.ts:3"}, "properties": {"repobilityId": "c621b641c19e3d20", "scanner": "scanner-primary", "fingerprint": "df35c7d1131128f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0162174acd478e69", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/mock-exam-grade/index.ts:216"}, "properties": {"repobilityId": "4907ca60c6886f95", "scanner": "scanner-primary", "fingerprint": "0162174acd478e69", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aff88cdeaecde90f", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/student-lessons-api/index.ts:4"}, "properties": {"repobilityId": "22b3875c79e14222", "scanner": "scanner-primary", "fingerprint": "aff88cdeaecde90f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6ac8bf569b1db2f6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/yookassa-create-payment/index.ts:140"}, "properties": {"repobilityId": "60831f84eabd8c83", "scanner": "scanner-primary", "fingerprint": "6ac8bf569b1db2f6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6d2525549023d5e6", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/chat/index.ts:1280"}, "properties": {"repobilityId": "9bc97daf1d568647", "scanner": "scanner-primary", "fingerprint": "6d2525549023d5e6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6b4d49efbd31ecbf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/chat/index.ts:147"}, "properties": {"repobilityId": "70ae36b0c1fc2124", "scanner": "scanner-primary", "fingerprint": "6b4d49efbd31ecbf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b3d456a8fba4f043", "level": "none", "message": {"text": "Commented-code block (8 lines) in supabase/functions/public-student-report/index.ts:5"}, "properties": {"repobilityId": "d552b66a31d602f5", "scanner": "scanner-primary", "fingerprint": "b3d456a8fba4f043", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0811083d4279bd37", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/homework-reminder/index.ts:5"}, "properties": {"repobilityId": "65919a027db9608e", "scanner": "scanner-primary", "fingerprint": "0811083d4279bd37", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ee016f48e5e0c648", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/public-homework-share/index.ts:21"}, "properties": {"repobilityId": "c3538b2100be4903", "scanner": "scanner-primary", "fingerprint": "ee016f48e5e0c648", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b338951db094cbe9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/rag-bot-setup-webhook/index.ts:27"}, "properties": {"repobilityId": "b93e1e70886e3eec", "scanner": "scanner-primary", "fingerprint": "b338951db094cbe9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-94c7d175c0587886", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/telegram-broadcast/index.ts:219"}, "properties": {"repobilityId": "76e4db5cfce64cbc", "scanner": "scanner-primary", "fingerprint": "94c7d175c0587886", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6b36297f0538ca50", "level": "none", "message": {"text": "Commented-code block (9 lines) in supabase/functions/invite-preview/index.ts:1"}, "properties": {"repobilityId": "3de8577adb6fb425", "scanner": "scanner-primary", "fingerprint": "6b36297f0538ca50", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9ea16dd9e58489fd", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/lesson-materials-api/index.ts:4"}, "properties": {"repobilityId": "7acd6117642fb871", "scanner": "scanner-primary", "fingerprint": "9ea16dd9e58489fd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dd8270b1e8ba9a76", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/oauth-google-callback/index.ts:278"}, "properties": {"repobilityId": "12011fce16d56707", "scanner": "scanner-primary", "fingerprint": "dd8270b1e8ba9a76", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1bf33a85110e81af", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/oauth-google-callback/index.ts:171"}, "properties": {"repobilityId": "d494984ea0561cfc", "scanner": "scanner-primary", "fingerprint": "1bf33a85110e81af", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3b312ecc03590a66", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/email-verify/index.ts:106"}, "properties": {"repobilityId": "c33d4884766cc85d", "scanner": "scanner-primary", "fingerprint": "3b312ecc03590a66", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-45e5caece2c2838a", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/tutor-account/index.ts:124"}, "properties": {"repobilityId": "b433803ffa4d10e3", "scanner": "scanner-primary", "fingerprint": "45e5caece2c2838a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6a4e4ec68196b32b", "level": "none", "message": {"text": "Commented-code block (11 lines) in supabase/functions/telegram-bot/index.ts:1480"}, "properties": {"repobilityId": "3ff7f4ef3d6977c8", "scanner": "scanner-primary", "fingerprint": "6a4e4ec68196b32b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3a4b706aeeabf237", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/telegram-bot/index.ts:475"}, "properties": {"repobilityId": "eb087e5f797c7f30", "scanner": "scanner-primary", "fingerprint": "3a4b706aeeabf237", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b196d1d6f9d060ba", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/auth-email-hook/index.ts:44"}, "properties": {"repobilityId": "c55d9514849ec462", "scanner": "scanner-primary", "fingerprint": "b196d1d6f9d060ba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6b67f91130241c93", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/_shared/image-domains.ts:1"}, "properties": {"repobilityId": "d189c5dc86b9d1c4", "scanner": "scanner-primary", "fingerprint": "6b67f91130241c93", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e99dd02d64a98bf4", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/_shared/student-progress-build.ts:263"}, "properties": {"repobilityId": "ea95e6e3150b1701", "scanner": "scanner-primary", "fingerprint": "e99dd02d64a98bf4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fd0200af34260144", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/_shared/push-sender.ts:314"}, "properties": {"repobilityId": "970c8850249272ab", "scanner": "scanner-primary", "fingerprint": "fd0200af34260144", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f274a08f8fa9b719", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/_shared/subscription-limits.ts:3"}, "properties": {"repobilityId": "65d74cad0a814874", "scanner": "scanner-primary", "fingerprint": "f274a08f8fa9b719", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d9c8adbab6dd3b9b", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/_shared/mock-exam-part1-checker.ts:161"}, "properties": {"repobilityId": "f9df4115d3bd47b2", "scanner": "scanner-primary", "fingerprint": "d9c8adbab6dd3b9b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-df6c84f362d942f0", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/_shared/mock-exam-prompts.ts:252"}, "properties": {"repobilityId": "67b2ecc4fc79f2cc", "scanner": "scanner-primary", "fingerprint": "df6c84f362d942f0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3011c8cb9aa17539", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/_shared/proxy-url.ts:52"}, "properties": {"repobilityId": "bf5f836d9754fff3", "scanner": "scanner-primary", "fingerprint": "3011c8cb9aa17539", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8a8c3290fdfc3f37", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/_shared/subject-rubrics/index.ts:66"}, "properties": {"repobilityId": "37de1c0d9c4d2573", "scanner": "scanner-primary", "fingerprint": "8a8c3290fdfc3f37", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-254f6a6b5175c9d4", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/_shared/subject-rubrics/languages-ege.ts:206"}, "properties": {"repobilityId": "667a65606f98881e", "scanner": "scanner-primary", "fingerprint": "254f6a6b5175c9d4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-beb38089a4aff4c5", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/_shared/subject-rubrics/cefr-detector.ts:26"}, "properties": {"repobilityId": "9df703aa66723ef7", "scanner": "scanner-primary", "fingerprint": "beb38089a4aff4c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7223a7d3e8577a51", "level": "none", "message": {"text": "Commented-code block (11 lines) in public/service-worker.js:67"}, "properties": {"repobilityId": "7e6f321eae9df43e", "scanner": "scanner-primary", "fingerprint": "7223a7d3e8577a51", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b2c188e88488ad76", "level": "none", "message": {"text": "Commented-code block (5 lines) in SokratAI/HomeworkResultsV2Mock.jsx:4"}, "properties": {"repobilityId": "11623824cfba0e0e", "scanner": "scanner-primary", "fingerprint": "b2c188e88488ad76", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3ef3faf77728ebd8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/registerServiceWorker.ts:3"}, "properties": {"repobilityId": "212328df2b17d8f9", "scanner": "scanner-primary", "fingerprint": "3ef3faf77728ebd8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-78dea1f224e73b00", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/App.tsx:32"}, "properties": {"repobilityId": "4ae894a399e20f90", "scanner": "scanner-primary", "fingerprint": "78dea1f224e73b00", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a1f375b562b5926f", "level": "note", "message": {"text": "Legacy-named symbol `fetch_catalog_tasks_v2` in src/integrations/supabase/types.ts:4040"}, "properties": {"repobilityId": "448fe48165a41040", "scanner": "scanner-primary", "fingerprint": "a1f375b562b5926f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-31f99fb733fe913e", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/TutorGuard.tsx:198"}, "properties": {"repobilityId": "2812c5fc12f0ab66", "scanner": "scanner-primary", "fingerprint": "31f99fb733fe913e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-98fd3c837378c461", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/AuthGuard.tsx:51"}, "properties": {"repobilityId": "60a4c54d1aa8aca1", "scanner": "scanner-primary", "fingerprint": "98fd3c837378c461", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-84c223916b6019ea", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/TutorTelegramLoginButton.tsx:123"}, "properties": {"repobilityId": "8264f8db32e5fc3d", "scanner": "scanner-primary", "fingerprint": "84c223916b6019ea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bfd1d551cc8b3348", "level": "none", "message": {"text": "Commented-code block (13 lines) in src/components/student/useMockExamAutoSave.ts:9"}, "properties": {"repobilityId": "b810c9587ca51723", "scanner": "scanner-primary", "fingerprint": "bfd1d551cc8b3348", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eb664df4bb0f3be2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/student/mock-exam/MarkdownTaskText.tsx:20"}, "properties": {"repobilityId": "1aa28859e87ad940", "scanner": "scanner-primary", "fingerprint": "eb664df4bb0f3be2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-822e464a0010f998", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/student/homework-problem/SubmitSheet.tsx:161"}, "properties": {"repobilityId": "32d0ed62a63d0c0e", "scanner": "scanner-primary", "fingerprint": "822e464a0010f998", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-644fc7d6c561b24f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/student/homework-problem/TaskImagesGallery.tsx:64"}, "properties": {"repobilityId": "b92ca68d9255877d", "scanner": "scanner-primary", "fingerprint": "644fc7d6c561b24f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0784d5f380c4e596", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/student/homework-problem/TaskImagesGallery.tsx:64"}, "properties": {"repobilityId": "eb7f2fc750c08353", "scanner": "scanner-primary", "fingerprint": "0784d5f380c4e596", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a0db454e3f46879c", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/components/student/homework-problem/StepIndicator.tsx:55"}, "properties": {"repobilityId": "873cd3703b293736", "scanner": "scanner-primary", "fingerprint": "a0db454e3f46879c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4fba2fc73d8b9d1e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/common/UserAvatar.tsx:54"}, "properties": {"repobilityId": "a193108c003f267a", "scanner": "scanner-primary", "fingerprint": "4fba2fc73d8b9d1e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7da4a1b04e60499e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/tutor/AddStudentDialog.tsx:95"}, "properties": {"repobilityId": "74a8e1b27e25bcf3", "scanner": "scanner-primary", "fingerprint": "7da4a1b04e60499e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-910e1abbf1815dc5", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/tutor/GuidedThreadViewer.tsx:146"}, "properties": {"repobilityId": "a5ef126df9c65ed1", "scanner": "scanner-primary", "fingerprint": "910e1abbf1815dc5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-691d3501bc779622", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/tutor/StudentCard.tsx:58"}, "properties": {"repobilityId": "e70886f8cbc8a67c", "scanner": "scanner-primary", "fingerprint": "691d3501bc779622", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0851a16243243a2b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/tutor/schedule/LessonMaterialsDrawer.tsx:1"}, "properties": {"repobilityId": "dc5c962addc1bc6a", "scanner": "scanner-primary", "fingerprint": "0851a16243243a2b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4418f220c07fdf05", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/tutor/schedule/PostLessonSheet.tsx:1"}, "properties": {"repobilityId": "80d9a9e8e7502a3e", "scanner": "scanner-primary", "fingerprint": "4418f220c07fdf05", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ac508adca6fcc42a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/tutor/schedule/ConfirmLessonsSheet.tsx:1"}, "properties": {"repobilityId": "d17dced5f9bd63f8", "scanner": "scanner-primary", "fingerprint": "ac508adca6fcc42a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0078fa27e5fd83a8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/tutor/schedule/LessonMaterialsPanel.tsx:5"}, "properties": {"repobilityId": "9c002b71a041d989", "scanner": "scanner-primary", "fingerprint": "0078fa27e5fd83a8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-06f0d3625e8fcf67", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/tutor/schedule/MonthIncomeStrip.tsx:8"}, "properties": {"repobilityId": "4638a3e361c66ad5", "scanner": "scanner-primary", "fingerprint": "06f0d3625e8fcf67", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e5f35c3cd83a98c2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/tutor/homework-create/HWTaskCard.tsx:905"}, "properties": {"repobilityId": "59e5c461583d59f6", "scanner": "scanner-primary", "fingerprint": "e5f35c3cd83a98c2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-223e244358fb9772", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/tutor/results/heatmapStyles.ts:5"}, "properties": {"repobilityId": "d7f6c9ce1b05f377", "scanner": "scanner-primary", "fingerprint": "223e244358fb9772", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e670f1244d9b8db", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/tutor/results/EditScoreDialog.tsx:35"}, "properties": {"repobilityId": "7c22933862de4f8d", "scanner": "scanner-primary", "fingerprint": "9e670f1244d9b8db", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a27398036a7cdaeb", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/components/tutor/students/LedgerFeed.tsx:25"}, "properties": {"repobilityId": "fcb3b9c8aec28321", "scanner": "scanner-primary", "fingerprint": "a27398036a7cdaeb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e67896ca08f1d821", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/tutor/students/ParentReportDialog.tsx:57"}, "properties": {"repobilityId": "fde35cea4daf51e0", "scanner": "scanner-primary", "fingerprint": "e67896ca08f1d821", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-56c314c09b49daa7", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/tutor/homework-reuse/SaveAsTemplateDialog.tsx:177"}, "properties": {"repobilityId": "d34ddd4e87bba1f2", "scanner": "scanner-primary", "fingerprint": "56c314c09b49daa7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a99fd94554cef7be", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/tutor/home/StudentsActivityBlock.tsx:198"}, "properties": {"repobilityId": "ac1fe6c68cda0f9c", "scanner": "scanner-primary", "fingerprint": "a99fd94554cef7be", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1ea7f261455d4ae9", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/tutor/home/primitives/ChatRow.tsx:32"}, "properties": {"repobilityId": "7bac36b59c85f876", "scanner": "scanner-primary", "fingerprint": "1ea7f261455d4ae9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bdb5ba25c1e8d968", "level": "none", "message": {"text": "Commented-code block (13 lines) in src/components/tutor/mock-exams/MockExamVariantPreviewSheet.tsx:7"}, "properties": {"repobilityId": "1a75e2918bf8c8a0", "scanner": "scanner-primary", "fingerprint": "bdb5ba25c1e8d968", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b8d22287ad64cfb5", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/components/tutor/mock-exams/Part1TaskDrillDownDialog.tsx:10"}, "properties": {"repobilityId": "39462545fea92f7a", "scanner": "scanner-primary", "fingerprint": "b8d22287ad64cfb5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0c0f9301c7d91972", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/tutor/mock-exams/mockHeatmapStyles.ts:12"}, "properties": {"repobilityId": "a0023ee9d38bdbd9", "scanner": "scanner-primary", "fingerprint": "0c0f9301c7d91972", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c84073f38566def3", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/tutor/mock-exams/LeadLinkSuccessDialog.tsx:9"}, "properties": {"repobilityId": "669e460f8f0d9d07", "scanner": "scanner-primary", "fingerprint": "c84073f38566def3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3258f774e1134680", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/components/tutor/mock-exams/MockExamHeatmap.tsx:10"}, "properties": {"repobilityId": "463dc6970018ee89", "scanner": "scanner-primary", "fingerprint": "3258f774e1134680", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a3c822ea3ca284a3", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/components/tutor/mock-exams/MockExamInviteLinksSection.tsx:8"}, "properties": {"repobilityId": "f8075a7f38a094fb", "scanner": "scanner-primary", "fingerprint": "a3c822ea3ca284a3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-71d8105139a8b7fe", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/tutor/profile/LoginProvidersSection.tsx:148"}, "properties": {"repobilityId": "7eb5325c3baf243e", "scanner": "scanner-primary", "fingerprint": "71d8105139a8b7fe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-215935ac25a7339e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/tutor/chrome/SideNav.tsx:82"}, "properties": {"repobilityId": "159fabfc29e68c3e", "scanner": "scanner-primary", "fingerprint": "215935ac25a7339e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-616e445b7af85705", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/homework/GuidedChatMessage.tsx:112"}, "properties": {"repobilityId": "ceb4b27df99b5399", "scanner": "scanner-primary", "fingerprint": "616e445b7af85705", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ec1b448c75888dcc", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/homework/CriteriaBreakdownTable.tsx:65"}, "properties": {"repobilityId": "be5ed121ae07ae43", "scanner": "scanner-primary", "fingerprint": "ec1b448c75888dcc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e76164d5ba5bbfcd", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/components/homework/GuidedHomeworkWorkspace.tsx:589"}, "properties": {"repobilityId": "ce96ea84e3d330d5", "scanner": "scanner-primary", "fingerprint": "e76164d5ba5bbfcd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-86c036ac628ff710", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/sections/tutor/SocialProof.tsx:252"}, "properties": {"repobilityId": "86163be4ce3744bb", "scanner": "scanner-primary", "fingerprint": "86c036ac628ff710", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-46c4fd16f9c294ff", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/kb/HWDrawer.tsx:258"}, "properties": {"repobilityId": "1d95bcae0758483c", "scanner": "scanner-primary", "fingerprint": "46c4fd16f9c294ff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a7a9f327de1dad8b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/subjectHelpers.ts:41"}, "properties": {"repobilityId": "1331eaabdd86a0af", "scanner": "scanner-primary", "fingerprint": "a7a9f327de1dad8b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-89384ab4e67557fc", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/lib/studentMockExamApi.ts:6"}, "properties": {"repobilityId": "de7949e63f1ec87f", "scanner": "scanner-primary", "fingerprint": "89384ab4e67557fc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d7c2727872f79150", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/homeworkTelemetry.ts:74"}, "properties": {"repobilityId": "4bf302c4ee9fec80", "scanner": "scanner-primary", "fingerprint": "d7c2727872f79150", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f08ae3ca37857944", "level": "note", "message": {"text": "Legacy-named symbol `pending_consent_v1` in src/lib/consent.ts:13"}, "properties": {"repobilityId": "ed4905ed2ced99dc", "scanner": "scanner-primary", "fingerprint": "f08ae3ca37857944", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8e22653024f3f8ea", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/mockExamPublicApi.ts:232"}, "properties": {"repobilityId": "e2d44f4a56406fea", "scanner": "scanner-primary", "fingerprint": "8e22653024f3f8ea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1297a2dfbb6c7c25", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/studentHomeworkApi.ts:109"}, "properties": {"repobilityId": "b6d74187df6221d0", "scanner": "scanner-primary", "fingerprint": "1297a2dfbb6c7c25", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e04276afb7a7332a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/studentHomeworkApi.ts:96"}, "properties": {"repobilityId": "5b1a032e5d23b1d8", "scanner": "scanner-primary", "fingerprint": "e04276afb7a7332a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9a15b9e809d11881", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/streamChat.ts:129"}, "properties": {"repobilityId": "eb4fd7fb6a2031c1", "scanner": "scanner-primary", "fingerprint": "9a15b9e809d11881", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aa38e9e1b6e873d6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/tutors.ts:860"}, "properties": {"repobilityId": "fe740cbfed9e5a0b", "scanner": "scanner-primary", "fingerprint": "aa38e9e1b6e873d6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ec79fa6abb445ac1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/studentScheduleApi.ts:6"}, "properties": {"repobilityId": "992559d24f97a3fc", "scanner": "scanner-primary", "fingerprint": "ec79fa6abb445ac1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f3d553d2b5c1b829", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/studentScheduleApi.ts:28"}, "properties": {"repobilityId": "a27047b1ce7ac119", "scanner": "scanner-primary", "fingerprint": "f3d553d2b5c1b829", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1d82db9f6b67e293", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/tutorHomeworkApi.ts:1167"}, "properties": {"repobilityId": "81e76cb77613b7c7", "scanner": "scanner-primary", "fingerprint": "1d82db9f6b67e293", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eb36b1a5b897f3e2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/supabaseClient.ts:5"}, "properties": {"repobilityId": "19f195baf73c90ba", "scanner": "scanner-primary", "fingerprint": "eb36b1a5b897f3e2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1ca1650236824d98", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/lessonMaterialsApi.ts:6"}, "properties": {"repobilityId": "022f5c88d2665e22", "scanner": "scanner-primary", "fingerprint": "1ca1650236824d98", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-41f8d4f19d79d8ab", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/lib/imageCompression.ts:66"}, "properties": {"repobilityId": "7581b5f143b06184", "scanner": "scanner-primary", "fingerprint": "41f8d4f19d79d8ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e649f2901a3b83cf", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/kbModeratorApi.ts:15"}, "properties": {"repobilityId": "22b9e5fb5751e291", "scanner": "scanner-primary", "fingerprint": "e649f2901a3b83cf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-746559873468fae6", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/lib/mockExamPart1Checker.ts:8"}, "properties": {"repobilityId": "d4c3e4eeb75375b9", "scanner": "scanner-primary", "fingerprint": "746559873468fae6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-01a1b6df8d5bf7d1", "level": "note", "message": {"text": "Legacy-named symbol `\u041c\u0435\u0445\u0430\u043d\u0438\u043a\u0430_v1` in src/lib/formulaEngine/egorFormulas.ts:6"}, "properties": {"repobilityId": "019cbfccf8f10c1a", "scanner": "scanner-primary", "fingerprint": "01a1b6df8d5bf7d1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-eaa907af77537aac", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/formulaEngine/questionGenerator.ts:11"}, "properties": {"repobilityId": "b2a6cf304e069fe8", "scanner": "scanner-primary", "fingerprint": "eaa907af77537aac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1cd51e5a5f8d4a42", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/pages/PublicMockInvite.tsx:6"}, "properties": {"repobilityId": "ac9a4d8903be2578", "scanner": "scanner-primary", "fingerprint": "1cd51e5a5f8d4a42", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5898b5415f1e32a7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/Chat.tsx:951"}, "properties": {"repobilityId": "0ceaf971f9aea062", "scanner": "scanner-primary", "fingerprint": "5898b5415f1e32a7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bda626ab7831d7c6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/Profile.tsx:233"}, "properties": {"repobilityId": "2763a1681652e843", "scanner": "scanner-primary", "fingerprint": "bda626ab7831d7c6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e20aa379de4a4b02", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/RegisterTutor.tsx:101"}, "properties": {"repobilityId": "05e979897a0c810d", "scanner": "scanner-primary", "fingerprint": "e20aa379de4a4b02", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a3ae4deebf56aadd", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/pages/TutorSignupTrial.tsx:218"}, "properties": {"repobilityId": "879874dd9e9ddcbd", "scanner": "scanner-primary", "fingerprint": "a3ae4deebf56aadd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3589ac445c2e3638", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pages/StudentHomeworkDetail.tsx:66"}, "properties": {"repobilityId": "55d2a65a2c209e66", "scanner": "scanner-primary", "fingerprint": "3589ac445c2e3638", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-205ae3896aaecc96", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pages/PublicMockResult.tsx:11"}, "properties": {"repobilityId": "f26db706545ae2ca", "scanner": "scanner-primary", "fingerprint": "205ae3896aaecc96", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1780c66c4fd13240", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/SignUp.tsx:140"}, "properties": {"repobilityId": "585e4bf130265ff8", "scanner": "scanner-primary", "fingerprint": "1780c66c4fd13240", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-19b1fda22a6b5710", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pages/student/HomeworkProblem.tsx:132"}, "properties": {"repobilityId": "8ad62b20a5593df0", "scanner": "scanner-primary", "fingerprint": "19b1fda22a6b5710", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-78f0e0022cce302b", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/pages/student/StudentMockExam.tsx:986"}, "properties": {"repobilityId": "ecb172f4020a0903", "scanner": "scanner-primary", "fingerprint": "78f0e0022cce302b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-02f833181ff6295c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/student/StudentMockExams.tsx:3"}, "properties": {"repobilityId": "603cd0fd15fc583a", "scanner": "scanner-primary", "fingerprint": "02f833181ff6295c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2f68deb4d39d4f72", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pages/student/StudentMockExamResult.tsx:6"}, "properties": {"repobilityId": "cbe466e08e779d04", "scanner": "scanner-primary", "fingerprint": "2f68deb4d39d4f72", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-49f5ced7ac6520c3", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pages/tutor/TutorHomeworkTemplates.tsx:53"}, "properties": {"repobilityId": "c9ec7b04e090d7da", "scanner": "scanner-primary", "fingerprint": "49f5ced7ac6520c3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0bc1e000c47f1430", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pages/tutor/TutorPayments.tsx:32"}, "properties": {"repobilityId": "c21c18a9df35c406", "scanner": "scanner-primary", "fingerprint": "0bc1e000c47f1430", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a82cea150c8a13a0", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/tutor/TutorHomeworkCreate.tsx:37"}, "properties": {"repobilityId": "b528873154425210", "scanner": "scanner-primary", "fingerprint": "a82cea150c8a13a0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-680a8c5d721176f6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/tutor/TutorHomework.tsx:35"}, "properties": {"repobilityId": "090eeb1226fa66c8", "scanner": "scanner-primary", "fingerprint": "680a8c5d721176f6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b342105fb8dfc3bb", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/pages/tutor/TutorHomeworkDetail.tsx:512"}, "properties": {"repobilityId": "de5513c5ee878332", "scanner": "scanner-primary", "fingerprint": "b342105fb8dfc3bb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e30146f8ab110dae", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pages/tutor/students/StudentsProgressOverview.tsx:13"}, "properties": {"repobilityId": "1fb59f3b1b74e704", "scanner": "scanner-primary", "fingerprint": "e30146f8ab110dae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b1f8e09f21945ec4", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/pages/tutor/mock-exams/TutorMockExams.tsx:8"}, "properties": {"repobilityId": "ad468375b5a8d462", "scanner": "scanner-primary", "fingerprint": "b1f8e09f21945ec4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-736f4f4e8e5fadbc", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/tutor/mock-exams/TutorMockExamCreate.tsx:8"}, "properties": {"repobilityId": "026c49923c71d979", "scanner": "scanner-primary", "fingerprint": "736f4f4e8e5fadbc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e1798b8b182c6b96", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/pages/tutor/mock-exams/TutorMockExamReview.tsx:3"}, "properties": {"repobilityId": "53690f1692822a79", "scanner": "scanner-primary", "fingerprint": "e1798b8b182c6b96", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2969088a1cbc0b21", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/tutor/mock-exams/TutorMockExamDetail.tsx:3"}, "properties": {"repobilityId": "448ad8be2026d0b8", "scanner": "scanner-primary", "fingerprint": "2969088a1cbc0b21", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-553bc6b4cff17092", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/hooks/useMockExamAssignment.ts:31"}, "properties": {"repobilityId": "a1ea21d0d7793883", "scanner": "scanner-primary", "fingerprint": "553bc6b4cff17092", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2e236c17fbae0614", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/hooks/useTutorStudentActivity.ts:155"}, "properties": {"repobilityId": "dcd21e4dc968047c", "scanner": "scanner-primary", "fingerprint": "2e236c17fbae0614", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6ddb95db109ccf3c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/hooks/useSubmitSolution.ts:31"}, "properties": {"repobilityId": "338cb20a89770485", "scanner": "scanner-primary", "fingerprint": "6ddb95db109ccf3c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c4c848b533c23d11", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/hooks/useStudentMockExamResult.ts:56"}, "properties": {"repobilityId": "5b1d41557c8b5a0b", "scanner": "scanner-primary", "fingerprint": "c4c848b533c23d11", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b89df0b42c2a5714", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useNetworkStatus.ts:52"}, "properties": {"repobilityId": "cf167348abc3c15c", "scanner": "scanner-primary", "fingerprint": "b89df0b42c2a5714", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2996b69fb58f6874", "level": "note", "message": {"text": "Legacy-named symbol `fetch_catalog_tasks_v2` in src/hooks/useKnowledgeBase.ts:77"}, "properties": {"repobilityId": "0b4d20cd959a1421", "scanner": "scanner-primary", "fingerprint": "2996b69fb58f6874", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-dfa09ce7a864a2fc", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/hooks/useUserIdentities.ts:55"}, "properties": {"repobilityId": "966220ec807de05f", "scanner": "scanner-primary", "fingerprint": "dfa09ce7a864a2fc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-02f706d8a2e7bd89", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/hooks/useTutorHomeData.ts:85"}, "properties": {"repobilityId": "902d5c96d97945b3", "scanner": "scanner-primary", "fingerprint": "02f706d8a2e7bd89", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7f1bec1fd65c0879", "level": "warning", "message": {"text": "Frontend route `/reset-password` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "934747c714145754", "scanner": "scanner-primary", "fingerprint": "7f1bec1fd65c0879", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6cbf0d2dc1b6508c", "level": "warning", "message": {"text": "Frontend route `/homework/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "9715af196216b53b", "scanner": "scanner-primary", "fingerprint": "6cbf0d2dc1b6508c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f9b069cf73f645b8", "level": "warning", "message": {"text": "Frontend route `/student/homework/:hwId/problem/:taskId` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "f9c6c16d13fb78aa", "scanner": "scanner-primary", "fingerprint": "f9b069cf73f645b8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c9e2f4cc73251cde", "level": "warning", "message": {"text": "Frontend route `/student/schedule/:lessonId` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "89c91e6239ff07f1", "scanner": "scanner-primary", "fingerprint": "c9e2f4cc73251cde", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d727c2fa5b4d7978", "level": "warning", "message": {"text": "Frontend route `/student/mock-exams/:id/result` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "4d6bcc793342cf4d", "scanner": "scanner-primary", "fingerprint": "d727c2fa5b4d7978", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ab9db712022bfd6b", "level": "warning", "message": {"text": "Frontend route `/student/mock-exams/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "9874c4732890e400", "scanner": "scanner-primary", "fingerprint": "ab9db712022bfd6b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6db0055b34958619", "level": "warning", "message": {"text": "Frontend route `/p/mock-invite/:slug` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "a555f808d75f8995", "scanner": "scanner-primary", "fingerprint": "6db0055b34958619", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b9110dd08714038a", "level": "warning", "message": {"text": "Frontend route `/p/mock-result/:slug` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "97a872ba3bee1a85", "scanner": "scanner-primary", "fingerprint": "b9110dd08714038a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6ee8c30419e7ef41", "level": "warning", "message": {"text": "Frontend route `/p/report/:slug` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "260e68b7fc437ace", "scanner": "scanner-primary", "fingerprint": "6ee8c30419e7ef41", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-33b8bdeb15f0a585", "level": "warning", "message": {"text": "Frontend route `/p/:slug` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "49a6be41a6aeca02", "scanner": "scanner-primary", "fingerprint": "33b8bdeb15f0a585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ad0a932c33ea5f15", "level": "warning", "message": {"text": "Frontend route `/trainer` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "96d73a499143ced8", "scanner": "scanner-primary", "fingerprint": "ad0a932c33ea5f15", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4e198c6b17b71328", "level": "warning", "message": {"text": "Frontend route `/miniapp` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "2253b36d53886241", "scanner": "scanner-primary", "fingerprint": "4e198c6b17b71328", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4a63af6126c5d77c", "level": "warning", "message": {"text": "Frontend route `/miniapp/solution/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "f9a1b56552698cf1", "scanner": "scanner-primary", "fingerprint": "4a63af6126c5d77c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3d47341344301241", "level": "warning", "message": {"text": "Frontend route `/admin` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "3060fc2a800f6a3c", "scanner": "scanner-primary", "fingerprint": "3d47341344301241", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-930256c88f43a86f", "level": "warning", "message": {"text": "Frontend route `/retention-analysis` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "a2e697b00e085edf", "scanner": "scanner-primary", "fingerprint": "930256c88f43a86f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7bc5a7aa514c1edd", "level": "warning", "message": {"text": "Frontend route `/tutor` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "ce121f603189ea9e", "scanner": "scanner-primary", "fingerprint": "7bc5a7aa514c1edd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-27525ec45210c5d4", "level": "warning", "message": {"text": "Frontend route `home` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "50b7a7b087335cfe", "scanner": "scanner-primary", "fingerprint": "27525ec45210c5d4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cef386312d50c26d", "level": "warning", "message": {"text": "Frontend route `dashboard` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "7176b9e63e301c9b", "scanner": "scanner-primary", "fingerprint": "cef386312d50c26d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-001baaf21927e532", "level": "warning", "message": {"text": "Frontend route `schedule` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "9db9331a8a190a38", "scanner": "scanner-primary", "fingerprint": "001baaf21927e532", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fe417df543c07af9", "level": "warning", "message": {"text": "Frontend route `students` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "b3a7864bd7efe69f", "scanner": "scanner-primary", "fingerprint": "fe417df543c07af9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8369326f80e3d196", "level": "warning", "message": {"text": "Frontend route `students/:tutorStudentId/progress` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "d7021252ca83e6a7", "scanner": "scanner-primary", "fingerprint": "8369326f80e3d196", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f2a29606b67a1c1e", "level": "warning", "message": {"text": "Frontend route `students/:tutorStudentId` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "522b4373e76d18ca", "scanner": "scanner-primary", "fingerprint": "f2a29606b67a1c1e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a8d0c9b0ace55e37", "level": "warning", "message": {"text": "Frontend route `payments` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "bc74077fcf9e1a4f", "scanner": "scanner-primary", "fingerprint": "a8d0c9b0ace55e37", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-11feb210c2f50b50", "level": "warning", "message": {"text": "Frontend route `profile` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "96c44ef5fce161fb", "scanner": "scanner-primary", "fingerprint": "11feb210c2f50b50", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-88402d345d90c066", "level": "warning", "message": {"text": "Frontend route `homework/templates` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "c175a33ed0cf465f", "scanner": "scanner-primary", "fingerprint": "88402d345d90c066", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6af7b156e5c74bc7", "level": "warning", "message": {"text": "Frontend route `homework/create` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "1c7f1b5d8027ea0e", "scanner": "scanner-primary", "fingerprint": "6af7b156e5c74bc7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4ac8e7b14a0ce380", "level": "warning", "message": {"text": "Frontend route `homework/:id/edit` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "aa5ce0f648395e88", "scanner": "scanner-primary", "fingerprint": "4ac8e7b14a0ce380", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-de48742bcaca2279", "level": "warning", "message": {"text": "Frontend route `homework/:id/preview` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "c6cc721a402fb0b9", "scanner": "scanner-primary", "fingerprint": "de48742bcaca2279", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-be491add49ab7fc4", "level": "warning", "message": {"text": "Frontend route `homework/:id/results` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "8ef52ce6e8e694e9", "scanner": "scanner-primary", "fingerprint": "be491add49ab7fc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-28f98f7d4c708861", "level": "warning", "message": {"text": "Frontend route `homework/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "8fc4bb384485778e", "scanner": "scanner-primary", "fingerprint": "28f98f7d4c708861", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-43df1d2b3c3fe2db", "level": "warning", "message": {"text": "Frontend route `homework` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "d6cb180f05cd9241", "scanner": "scanner-primary", "fingerprint": "43df1d2b3c3fe2db", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8793560e1b0480b9", "level": "warning", "message": {"text": "Frontend route `mock-exams/new` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "d0477a4cabe84ab0", "scanner": "scanner-primary", "fingerprint": "8793560e1b0480b9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-88d85e5a18a2febe", "level": "warning", "message": {"text": "Frontend route `mock-exams/:id/review/:studentId` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "b0800d30f584eefb", "scanner": "scanner-primary", "fingerprint": "88d85e5a18a2febe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-721b2c44aeea749a", "level": "warning", "message": {"text": "Frontend route `mock-exams/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "cabec7c7b6d247a9", "scanner": "scanner-primary", "fingerprint": "721b2c44aeea749a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-74c158e2b33b5962", "level": "warning", "message": {"text": "Frontend route `mock-exams` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "a461b42efcacd55b", "scanner": "scanner-primary", "fingerprint": "74c158e2b33b5962", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a49c2b061a44e4d7", "level": "warning", "message": {"text": "Frontend route `assistant` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "1e5ceaf95ac71668", "scanner": "scanner-primary", "fingerprint": "a49c2b061a44e4d7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-51499f5efdb5692c", "level": "warning", "message": {"text": "Frontend route `knowledge/topic/:topicId` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "e951c8eeeee2e514", "scanner": "scanner-primary", "fingerprint": "51499f5efdb5692c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c572c119e5fdca97", "level": "warning", "message": {"text": "Frontend route `knowledge/folder/:folderId` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "60d9864a3569136b", "scanner": "scanner-primary", "fingerprint": "c572c119e5fdca97", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d4605c937c150b17", "level": "warning", "message": {"text": "Frontend route `knowledge` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "a30166d141ea1b7f", "scanner": "scanner-primary", "fingerprint": "d4605c937c150b17", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4981be79e8b50a1e", "level": "warning", "message": {"text": "Frontend route `/book/:bookingLink` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "064e271b9a99ee2c", "scanner": "scanner-primary", "fingerprint": "4981be79e8b50a1e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7f0f564db75b3338", "level": "warning", "message": {"text": "Frontend route `/invite/:inviteCode` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "5dd2a1b01b873ec5", "scanner": "scanner-primary", "fingerprint": "7f0f564db75b3338", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0ee297dfdaea62bb", "level": "warning", "message": {"text": "Frontend route `/install` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "f9f23fa193deedab", "scanner": "scanner-primary", "fingerprint": "0ee297dfdaea62bb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}]}]}