{"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-85412bdb4e9c8f39", "name": "Possibly dead Python function: find_match_with_ai", "shortDescription": {"text": "Possibly dead Python function: find_match_with_ai"}, "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-856bc20d6e911a8f", "name": "Possibly dead Python function: matrix_replace", "shortDescription": {"text": "Possibly dead Python function: matrix_replace"}, "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-2da57025f2ce9e13", "name": "Possibly dead Python function: log_progress", "shortDescription": {"text": "Possibly dead Python function: log_progress"}, "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-06b6f7f51871580a", "name": "Stray `console.log` in TS/JS \u2014 scripts/fix-problem3-crop.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-problem3-crop.js:11"}, "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-c1fef1404006bbd5", "name": "Stray `console.log` in TS/JS \u2014 scripts/recover-singok-orphans.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/recover-singok-orphans.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-dd680110e39e72a7", "name": "Stray `console.log` in TS/JS \u2014 scripts/build-seed-sql.ts:152", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-seed-sql.ts:152"}, "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-878e44b4278e84ef", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-figures.js:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-figures.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-fc315530b3324cf2", "name": "Stray `console.log` in TS/JS \u2014 scripts/apply-seed-to-supabase.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/apply-seed-to-supabase.ts:38"}, "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-1b4de59bb3b765eb", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-render-repair.ts:68", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-render-repair.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-7691c4afb7a85b4c", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-proxy.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-proxy.js:10"}, "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-01252acddbb1c8d0", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-figures5.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-figures5.js:8"}, "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-9dd0696323566a40", "name": "Stray `console.log` in TS/JS \u2014 scripts/reclassify-all-orphans.ts:118", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/reclassify-all-orphans.ts:118"}, "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-09644f26f8bfe874", "name": "Stray `console.log` in TS/JS \u2014 scripts/reclassify-science.js:118", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/reclassify-science.js:118"}, "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-1369285602fb56a1", "name": "Stray `console.log` in TS/JS \u2014 scripts/generate-expanded-types.ts:297", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-expanded-types.ts:297"}, "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-1586880174fa3abc", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-glm-classify.ts:127", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-glm-classify.ts:127"}, "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-06adf772d8996b1e", "name": "Stray `console.log` in TS/JS \u2014 scripts/audit-recent-exams.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-recent-exams.ts:34"}, "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-b9527cf1090454a5", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate-repair-existing-broken-latex.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-repair-existing-broken-latex.ts:20"}, "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-e9974e0647e5097f", "name": "Stray `console.log` in TS/JS \u2014 scripts/export-obsidian-students.ts:138", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/export-obsidian-students.ts:138"}, "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-404baa95df5b7ef0", "name": "Stray `console.log` in TS/JS \u2014 scripts/scan-all-orphan-codes.ts:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/scan-all-orphan-codes.ts:21"}, "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-06007240b5cc0201", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-figures4.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-figures4.js:9"}, "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-bfab0d08f3dd320f", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-db-state.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-db-state.ts:18"}, "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-3c03f89dd1d79776", "name": "Stray `console.log` in TS/JS \u2014 scripts/find-bad-difficulty.ts:52", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/find-bad-difficulty.ts:52"}, "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-35d3f6f52d5c9da1", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-glm-detect.ts:116", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-glm-detect.ts:116"}, "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-789a5dff1b6e43ab", "name": "Stray `console.log` in TS/JS \u2014 scripts/fix-p17.js:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-p17.js:18"}, "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-9e44599c0c13ae40", "name": "Stray `console.log` in TS/JS \u2014 scripts/find-orphan-uploads.ts:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/find-orphan-uploads.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-816273e01eb8ad70", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-figures7.js:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-figures7.js:20"}, "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-3c3c3f7ea29c6921", "name": "Stray `console.log` in TS/JS \u2014 scripts/export-yolo-dataset.ts:101", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/export-yolo-dataset.ts:101"}, "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-fae593939d670dcc", "name": "Stray `console.log` in TS/JS \u2014 scripts/inspect-sangdang.ts:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/inspect-sangdang.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-0365f4e456c2c520", "name": "Stray `console.log` in TS/JS \u2014 scripts/extract-bible-solutions.ts:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/extract-bible-solutions.ts:16"}, "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-883753d4d79fb936", "name": "Stray `console.log` in TS/JS \u2014 scripts/dump-problem-10.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/dump-problem-10.ts:31"}, "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-8c18325eb62f5979", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-two-stage-classify.ts:80", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-two-stage-classify.ts:80"}, "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-aa5d6fb108996912", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-exam-classification.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-exam-classification.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-37f938a57b239856", "name": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-sangdang-orphan.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-sangdang-orphan.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-63448ef0a68470d7", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-glm-graph.ts:181", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-glm-graph.ts:181"}, "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-7d77f7e5dde85fd4", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-figures2.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-figures2.js:10"}, "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-ab21ba8d407fd7f2", "name": "Stray `console.log` in TS/JS \u2014 scripts/fix-haegang-3-1.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-haegang-3-1.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-528a7191a55c73af", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-figures8.js:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-figures8.js:17"}, "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-1da14657a0fd59ca", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-upscaled.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-upscaled.js:8"}, "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-6a789ee56224543a", "name": "Stray `console.log` in TS/JS \u2014 scripts/fix-p20.js:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-p20.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-258ceb26aaeb3354", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-crop-mapping.js:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-crop-mapping.js: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-6a10b61e21c4866b", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-mathsecr-types.ts:104", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-mathsecr-types.ts:104"}, "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-bfbcc01b2b69f93d", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-figures3.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-figures3.js:11"}, "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-ca34728d41abb1db", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-glm-graph-full.ts:115", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-glm-graph-full.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-58754ee260a0f3bf", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-title-detect.ts:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-title-detect.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-4d0b345dd5fa0859", "name": "Stray `console.log` in TS/JS \u2014 scripts/reclassify-haegang.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/reclassify-haegang.ts:34"}, "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-31846f73d89f12ec", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-figures6.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-figures6.js:8"}, "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-2401aa4d2c11ec0c", "name": "Stray `console.log` in TS/JS \u2014 scripts/fix-upscaled-urls.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-upscaled-urls.js:16"}, "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-33806f852c530e50", "name": "Stray `console.log` in TS/JS \u2014 scripts/clear-wrong-crop.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/clear-wrong-crop.js:8"}, "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-e87848fa4a205d46", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/BatchSolutionNotifier.tsx:140", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/BatchSolutionNotifier.tsx:140"}, "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-f08779e7aecaa6da", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/exam/AnswerMatchModal.tsx:476", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/exam/AnswerMatchModal.tsx:476"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-362898032e839f46", "name": "Stray `console.log` in TS/JS \u2014 src/components/exam/AnswerMatchModal.tsx:231", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/exam/AnswerMatchModal.tsx:231"}, "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-0433da54b4c48177", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/exam/DeployExamModal.tsx:145", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/exam/DeployExamModal.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-71bccd70182b980c", "name": "Stray `console.log` in TS/JS \u2014 src/components/shared/InlineDesmosGraph.tsx:156", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/shared/InlineDesmosGraph.tsx:156"}, "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-4d05b799b9f155a4", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/shared/InlineDesmosGraph.tsx:421", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/shared/InlineDesmosGraph.tsx:421"}, "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-834223d978b7d38a", "name": "Stray `console.log` in TS/JS \u2014 src/components/shared/MixedContentRenderer.tsx:149", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/shared/MixedContentRenderer.tsx:149"}, "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-3eb2f20dfd93946e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/shared/MixedContentRenderer.tsx:36", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/shared/MixedContentRenderer.tsx:36"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b53c9ba50dc3d68c", "name": "Stray `console.log` in TS/JS \u2014 src/components/shared/FigureRenderer.tsx:220", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/shared/FigureRenderer.tsx:220"}, "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-6678fd4e4be91a13", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/shared/FigureRenderer.tsx:258", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/shared/FigureRenderer.tsx:258"}, "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-c34602621f9e5829", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/shared/MathRenderer.tsx:115", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/shared/MathRenderer.tsx:115"}, "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-65ea9ae4b5c8af01", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/exam-create/SelectionTray.tsx:91", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/exam-create/SelectionTray.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-3e68d22a63992925", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/Sidebar.tsx:66", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/Sidebar.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-271ea5aadcc52816", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/prescription/StudentPitfallSummary.tsx:171", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/prescription/StudentPitfallSummary.tsx:171"}, "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-db9481233ef05c43", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/prescription/CreateSessionsModal.tsx:218", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/prescription/CreateSessionsModal.tsx:218"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e3303c5e6483b3d6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/prescription/WeeklyConnections.tsx:137", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/prescription/WeeklyConnections.tsx:137"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bc67fd6189025121", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/prescription/PrescriptionRecommendation.tsx:172", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/prescription/PrescriptionRecommendation.tsx:172"}, "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-388708ff5781e786", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/prescription/RecommendedProblems.tsx:136", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/prescription/RecommendedProblems.tsx:136"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f14dd9650ca95ab6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/students/StudentDetailContent.tsx:231", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/students/StudentDetailContent.tsx:231"}, "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-641d763d647b58c7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/class/StudentTreePanel.tsx:142", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/class/StudentTreePanel.tsx:142"}, "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-16fd18d323f47f65", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/class/StudentLearningReport.tsx:212", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/class/StudentLearningReport.tsx:212"}, "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-58a433ffd2939ba9", "name": "Stray `console.log` in TS/JS \u2014 src/components/editor/MathEditor.tsx:141", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/editor/MathEditor.tsx: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-7de1bfe6dd7677c2", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/editor/LaTeXInputModal.tsx:144", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/editor/LaTeXInputModal.tsx:144"}, "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-d81effc9b00b8157", "name": "Stray `console.log` in TS/JS \u2014 src/components/editor/modals/GraphModal.tsx:134", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/editor/modals/GraphModal.tsx:134"}, "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-54c5276afae57755", "name": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/components/editor/modals/GraphModal.tsx:", "shortDescription": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/components/editor/modals/GraphModal.tsx:524"}, "fullDescription": {"text": "React Flow edge labels render with a white rectangle behind the text by default, which scatters bright boxes across a dark canvas. Either drop the label, or override `.react-flow__edge-textbg` and `.react-flow__edge-text` in your stylesheet.\n\nWhy: P-H in CHECKLIST.md \u2014 vendor edge labels bleed white through a dark canvas.\nRule id: fq.edge-label.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ffbe25b24d9b2411", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/editor/modals/MathSymbolPicker.tsx:281", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/editor/modals/MathSymbolPicker.tsx:281"}, "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-57333bb460e03628", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/pdf/ExamTemplate.tsx:255", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/pdf/ExamTemplate.tsx:255"}, "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-cd8211148c1eb54e", "name": "Stray `console.log` in TS/JS \u2014 src/components/papers/ProblemEditModal.tsx:1120", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/papers/ProblemEditModal.tsx:1120"}, "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-d3ada243dda67c98", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/papers/MathsecrTreePicker.tsx:222", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/papers/MathsecrTreePicker.tsx:222"}, "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-44051196c17c2688", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/papers/DiagramBrowserModal.tsx:601", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/papers/DiagramBrowserModal.tsx:601"}, "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-5dd012aa02c3f09b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/papers/ExamStatsModal.tsx:365", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/papers/ExamStatsModal.tsx:365"}, "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-6abde7ccf3c3ecab", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/papers/ExamAnalyticsSidebar.tsx:122", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/papers/ExamAnalyticsSidebar.tsx:122"}, "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-e53f77d5916fba41", "name": "TODO/FIXME marker in shipping code \u2014 src/components/papers/TwinProblemModal.tsx:165", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/papers/TwinProblemModal.tsx:165"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cd1db2bc8edc772e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/grading/GradingSheetUpload.tsx:201", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/grading/GradingSheetUpload.tsx:201"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1879a8d915fb045f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/answer/[session_id]/page.tsx:209", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/answer/[session_id]/page.tsx:209"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-073841a641e919a3", "name": "TODO/FIXME marker in shipping code \u2014 src/app/student/analytics/page.tsx:34", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/student/analytics/page.tsx:34"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c27770ecfbdcb837", "name": "Stray `console.log` in TS/JS \u2014 src/app/student/analytics/page.tsx:56", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/student/analytics/page.tsx:56"}, "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-39dc662df865cc95", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/student/sessions/[id]/page.tsx:163", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/student/sessions/[id]/page.tsx:163"}, "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-89c24bcd8e44ed6b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/parent/[token]/page.tsx:234", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/parent/[token]/page.tsx:234"}, "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-9c00334390fdd1ac", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/print/session/[sessionId]/page.tsx:387", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/print/session/[sessionId]/page.tsx:387"}, "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-8790b27c84ce5a62", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/route.ts:217", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/route.ts:217"}, "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-e899e89d31ab594c", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/generate/route.ts:64", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/generate/route.ts:64"}, "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-5bcf412d57f0601b", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/[examId]/route.ts:361", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/[examId]/route.ts:361"}, "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-769610bb45d7d82f", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/[examId]/create-similar/route.ts:143", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/[examId]/create-similar/route.ts:143"}, "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-106de4634d6ae701", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/[examId]/match-answers/route.ts:91", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/[examId]/match-answers/route.ts:91"}, "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-a1519705580475be", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/[examId]/auto-fix/route.ts:79", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/[examId]/auto-fix/route.ts:79"}, "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-7c965161f1efd957", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/[examId]/sync-answers-from-solutions/route.ts:126", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/[examId]/sync-answers-from-solutions/route.ts:126"}, "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-48cb7b2453f5c401", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/[examId]/batch-solutions/route.ts:130", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/[examId]/batch-solutions/route.ts:130"}, "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-2a50c9328cb9194b", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/create-from-problems/route.ts:100", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/create-from-problems/route.ts:100"}, "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-9aeab2445a5a44ce", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/analytics/heatmap/route.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/analytics/heatmap/route.ts:31"}, "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-c87c022ce20968f6", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/sessions/[id]/complete/route.ts:68", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sessions/[id]/complete/route.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-43917fc7e4f73900", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/students/route.ts:238", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/students/route.ts:238"}, "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-0181b6e572188148", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/students/[studentId]/generate-recommended-session/route.ts:180", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/students/[studentId]/generate-recommended-session/route.ts:180"}, "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-e0e0f7e87bd8656e", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/vision/interpret/route.ts:71", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/vision/interpret/route.ts:71"}, "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-1c9abff8741ac04b", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/admin/users/backfill-names/route.ts:101", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/admin/users/backfill-names/route.ts:101"}, "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-a1ed0222bb2eb17b", "name": "TODO/FIXME marker in shipping code \u2014 src/app/api/admin/reocr-points/route.ts:96", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/admin/reocr-points/route.ts:96"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5d406e7245bafce1", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/admin/reocr-points/route.ts:233", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/admin/reocr-points/route.ts:233"}, "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-ec8fdf4d93caff31", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/detect-problems-yolo/route.ts:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/detect-problems-yolo/route.ts: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-406c0e9ab0bb4ed8", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/upload/route.ts:190", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/upload/route.ts:190"}, "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-0f83b116e911acfa", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/detect-problems/route.ts:96", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/detect-problems/route.ts: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-9b72116aacb30a19", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/upload-science-perproblem/route.ts:124", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/upload-science-perproblem/route.ts:124"}, "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-8a52b6dabfa1ff87", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/upload-science-gemini/route.ts:112", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/upload-science-gemini/route.ts:112"}, "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-ceda6daa211ef1b7", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/reanalyze-crop/route.ts:70", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/reanalyze-crop/route.ts:70"}, "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-3778089e53c6aea4", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/detect-from-ocr/route.ts:90", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/detect-from-ocr/route.ts:90"}, "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-a88b1bb3b79c1f18", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/detect-figures-gpt/route.ts:150", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/detect-figures-gpt/route.ts:150"}, "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-cd4acec83fe6ae21", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/pdf-proxy/route.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/pdf-proxy/route.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-89a3ad1ff9efa8a6", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/twin/route.ts:91", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/twin/route.ts:91"}, "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-57aeca8640a2d739", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/session-results/route.ts:186", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/session-results/route.ts:186"}, "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-077d10df1e72d5ec", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/diagram-images/route.ts:212", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/diagram-images/route.ts:212"}, "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-818f14f5fe3ffc47", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/diagram-images/upload/route.ts:74", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/diagram-images/upload/route.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-8c3f57dce4f2f49d", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/share/exam/[token]/route.ts:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/share/exam/[token]/route.ts:33"}, "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-3cf5c03f1ea51787", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/figure-corrections/route.ts:124", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/figure-corrections/route.ts:124"}, "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-d6952c2d5f1d6f97", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/problems/route.ts:144", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/problems/route.ts:144"}, "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-55247c7876db096d", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/problems/[problemId]/route.ts:84", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/problems/[problemId]/route.ts:84"}, "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-35fe9c033e6f9d1d", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/problems/[problemId]/update-figure/route.ts:92", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/problems/[problemId]/update-figure/route.ts:92"}, "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-663b2d87cf066f06", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/problems/[problemId]/delete-figure/route.ts:55", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/problems/[problemId]/delete-figure/route.ts:55"}, "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-25c7a2a0bcb66ac0", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/problems/[problemId]/generate-solution/route.ts:437", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/problems/[problemId]/generate-solution/route.ts:437"}, "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-d67f204374d7d0f9", "name": "TODO/FIXME marker in shipping code \u2014 src/app/api/problems/[problemId]/generate-figure/route.ts:17", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/problems/[problemId]/generate-figure/route.ts:17"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7ef9698fa320bd76", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/problems/[problemId]/generate-figure/route.ts:82", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/problems/[problemId]/generate-figure/route.ts:82"}, "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-d6a9976a31ec0193", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/problems/[problemId]/reanalyze/route.ts:109", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/problems/[problemId]/reanalyze/route.ts:109"}, "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-4c1a9ef1d1d3b547", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/storage/upload-image/route.ts:65", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/storage/upload-image/route.ts:65"}, "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-bbcdb38d003913a4", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/export/hwpx/route.ts:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/export/hwpx/route.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-451f0c5f4512ee0c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/shared/chat/page.tsx:95", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/shared/chat/page.tsx:95"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-23ba8b22c31cd058", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/page.tsx:280", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/page.tsx:280"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-16f43589db0e815b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/similar/page.tsx:419", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/similar/page.tsx:419"}, "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-0e0a3b776a039467", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/exam-create/page.tsx:726", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/exam-create/page.tsx:726"}, "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-603b5dbd8bbe7913", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/prescription/page.tsx:719", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/prescription/page.tsx:719"}, "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-156cb042216584c1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/prescription/report/page.tsx:209", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/prescription/report/page.tsx:209"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a6599c82f9387d8c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/cloud/CloudListClient.tsx:275", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/cloud/CloudListClient.tsx:275"}, "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-2d0079f0de27e610", "name": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/cloud/CloudListClient.tsx:2628", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/cloud/CloudListClient.tsx:2628"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3b74dafb21518048", "name": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/cloud/CloudListClient.tsx:1040", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/cloud/CloudListClient.tsx:1040"}, "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-0ba3ee885e98bef6", "name": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/cloud/[examId]/page.tsx:821", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/cloud/[examId]/page.tsx:821"}, "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-8cc6b527bcac2692", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/cloud/folder-import/page.tsx:482", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/cloud/folder-import/page.tsx:482"}, "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-376c33ecf387ef64", "name": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/repository/page.tsx:401", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/repository/page.tsx:401"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-69f7bf243afa8213", "name": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/repository/page.tsx:402", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/repository/page.tsx:402"}, "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-4d8220ae0bb3a25f", "name": "\"active\" state uses light bg in a dark theme \u2014 src/app/dashboard/repository/page.tsx:340", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/app/dashboard/repository/page.tsx:340"}, "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-366932e809899432", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/repository/editor/page.tsx:67", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/repository/editor/page.tsx:67"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-30fa2de27255a221", "name": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/repository/editor/page.tsx:103", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/repository/editor/page.tsx: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-f1de872f2c0a190d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/assignments/page.tsx:354", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/assignments/page.tsx:354"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e92d7fb6565dd33d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/corrections/page.tsx:174", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/corrections/page.tsx:174"}, "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-f67602da1fa48267", "name": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/workflow/page.tsx:143", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/workflow/page.tsx:143"}, "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-1c7b30ece12a10e2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/workflow/analyze/[jobId]/page.tsx:2179", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/workflow/analyze/[jobId]/page.tsx:2179"}, "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-1f797e6d1a4eb79d", "name": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/workflow/analyze/[jobId]/page.tsx:986", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/workflow/analyze/[jobId]/page.tsx:986"}, "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-a2b05b27e5042982", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/create/page.tsx:242", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/create/page.tsx:242"}, "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-65f062252272d842", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/materials/page.tsx:343", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/materials/page.tsx:343"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e9afd537ed91d34c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/materials/diagrams/DiagramsClient.tsx:432", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/materials/diagrams/DiagramsClient.tsx:432"}, "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-3f5b71e19b8ad751", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/exam-management/page.tsx:195", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/exam-management/page.tsx:195"}, "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-12d4387697da1731", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/dashboard/exam-management/page.tsx:1757", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/dashboard/exam-management/page.tsx:1757"}, "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-fd6004e4dd5a795d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/reports/aggregate/page.tsx:971", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/reports/aggregate/page.tsx:971"}, "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-557dbfaf320f4a25", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/skills/page.tsx:189", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/skills/page.tsx:189"}, "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-c6e559fa27f4197f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/editor/page.tsx:304", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/editor/page.tsx:304"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8b8722d7e096bb79", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/exam-analysis/[examId]/students/[studentId]/page.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/exam-analysis/[examId]/students/[studentId]/page.tsx:446"}, "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-b8bf76ee0bc7169e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/papers/page.tsx:376", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/papers/page.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-33294903536bfeea", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/grading/page.tsx:432", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/grading/page.tsx:432"}, "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-9e1d4de8c09b9e0c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/tutor/analytics/page.tsx:326", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/tutor/analytics/page.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-eebaeb94f6c15170", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/tutor/classes/[id]/page.tsx:269", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/tutor/classes/[id]/page.tsx:269"}, "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-176456a4a891e051", "name": "TODO/FIXME marker in shipping code \u2014 src/app/tutor/workflow/page.tsx:140", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/tutor/workflow/page.tsx:140"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ac86226b6382afde", "name": "Stray `console.log` in TS/JS \u2014 src/app/tutor/workflow/page.tsx:61", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/tutor/workflow/page.tsx:61"}, "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-f8f403db10f89e1d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/grade/[session_id]/page.tsx:302", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/grade/[session_id]/page.tsx:302"}, "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-1270778b022a5fc8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/answer-fix/page.tsx:242", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/answer-fix/page.tsx:242"}, "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-6376897fd3673716", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/share/student-report/[token]/page.tsx:286", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/share/student-report/[token]/page.tsx:286"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d514075bd9a408d6", "name": "Stray `console.log` in TS/JS \u2014 src/app/editor/page.tsx:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/editor/page.tsx:34"}, "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-2222eede7b3bbf5b", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/api/analytics.ts:166", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/api/analytics.ts:166"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-41d6f56a4438da50", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/api/grading.ts:161", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/api/grading.ts:161"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-22db15fd36b82ad1", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/utils/sanitize-svg.ts:2", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/utils/sanitize-svg.ts:2"}, "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-9252610312ddd8fd", "name": "Stray `console.log` in TS/JS \u2014 src/lib/utils/auto-folder.ts:91", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/utils/auto-folder.ts:91"}, "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-958fa518d5f57097", "name": "Stray `console.log` in TS/JS \u2014 src/lib/vision/image-upscaler.ts:214", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/vision/image-upscaler.ts:214"}, "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-5ff74afdd019d04e", "name": "Stray `console.log` in TS/JS \u2014 src/lib/vision/image-interpreter.ts:522", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/vision/image-interpreter.ts:522"}, "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-39f93f846a5ff823", "name": "Stray `console.log` in TS/JS \u2014 src/lib/vision/figure-renderer.ts:711", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/vision/figure-renderer.ts:711"}, "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-b7355aa7d6b5c11b", "name": "Stray `console.log` in TS/JS \u2014 src/lib/vision/visual-prompting.ts:129", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/vision/visual-prompting.ts:129"}, "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-39296964d45a6ac0", "name": "Stray `console.log` in TS/JS \u2014 src/lib/workflow/classify.ts:222", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/workflow/classify.ts:222"}, "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-77d4cdd9c3a20b7e", "name": "Stray `console.log` in TS/JS \u2014 src/lib/workflow/cloud-flow.ts:128", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/workflow/cloud-flow.ts:128"}, "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-a036a40db010ac07", "name": "Stray `console.log` in TS/JS \u2014 src/lib/workflow/science-gemini-flow.ts:118", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/workflow/science-gemini-flow.ts:118"}, "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-7a0c15f22040eb29", "name": "Stray `console.log` in TS/JS \u2014 src/lib/workflow/twin-generator.ts:469", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/workflow/twin-generator.ts:469"}, "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-6428226db751fab4", "name": "Stray `console.log` in TS/JS \u2014 src/lib/workflow/hwp-converter.ts:64", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/workflow/hwp-converter.ts:64"}, "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-a47622ee07cc1742", "name": "Stray `console.log` in TS/JS \u2014 src/lib/image-pipeline/workflow-integration.ts:60", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/image-pipeline/workflow-integration.ts:60"}, "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-fc518f9aa1f83135", "name": "Stray `console.log` in TS/JS \u2014 src/lib/image-pipeline/client.ts:72", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/image-pipeline/client.ts:72"}, "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-4070952998ebe102", "name": "Stray `console.log` in TS/JS \u2014 src/lib/pdf/auto-crop.ts:189", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/pdf/auto-crop.ts:189"}, "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-48922e848711f05c", "name": "Stray `console.log` in TS/JS \u2014 src/lib/ocr/symbol-detector.ts:164", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/ocr/symbol-detector.ts:164"}, "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-895e3564c3af5dd5", "name": "Stray `console.log` in TS/JS \u2014 src/lib/ocr/question-parser.ts:126", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/ocr/question-parser.ts:126"}, "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-43a87259cc42a215", "name": "Stray `console.log` in TS/JS \u2014 src/lib/ocr/vision-verifier.ts:203", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/ocr/vision-verifier.ts:203"}, "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-30d817e487bdf46b", "name": "Stray `console.log` in TS/JS \u2014 src/lib/ocr/mathpix.ts:88", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/ocr/mathpix.ts:88"}, "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-8197548433f5cc5f", "name": "Stray `console.log` in TS/JS \u2014 src/lib/export/docx-generator.ts:703", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/export/docx-generator.ts:703"}, "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-89be6b8adddfc301", "name": "Stray `console.log` in TS/JS \u2014 src/hooks/useExams.ts:104", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useExams.ts:104"}, "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-d4c66234c8013276", "name": "Stray `console.log` in TS/JS \u2014 src/hooks/useDashboardStats.ts:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useDashboardStats.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-e0a3c1f60d3653dc", "name": "Stray `console.log` in TS/JS \u2014 src/hooks/useActivityLogs.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useActivityLogs.ts:31"}, "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-a97a373b65d72a52", "name": "Stray `console.log` in TS/JS \u2014 src/hooks/useExamProblems.ts:379", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useExamProblems.ts:379"}, "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-dca4d2a189c148f6", "name": "Dockerfile runs as root: yolo-server/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: yolo-server/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-89ebfa5d0d2d2c51", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d1a23de9e5166113", "name": "Dockerfile runs as root: image-pipeline/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: image-pipeline/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6adda056d06265e6", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e284e6c58e4d105e", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/_shared/cors.ts:6", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/_shared/cors.ts:6"}, "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-7f12204cadcb8516", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/shared/InlineDesmosGraph.tsx:421", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/shared/InlineDesmosGraph.tsx:421"}, "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-b4a48f4fb14a8f38", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/shared/MixedContentRenderer.tsx:36", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/shared/MixedContentRenderer.tsx:36"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7e69a8aff35089ad", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/shared/FigureRenderer.tsx:258", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/shared/FigureRenderer.tsx:258"}, "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-562d8c97fab92b19", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/shared/MathRenderer.tsx:115", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/shared/MathRenderer.tsx:115"}, "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-6de4190893facbc2", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/editor/LaTeXInputModal.tsx:144", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/editor/LaTeXInputModal.tsx:144"}, "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-c112a4ed51268b42", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/editor/modals/MathSymbolPicker.tsx:281", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/editor/modals/MathSymbolPicker.tsx:281"}, "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-cb661ee9e5b4c4a8", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/print/session/[sessionId]/page.tsx:387", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/print/session/[sessionId]/page.tsx:387"}, "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-a1ed4d9ae81d64c8", "name": "Insecure pattern 'node_child_process' in src/app/api/export/hwpx/route.ts:8", "shortDescription": {"text": "Insecure pattern 'node_child_process' in src/app/api/export/hwpx/route.ts:8"}, "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-ef7615433e1a2077", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/dashboard/exam-management/page.tsx:1757", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/dashboard/exam-management/page.tsx:1757"}, "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-06ecaf99f0f34258", "name": "Insecure pattern 'new_function_used' in src/lib/vision/figure-renderer.ts:705", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/lib/vision/figure-renderer.ts:705"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-62f63c7196600e5d", "name": "Insecure pattern 'exec_used' in src/lib/workflow/hwp-converter.ts:69", "shortDescription": {"text": "Insecure pattern 'exec_used' in src/lib/workflow/hwp-converter.ts:69"}, "fullDescription": {"text": "Found a known-risky pattern (exec_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-175481056046a12c", "name": "Insecure pattern 'node_child_process' in src/lib/workflow/hwp-converter.ts:6", "shortDescription": {"text": "Insecure pattern 'node_child_process' in src/lib/workflow/hwp-converter.ts:6"}, "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-68bf8a84dfda1ec1", "name": "Very large file: scripts/expansion-data-es.ts (1094 lines)", "shortDescription": {"text": "Very large file: scripts/expansion-data-es.ts (1094 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-065351e32415afcc", "name": "Very large file: image-pipeline/server.py (1789 lines)", "shortDescription": {"text": "Very large file: image-pipeline/server.py (1789 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-1ca402a0e8b1c848", "name": "Very large file: src/components/shared/MixedContentRenderer.tsx (1564 lines)", "shortDescription": {"text": "Very large file: src/components/shared/MixedContentRenderer.tsx (1564 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-93ea91ba47077b49", "name": "Very large file: src/components/workflow/AnalyzeProblemEditModal.tsx (1713 lines)", "shortDescription": {"text": "Very large file: src/components/workflow/AnalyzeProblemEditModal.tsx (1713 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-a226c8c55416ecdc", "name": "Very large file: src/components/workflow/CloudFlowUploader.tsx (1514 lines)", "shortDescription": {"text": "Very large file: src/components/workflow/CloudFlowUploader.tsx (1514 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-c404a5afcf59c40b", "name": "Very large file: src/components/papers/ProblemEditModal.tsx (1551 lines)", "shortDescription": {"text": "Very large file: src/components/papers/ProblemEditModal.tsx (1551 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-61364ca2d8551637", "name": "Very large file: src/app/api/workflow/upload/route.ts (3173 lines)", "shortDescription": {"text": "Very large file: src/app/api/workflow/upload/route.ts (3173 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-6d582227ffcfef74", "name": "Very large file: src/app/api/workflow/reanalyze-crop/route.ts (1228 lines)", "shortDescription": {"text": "Very large file: src/app/api/workflow/reanalyze-crop/route.ts (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-1168be87e80995f3", "name": "Very large file: src/app/api/problems/[problemId]/generate-solution/route.ts (1334 lines)", "shortDescription": {"text": "Very large file: src/app/api/problems/[problemId]/generate-solution/route.ts (1334 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-a24e9ae518c64a15", "name": "Very large file: src/app/dashboard/exam-create/page.tsx (2163 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/exam-create/page.tsx (2163 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-5b0934506a005203", "name": "Very large file: src/app/dashboard/cloud/CloudListClient.tsx (2665 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/cloud/CloudListClient.tsx (2665 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-e457a4ee6c194641", "name": "Very large file: src/app/dashboard/cloud/[examId]/page.tsx (4739 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/cloud/[examId]/page.tsx (4739 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-ba1dff4b532de766", "name": "Very large file: src/app/dashboard/workflow/analyze/[jobId]/page.tsx (5631 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/workflow/analyze/[jobId]/page.tsx (5631 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-28a0230a31e849ca", "name": "Very large file: src/app/dashboard/create/page.tsx (1631 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/create/page.tsx (1631 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-54fe1bf85934a8cc", "name": "Very large file: src/app/dashboard/exam-management/page.tsx (1952 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/exam-management/page.tsx (1952 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-58558dfa34930f45", "name": "Very large file: src/app/dashboard/skills/page.tsx (1148 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/skills/page.tsx (1148 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-e1b49aadebc60cb6", "name": "Very large file: src/app/dashboard/exam-analysis/[examId]/students/[studentId]/page.tsx (1656 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/exam-analysis/[examId]/students/[studentId]/page.tsx (1656 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-71e86ae512884153", "name": "Very large file: src/app/tutor/students/page.tsx (1601 lines)", "shortDescription": {"text": "Very large file: src/app/tutor/students/page.tsx (1601 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-1855997ad0e85d9e", "name": "Very large file: src/app/share/aggregate/ShareAggregateClient.tsx (1225 lines)", "shortDescription": {"text": "Very large file: src/app/share/aggregate/ShareAggregateClient.tsx (1225 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-3beebd5d781cefc3", "name": "Very large file: src/lib/vision/image-interpreter.ts (2280 lines)", "shortDescription": {"text": "Very large file: src/lib/vision/image-interpreter.ts (2280 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-011b27828f602ddf", "name": "Very large file: src/lib/vision/figure-renderer.ts (1489 lines)", "shortDescription": {"text": "Very large file: src/lib/vision/figure-renderer.ts (1489 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-71df577b8a4b26d2", "name": "Very large file: src/lib/workflow/cloud-flow.ts (2514 lines)", "shortDescription": {"text": "Very large file: src/lib/workflow/cloud-flow.ts (2514 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": "12 test file(s) for 578 source file(s) (ratio 0.02). 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 1165 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 421 placeholder/mock markers across 105 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e06cd9972d1b0bc6", "name": "Network/subprocess call without timeout or try/except \u2014 \uacfc\ud559\ubaa8\ub4c8\ud1b5\ud569\ud3f4\ub354/science_diagram_pipeline.py:151", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 \uacfc\ud559\ubaa8\ub4c8\ud1b5\ud569\ud3f4\ub354/science_diagram_pipeline.py:151"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c899d4d6445c4a9e", "name": "Legacy-named symbol `seed_expanded_types_v2` in scripts/build-seed-sql.ts:163", "shortDescription": {"text": "Legacy-named symbol `seed_expanded_types_v2` in scripts/build-seed-sql.ts:163"}, "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-68da8a89de5902e3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/reclassify-science.js:108", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/reclassify-science.js:108"}, "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-d36b8345133c0682", "name": "Legacy-named symbol `seed_expanded_types_v2` in scripts/generate-expanded-types.ts:302", "shortDescription": {"text": "Legacy-named symbol `seed_expanded_types_v2` in scripts/generate-expanded-types.ts:302"}, "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-699ab8cacd64e1bf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-glm-classify.ts:80", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-glm-classify.ts:80"}, "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-8a8edc9c9ba5a55d", "name": "Commented-code block (5 lines) in scripts/export-obsidian-students.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/export-obsidian-students.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-8da99966f3d35d62", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-glm-detect.ts:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-glm-detect.ts:56"}, "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-9f964cf46650c60e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/fix-p17.js:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/fix-p17.js:20"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3cd0ae91dfab3e10", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-two-stage-classify.ts:50", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-two-stage-classify.ts:50"}, "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-3cf55425b3f09fc2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-glm-graph.ts:103", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-glm-graph.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-5f79a53bf8924e1a", "name": "Commented-code block (5 lines) in scripts/expansion-data-hs2-cal-prb-geo.ts:23", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/expansion-data-hs2-cal-prb-geo.ts:23"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a663e014c9426ef9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-glm-graph-full.ts:92", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-glm-graph-full.ts:92"}, "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-567cb40af6fa0c08", "name": "Commented-code block (5 lines) in image-pipeline/server.py:416", "shortDescription": {"text": "Commented-code block (5 lines) in image-pipeline/server.py:416"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bc10c0f7a9ed2828", "name": "Commented-code block (7 lines) in supabase/functions/ai-twin-problem/index.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in supabase/functions/ai-twin-problem/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-90a63bc50b4eadd7", "name": "Commented-code block (7 lines) in supabase/functions/ai-auto-tag/index.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in supabase/functions/ai-auto-tag/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-3aad42679b26d161", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/_shared/openai.ts:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/_shared/openai.ts:40"}, "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-783a30a16ba7b61d", "name": "Commented-code block (6 lines) in src/middleware.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/middleware.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-6fc74fa14617bfa8", "name": "Commented-code block (5 lines) in src/config/navigation.ts:159", "shortDescription": {"text": "Commented-code block (5 lines) in src/config/navigation.ts:159"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3e0d26bccf7e4af2", "name": "Commented-code block (7 lines) in src/components/layout/TopNav.tsx:412", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/layout/TopNav.tsx:412"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ab801d9414c1fb87", "name": "Commented-code block (5 lines) in src/components/brand/Logo.tsx:6", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/brand/Logo.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-91d703b788f675a3", "name": "Commented-code block (7 lines) in src/components/exam-report/StudentExamReportDark.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/exam-report/StudentExamReportDark.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-e0876792d0c519a1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/exam/AnswerMatchModal.tsx:288", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/exam/AnswerMatchModal.tsx:288"}, "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-6c7c7d754d95968c", "name": "Commented-code block (5 lines) in src/components/exam/EditableExamHeader.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/exam/EditableExamHeader.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-9dac1914632e1d02", "name": "Commented-code block (5 lines) in src/components/exam/DeployExamModal.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/exam/DeployExamModal.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-2aa8c7814f0b7ba1", "name": "Commented-code block (5 lines) in src/components/shared/MixedContentRenderer.tsx:81", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/shared/MixedContentRenderer.tsx:81"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-432d4922d55ba7c5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/shared/FigureRenderer.tsx:202", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/shared/FigureRenderer.tsx:202"}, "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-486329d81b8ea19b", "name": "Commented-code block (11 lines) in src/components/shared/MathRenderer.tsx:21", "shortDescription": {"text": "Commented-code block (11 lines) in src/components/shared/MathRenderer.tsx:21"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1aa33b6e85c0c502", "name": "Commented-code block (7 lines) in src/components/shared/ExamProblemRenderer.tsx:321", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/shared/ExamProblemRenderer.tsx:321"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8e7ea64f7b3b4061", "name": "Commented-code block (7 lines) in src/components/students/StudentDetailContent.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/students/StudentDetailContent.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-38d0413bd62fe90a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/students/StudentDetailContent.tsx:180", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/students/StudentDetailContent.tsx:180"}, "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-c93f502f8511d3a3", "name": "Commented-code block (5 lines) in src/components/students/StudentDetailModal.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/students/StudentDetailModal.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-2f0167b671b13537", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/workflow/AnalyzeProblemEditModal.tsx:1126", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/workflow/AnalyzeProblemEditModal.tsx:1126"}, "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-787d7ada7e4ef95c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/workflow/CloudFlowUploader.tsx:212", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/workflow/CloudFlowUploader.tsx:212"}, "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-3f82fc963146770d", "name": "Commented-code block (5 lines) in src/components/class/StudentTreePanel.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/class/StudentTreePanel.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-b59ef91e6434eb8b", "name": "Commented-code block (7 lines) in src/components/class/StudentLearningReport.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/class/StudentLearningReport.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-716e9fee7503561e", "name": "Commented-code block (5 lines) in src/components/diagnostics/report-primitives.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/diagnostics/report-primitives.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-62803f4b2aef9868", "name": "Commented-code block (6 lines) in src/components/diagnostics/ComprehensiveReportView.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/diagnostics/ComprehensiveReportView.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-df48a197fe63d82f", "name": "Commented-code block (5 lines) in src/components/editor/modals/GraphModal.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/editor/modals/GraphModal.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-b2d8366b70250343", "name": "Commented-code block (6 lines) in src/components/track/TrackLink.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/track/TrackLink.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-df3476bf7c9cb1a6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/papers/AddProblemsModal.tsx:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/papers/AddProblemsModal.tsx:72"}, "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-67f89d3363d84753", "name": "Commented-code block (6 lines) in src/components/papers/ProblemEditModal.tsx:483", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/papers/ProblemEditModal.tsx:483"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-efe68c7aa5b11db1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/papers/ProblemEditModal.tsx:866", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/papers/ProblemEditModal.tsx:866"}, "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-33ab7481e0576b0b", "name": "Commented-code block (5 lines) in src/components/papers/MathsecrTreePicker.tsx:11", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/papers/MathsecrTreePicker.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-a2cf25477ece7f97", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/papers/MathsecrTreePicker.tsx:66", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/papers/MathsecrTreePicker.tsx:66"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-12693c484c6f37a9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/papers/DiagramBrowserModal.tsx:126", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/papers/DiagramBrowserModal.tsx:126"}, "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-e7b4f617511857ea", "name": "Commented-code block (6 lines) in src/components/grading/GradingSheetUpload.tsx:6", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/grading/GradingSheetUpload.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-7847c5713d30d74d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/grading/GradingSheetUpload.tsx:126", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/grading/GradingSheetUpload.tsx:126"}, "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-3d92c7e550093aa0", "name": "Commented-code block (5 lines) in src/app/answer/[session_id]/page.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/answer/[session_id]/page.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-7fe0b4e8c74ee61b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/answer/[session_id]/page.tsx:158", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/answer/[session_id]/page.tsx:158"}, "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-3a145c8f05266a49", "name": "Commented-code block (5 lines) in src/app/student/exams/page.tsx:17", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/student/exams/page.tsx:17"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-57b1fa986b9056bd", "name": "Commented-code block (5 lines) in src/app/student/sessions/[id]/page.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/student/sessions/[id]/page.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-c3b7f171ff57ec0e", "name": "Commented-code block (5 lines) in src/app/auth/signup/page.tsx:70", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/auth/signup/page.tsx:70"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6a62f2fe9fbb7f59", "name": "Commented-code block (6 lines) in src/app/print/session/[sessionId]/page.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/print/session/[sessionId]/page.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-ed33d12abb2469d8", "name": "Commented-code block (6 lines) in src/app/api/users/students/route.ts:5", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/users/students/route.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-95396776ac545c01", "name": "Commented-code block (6 lines) in src/app/api/users/me/track/route.ts:7", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/users/me/track/route.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0a9247bf5dc72d09", "name": "Commented-code block (5 lines) in src/app/api/exams/route.ts:53", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/exams/route.ts: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-5eea068e2d74e82e", "name": "Commented-code block (5 lines) in src/app/api/exams/generate/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/exams/generate/route.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-82007e1fec1f6031", "name": "Commented-code block (6 lines) in src/app/api/exams/[examId]/route.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/exams/[examId]/route.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-f82811d4f54bbbfb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/exams/[examId]/upload/route.ts:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/exams/[examId]/upload/route.ts:53"}, "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-43adc86d3ff9e1fb", "name": "Commented-code block (7 lines) in src/app/api/exams/[examId]/print/route.ts:7", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/exams/[examId]/print/route.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-87869832c0e47c1e", "name": "Commented-code block (6 lines) in src/app/api/exams/[examId]/ai-analysis/route.ts:225", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/exams/[examId]/ai-analysis/route.ts:225"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-81f3377e4cf4c759", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/exams/[examId]/ai-analysis/route.ts:146", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/exams/[examId]/ai-analysis/route.ts:146"}, "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-1886fbb71acebfb4", "name": "Commented-code block (5 lines) in src/app/api/exams/[examId]/students/route.ts:81", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/exams/[examId]/students/route.ts:81"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-994d7433c4bcad18", "name": "Commented-code block (5 lines) in src/app/api/exams/[examId]/students/[studentId]/report/route.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/exams/[examId]/students/[studentId]/report/route.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4b0be0be9fda591c", "name": "Commented-code block (5 lines) in src/app/api/exams/[examId]/students/[studentId]/report/ai-comment/route.ts:234", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/exams/[examId]/students/[studentId]/report/ai-comment/route.ts:234"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e2e4f73d7a54cb45", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/exams/[examId]/students/[studentId]/report/ai-comment/route.ts", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/exams/[examId]/students/[studentId]/report/ai-comment/route.ts:161"}, "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-878e08ac0460841a", "name": "Commented-code block (7 lines) in src/app/api/exams/[examId]/students/[studentId]/share/route.ts:8", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/exams/[examId]/students/[studentId]/share/route.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-e35ad64228eff7dd", "name": "Commented-code block (6 lines) in src/app/api/exams/[examId]/match-answers/route.ts:340", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/exams/[examId]/match-answers/route.ts:340"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2353ab502e83cc80", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/exams/[examId]/match-answers/route.ts:516", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/exams/[examId]/match-answers/route.ts:516"}, "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-741ce411f9af5546", "name": "Commented-code block (5 lines) in src/app/api/exams/[examId]/auto-fix/route.ts:564", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/exams/[examId]/auto-fix/route.ts:564"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-456c16d270865798", "name": "Commented-code block (9 lines) in src/app/api/exams/[examId]/student-responses/route.ts:6", "shortDescription": {"text": "Commented-code block (9 lines) in src/app/api/exams/[examId]/student-responses/route.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-cff2e94e704724f8", "name": "Commented-code block (6 lines) in src/app/api/exams/[examId]/share/route.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/exams/[examId]/share/route.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-ac923ab7d444e0d3", "name": "Commented-code block (6 lines) in src/app/api/exams/[examId]/distribute-points/route.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/exams/[examId]/distribute-points/route.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-7f12e0ce4dc8edf8", "name": "Commented-code block (5 lines) in src/app/api/exams/[examId]/problems/route.ts:82", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/exams/[examId]/problems/route.ts: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-f579a164cfebc24d", "name": "Commented-code block (8 lines) in src/app/api/exams/[examId]/breakdown/route.ts:10", "shortDescription": {"text": "Commented-code block (8 lines) in src/app/api/exams/[examId]/breakdown/route.ts:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4e73d8efe999aadc", "name": "Commented-code block (5 lines) in src/app/api/exams/[examId]/batch-solutions/route.ts:32", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/exams/[examId]/batch-solutions/route.ts: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-a7cc6e37182d7744", "name": "Commented-code block (5 lines) in src/app/api/exams/[examId]/reorder/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/exams/[examId]/reorder/route.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-cca75f301a8cf244", "name": "Commented-code block (8 lines) in src/app/api/exams/available-counts/route.ts:1", "shortDescription": {"text": "Commented-code block (8 lines) in src/app/api/exams/available-counts/route.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-7309c15dc20fa4cb", "name": "Commented-code block (7 lines) in src/app/api/dashboard/stats/route.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/dashboard/stats/route.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-7e1b7e0ec3b75c3f", "name": "Commented-code block (7 lines) in src/app/api/organization-applications/[id]/route.ts:5", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/organization-applications/[id]/route.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-91eb5ce26736b26a", "name": "Commented-code block (5 lines) in src/app/api/sessions/route.ts:8", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/sessions/route.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-c42742cc7dd064a7", "name": "Commented-code block (5 lines) in src/app/api/sessions/[id]/grading-sheet/route.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/sessions/[id]/grading-sheet/route.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-26e999a473792b55", "name": "Commented-code block (5 lines) in src/app/api/sessions/[id]/complete/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/sessions/[id]/complete/route.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-2bb49d70c29d23c9", "name": "Commented-code block (5 lines) in src/app/api/sessions/[id]/print-meta/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/sessions/[id]/print-meta/route.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-c719aa506afe4d4f", "name": "Commented-code block (7 lines) in src/app/api/grades/roster/route.ts:5", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/grades/roster/route.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-1856b1d51c3375c4", "name": "Commented-code block (5 lines) in src/app/api/students/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/students/route.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-0fbe868a361026d6", "name": "Commented-code block (5 lines) in src/app/api/students/[studentId]/route.ts:11", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/students/[studentId]/route.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-ea61b6be19c8d1cb", "name": "Commented-code block (6 lines) in src/app/api/students/[studentId]/school-exam-scores/route.ts:88", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/students/[studentId]/school-exam-scores/route.ts:88"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c8afe77b1cc333cd", "name": "Commented-code block (5 lines) in src/app/api/students/[studentId]/recommended-problems/route.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/students/[studentId]/recommended-problems/route.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-5c4fbfd8bcdfffd8", "name": "Commented-code block (6 lines) in src/app/api/students/[studentId]/exam-scores/route.ts:78", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/students/[studentId]/exam-scores/route.ts:78"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-af64aba63fb55131", "name": "Commented-code block (6 lines) in src/app/api/students/me/sessions/route.ts:6", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/students/me/sessions/route.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-9b98b892bb550849", "name": "Commented-code block (6 lines) in src/app/api/classes/route.ts:4", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/classes/route.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-1d15f757941225a8", "name": "Commented-code block (6 lines) in src/app/api/classes/[classId]/route.ts:4", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/classes/[classId]/route.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-8847814dd8be6121", "name": "Commented-code block (5 lines) in src/app/api/classes/[classId]/students/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/classes/[classId]/students/route.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-103002909c02787a", "name": "Commented-code block (5 lines) in src/app/api/classes/[classId]/enrollments/route.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/classes/[classId]/enrollments/route.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-429ee10d5af5434a", "name": "Commented-code block (5 lines) in src/app/api/assignments/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/assignments/route.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-bbbeb9d94935c38a", "name": "Commented-code block (6 lines) in src/app/api/corrections/summary/route.ts:4", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/corrections/summary/route.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-14c26f19a65fead2", "name": "Commented-code block (5 lines) in src/app/api/admin/users/backfill-names/route.ts:9", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/admin/users/backfill-names/route.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-25eb36c25f7876ec", "name": "Commented-code block (5 lines) in src/app/api/admin/tenancy/organizations/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/admin/tenancy/organizations/route.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-2fce8c4a59249c94", "name": "Commented-code block (5 lines) in src/app/api/admin/tenancy/institutes/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/admin/tenancy/institutes/route.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-0916b725f706ef11", "name": "Commented-code block (7 lines) in src/app/api/admin/reocr-points/route.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/admin/reocr-points/route.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-1c81c5b522e11c1a", "name": "Commented-code block (5 lines) in src/app/api/admin/restore-all-points/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/admin/restore-all-points/route.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-6b802e3546f4b01c", "name": "Commented-code block (6 lines) in src/app/api/admin/objective-answer-fix/route.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/admin/objective-answer-fix/route.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-e2d03ce9a4720279", "name": "Commented-code block (5 lines) in src/app/api/msb/students/route.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/msb/students/route.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-56ce8ce12ad7f278", "name": "Commented-code block (5 lines) in src/app/api/msb/students/[id]/diagnostics/route.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/msb/students/[id]/diagnostics/route.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-928d94ea3d7d60de", "name": "Commented-code block (5 lines) in src/app/api/workflow/yolo-export/route.ts:9", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/workflow/yolo-export/route.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-69603fc28baca48c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/workflow/detect-problems-yolo/route.ts:124", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/workflow/detect-problems-yolo/route.ts:124"}, "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-7160d42e25f42155", "name": "Commented-code block (5 lines) in src/app/api/workflow/upload/route.ts:27", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/workflow/upload/route.ts:27"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-770e7a50daea602d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/workflow/upload/route.ts:3069", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/workflow/upload/route.ts:3069"}, "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-e3256876ed0ab857", "name": "Commented-code block (7 lines) in src/app/api/workflow/upload-science-perproblem/route.ts:7", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/workflow/upload-science-perproblem/route.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3ef42644d0217d20", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/workflow/upload-science-perproblem/route.ts:373", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/workflow/upload-science-perproblem/route.ts:373"}, "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-8a02a8ae151e64bb", "name": "Commented-code block (6 lines) in src/app/api/workflow/reanalyze-crop/route.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/workflow/reanalyze-crop/route.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-4ea639c9cbd0a4a1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/workflow/reanalyze-crop/route.ts:1117", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/workflow/reanalyze-crop/route.ts:1117"}, "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-a985498acfa7cba4", "name": "Commented-code block (6 lines) in src/app/api/workflow/crop-figure/route.ts:7", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/workflow/crop-figure/route.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5428425e474c95ff", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/workflow/crop-figure/route.ts:96", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/workflow/crop-figure/route.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-a2f091c22a43cab7", "name": "Commented-code block (5 lines) in src/app/api/workflow/detect-figures-gpt/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/workflow/detect-figures-gpt/route.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-232e9f6a004f4a5a", "name": "Commented-code block (6 lines) in src/app/api/workflow/twin/route.ts:231", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/workflow/twin/route.ts:231"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a59c97506e4c92ca", "name": "Commented-code block (7 lines) in src/app/api/session-results/route.ts:11", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/session-results/route.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-f280eb2c71193001", "name": "Commented-code block (5 lines) in src/app/api/session-results/from-student/route.ts:15", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/session-results/from-student/route.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-480b17de3a324877", "name": "Commented-code block (5 lines) in src/app/api/organizations/[id]/public/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/organizations/[id]/public/route.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-6b70432cd71fefd8", "name": "Commented-code block (5 lines) in src/app/api/organizations/search/route.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/organizations/search/route.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-3d9f44310e9ade6f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/image-pipeline/extract/route.ts:58", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/image-pipeline/extract/route.ts:58"}, "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-aaf8faf45d8928d5", "name": "Commented-code block (6 lines) in src/app/api/diagnostics/analytics/route.ts:5", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/diagnostics/analytics/route.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-dc33155effdf6963", "name": "Commented-code block (6 lines) in src/app/api/diagnostics/report-tokens/route.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/diagnostics/report-tokens/route.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-f1c24e761cae0364", "name": "Commented-code block (5 lines) in src/app/api/diagnostics/report/issue/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/diagnostics/report/issue/route.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-f80b04973af4a5a7", "name": "Commented-code block (6 lines) in src/app/api/me/change-password/route.ts:8", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/me/change-password/route.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-39b16cd329b5d229", "name": "Commented-code block (5 lines) in src/app/api/share/exam/[token]/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/share/exam/[token]/route.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-3b55d99caea9ed42", "name": "Commented-code block (5 lines) in src/app/api/share/student-report/[token]/route.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/share/student-report/[token]/route.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-02870808db947bd5", "name": "Commented-code block (6 lines) in src/app/api/share/diagnostic-report/[token]/route.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/share/diagnostic-report/[token]/route.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-9ae144743c3dc3f7", "name": "Commented-code block (5 lines) in src/app/api/reports/by-school/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/reports/by-school/route.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-86ffae2812d75db9", "name": "Commented-code block (11 lines) in src/app/api/reports/aggregate/route.ts:5", "shortDescription": {"text": "Commented-code block (11 lines) in src/app/api/reports/aggregate/route.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-4686557fbdf1c15f", "name": "Commented-code block (5 lines) in src/app/api/problems/[problemId]/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/problems/[problemId]/route.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-6e09b09889534aa4", "name": "Commented-code block (5 lines) in src/app/api/problems/[problemId]/generate-solution/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/problems/[problemId]/generate-solution/route.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-1a48be92e629e628", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/problems/[problemId]/generate-solution/route.ts:631", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/problems/[problemId]/generate-solution/route.ts:631"}, "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-d3f70fa405e1fe27", "name": "Commented-code block (5 lines) in src/app/api/problems/[problemId]/generate-figure/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/problems/[problemId]/generate-figure/route.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-2597a4630ba9d88c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/problems/[problemId]/generate-figure/route.ts:186", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/problems/[problemId]/generate-figure/route.ts:186"}, "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-bd40009a5bdfcb1d", "name": "Commented-code block (7 lines) in src/app/api/problems/[problemId]/reanalyze/route.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/problems/[problemId]/reanalyze/route.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-c97e56c0855dddfc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/problems/[problemId]/reanalyze/route.ts:531", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/problems/[problemId]/reanalyze/route.ts:531"}, "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-0e2603a3048b1c82", "name": "Commented-code block (5 lines) in src/app/api/export/hwpx/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/export/hwpx/route.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-562bf56529955407", "name": "Commented-code block (6 lines) in src/app/dashboard/exam-create/page.tsx:10", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/dashboard/exam-create/page.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-7060b1e66f54dcab", "name": "Commented-code block (6 lines) in src/app/dashboard/prescription/report/page.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/dashboard/prescription/report/page.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-20e37a335890dd7e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/prescription/report/page.tsx:100", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/prescription/report/page.tsx:100"}, "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-f86fbc505ced5a6a", "name": "Legacy-named symbol `pinOld` in src/app/dashboard/cloud/CloudListClient.tsx:944", "shortDescription": {"text": "Legacy-named symbol `pinOld` in src/app/dashboard/cloud/CloudListClient.tsx:944"}, "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-d553076fa49f0cca", "name": "Commented-code block (6 lines) in src/app/dashboard/cloud/CloudListClient.tsx:1261", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/dashboard/cloud/CloudListClient.tsx:1261"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cf452b9f77f9629c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/cloud/CloudListClient.tsx:1030", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/cloud/CloudListClient.tsx:1030"}, "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-bdd2e7129df8cd4a", "name": "Commented-code block (5 lines) in src/app/dashboard/cloud/[examId]/page.tsx:1178", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/dashboard/cloud/[examId]/page.tsx:1178"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-df48971e7fd37c6a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/cloud/[examId]/page.tsx:958", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/cloud/[examId]/page.tsx:958"}, "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-1de78cf14f62c586", "name": "Commented-code block (6 lines) in src/app/dashboard/cloud/folder-import/page.tsx:6", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/dashboard/cloud/folder-import/page.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-184ccc4ec16ca830", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/cloud/folder-import/page.tsx:88", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/cloud/folder-import/page.tsx:88"}, "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-6c8fcd69a0ea13dc", "name": "Commented-code block (6 lines) in src/app/dashboard/assignments/page.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/dashboard/assignments/page.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-4129667c5f2edd06", "name": "Commented-code block (5 lines) in src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/dashboard/workflow/analyze/[jobId]/page.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-c5b71fb564372193", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3332", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3332"}, "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-14856b203fdac47f", "name": "Commented-code block (6 lines) in src/app/dashboard/class/page.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/dashboard/class/page.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-c670c851f4154600", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/create/page.tsx:422", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/create/page.tsx:422"}, "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-0578d04d6aefecaa", "name": "Commented-code block (5 lines) in src/app/dashboard/problem-bank/page.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/dashboard/problem-bank/page.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-31fdc681c70dbd63", "name": "Commented-code block (5 lines) in src/app/dashboard/account/page.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/dashboard/account/page.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-75a8a9cb012c01be", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/materials/page.tsx:650", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/materials/page.tsx:650"}, "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-89fecc067715d31c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/materials/diagrams/DiagramsClient.tsx:167", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/materials/diagrams/DiagramsClient.tsx:167"}, "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-7cb8d8020fd41a12", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/reports/aggregate/page.tsx:156", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/reports/aggregate/page.tsx:156"}, "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-cb923f4fb5ad1275", "name": "Commented-code block (6 lines) in src/app/dashboard/exam-analysis/[examId]/StudentsTab.tsx:6", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/dashboard/exam-analysis/[examId]/StudentsTab.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-eeb239bb052a52df", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/exam-analysis/[examId]/page.tsx:128", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/exam-analysis/[examId]/page.tsx:128"}, "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-91d65dd01ab4f7c5", "name": "Commented-code block (5 lines) in src/app/dashboard/grading/page.tsx:6", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/dashboard/grading/page.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-bd2d2df6cf4b5d81", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/tutor/students/page.tsx:146", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/tutor/students/page.tsx:146"}, "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-07df2e54db7b30e3", "name": "Commented-code block (5 lines) in src/app/tutor/students/[studentId]/page.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/tutor/students/[studentId]/page.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-62edda81757d57ad", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/tutor/classes/page.tsx:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/tutor/classes/page.tsx:53"}, "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-2016d719830d9252", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/tutor/classes/[id]/page.tsx:110", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/tutor/classes/[id]/page.tsx:110"}, "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-25ecc57760b4137e", "name": "Commented-code block (6 lines) in src/app/tutor/classes/[id]/edit/page.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/tutor/classes/[id]/edit/page.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-6ada00d30f667c6f", "name": "Commented-code block (5 lines) in src/app/admin/layout.tsx:8", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/admin/layout.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-028632c8693bb3ed", "name": "Commented-code block (5 lines) in src/app/admin/answer-fix/page.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/admin/answer-fix/page.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-41b576ab825729f6", "name": "Commented-code block (5 lines) in src/app/admin/staff/page.tsx:4", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/admin/staff/page.tsx:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9fbabc1bc1035c88", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/organization-applications/page.tsx:155", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/organization-applications/page.tsx:155"}, "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-f5e11f5fe8e072e1", "name": "Commented-code block (5 lines) in src/app/admin/institutes/page.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/admin/institutes/page.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-e146b7bb941b4227", "name": "Commented-code block (5 lines) in src/app/admin/teachers/page.tsx:74", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/admin/teachers/page.tsx: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-13d942df5915c827", "name": "Commented-code block (7 lines) in src/app/(tracks)/[track]/dashboard/layout.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/(tracks)/[track]/dashboard/layout.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-6c59f1570cf11df7", "name": "Commented-code block (6 lines) in src/app/test-science/page.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/test-science/page.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-3f96ddf302734e69", "name": "Commented-code block (5 lines) in src/app/select-track/page.tsx:10", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/select-track/page.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-bb7141b6d85dc73d", "name": "Commented-code block (5 lines) in src/app/share/exam/[token]/opengraph-image.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/share/exam/[token]/opengraph-image.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-98b8a33e11719a4b", "name": "Commented-code block (5 lines) in src/app/share/exam/[token]/page.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/share/exam/[token]/page.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-40d2119cce2bc4c4", "name": "Commented-code block (5 lines) in src/app/share/exam/[token]/ShareReportClient.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/share/exam/[token]/ShareReportClient.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-d7feea0c3849e5ca", "name": "Commented-code block (7 lines) in src/app/share/student-report/[token]/page.tsx:7", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/share/student-report/[token]/page.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-2227856ab91cc342", "name": "Commented-code block (6 lines) in src/lib/subject-track.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/subject-track.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-9b729e8d1f0d44d7", "name": "Commented-code block (5 lines) in src/lib/security/msb-auth.ts:18", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/security/msb-auth.ts:18"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a57ddbfd1099cfa1", "name": "Commented-code block (6 lines) in src/lib/security/institute-guard.ts:21", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/security/institute-guard.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-d7b1a2bce89ced45", "name": "Commented-code block (5 lines) in src/lib/navigation/useSmartBack.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/navigation/useSmartBack.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-feb47569e2a3e6ed", "name": "Commented-code block (5 lines) in src/lib/auth/get-active-track.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/auth/get-active-track.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-1d8babcc78c4d2fc", "name": "Commented-code block (7 lines) in src/lib/print/exam-print.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/print/exam-print.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-ed4ba0c4a0948a81", "name": "Commented-code block (5 lines) in src/lib/api/validation.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/api/validation.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1c955be41f804ef5", "name": "Commented-code block (6 lines) in src/lib/utils/school-extract.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/utils/school-extract.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-c56f225fd3fadb26", "name": "Commented-code block (6 lines) in src/lib/utils/clean-latex.test.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/utils/clean-latex.test.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-cbc59322d9723076", "name": "Commented-code block (7 lines) in src/lib/utils/clean-latex.ts:17", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/utils/clean-latex.ts:17"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e69d230fcc864bb1", "name": "Commented-code block (6 lines) in src/lib/utils/exam-meta-extract.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/utils/exam-meta-extract.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-cd450e062dbd0c83", "name": "Commented-code block (8 lines) in src/lib/utils/year-extract.ts:1", "shortDescription": {"text": "Commented-code block (8 lines) in src/lib/utils/year-extract.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-27b174fcaa36ff09", "name": "Commented-code block (5 lines) in src/lib/latex/renderRepair.ts:28", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/latex/renderRepair.ts:28"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-012577a7c5b2c25a", "name": "Commented-code block (5 lines) in src/lib/students/phone-id.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/students/phone-id.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-be248731bd20eb70", "name": "Commented-code block (5 lines) in src/lib/vision/image-interpreter.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/vision/image-interpreter.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-aa33fa5d5a821de9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/vision/image-interpreter.ts:1084", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/vision/image-interpreter.ts:1084"}, "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-30e47e7fbee3a82c", "name": "Commented-code block (6 lines) in src/lib/workflow/classify.ts:4", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/workflow/classify.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-0fcebfafefc5f94c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/workflow/classify.ts:236", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/workflow/classify.ts:236"}, "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-ce4f91a1ea460db0", "name": "Commented-code block (5 lines) in src/lib/workflow/apply-learned-rules.ts:12", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/workflow/apply-learned-rules.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-e7ba04cbc4f694ac", "name": "Commented-code block (12 lines) in src/lib/workflow/cloud-flow.ts:555", "shortDescription": {"text": "Commented-code block (12 lines) in src/lib/workflow/cloud-flow.ts:555"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ae38a652d6abf2fa", "name": "Commented-code block (6 lines) in src/lib/workflow/science-gemini-flow.ts:8", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/workflow/science-gemini-flow.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-2bc87ac82becae16", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/workflow/science-gemini-flow.ts:415", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/workflow/science-gemini-flow.ts:415"}, "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-ee2324ca6570b938", "name": "Commented-code block (5 lines) in src/lib/workflow/mathsecr-prompt.test.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/workflow/mathsecr-prompt.test.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-009ad20a074ae475", "name": "Commented-code block (6 lines) in src/lib/workflow/title-detect.ts:159", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/workflow/title-detect.ts:159"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fdafd85bb067e91c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/image-pipeline/client.ts:159", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/image-pipeline/client.ts:159"}, "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-7cf75739925b2acf", "name": "Commented-code block (11 lines) in src/lib/diagnostics/exam-sets.ts:4", "shortDescription": {"text": "Commented-code block (11 lines) in src/lib/diagnostics/exam-sets.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-03921c5e11240933", "name": "Commented-code block (6 lines) in src/lib/pdf/auto-crop.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/pdf/auto-crop.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-53693ebd79274d3b", "name": "Commented-code block (5 lines) in src/lib/ocr/symbol-detector.ts:9", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ocr/symbol-detector.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-e02cc3d2510013d2", "name": "Commented-code block (5 lines) in src/lib/ocr/gemini-science.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ocr/gemini-science.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-d05b5ea9b434c7d0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ocr/gemini-science.ts:159", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ocr/gemini-science.ts:159"}, "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-2ce45fe32330b0a1", "name": "Commented-code block (5 lines) in src/lib/ocr/question-parser.ts:133", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ocr/question-parser.ts:133"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f07f6068b67ce940", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ocr/gemini-science-segmenter.ts:98", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ocr/gemini-science-segmenter.ts:98"}, "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-bcac8c57b94aec5e", "name": "Commented-code block (9 lines) in src/lib/ocr/apply-answer-sheet.ts:4", "shortDescription": {"text": "Commented-code block (9 lines) in src/lib/ocr/apply-answer-sheet.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-5bed514b8dddd0fc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ocr/gemini-science-perproblem.ts:133", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ocr/gemini-science-perproblem.ts:133"}, "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-472c4f788bbb1915", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ocr/answer-vision.ts:47", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ocr/answer-vision.ts:47"}, "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-32e846a49b07a5d4", "name": "Commented-code block (5 lines) in src/lib/ocr/vision-verifier.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ocr/vision-verifier.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-d6d8f824630176f8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ocr/mathpix.ts:52", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ocr/mathpix.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-c62f7a38054aae65", "name": "Commented-code block (6 lines) in src/lib/track/filter.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/track/filter.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-9bebe3b70e111bec", "name": "Commented-code block (6 lines) in src/lib/track/hooks.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/track/hooks.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-ad71f0e867c8c8e7", "name": "Commented-code block (5 lines) in src/lib/track/href.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/track/href.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-4e4d70bb6aeb0308", "name": "Commented-code block (6 lines) in src/lib/track/nav.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/track/nav.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-a47a8c260ada756d", "name": "Commented-code block (5 lines) in src/lib/grading/parse-student-sheet.ts:13", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/grading/parse-student-sheet.ts:13"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-659a64d9451f8d69", "name": "Commented-code block (5 lines) in src/lib/claude/cache.ts:11", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/claude/cache.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-2528078410821310", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/export/docx-generator.ts:246", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/export/docx-generator.ts:246"}, "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-43ecb7074048ff9d", "name": "Commented-code block (14 lines) in src/lib/export/hwpx-generator.ts:1", "shortDescription": {"text": "Commented-code block (14 lines) in src/lib/export/hwpx-generator.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-6727b4fb025554fe", "name": "Commented-code block (5 lines) in src/hooks/useExamProblems.ts:187", "shortDescription": {"text": "Commented-code block (5 lines) in src/hooks/useExamProblems.ts:187"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-11b4af7e15408bbe", "name": "Commented-code block (5 lines) in src/hooks/useUserScope.ts:47", "shortDescription": {"text": "Commented-code block (5 lines) in src/hooks/useUserScope.ts:47"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f697022b8ecb2933", "name": "46 env vars used in code but missing from .env.example", "shortDescription": {"text": "46 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANTHROPIC_API_KEY`, `ANTHROPIC_OPUS_MODEL`, `CLASSIFY_GEMINI_MODEL`, `CLASSIFY_PROVIDER`, `CLAUDE_CLASSIFY_MODEL`, `CLAUDE_FIGURE_THINKING`, `CLAUDE_FIGURE_THINKING_BUDGET`, `DETECT_FIGURES_GPT_ENABLED` + 38 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\n\uacfc\ud559\ubaa8\ub4c8\ud1b5\ud569\ud3f4\ub354/science_diagram_pipeline.py:extract_with_pymupdf, \uacfc\ud559\ubaa8\ub4c8\ud1b5\ud569\ud3f4\ub354/science_diagram_pipeline.py:extract\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f13cd461ec6e5e85", "name": "FastAPI POST `detect_problems` without auth dependency \u2014 yolo-server/server.py:74", "shortDescription": {"text": "FastAPI POST `detect_problems` without auth dependency \u2014 yolo-server/server.py:74"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-92e2da99d16ba6b8", "name": "FastAPI POST `annotate_endpoint` without auth dependency \u2014 yolo-server/server.py:177", "shortDescription": {"text": "FastAPI POST `annotate_endpoint` without auth dependency \u2014 yolo-server/server.py:177"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-225a27fe0ff9c387", "name": "FastAPI POST `clean_handwriting` without auth dependency \u2014 image-pipeline/server.py:94", "shortDescription": {"text": "FastAPI POST `clean_handwriting` without auth dependency \u2014 image-pipeline/server.py:94"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-166399642c6ee214", "name": "FastAPI POST `clean_pdf_handwriting` without auth dependency \u2014 image-pipeline/server.py:134", "shortDescription": {"text": "FastAPI POST `clean_pdf_handwriting` without auth dependency \u2014 image-pipeline/server.py:134"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-374a888e82570d49", "name": "FastAPI POST `clean_pdf_base64` without auth dependency \u2014 image-pipeline/server.py:192", "shortDescription": {"text": "FastAPI POST `clean_pdf_base64` without auth dependency \u2014 image-pipeline/server.py:192"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1b4ad9bb4785428d", "name": "FastAPI POST `detect_figures_cv` without auth dependency \u2014 image-pipeline/server.py:499", "shortDescription": {"text": "FastAPI POST `detect_figures_cv` without auth dependency \u2014 image-pipeline/server.py:499"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ca149539fb7c4637", "name": "FastAPI POST `render_pdf_pages` without auth dependency \u2014 image-pipeline/server.py:599", "shortDescription": {"text": "FastAPI POST `render_pdf_pages` without auth dependency \u2014 image-pipeline/server.py:599"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f8caaa711ac28dd9", "name": "FastAPI POST `crop_figure` without auth dependency \u2014 image-pipeline/server.py:664", "shortDescription": {"text": "FastAPI POST `crop_figure` without auth dependency \u2014 image-pipeline/server.py:664"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3f00a977e0bd16a1", "name": "FastAPI POST `clean_handwriting_base64` without auth dependency \u2014 image-pipeline/server.py:760", "shortDescription": {"text": "FastAPI POST `clean_handwriting_base64` without auth dependency \u2014 image-pipeline/server.py:760"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3fca70e06b05b4a2", "name": "FastAPI POST `clean_handwriting_local` without auth dependency \u2014 image-pipeline/server.py:808", "shortDescription": {"text": "FastAPI POST `clean_handwriting_local` without auth dependency \u2014 image-pipeline/server.py:808"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-591585ec4d0e4c59", "name": "FastAPI POST `extract_images_local` without auth dependency \u2014 image-pipeline/server.py:836", "shortDescription": {"text": "FastAPI POST `extract_images_local` without auth dependency \u2014 image-pipeline/server.py:836"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e3809dce3913f259", "name": "FastAPI POST `extract_images` without auth dependency \u2014 image-pipeline/server.py:866", "shortDescription": {"text": "FastAPI POST `extract_images` without auth dependency \u2014 image-pipeline/server.py:866"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b894c50d13c732e2", "name": "FastAPI POST `detect_problems_yolo` without auth dependency \u2014 image-pipeline/server.py:1098", "shortDescription": {"text": "FastAPI POST `detect_problems_yolo` without auth dependency \u2014 image-pipeline/server.py:1098"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a02d4f3945cd911d", "name": "FastAPI POST `enhance_single` without auth dependency \u2014 image-pipeline/server.py:1176", "shortDescription": {"text": "FastAPI POST `enhance_single` without auth dependency \u2014 image-pipeline/server.py:1176"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-18cba5dc553f67fb", "name": "FastAPI POST `find_similar` without auth dependency \u2014 image-pipeline/server.py:1236", "shortDescription": {"text": "FastAPI POST `find_similar` without auth dependency \u2014 image-pipeline/server.py:1236"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0e50098e5ff540c8", "name": "FastAPI POST `tag_image` without auth dependency \u2014 image-pipeline/server.py:1263", "shortDescription": {"text": "FastAPI POST `tag_image` without auth dependency \u2014 image-pipeline/server.py:1263"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-da75b736e7d393d8", "name": "FastAPI POST `tag_images_batch` without auth dependency \u2014 image-pipeline/server.py:1336", "shortDescription": {"text": "FastAPI POST `tag_images_batch` without auth dependency \u2014 image-pipeline/server.py:1336"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ae940c7424afc078", "name": "FastAPI POST `retag_all_images` without auth dependency \u2014 image-pipeline/server.py:1392", "shortDescription": {"text": "FastAPI POST `retag_all_images` without auth dependency \u2014 image-pipeline/server.py:1392"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-785b8e71c62853f7", "name": "FastAPI POST `match_image` without auth dependency \u2014 image-pipeline/server.py:1487", "shortDescription": {"text": "FastAPI POST `match_image` without auth dependency \u2014 image-pipeline/server.py:1487"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e1eb8e38c003c336", "name": "FastAPI POST `match_images_batch` without auth dependency \u2014 image-pipeline/server.py:1537", "shortDescription": {"text": "FastAPI POST `match_images_batch` without auth dependency \u2014 image-pipeline/server.py:1537"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-66ce388fab653c6a", "name": "FastAPI DELETE `delete_image` without auth dependency \u2014 image-pipeline/server.py:1579", "shortDescription": {"text": "FastAPI DELETE `delete_image` without auth dependency \u2014 image-pipeline/server.py:1579"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fbf94085b28dcba0", "name": "FastAPI DELETE `delete_source` without auth dependency \u2014 image-pipeline/server.py:1604", "shortDescription": {"text": "FastAPI DELETE `delete_source` without auth dependency \u2014 image-pipeline/server.py:1604"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6259b4013cd738e0", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (scripts/reclassify-science.js:132)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (scripts/reclassify-science.js:132)"}, "fullDescription": {"text": "`scripts/reclassify-science.js:132` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c2af19a0602498c7", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (scripts/fix-p17.js:20)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (scripts/fix-p17.js:20)"}, "fullDescription": {"text": "`scripts/fix-p17.js:20` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bcb406831fcd77f3", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (scripts/test-glm-classify.ts:80)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (scripts/test-glm-classify.ts:80)"}, "fullDescription": {"text": "`scripts/test-glm-classify.ts:80` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-58ce5abffba9d843", "name": "Dangling fetch: POST https://api.z.ai/api/paas/v4/chat/completions (scripts/test-glm-classify.ts:107)", "shortDescription": {"text": "Dangling fetch: POST https://api.z.ai/api/paas/v4/chat/completions (scripts/test-glm-classify.ts:107)"}, "fullDescription": {"text": "`scripts/test-glm-classify.ts:107` calls `POST https://api.z.ai/api/paas/v4/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.z.ai/api/paas/v4/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f3b9b9a1fe9ca883", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (scripts/test-glm-detect.ts:56)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (scripts/test-glm-detect.ts:56)"}, "fullDescription": {"text": "`scripts/test-glm-detect.ts:56` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-788839e78157692d", "name": "Dangling fetch: POST https://api.z.ai/api/paas/v4/chat/completions (scripts/test-glm-detect.ts:84)", "shortDescription": {"text": "Dangling fetch: POST https://api.z.ai/api/paas/v4/chat/completions (scripts/test-glm-detect.ts:84)"}, "fullDescription": {"text": "`scripts/test-glm-detect.ts:84` calls `POST https://api.z.ai/api/paas/v4/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.z.ai/api/paas/v4/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1acc781486120f5b", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (scripts/test-two-stage-classify.ts:50)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (scripts/test-two-stage-classify.ts:50)"}, "fullDescription": {"text": "`scripts/test-two-stage-classify.ts:50` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-aa775de0b88ab9b8", "name": "Dangling fetch: POST https://api.z.ai/api/paas/v4/chat/completions (scripts/test-glm-graph.ts:103)", "shortDescription": {"text": "Dangling fetch: POST https://api.z.ai/api/paas/v4/chat/completions (scripts/test-glm-graph.ts:103)"}, "fullDescription": {"text": "`scripts/test-glm-graph.ts:103` calls `POST https://api.z.ai/api/paas/v4/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.z.ai/api/paas/v4/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f57df195bb2cf037", "name": "Dangling fetch: POST https://api.z.ai/api/paas/v4/chat/completions (scripts/test-glm-graph.ts:132)", "shortDescription": {"text": "Dangling fetch: POST https://api.z.ai/api/paas/v4/chat/completions (scripts/test-glm-graph.ts:132)"}, "fullDescription": {"text": "`scripts/test-glm-graph.ts:132` calls `POST https://api.z.ai/api/paas/v4/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.z.ai/api/paas/v4/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-63fc86d9630321de", "name": "Dangling fetch: GET /api/exams/${w.examId}/batch-solutions (src/components/BatchSolutionNotifier.tsx:75)", "shortDescription": {"text": "Dangling fetch: GET /api/exams/${w.examId}/batch-solutions (src/components/BatchSolutionNotifier.tsx:75)"}, "fullDescription": {"text": "`src/components/BatchSolutionNotifier.tsx:75` calls `GET /api/exams/${w.examId}/batch-solutions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/batch-solutions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b98a8b2b5f9b276b", "name": "Dangling fetch: GET /api/me/active-institute (src/components/layout/ActiveInstituteSwitcher.tsx:24)", "shortDescription": {"text": "Dangling fetch: GET /api/me/active-institute (src/components/layout/ActiveInstituteSwitcher.tsx:24)"}, "fullDescription": {"text": "`src/components/layout/ActiveInstituteSwitcher.tsx:24` calls `GET /api/me/active-institute` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/me/active-institute`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0198909eb6f172d8", "name": "Dangling fetch: POST /api/me/active-institute (src/components/layout/ActiveInstituteSwitcher.tsx:49)", "shortDescription": {"text": "Dangling fetch: POST /api/me/active-institute (src/components/layout/ActiveInstituteSwitcher.tsx:49)"}, "fullDescription": {"text": "`src/components/layout/ActiveInstituteSwitcher.tsx:49` calls `POST /api/me/active-institute` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/me/active-institute`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cc823774b1b425f4", "name": "Dangling fetch: POST /api/exams/${examId}/match-answers (src/components/exam/AnswerMatchModal.tsx:232)", "shortDescription": {"text": "Dangling fetch: POST /api/exams/${examId}/match-answers (src/components/exam/AnswerMatchModal.tsx:232)"}, "fullDescription": {"text": "`src/components/exam/AnswerMatchModal.tsx:232` calls `POST /api/exams/${examId}/match-answers` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/match-answers`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c23a5854bdcdce22", "name": "Dangling fetch: PUT /api/exams/${examId}/match-answers (src/components/exam/AnswerMatchModal.tsx:288)", "shortDescription": {"text": "Dangling fetch: PUT /api/exams/${examId}/match-answers (src/components/exam/AnswerMatchModal.tsx:288)"}, "fullDescription": {"text": "`src/components/exam/AnswerMatchModal.tsx:288` calls `PUT /api/exams/${examId}/match-answers` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/match-answers`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d13679dc34132f8c", "name": "Dangling fetch: GET /api/users/students${qs} (src/components/exam/DeployExamModal.tsx:67)", "shortDescription": {"text": "Dangling fetch: GET /api/users/students${qs} (src/components/exam/DeployExamModal.tsx:67)"}, "fullDescription": {"text": "`src/components/exam/DeployExamModal.tsx:67` calls `GET /api/users/students${qs}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/users/students/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4a88ffd4d216bacc", "name": "Dangling fetch: POST /api/sessions (src/components/exam/DeployExamModal.tsx:116)", "shortDescription": {"text": "Dangling fetch: POST /api/sessions (src/components/exam/DeployExamModal.tsx:116)"}, "fullDescription": {"text": "`src/components/exam/DeployExamModal.tsx:116` calls `POST /api/sessions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sessions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-49e95ac43a268b84", "name": "Dangling fetch: POST /api/problems/${problemId}/update-figure (src/components/shared/FigureRenderer.tsx:130)", "shortDescription": {"text": "Dangling fetch: POST /api/problems/${problemId}/update-figure (src/components/shared/FigureRenderer.tsx:130)"}, "fullDescription": {"text": "`src/components/shared/FigureRenderer.tsx:130` calls `POST /api/problems/${problemId}/update-figure` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>/update-figure`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-13e5789f68ffeff8", "name": "Dangling fetch: POST /api/problems/${problemId}/update-figure (src/components/shared/FigureRenderer.tsx:202)", "shortDescription": {"text": "Dangling fetch: POST /api/problems/${problemId}/update-figure (src/components/shared/FigureRenderer.tsx:202)"}, "fullDescription": {"text": "`src/components/shared/FigureRenderer.tsx:202` calls `POST /api/problems/${problemId}/update-figure` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>/update-figure`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fa006d7581b2dbb6", "name": "Dangling fetch: GET /api/students/${encodeURIComponent(studentId)}/pitfall-summary (src/components/prescription/StudentP", "shortDescription": {"text": "Dangling fetch: GET /api/students/${encodeURIComponent(studentId)}/pitfall-summary (src/components/prescription/StudentPitfallSummary.tsx:66)"}, "fullDescription": {"text": "`src/components/prescription/StudentPitfallSummary.tsx:66` calls `GET /api/students/${encodeURIComponent(studentId)}/pitfall-summary` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/students/<p>/pitfall-summary`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-92ee82a093c2a87d", "name": "Dangling fetch: GET /api/exams (src/components/prescription/CreateSessionsModal.tsx:86)", "shortDescription": {"text": "Dangling fetch: GET /api/exams (src/components/prescription/CreateSessionsModal.tsx:86)"}, "fullDescription": {"text": "`src/components/prescription/CreateSessionsModal.tsx:86` calls `GET /api/exams` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5e7dda99e4834a18", "name": "Dangling fetch: POST /api/sessions (src/components/prescription/CreateSessionsModal.tsx:140)", "shortDescription": {"text": "Dangling fetch: POST /api/sessions (src/components/prescription/CreateSessionsModal.tsx:140)"}, "fullDescription": {"text": "`src/components/prescription/CreateSessionsModal.tsx:140` calls `POST /api/sessions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sessions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-340151f51b1251b6", "name": "Dangling fetch: GET /api/students/${encodeURIComponent(studentId)}/pitfall-summary (src/components/prescription/WeeklyCo", "shortDescription": {"text": "Dangling fetch: GET /api/students/${encodeURIComponent(studentId)}/pitfall-summary (src/components/prescription/WeeklyConnections.tsx:59)"}, "fullDescription": {"text": "`src/components/prescription/WeeklyConnections.tsx:59` calls `GET /api/students/${encodeURIComponent(studentId)}/pitfall-summary` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/students/<p>/pitfall-summary`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2a7d5a714fc82885", "name": "Dangling fetch: GET /api/students/${encodeURIComponent(studentId)}/pitfall-summary (src/components/prescription/Prescrip", "shortDescription": {"text": "Dangling fetch: GET /api/students/${encodeURIComponent(studentId)}/pitfall-summary (src/components/prescription/PrescriptionRecommendation.tsx:66)"}, "fullDescription": {"text": "`src/components/prescription/PrescriptionRecommendation.tsx:66` calls `GET /api/students/${encodeURIComponent(studentId)}/pitfall-summary` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/students/<p>/pitfall-summary`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-26088cf55dcb4638", "name": "Dangling fetch: GET /api/students/${encodeURIComponent(studentId)}/recommended-problems?topN=10 (src/components/prescrip", "shortDescription": {"text": "Dangling fetch: GET /api/students/${encodeURIComponent(studentId)}/recommended-problems?topN=10 (src/components/prescription/RecommendedProblems.tsx:58)"}, "fullDescription": {"text": "`src/components/prescription/RecommendedProblems.tsx:58` calls `GET /api/students/${encodeURIComponent(studentId)}/recommended-problems?topN=10` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/students/<p>/recommended-problems`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1623976dccff37ce", "name": "Dangling fetch: POST /api/students/${encodeURIComponent(studentId)}/generate-recommended-session (src/components/prescri", "shortDescription": {"text": "Dangling fetch: POST /api/students/${encodeURIComponent(studentId)}/generate-recommended-session (src/components/prescription/RecommendedProblems.tsx:220)"}, "fullDescription": {"text": "`src/components/prescription/RecommendedProblems.tsx:220` calls `POST /api/students/${encodeURIComponent(studentId)}/generate-recommended-session` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/students/<p>/generate-recommended-session`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8d91dfa7311a845b", "name": "Dangling fetch: GET /api/grades/roster (src/components/grades/GradeRosterTable.tsx:60)", "shortDescription": {"text": "Dangling fetch: GET /api/grades/roster (src/components/grades/GradeRosterTable.tsx:60)"}, "fullDescription": {"text": "`src/components/grades/GradeRosterTable.tsx:60` calls `GET /api/grades/roster` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/grades/roster`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c3959c1a8a4543b1", "name": "Dangling fetch: GET /api/students/${studentId}/analytics (src/components/students/StudentDetailContent.tsx:144)", "shortDescription": {"text": "Dangling fetch: GET /api/students/${studentId}/analytics (src/components/students/StudentDetailContent.tsx:144)"}, "fullDescription": {"text": "`src/components/students/StudentDetailContent.tsx:144` calls `GET /api/students/${studentId}/analytics` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/students/<p>/analytics`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7d3416f482c00986", "name": "Dangling fetch: GET /api/users/students (src/components/students/StudentDetailContent.tsx:160)", "shortDescription": {"text": "Dangling fetch: GET /api/users/students (src/components/students/StudentDetailContent.tsx:160)"}, "fullDescription": {"text": "`src/components/students/StudentDetailContent.tsx:160` calls `GET /api/users/students` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/users/students`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e53d21659ca64129", "name": "Dangling fetch: GET /api/diagnostics/exam-sets (src/components/students/StudentDetailContent.tsx:180)", "shortDescription": {"text": "Dangling fetch: GET /api/diagnostics/exam-sets (src/components/students/StudentDetailContent.tsx:180)"}, "fullDescription": {"text": "`src/components/students/StudentDetailContent.tsx:180` calls `GET /api/diagnostics/exam-sets` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/diagnostics/exam-sets`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3179d1ad657ddad8", "name": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/components/workflow/AnalyzeProblemEditModal.tsx:1126)", "shortDescription": {"text": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/components/workflow/AnalyzeProblemEditModal.tsx:1126)"}, "fullDescription": {"text": "`src/components/workflow/AnalyzeProblemEditModal.tsx:1126` calls `POST /api/workflow/reanalyze-crop` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/reanalyze-crop`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9e94292c328ad41c", "name": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/components/workflow/AnalyzeProblemEditModal.tsx:1217)", "shortDescription": {"text": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/components/workflow/AnalyzeProblemEditModal.tsx:1217)"}, "fullDescription": {"text": "`src/components/workflow/AnalyzeProblemEditModal.tsx:1217` calls `POST /api/workflow/reanalyze-crop` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/reanalyze-crop`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5b0ed65f5562626e", "name": "Dangling fetch: POST /api/workflow/twin (src/components/workflow/ZeroWrongLoop.tsx:98)", "shortDescription": {"text": "Dangling fetch: POST /api/workflow/twin (src/components/workflow/ZeroWrongLoop.tsx:98)"}, "fullDescription": {"text": "`src/components/workflow/ZeroWrongLoop.tsx:98` calls `POST /api/workflow/twin` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/twin`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c0b1bfbc2311b8fe", "name": "Dangling fetch: POST /api/workflow/twin (src/components/workflow/ZeroWrongLoop.tsx:142)", "shortDescription": {"text": "Dangling fetch: POST /api/workflow/twin (src/components/workflow/ZeroWrongLoop.tsx:142)"}, "fullDescription": {"text": "`src/components/workflow/ZeroWrongLoop.tsx:142` calls `POST /api/workflow/twin` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/twin`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5a23f3fbd36689ab", "name": "Dangling fetch: POST /api/workflow/upload-url (src/components/workflow/CloudFlowUploader.tsx:195)", "shortDescription": {"text": "Dangling fetch: POST /api/workflow/upload-url (src/components/workflow/CloudFlowUploader.tsx:195)"}, "fullDescription": {"text": "`src/components/workflow/CloudFlowUploader.tsx:195` calls `POST /api/workflow/upload-url` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/upload-url`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3fa7d80501abc417", "name": "Dangling fetch: POST /api/workflow/upload (src/components/workflow/CloudFlowUploader.tsx:312)", "shortDescription": {"text": "Dangling fetch: POST /api/workflow/upload (src/components/workflow/CloudFlowUploader.tsx:312)"}, "fullDescription": {"text": "`src/components/workflow/CloudFlowUploader.tsx:312` calls `POST /api/workflow/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/upload`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c0136fbc1f232171", "name": "Dangling fetch: GET /api/workflow/upload?jobId=${jobId} (src/components/workflow/CloudFlowUploader.tsx:406)", "shortDescription": {"text": "Dangling fetch: GET /api/workflow/upload?jobId=${jobId} (src/components/workflow/CloudFlowUploader.tsx:406)"}, "fullDescription": {"text": "`src/components/workflow/CloudFlowUploader.tsx:406` calls `GET /api/workflow/upload?jobId=${jobId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/upload`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-001fa6050693dbf1", "name": "Dangling fetch: POST /api/workflow/twin (src/components/workflow/TwinProblemButton.tsx:44)", "shortDescription": {"text": "Dangling fetch: POST /api/workflow/twin (src/components/workflow/TwinProblemButton.tsx:44)"}, "fullDescription": {"text": "`src/components/workflow/TwinProblemButton.tsx:44` calls `POST /api/workflow/twin` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/twin`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3a6ee078a91e3e85", "name": "Dangling fetch: GET /api/diagnostics/exam-sets (src/components/class/StudentLearningReport.tsx:87)", "shortDescription": {"text": "Dangling fetch: GET /api/diagnostics/exam-sets (src/components/class/StudentLearningReport.tsx:87)"}, "fullDescription": {"text": "`src/components/class/StudentLearningReport.tsx:87` calls `GET /api/diagnostics/exam-sets` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/diagnostics/exam-sets`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8a1caa78a413c0be", "name": "Dangling fetch: GET /api/diagnostics/report-tokens?studentId=${encodeURIComponent(sid)} (src/components/class/StudentLea", "shortDescription": {"text": "Dangling fetch: GET /api/diagnostics/report-tokens?studentId=${encodeURIComponent(sid)} (src/components/class/StudentLearningReport.tsx:98)"}, "fullDescription": {"text": "`src/components/class/StudentLearningReport.tsx:98` calls `GET /api/diagnostics/report-tokens?studentId=${encodeURIComponent(sid)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/diagnostics/report-tokens`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8ddf5e087a0f7a0e", "name": "Dangling fetch: DELETE /api/diagnostics/report-tokens (src/components/class/StudentLearningReport.tsx:118)", "shortDescription": {"text": "Dangling fetch: DELETE /api/diagnostics/report-tokens (src/components/class/StudentLearningReport.tsx:118)"}, "fullDescription": {"text": "`src/components/class/StudentLearningReport.tsx:118` calls `DELETE /api/diagnostics/report-tokens` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/diagnostics/report-tokens`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0371a7c514958c4c", "name": "Dangling fetch: POST /api/me/change-password (src/components/account/ChangePasswordCard.tsx:43)", "shortDescription": {"text": "Dangling fetch: POST /api/me/change-password (src/components/account/ChangePasswordCard.tsx:43)"}, "fullDescription": {"text": "`src/components/account/ChangePasswordCard.tsx:43` calls `POST /api/me/change-password` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/me/change-password`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3e5e715e8a014625", "name": "Dangling fetch: GET /api/problems/search?${params} (src/components/papers/AddProblemsModal.tsx:72)", "shortDescription": {"text": "Dangling fetch: GET /api/problems/search?${params} (src/components/papers/AddProblemsModal.tsx:72)"}, "fullDescription": {"text": "`src/components/papers/AddProblemsModal.tsx:72` calls `GET /api/problems/search?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/search`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5ebeeec8c963bbbd", "name": "Dangling fetch: POST /api/exams/${examId}/problems (src/components/papers/AddProblemsModal.tsx:252)", "shortDescription": {"text": "Dangling fetch: POST /api/exams/${examId}/problems (src/components/papers/AddProblemsModal.tsx:252)"}, "fullDescription": {"text": "`src/components/papers/AddProblemsModal.tsx:252` calls `POST /api/exams/${examId}/problems` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/problems`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f77826e0b6827917", "name": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/components/papers/ProblemEditModal.tsx:866)", "shortDescription": {"text": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/components/papers/ProblemEditModal.tsx:866)"}, "fullDescription": {"text": "`src/components/papers/ProblemEditModal.tsx:866` calls `POST /api/workflow/reanalyze-crop` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/reanalyze-crop`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-075ccc31e32eac9b", "name": "Dangling fetch: POST /api/storage/upload-image (src/components/papers/ProblemEditModal.tsx:966)", "shortDescription": {"text": "Dangling fetch: POST /api/storage/upload-image (src/components/papers/ProblemEditModal.tsx:966)"}, "fullDescription": {"text": "`src/components/papers/ProblemEditModal.tsx:966` calls `POST /api/storage/upload-image` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/storage/upload-image`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2080454f27e5126e", "name": "Dangling fetch: POST /api/problems/${problemId}/generate-solution (src/components/papers/ProblemEditModal.tsx:1078)", "shortDescription": {"text": "Dangling fetch: POST /api/problems/${problemId}/generate-solution (src/components/papers/ProblemEditModal.tsx:1078)"}, "fullDescription": {"text": "`src/components/papers/ProblemEditModal.tsx:1078` calls `POST /api/problems/${problemId}/generate-solution` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>/generate-solution`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5fc3dbecb7efe24c", "name": "Dangling fetch: PATCH /api/problems/${problemId} (src/components/papers/ProblemEditModal.tsx:1179)", "shortDescription": {"text": "Dangling fetch: PATCH /api/problems/${problemId} (src/components/papers/ProblemEditModal.tsx:1179)"}, "fullDescription": {"text": "`src/components/papers/ProblemEditModal.tsx:1179` calls `PATCH /api/problems/${problemId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c22a23bc4a0e1e42", "name": "Dangling fetch: POST /api/latex-corrections (src/components/papers/ProblemEditModal.tsx:1220)", "shortDescription": {"text": "Dangling fetch: POST /api/latex-corrections (src/components/papers/ProblemEditModal.tsx:1220)"}, "fullDescription": {"text": "`src/components/papers/ProblemEditModal.tsx:1220` calls `POST /api/latex-corrections` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/latex-corrections`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-63e7552ad5b684a3", "name": "Dangling fetch: POST /api/latex-corrections (src/components/papers/ProblemEditModal.tsx:1232)", "shortDescription": {"text": "Dangling fetch: POST /api/latex-corrections (src/components/papers/ProblemEditModal.tsx:1232)"}, "fullDescription": {"text": "`src/components/papers/ProblemEditModal.tsx:1232` calls `POST /api/latex-corrections` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/latex-corrections`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5e78e235edb43767", "name": "Dangling fetch: POST /api/problems/${problemId}/reanalyze (src/components/papers/ProblemEditModal.tsx:1265)", "shortDescription": {"text": "Dangling fetch: POST /api/problems/${problemId}/reanalyze (src/components/papers/ProblemEditModal.tsx:1265)"}, "fullDescription": {"text": "`src/components/papers/ProblemEditModal.tsx:1265` calls `POST /api/problems/${problemId}/reanalyze` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>/reanalyze`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a34652264610a123", "name": "Dangling fetch: GET /api/mathsecr-types?subject=${subjectCode} (src/components/papers/MathsecrTreePicker.tsx:66)", "shortDescription": {"text": "Dangling fetch: GET /api/mathsecr-types?subject=${subjectCode} (src/components/papers/MathsecrTreePicker.tsx:66)"}, "fullDescription": {"text": "`src/components/papers/MathsecrTreePicker.tsx:66` calls `GET /api/mathsecr-types?subject=${subjectCode}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/mathsecr-types`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b9f2f7025c529c94", "name": "Dangling fetch: GET /api/diagram-images?${params} (src/components/papers/DiagramBrowserModal.tsx:126)", "shortDescription": {"text": "Dangling fetch: GET /api/diagram-images?${params} (src/components/papers/DiagramBrowserModal.tsx:126)"}, "fullDescription": {"text": "`src/components/papers/DiagramBrowserModal.tsx:126` calls `GET /api/diagram-images?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/diagram-images`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b2e1c3467c565ce5", "name": "Dangling fetch: POST /api/diagram-images/upload (src/components/papers/DiagramBrowserModal.tsx:224)", "shortDescription": {"text": "Dangling fetch: POST /api/diagram-images/upload (src/components/papers/DiagramBrowserModal.tsx:224)"}, "fullDescription": {"text": "`src/components/papers/DiagramBrowserModal.tsx:224` calls `POST /api/diagram-images/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/diagram-images/upload`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4b78082502716ace", "name": "Dangling fetch: POST /api/diagram-images/upload (src/components/papers/DiagramBrowserModal.tsx:284)", "shortDescription": {"text": "Dangling fetch: POST /api/diagram-images/upload (src/components/papers/DiagramBrowserModal.tsx:284)"}, "fullDescription": {"text": "`src/components/papers/DiagramBrowserModal.tsx:284` calls `POST /api/diagram-images/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/diagram-images/upload`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e76bc46a50e83c0f", "name": "Dangling fetch: GET /api/exams/${examId} (src/components/papers/ExamViewerModal.tsx:76)", "shortDescription": {"text": "Dangling fetch: GET /api/exams/${examId} (src/components/papers/ExamViewerModal.tsx:76)"}, "fullDescription": {"text": "`src/components/papers/ExamViewerModal.tsx:76` calls `GET /api/exams/${examId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ed3f9840addef3f1", "name": "Dangling fetch: GET /api/latex-corrections (src/components/papers/RenderRepairPanel.tsx:65)", "shortDescription": {"text": "Dangling fetch: GET /api/latex-corrections (src/components/papers/RenderRepairPanel.tsx:65)"}, "fullDescription": {"text": "`src/components/papers/RenderRepairPanel.tsx:65` calls `GET /api/latex-corrections` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/latex-corrections`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f429f080797c5999", "name": "Dangling fetch: POST /api/workflow/twin (src/components/papers/TwinProblemModal.tsx:100)", "shortDescription": {"text": "Dangling fetch: POST /api/workflow/twin (src/components/papers/TwinProblemModal.tsx:100)"}, "fullDescription": {"text": "`src/components/papers/TwinProblemModal.tsx:100` calls `POST /api/workflow/twin` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/twin`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-72fa672ef8420a42", "name": "Dangling fetch: POST /api/sessions/${sessionId}/grading-sheet (src/components/grading/GradingSheetUpload.tsx:80)", "shortDescription": {"text": "Dangling fetch: POST /api/sessions/${sessionId}/grading-sheet (src/components/grading/GradingSheetUpload.tsx:80)"}, "fullDescription": {"text": "`src/components/grading/GradingSheetUpload.tsx:80` calls `POST /api/sessions/${sessionId}/grading-sheet` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sessions/<p>/grading-sheet`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ec4f12c07f2850f4", "name": "Dangling fetch: PUT /api/sessions/${sessionId}/grading-sheet (src/components/grading/GradingSheetUpload.tsx:126)", "shortDescription": {"text": "Dangling fetch: PUT /api/sessions/${sessionId}/grading-sheet (src/components/grading/GradingSheetUpload.tsx:126)"}, "fullDescription": {"text": "`src/components/grading/GradingSheetUpload.tsx:126` calls `PUT /api/sessions/${sessionId}/grading-sheet` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sessions/<p>/grading-sheet`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-538a4f73f101fa3b", "name": "Dangling fetch: GET /api/users/me/track (src/contexts/SubjectTrackContext.tsx:50)", "shortDescription": {"text": "Dangling fetch: GET /api/users/me/track (src/contexts/SubjectTrackContext.tsx:50)"}, "fullDescription": {"text": "`src/contexts/SubjectTrackContext.tsx:50` calls `GET /api/users/me/track` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/users/me/track`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-01fd5db20ba1c101", "name": "Dangling fetch: PATCH /api/users/me/track (src/contexts/SubjectTrackContext.tsx:128)", "shortDescription": {"text": "Dangling fetch: PATCH /api/users/me/track (src/contexts/SubjectTrackContext.tsx:128)"}, "fullDescription": {"text": "`src/contexts/SubjectTrackContext.tsx:128` calls `PATCH /api/users/me/track` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/users/me/track`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8645830def290949", "name": "Dangling fetch: GET /api/sessions/${sessionId} (src/app/answer/[session_id]/page.tsx:109)", "shortDescription": {"text": "Dangling fetch: GET /api/sessions/${sessionId} (src/app/answer/[session_id]/page.tsx:109)"}, "fullDescription": {"text": "`src/app/answer/[session_id]/page.tsx:109` calls `GET /api/sessions/${sessionId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sessions/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ca7d3a8d629e5eb3", "name": "Dangling fetch: POST /api/session-results/from-student (src/app/answer/[session_id]/page.tsx:158)", "shortDescription": {"text": "Dangling fetch: POST /api/session-results/from-student (src/app/answer/[session_id]/page.tsx:158)"}, "fullDescription": {"text": "`src/app/answer/[session_id]/page.tsx:158` calls `POST /api/session-results/from-student` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/session-results/from-student`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-63b67fccf4c7b914", "name": "Dangling fetch: GET /api/students/me/sessions (src/app/student/exams/page.tsx:74)", "shortDescription": {"text": "Dangling fetch: GET /api/students/me/sessions (src/app/student/exams/page.tsx:74)"}, "fullDescription": {"text": "`src/app/student/exams/page.tsx:74` calls `GET /api/students/me/sessions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/students/me/sessions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-673e93d2a186aad0", "name": "Dangling fetch: GET /api/analytics/heatmap?range=${dateRange} (src/app/student/analytics/page.tsx:35)", "shortDescription": {"text": "Dangling fetch: GET /api/analytics/heatmap?range=${dateRange} (src/app/student/analytics/page.tsx:35)"}, "fullDescription": {"text": "`src/app/student/analytics/page.tsx:35` calls `GET /api/analytics/heatmap?range=${dateRange}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/analytics/heatmap`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-38ac6f4006835656", "name": "Dangling fetch: GET /api/sessions/${sessionId} (src/app/student/sessions/[id]/page.tsx:82)", "shortDescription": {"text": "Dangling fetch: GET /api/sessions/${sessionId} (src/app/student/sessions/[id]/page.tsx:82)"}, "fullDescription": {"text": "`src/app/student/sessions/[id]/page.tsx:82` calls `GET /api/sessions/${sessionId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sessions/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3eadca03daf39918", "name": "Dangling fetch: GET /api/organizations/${orgId}/public (src/app/auth/login/page.tsx:37)", "shortDescription": {"text": "Dangling fetch: GET /api/organizations/${orgId}/public (src/app/auth/login/page.tsx:37)"}, "fullDescription": {"text": "`src/app/auth/login/page.tsx:37` calls `GET /api/organizations/${orgId}/public` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/organizations/<p>/public`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-310604bc2b6131c8", "name": "Dangling fetch: GET /api/institutes/public?organization_id=${selectedOrg.id} (src/app/auth/signup/page.tsx:128)", "shortDescription": {"text": "Dangling fetch: GET /api/institutes/public?organization_id=${selectedOrg.id} (src/app/auth/signup/page.tsx:128)"}, "fullDescription": {"text": "`src/app/auth/signup/page.tsx:128` calls `GET /api/institutes/public?organization_id=${selectedOrg.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/institutes/public`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ecb0c2be716a36e7", "name": "Dangling fetch: POST /api/organization-applications (src/app/auth/signup/page.tsx:302)", "shortDescription": {"text": "Dangling fetch: POST /api/organization-applications (src/app/auth/signup/page.tsx:302)"}, "fullDescription": {"text": "`src/app/auth/signup/page.tsx:302` calls `POST /api/organization-applications` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/organization-applications`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-754eab2a13c5b533", "name": "Dangling fetch: GET /api/parent/${encodeURIComponent(token)} (src/app/parent/[token]/page.tsx:64)", "shortDescription": {"text": "Dangling fetch: GET /api/parent/${encodeURIComponent(token)} (src/app/parent/[token]/page.tsx:64)"}, "fullDescription": {"text": "`src/app/parent/[token]/page.tsx:64` calls `GET /api/parent/${encodeURIComponent(token)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/parent/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b4fccfdbfff98604", "name": "Dangling fetch: GET /api/sessions/${id}/print-meta?variant=${variant} (src/app/print/session/[sessionId]/page.tsx:77)", "shortDescription": {"text": "Dangling fetch: GET /api/sessions/${id}/print-meta?variant=${variant} (src/app/print/session/[sessionId]/page.tsx:77)"}, "fullDescription": {"text": "`src/app/print/session/[sessionId]/page.tsx:77` calls `GET /api/sessions/${id}/print-meta?variant=${variant}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sessions/<p>/print-meta`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-eb391b0f920790af", "name": "Dangling fetch: POST https://api.mathpix.com/v3/pdf (src/app/api/exams/[examId]/match-answers/route.ts:949)", "shortDescription": {"text": "Dangling fetch: POST https://api.mathpix.com/v3/pdf (src/app/api/exams/[examId]/match-answers/route.ts:949)"}, "fullDescription": {"text": "`src/app/api/exams/[examId]/match-answers/route.ts:949` calls `POST https://api.mathpix.com/v3/pdf` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.mathpix.com/v3/pdf`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-07db532c0e8748e0", "name": "Dangling fetch: GET https://api.mathpix.com/v3/pdf/${pdfId} (src/app/api/exams/[examId]/match-answers/route.ts:967)", "shortDescription": {"text": "Dangling fetch: GET https://api.mathpix.com/v3/pdf/${pdfId} (src/app/api/exams/[examId]/match-answers/route.ts:967)"}, "fullDescription": {"text": "`src/app/api/exams/[examId]/match-answers/route.ts:967` calls `GET https://api.mathpix.com/v3/pdf/${pdfId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.mathpix.com/v3/pdf/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-280e3b1231cf5635", "name": "Dangling fetch: GET https://api.mathpix.com/v3/pdf/${pdfId}.mmd (src/app/api/exams/[examId]/match-answers/route.ts:976)", "shortDescription": {"text": "Dangling fetch: GET https://api.mathpix.com/v3/pdf/${pdfId}.mmd (src/app/api/exams/[examId]/match-answers/route.ts:976)"}, "fullDescription": {"text": "`src/app/api/exams/[examId]/match-answers/route.ts:976` calls `GET https://api.mathpix.com/v3/pdf/${pdfId}.mmd` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.mathpix.com/v3/pdf/<p>.mmd`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-894f7c0512173b75", "name": "Dangling fetch: POST https://api.mathpix.com/v3/text (src/app/api/exams/[examId]/match-answers/route.ts:1008)", "shortDescription": {"text": "Dangling fetch: POST https://api.mathpix.com/v3/text (src/app/api/exams/[examId]/match-answers/route.ts:1008)"}, "fullDescription": {"text": "`src/app/api/exams/[examId]/match-answers/route.ts:1008` calls `POST https://api.mathpix.com/v3/text` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.mathpix.com/v3/text`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-70b0730581dfb309", "name": "Dangling fetch: POST https://api.mathpix.com/v3/text (src/app/api/admin/reocr-points/route.ts:72)", "shortDescription": {"text": "Dangling fetch: POST https://api.mathpix.com/v3/text (src/app/api/admin/reocr-points/route.ts:72)"}, "fullDescription": {"text": "`src/app/api/admin/reocr-points/route.ts:72` calls `POST https://api.mathpix.com/v3/text` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.mathpix.com/v3/text`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e151e97cb2bb8b9c", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/api/workflow/detect-problems/route.ts:132)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/api/workflow/detect-problems/route.ts:132)"}, "fullDescription": {"text": "`src/app/api/workflow/detect-problems/route.ts:132` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-48bfe93102649246", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/api/workflow/reanalyze-crop/route.ts:994)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/api/workflow/reanalyze-crop/route.ts:994)"}, "fullDescription": {"text": "`src/app/api/workflow/reanalyze-crop/route.ts:994` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d5df3180093e103a", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/api/workflow/reanalyze-crop/route.ts:1117)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/api/workflow/reanalyze-crop/route.ts:1117)"}, "fullDescription": {"text": "`src/app/api/workflow/reanalyze-crop/route.ts:1117` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e3bc6309cd04df9a", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/app/api/workflow/reanalyze-crop/route.ts:1203)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/app/api/workflow/reanalyze-crop/route.ts:1203)"}, "fullDescription": {"text": "`src/app/api/workflow/reanalyze-crop/route.ts:1203` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0011f62229c077e9", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/api/workflow/detect-figures-gpt/route.ts:92)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/api/workflow/detect-figures-gpt/route.ts:92)"}, "fullDescription": {"text": "`src/app/api/workflow/detect-figures-gpt/route.ts:92` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-37dbf1552e94bcd3", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/app/api/problems/[problemId]/generate-solution/route.ts:", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/app/api/problems/[problemId]/generate-solution/route.ts:488)"}, "fullDescription": {"text": "`src/app/api/problems/[problemId]/generate-solution/route.ts:488` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3ca2c5a0f0df39b9", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/app/api/problems/[problemId]/generate-solution/route.ts:", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/app/api/problems/[problemId]/generate-solution/route.ts:534)"}, "fullDescription": {"text": "`src/app/api/problems/[problemId]/generate-solution/route.ts:534` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3c92418f7a16dbf5", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/app/api/problems/[problemId]/generate-solution/route.ts:", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/app/api/problems/[problemId]/generate-solution/route.ts:571)"}, "fullDescription": {"text": "`src/app/api/problems/[problemId]/generate-solution/route.ts:571` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bb1be0819ccafa6b", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/api/problems/[problemId]/generate-solution/rout", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/api/problems/[problemId]/generate-solution/route.ts:631)"}, "fullDescription": {"text": "`src/app/api/problems/[problemId]/generate-solution/route.ts:631` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-723fe14755987e7e", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/app/api/problems/[problemId]/generate-solution/route.ts:", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/app/api/problems/[problemId]/generate-solution/route.ts:860)"}, "fullDescription": {"text": "`src/app/api/problems/[problemId]/generate-solution/route.ts:860` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-31f875d61524943c", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/app/api/problems/[problemId]/generate-solution/route.ts:", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/app/api/problems/[problemId]/generate-solution/route.ts:950)"}, "fullDescription": {"text": "`src/app/api/problems/[problemId]/generate-solution/route.ts:950` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-91b9c9a4a7abdeb9", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/api/problems/[problemId]/reanalyze/route.ts:531", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/api/problems/[problemId]/reanalyze/route.ts:531)"}, "fullDescription": {"text": "`src/app/api/problems/[problemId]/reanalyze/route.ts:531` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-da6e9554f96ed292", "name": "Dangling fetch: GET /api/admin/users?${params.toString()} (src/app/dashboard/settings/page.tsx:99)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/users?${params.toString()} (src/app/dashboard/settings/page.tsx:99)"}, "fullDescription": {"text": "`src/app/dashboard/settings/page.tsx:99` calls `GET /api/admin/users?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/users`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2e1caf73354dcdb5", "name": "Dangling fetch: GET /api/admin/system-stats (src/app/dashboard/settings/page.tsx:118)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/system-stats (src/app/dashboard/settings/page.tsx:118)"}, "fullDescription": {"text": "`src/app/dashboard/settings/page.tsx:118` calls `GET /api/admin/system-stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/system-stats`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cb770588c758e09d", "name": "Dangling fetch: GET /api/exams?is_diagnostic=true (src/app/dashboard/exam-create/page.tsx:258)", "shortDescription": {"text": "Dangling fetch: GET /api/exams?is_diagnostic=true (src/app/dashboard/exam-create/page.tsx:258)"}, "fullDescription": {"text": "`src/app/dashboard/exam-create/page.tsx:258` calls `GET /api/exams?is_diagnostic=true` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-40b3e14acc17631c", "name": "Dangling fetch: GET /api/exams?is_diagnostic=false (src/app/dashboard/exam-create/page.tsx:281)", "shortDescription": {"text": "Dangling fetch: GET /api/exams?is_diagnostic=false (src/app/dashboard/exam-create/page.tsx:281)"}, "fullDescription": {"text": "`src/app/dashboard/exam-create/page.tsx:281` calls `GET /api/exams?is_diagnostic=false` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9b33fb06a97a9996", "name": "Dangling fetch: GET /api/exams/school-filter-options (src/app/dashboard/exam-create/page.tsx:307)", "shortDescription": {"text": "Dangling fetch: GET /api/exams/school-filter-options (src/app/dashboard/exam-create/page.tsx:307)"}, "fullDescription": {"text": "`src/app/dashboard/exam-create/page.tsx:307` calls `GET /api/exams/school-filter-options` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/school-filter-options`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7aadcd0ce2d7ee72", "name": "Dangling fetch: GET /api/exams/${selectedSchoolExamId} (src/app/dashboard/exam-create/page.tsx:336)", "shortDescription": {"text": "Dangling fetch: GET /api/exams/${selectedSchoolExamId} (src/app/dashboard/exam-create/page.tsx:336)"}, "fullDescription": {"text": "`src/app/dashboard/exam-create/page.tsx:336` calls `GET /api/exams/${selectedSchoolExamId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b9bfa4b9f3069c27", "name": "Dangling fetch: GET /api/book-groups (src/app/dashboard/exam-create/page.tsx:369)", "shortDescription": {"text": "Dangling fetch: GET /api/book-groups (src/app/dashboard/exam-create/page.tsx:369)"}, "fullDescription": {"text": "`src/app/dashboard/exam-create/page.tsx:369` calls `GET /api/book-groups` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/book-groups`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-99ae9412340c0fd9", "name": "Dangling fetch: GET /api/exams?is_diagnostic=false (src/app/dashboard/exam-create/page.tsx:370)", "shortDescription": {"text": "Dangling fetch: GET /api/exams?is_diagnostic=false (src/app/dashboard/exam-create/page.tsx:370)"}, "fullDescription": {"text": "`src/app/dashboard/exam-create/page.tsx:370` calls `GET /api/exams?is_diagnostic=false` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c4693cf159e07734", "name": "Dangling fetch: GET /api/exams?is_diagnostic=false (src/app/dashboard/exam-create/page.tsx:401)", "shortDescription": {"text": "Dangling fetch: GET /api/exams?is_diagnostic=false (src/app/dashboard/exam-create/page.tsx:401)"}, "fullDescription": {"text": "`src/app/dashboard/exam-create/page.tsx:401` calls `GET /api/exams?is_diagnostic=false` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9fd8ed50fd9f1ef6", "name": "Dangling fetch: GET /api/exams/${selectedMockExamId} (src/app/dashboard/exam-create/page.tsx:445)", "shortDescription": {"text": "Dangling fetch: GET /api/exams/${selectedMockExamId} (src/app/dashboard/exam-create/page.tsx:445)"}, "fullDescription": {"text": "`src/app/dashboard/exam-create/page.tsx:445` calls `GET /api/exams/${selectedMockExamId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6ec00d8775f1860c", "name": "Dangling fetch: GET /api/exams/${selectedTextbookExamId} (src/app/dashboard/exam-create/page.tsx:478)", "shortDescription": {"text": "Dangling fetch: GET /api/exams/${selectedTextbookExamId} (src/app/dashboard/exam-create/page.tsx:478)"}, "fullDescription": {"text": "`src/app/dashboard/exam-create/page.tsx:478` calls `GET /api/exams/${selectedTextbookExamId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-98915a07a86b5207", "name": "Dangling fetch: GET /api/exams/${selectedDiagExamId} (src/app/dashboard/exam-create/page.tsx:511)", "shortDescription": {"text": "Dangling fetch: GET /api/exams/${selectedDiagExamId} (src/app/dashboard/exam-create/page.tsx:511)"}, "fullDescription": {"text": "`src/app/dashboard/exam-create/page.tsx:511` calls `GET /api/exams/${selectedDiagExamId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c40d47ad30a22b22", "name": "Dangling fetch: GET /api/problems/search?${params.toString()} (src/app/dashboard/exam-create/page.tsx:547)", "shortDescription": {"text": "Dangling fetch: GET /api/problems/search?${params.toString()} (src/app/dashboard/exam-create/page.tsx:547)"}, "fullDescription": {"text": "`src/app/dashboard/exam-create/page.tsx:547` calls `GET /api/problems/search?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/search`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3926e8307b0c8087", "name": "Dangling fetch: POST /api/exams/create-from-problems (src/app/dashboard/exam-create/page.tsx:1930)", "shortDescription": {"text": "Dangling fetch: POST /api/exams/create-from-problems (src/app/dashboard/exam-create/page.tsx:1930)"}, "fullDescription": {"text": "`src/app/dashboard/exam-create/page.tsx:1930` calls `POST /api/exams/create-from-problems` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/create-from-problems`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0402afc0098993ef", "name": "Dangling fetch: GET /api/users/students (src/app/dashboard/prescription/page.tsx:131)", "shortDescription": {"text": "Dangling fetch: GET /api/users/students (src/app/dashboard/prescription/page.tsx:131)"}, "fullDescription": {"text": "`src/app/dashboard/prescription/page.tsx:131` calls `GET /api/users/students` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/users/students`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ede50ef0c27b7f5f", "name": "Dangling fetch: GET /api/students/${student.id}/analytics (src/app/dashboard/prescription/page.tsx:200)", "shortDescription": {"text": "Dangling fetch: GET /api/students/${student.id}/analytics (src/app/dashboard/prescription/page.tsx:200)"}, "fullDescription": {"text": "`src/app/dashboard/prescription/page.tsx:200` calls `GET /api/students/${student.id}/analytics` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/students/<p>/analytics`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5082069a73f4094c", "name": "Dangling fetch: POST /api/parent/issue (src/app/dashboard/prescription/page.tsx:553)", "shortDescription": {"text": "Dangling fetch: POST /api/parent/issue (src/app/dashboard/prescription/page.tsx:553)"}, "fullDescription": {"text": "`src/app/dashboard/prescription/page.tsx:553` calls `POST /api/parent/issue` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/parent/issue`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7b599ef8497e87b1", "name": "Dangling fetch: GET /api/diagnostics/analytics (src/app/dashboard/prescription/analytics/page.tsx:83)", "shortDescription": {"text": "Dangling fetch: GET /api/diagnostics/analytics (src/app/dashboard/prescription/analytics/page.tsx:83)"}, "fullDescription": {"text": "`src/app/dashboard/prescription/analytics/page.tsx:83` calls `GET /api/diagnostics/analytics` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/diagnostics/analytics`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5c9238f46a85058b", "name": "Dangling fetch: GET /api/diagnostics/exam-sets (src/app/dashboard/prescription/report/page.tsx:43)", "shortDescription": {"text": "Dangling fetch: GET /api/diagnostics/exam-sets (src/app/dashboard/prescription/report/page.tsx:43)"}, "fullDescription": {"text": "`src/app/dashboard/prescription/report/page.tsx:43` calls `GET /api/diagnostics/exam-sets` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/diagnostics/exam-sets`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4968ddc34874ade8", "name": "Dangling fetch: GET /api/users/students (src/app/dashboard/prescription/report/page.tsx:70)", "shortDescription": {"text": "Dangling fetch: GET /api/users/students (src/app/dashboard/prescription/report/page.tsx:70)"}, "fullDescription": {"text": "`src/app/dashboard/prescription/report/page.tsx:70` calls `GET /api/users/students` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/users/students`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-20b47319589942b4", "name": "Dangling fetch: GET /api/diagnostics/comprehensive-report?${qs} (src/app/dashboard/prescription/report/page.tsx:100)", "shortDescription": {"text": "Dangling fetch: GET /api/diagnostics/comprehensive-report?${qs} (src/app/dashboard/prescription/report/page.tsx:100)"}, "fullDescription": {"text": "`src/app/dashboard/prescription/report/page.tsx:100` calls `GET /api/diagnostics/comprehensive-report?${qs}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/diagnostics/comprehensive-report`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f0c18558d67eb585", "name": "Dangling fetch: POST /api/diagnostics/report/issue (src/app/dashboard/prescription/report/page.tsx:252)", "shortDescription": {"text": "Dangling fetch: POST /api/diagnostics/report/issue (src/app/dashboard/prescription/report/page.tsx:252)"}, "fullDescription": {"text": "`src/app/dashboard/prescription/report/page.tsx:252` calls `POST /api/diagnostics/report/issue` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/diagnostics/report/issue`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0052ba9edd56f034", "name": "Dangling fetch: PATCH /api/exams/${examId} (src/app/dashboard/cloud/CloudListClient.tsx:993)", "shortDescription": {"text": "Dangling fetch: PATCH /api/exams/${examId} (src/app/dashboard/cloud/CloudListClient.tsx:993)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/CloudListClient.tsx:993` calls `PATCH /api/exams/${examId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e8923f945ca812ac", "name": "Dangling fetch: GET /api/book-groups${subjectParam} (src/app/dashboard/cloud/CloudListClient.tsx:1030)", "shortDescription": {"text": "Dangling fetch: GET /api/book-groups${subjectParam} (src/app/dashboard/cloud/CloudListClient.tsx:1030)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/CloudListClient.tsx:1030` calls `GET /api/book-groups${subjectParam}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/book-groups/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b1cce26b5831b62b", "name": "Dangling fetch: GET /api/exams${subjectParam} (src/app/dashboard/cloud/CloudListClient.tsx:1031)", "shortDescription": {"text": "Dangling fetch: GET /api/exams${subjectParam} (src/app/dashboard/cloud/CloudListClient.tsx:1031)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/CloudListClient.tsx:1031` calls `GET /api/exams${subjectParam}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b929018bac7659df", "name": "Dangling fetch: POST /api/book-groups (src/app/dashboard/cloud/CloudListClient.tsx:1154)", "shortDescription": {"text": "Dangling fetch: POST /api/book-groups (src/app/dashboard/cloud/CloudListClient.tsx:1154)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/CloudListClient.tsx:1154` calls `POST /api/book-groups` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/book-groups`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e3c1e71027b0ffd7", "name": "Dangling fetch: PUT /api/book-groups/${renamingGroupId} (src/app/dashboard/cloud/CloudListClient.tsx:1198)", "shortDescription": {"text": "Dangling fetch: PUT /api/book-groups/${renamingGroupId} (src/app/dashboard/cloud/CloudListClient.tsx:1198)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/CloudListClient.tsx:1198` calls `PUT /api/book-groups/${renamingGroupId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/book-groups/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3433457058803e4c", "name": "Dangling fetch: DELETE /api/book-groups/${id} (src/app/dashboard/cloud/CloudListClient.tsx:1220)", "shortDescription": {"text": "Dangling fetch: DELETE /api/book-groups/${id} (src/app/dashboard/cloud/CloudListClient.tsx:1220)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/CloudListClient.tsx:1220` calls `DELETE /api/book-groups/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/book-groups/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-78316de30b88001d", "name": "Dangling fetch: PATCH /api/exams/${renamingExamId} (src/app/dashboard/cloud/CloudListClient.tsx:1541)", "shortDescription": {"text": "Dangling fetch: PATCH /api/exams/${renamingExamId} (src/app/dashboard/cloud/CloudListClient.tsx:1541)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/CloudListClient.tsx:1541` calls `PATCH /api/exams/${renamingExamId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-80110fa8ac052acc", "name": "Dangling fetch: PATCH /api/exams/${movingExam.id} (src/app/dashboard/cloud/CloudListClient.tsx:1563)", "shortDescription": {"text": "Dangling fetch: PATCH /api/exams/${movingExam.id} (src/app/dashboard/cloud/CloudListClient.tsx:1563)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/CloudListClient.tsx:1563` calls `PATCH /api/exams/${movingExam.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6103543e3a07b1b0", "name": "Dangling fetch: DELETE /api/exams/${deleteModal.examId} (src/app/dashboard/cloud/CloudListClient.tsx:1607)", "shortDescription": {"text": "Dangling fetch: DELETE /api/exams/${deleteModal.examId} (src/app/dashboard/cloud/CloudListClient.tsx:1607)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/CloudListClient.tsx:1607` calls `DELETE /api/exams/${deleteModal.examId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7d4c8d0bfed121e3", "name": "Dangling fetch: DELETE /api/exams/${exam.id} (src/app/dashboard/cloud/CloudListClient.tsx:1618)", "shortDescription": {"text": "Dangling fetch: DELETE /api/exams/${exam.id} (src/app/dashboard/cloud/CloudListClient.tsx:1618)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/CloudListClient.tsx:1618` calls `DELETE /api/exams/${exam.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3966796818f180e2", "name": "Dangling fetch: PATCH /api/problems/${problemId} (src/app/dashboard/cloud/[examId]/page.tsx:701)", "shortDescription": {"text": "Dangling fetch: PATCH /api/problems/${problemId} (src/app/dashboard/cloud/[examId]/page.tsx:701)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:701` calls `PATCH /api/problems/${problemId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3ff2a8d845636289", "name": "Dangling fetch: GET /api/problems/${problem.id} (src/app/dashboard/cloud/[examId]/page.tsx:946)", "shortDescription": {"text": "Dangling fetch: GET /api/problems/${problem.id} (src/app/dashboard/cloud/[examId]/page.tsx:946)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:946` calls `GET /api/problems/${problem.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-72c6735b9f2f23a1", "name": "Dangling fetch: PATCH /api/problems/${problem.id} (src/app/dashboard/cloud/[examId]/page.tsx:958)", "shortDescription": {"text": "Dangling fetch: PATCH /api/problems/${problem.id} (src/app/dashboard/cloud/[examId]/page.tsx:958)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:958` calls `PATCH /api/problems/${problem.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f76531ae617e90d9", "name": "Dangling fetch: POST /api/figure-corrections (src/app/dashboard/cloud/[examId]/page.tsx:964)", "shortDescription": {"text": "Dangling fetch: POST /api/figure-corrections (src/app/dashboard/cloud/[examId]/page.tsx:964)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:964` calls `POST /api/figure-corrections` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/figure-corrections`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-68f739a32fd338a2", "name": "Dangling fetch: POST /api/exams/${examId}/distribute-points (src/app/dashboard/cloud/[examId]/page.tsx:1891)", "shortDescription": {"text": "Dangling fetch: POST /api/exams/${examId}/distribute-points (src/app/dashboard/cloud/[examId]/page.tsx:1891)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:1891` calls `POST /api/exams/${examId}/distribute-points` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/distribute-points`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-15d3dd0b8b0d8acb", "name": "Dangling fetch: DELETE /api/exams/${examId}/distribute-points (src/app/dashboard/cloud/[examId]/page.tsx:1917)", "shortDescription": {"text": "Dangling fetch: DELETE /api/exams/${examId}/distribute-points (src/app/dashboard/cloud/[examId]/page.tsx:1917)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:1917` calls `DELETE /api/exams/${examId}/distribute-points` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/distribute-points`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7b04b5a2623cfdb2", "name": "Dangling fetch: GET /api/exams/${examId}/batch-solutions (src/app/dashboard/cloud/[examId]/page.tsx:2509)", "shortDescription": {"text": "Dangling fetch: GET /api/exams/${examId}/batch-solutions (src/app/dashboard/cloud/[examId]/page.tsx:2509)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:2509` calls `GET /api/exams/${examId}/batch-solutions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/batch-solutions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-758a97c1009e20cc", "name": "Dangling fetch: GET /api/exams/${examId}/batch-solutions (src/app/dashboard/cloud/[examId]/page.tsx:2565)", "shortDescription": {"text": "Dangling fetch: GET /api/exams/${examId}/batch-solutions (src/app/dashboard/cloud/[examId]/page.tsx:2565)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:2565` calls `GET /api/exams/${examId}/batch-solutions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/batch-solutions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b8dd80e3cdfd5a20", "name": "Dangling fetch: POST /api/exams/${examId}/distribute-points (src/app/dashboard/cloud/[examId]/page.tsx:2761)", "shortDescription": {"text": "Dangling fetch: POST /api/exams/${examId}/distribute-points (src/app/dashboard/cloud/[examId]/page.tsx:2761)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:2761` calls `POST /api/exams/${examId}/distribute-points` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/distribute-points`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a64dee6629eac065", "name": "Dangling fetch: DELETE /api/exams/${examId}/distribute-points (src/app/dashboard/cloud/[examId]/page.tsx:2788)", "shortDescription": {"text": "Dangling fetch: DELETE /api/exams/${examId}/distribute-points (src/app/dashboard/cloud/[examId]/page.tsx:2788)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:2788` calls `DELETE /api/exams/${examId}/distribute-points` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/distribute-points`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4c6007f75a8bfcf1", "name": "Dangling fetch: POST /api/exams/${examId}/batch-solutions (src/app/dashboard/cloud/[examId]/page.tsx:2947)", "shortDescription": {"text": "Dangling fetch: POST /api/exams/${examId}/batch-solutions (src/app/dashboard/cloud/[examId]/page.tsx:2947)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:2947` calls `POST /api/exams/${examId}/batch-solutions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/batch-solutions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e140c14af76d848d", "name": "Dangling fetch: PATCH /api/exams/${examId} (src/app/dashboard/cloud/[examId]/page.tsx:3268)", "shortDescription": {"text": "Dangling fetch: PATCH /api/exams/${examId} (src/app/dashboard/cloud/[examId]/page.tsx:3268)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:3268` calls `PATCH /api/exams/${examId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2cdb39c3b60962b1", "name": "Dangling fetch: GET /api/problems/${diagramBrowserProblem.id} (src/app/dashboard/cloud/[examId]/page.tsx:3320)", "shortDescription": {"text": "Dangling fetch: GET /api/problems/${diagramBrowserProblem.id} (src/app/dashboard/cloud/[examId]/page.tsx:3320)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:3320` calls `GET /api/problems/${diagramBrowserProblem.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-adc43f5ff4a86f56", "name": "Dangling fetch: PATCH /api/problems/${diagramBrowserProblem.id} (src/app/dashboard/cloud/[examId]/page.tsx:3347)", "shortDescription": {"text": "Dangling fetch: PATCH /api/problems/${diagramBrowserProblem.id} (src/app/dashboard/cloud/[examId]/page.tsx:3347)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:3347` calls `PATCH /api/problems/${diagramBrowserProblem.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-eb13f0a3656e0799", "name": "Dangling fetch: POST /api/figure-corrections (src/app/dashboard/cloud/[examId]/page.tsx:3362)", "shortDescription": {"text": "Dangling fetch: POST /api/figure-corrections (src/app/dashboard/cloud/[examId]/page.tsx:3362)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:3362` calls `POST /api/figure-corrections` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/figure-corrections`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-966dd9c9248392a9", "name": "Dangling fetch: POST /api/problems/${problem.id}/generate-figure (src/app/dashboard/cloud/[examId]/page.tsx:3402)", "shortDescription": {"text": "Dangling fetch: POST /api/problems/${problem.id}/generate-figure (src/app/dashboard/cloud/[examId]/page.tsx:3402)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:3402` calls `POST /api/problems/${problem.id}/generate-figure` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>/generate-figure`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3c98d387131ad42d", "name": "Dangling fetch: POST /api/problems/${problem.id}/generate-figure (src/app/dashboard/cloud/[examId]/page.tsx:3444)", "shortDescription": {"text": "Dangling fetch: POST /api/problems/${problem.id}/generate-figure (src/app/dashboard/cloud/[examId]/page.tsx:3444)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:3444` calls `POST /api/problems/${problem.id}/generate-figure` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>/generate-figure`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ca6d86b9c438a665", "name": "Dangling fetch: PATCH /api/problems/${problemId} (src/app/dashboard/cloud/[examId]/page.tsx:3521)", "shortDescription": {"text": "Dangling fetch: PATCH /api/problems/${problemId} (src/app/dashboard/cloud/[examId]/page.tsx:3521)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:3521` calls `PATCH /api/problems/${problemId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-85e1ac94f35697b6", "name": "Dangling fetch: PATCH /api/exams/${examId}/problems (src/app/dashboard/cloud/[examId]/page.tsx:3540)", "shortDescription": {"text": "Dangling fetch: PATCH /api/exams/${examId}/problems (src/app/dashboard/cloud/[examId]/page.tsx:3540)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:3540` calls `PATCH /api/exams/${examId}/problems` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/problems`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4e4285c263b109c4", "name": "Dangling fetch: POST /api/problems/${problem.id}/delete-figure (src/app/dashboard/cloud/[examId]/page.tsx:3581)", "shortDescription": {"text": "Dangling fetch: POST /api/problems/${problem.id}/delete-figure (src/app/dashboard/cloud/[examId]/page.tsx:3581)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:3581` calls `POST /api/problems/${problem.id}/delete-figure` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>/delete-figure`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-58ad0280d54bc5ee", "name": "Dangling fetch: GET /api/problems/${diagramBrowserProblem.id} (src/app/dashboard/cloud/[examId]/page.tsx:3611)", "shortDescription": {"text": "Dangling fetch: GET /api/problems/${diagramBrowserProblem.id} (src/app/dashboard/cloud/[examId]/page.tsx:3611)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:3611` calls `GET /api/problems/${diagramBrowserProblem.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b6d7946b11578c6c", "name": "Dangling fetch: PATCH /api/problems/${diagramBrowserProblem.id} (src/app/dashboard/cloud/[examId]/page.tsx:3626)", "shortDescription": {"text": "Dangling fetch: PATCH /api/problems/${diagramBrowserProblem.id} (src/app/dashboard/cloud/[examId]/page.tsx:3626)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:3626` calls `PATCH /api/problems/${diagramBrowserProblem.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-84cb67bafd8676e8", "name": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/app/dashboard/cloud/[examId]/page.tsx:3676)", "shortDescription": {"text": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/app/dashboard/cloud/[examId]/page.tsx:3676)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:3676` calls `POST /api/workflow/reanalyze-crop` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/reanalyze-crop`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4104798525497d14", "name": "Dangling fetch: GET /api/problems/${problem.id} (src/app/dashboard/cloud/[examId]/page.tsx:3714)", "shortDescription": {"text": "Dangling fetch: GET /api/problems/${problem.id} (src/app/dashboard/cloud/[examId]/page.tsx:3714)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:3714` calls `GET /api/problems/${problem.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-10bebd65f28ad201", "name": "Dangling fetch: PATCH /api/problems/${problem.id} (src/app/dashboard/cloud/[examId]/page.tsx:3754)", "shortDescription": {"text": "Dangling fetch: PATCH /api/problems/${problem.id} (src/app/dashboard/cloud/[examId]/page.tsx:3754)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:3754` calls `PATCH /api/problems/${problem.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1ea58ffac2534716", "name": "Dangling fetch: POST /api/exams/${examId}/sync-answers-from-solutions (src/app/dashboard/cloud/[examId]/page.tsx:3790)", "shortDescription": {"text": "Dangling fetch: POST /api/exams/${examId}/sync-answers-from-solutions (src/app/dashboard/cloud/[examId]/page.tsx:3790)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:3790` calls `POST /api/exams/${examId}/sync-answers-from-solutions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/sync-answers-from-solutions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bd21ba3464a0bd7c", "name": "Dangling fetch: PATCH /api/exams/${examId}/reorder (src/app/dashboard/cloud/[examId]/page.tsx:3839)", "shortDescription": {"text": "Dangling fetch: PATCH /api/exams/${examId}/reorder (src/app/dashboard/cloud/[examId]/page.tsx:3839)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:3839` calls `PATCH /api/exams/${examId}/reorder` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/reorder`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-957ca5ebdfcb46b7", "name": "Dangling fetch: DELETE /api/problems/${problemId} (src/app/dashboard/cloud/[examId]/page.tsx:3949)", "shortDescription": {"text": "Dangling fetch: DELETE /api/problems/${problemId} (src/app/dashboard/cloud/[examId]/page.tsx:3949)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:3949` calls `DELETE /api/problems/${problemId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-157dc1fc44a23a10", "name": "Dangling fetch: POST /api/exams/${examId}/auto-fix?force=1 (src/app/dashboard/cloud/[examId]/page.tsx:4054)", "shortDescription": {"text": "Dangling fetch: POST /api/exams/${examId}/auto-fix?force=1 (src/app/dashboard/cloud/[examId]/page.tsx:4054)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:4054` calls `POST /api/exams/${examId}/auto-fix?force=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/auto-fix`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3e513e8241b4fe30", "name": "Dangling fetch: PATCH /api/exams/${examId} (src/app/dashboard/cloud/[examId]/page.tsx:4196)", "shortDescription": {"text": "Dangling fetch: PATCH /api/exams/${examId} (src/app/dashboard/cloud/[examId]/page.tsx:4196)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:4196` calls `PATCH /api/exams/${examId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2ab7bfa0b2e0d8db", "name": "Dangling fetch: POST /api/exams/${examId}/auto-fix?mode=fix (src/app/dashboard/cloud/[examId]/page.tsx:4323)", "shortDescription": {"text": "Dangling fetch: POST /api/exams/${examId}/auto-fix?mode=fix (src/app/dashboard/cloud/[examId]/page.tsx:4323)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:4323` calls `POST /api/exams/${examId}/auto-fix?mode=fix` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/auto-fix`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-39a467911862b271", "name": "Dangling fetch: DELETE /api/problems/${editModalProblem.id} (src/app/dashboard/cloud/[examId]/page.tsx:4702)", "shortDescription": {"text": "Dangling fetch: DELETE /api/problems/${editModalProblem.id} (src/app/dashboard/cloud/[examId]/page.tsx:4702)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/[examId]/page.tsx:4702` calls `DELETE /api/problems/${editModalProblem.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-032df3ddaae394e3", "name": "Dangling fetch: GET /api/book-groups (src/app/dashboard/cloud/create-exam/page.tsx:54)", "shortDescription": {"text": "Dangling fetch: GET /api/book-groups (src/app/dashboard/cloud/create-exam/page.tsx:54)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/create-exam/page.tsx:54` calls `GET /api/book-groups` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/book-groups`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-86dd413293405fa4", "name": "Dangling fetch: POST /api/exams/duplicate-check (src/app/dashboard/cloud/folder-import/page.tsx:88)", "shortDescription": {"text": "Dangling fetch: POST /api/exams/duplicate-check (src/app/dashboard/cloud/folder-import/page.tsx:88)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/folder-import/page.tsx:88` calls `POST /api/exams/duplicate-check` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/duplicate-check`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f2c027560dc7f93f", "name": "Dangling fetch: POST /api/workflow/upload (src/app/dashboard/cloud/folder-import/page.tsx:171)", "shortDescription": {"text": "Dangling fetch: POST /api/workflow/upload (src/app/dashboard/cloud/folder-import/page.tsx:171)"}, "fullDescription": {"text": "`src/app/dashboard/cloud/folder-import/page.tsx:171` calls `POST /api/workflow/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/upload`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d6f19cfd3d920217", "name": "Dangling fetch: GET /api/assignments (src/app/dashboard/assignments/page.tsx:59)", "shortDescription": {"text": "Dangling fetch: GET /api/assignments (src/app/dashboard/assignments/page.tsx:59)"}, "fullDescription": {"text": "`src/app/dashboard/assignments/page.tsx:59` calls `GET /api/assignments` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/assignments`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a1847cc4bd9cc984", "name": "Dangling fetch: GET /api/users/students (src/app/dashboard/assignments/page.tsx:60)", "shortDescription": {"text": "Dangling fetch: GET /api/users/students (src/app/dashboard/assignments/page.tsx:60)"}, "fullDescription": {"text": "`src/app/dashboard/assignments/page.tsx:60` calls `GET /api/users/students` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/users/students`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9d4c13c02a918b84", "name": "Dangling fetch: GET /api/corrections/summary (src/app/dashboard/corrections/page.tsx:62)", "shortDescription": {"text": "Dangling fetch: GET /api/corrections/summary (src/app/dashboard/corrections/page.tsx:62)"}, "fullDescription": {"text": "`src/app/dashboard/corrections/page.tsx:62` calls `GET /api/corrections/summary` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/corrections/summary`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e2ddbfe0b1416909", "name": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:1494)", "shortDescription": {"text": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:1494)"}, "fullDescription": {"text": "`src/app/dashboard/workflow/analyze/[jobId]/page.tsx:1494` calls `POST /api/workflow/reanalyze-crop` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/reanalyze-crop`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7dd6e08fc6e98337", "name": "Dangling fetch: POST /api/workflow/detect-problems-yolo (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:2676)", "shortDescription": {"text": "Dangling fetch: POST /api/workflow/detect-problems-yolo (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:2676)"}, "fullDescription": {"text": "`src/app/dashboard/workflow/analyze/[jobId]/page.tsx:2676` calls `POST /api/workflow/detect-problems-yolo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/detect-problems-yolo`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3daf95f227959770", "name": "Dangling fetch: POST /api/workflow/detect-figures-gpt (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:2692)", "shortDescription": {"text": "Dangling fetch: POST /api/workflow/detect-figures-gpt (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:2692)"}, "fullDescription": {"text": "`src/app/dashboard/workflow/analyze/[jobId]/page.tsx:2692` calls `POST /api/workflow/detect-figures-gpt` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/detect-figures-gpt`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7a767876853a83f8", "name": "Dangling fetch: POST /api/workflow/detect-from-ocr (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3049)", "shortDescription": {"text": "Dangling fetch: POST /api/workflow/detect-from-ocr (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3049)"}, "fullDescription": {"text": "`src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3049` calls `POST /api/workflow/detect-from-ocr` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/detect-from-ocr`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-da933c6a0cb8f2a7", "name": "Dangling fetch: POST /api/workflow/detect-problems-yolo (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3332)", "shortDescription": {"text": "Dangling fetch: POST /api/workflow/detect-problems-yolo (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3332)"}, "fullDescription": {"text": "`src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3332` calls `POST /api/workflow/detect-problems-yolo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/detect-problems-yolo`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6e687ef113c652b1", "name": "Dangling fetch: GET /api/workflow/upload?jobId=${jobId} (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3639)", "shortDescription": {"text": "Dangling fetch: GET /api/workflow/upload?jobId=${jobId} (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3639)"}, "fullDescription": {"text": "`src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3639` calls `GET /api/workflow/upload?jobId=${jobId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/upload`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5dc4ca06fe2ee1d8", "name": "Dangling fetch: POST /api/storage/upload-image (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3754)", "shortDescription": {"text": "Dangling fetch: POST /api/storage/upload-image (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3754)"}, "fullDescription": {"text": "`src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3754` calls `POST /api/storage/upload-image` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/storage/upload-image`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0718a5d4a0837763", "name": "Dangling fetch: PUT /api/workflow/upload (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3905)", "shortDescription": {"text": "Dangling fetch: PUT /api/workflow/upload (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3905)"}, "fullDescription": {"text": "`src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3905` calls `PUT /api/workflow/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/upload`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-97e82f11931bb204", "name": "Dangling fetch: PATCH /api/problems/${selectedProblem.problemId} (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:41", "shortDescription": {"text": "Dangling fetch: PATCH /api/problems/${selectedProblem.problemId} (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:4113)"}, "fullDescription": {"text": "`src/app/dashboard/workflow/analyze/[jobId]/page.tsx:4113` calls `PATCH /api/problems/${selectedProblem.problemId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9584f9cbc21ea7fe", "name": "Dangling fetch: DELETE /api/problems/${problem.problemId} (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:4155)", "shortDescription": {"text": "Dangling fetch: DELETE /api/problems/${problem.problemId} (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:4155)"}, "fullDescription": {"text": "`src/app/dashboard/workflow/analyze/[jobId]/page.tsx:4155` calls `DELETE /api/problems/${problem.problemId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-66c9c6ee7b0d66f9", "name": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:4702)", "shortDescription": {"text": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:4702)"}, "fullDescription": {"text": "`src/app/dashboard/workflow/analyze/[jobId]/page.tsx:4702` calls `POST /api/workflow/reanalyze-crop` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/reanalyze-crop`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cac926d113332bcc", "name": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:4849)", "shortDescription": {"text": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:4849)"}, "fullDescription": {"text": "`src/app/dashboard/workflow/analyze/[jobId]/page.tsx:4849` calls `POST /api/workflow/reanalyze-crop` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/reanalyze-crop`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-572b97b5097af184", "name": "Dangling fetch: DELETE /api/problems/${dbProblemId} (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:4940)", "shortDescription": {"text": "Dangling fetch: DELETE /api/problems/${dbProblemId} (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:4940)"}, "fullDescription": {"text": "`src/app/dashboard/workflow/analyze/[jobId]/page.tsx:4940` calls `DELETE /api/problems/${dbProblemId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4ea3744ffa56fbd6", "name": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:5058)", "shortDescription": {"text": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:5058)"}, "fullDescription": {"text": "`src/app/dashboard/workflow/analyze/[jobId]/page.tsx:5058` calls `POST /api/workflow/reanalyze-crop` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/reanalyze-crop`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ff3df6278ed9d21f", "name": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:5093)", "shortDescription": {"text": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:5093)"}, "fullDescription": {"text": "`src/app/dashboard/workflow/analyze/[jobId]/page.tsx:5093` calls `POST /api/workflow/reanalyze-crop` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/reanalyze-crop`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-161ae211029c5fd1", "name": "Dangling fetch: PATCH /api/problems/${editingProblem.problemId} (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:552", "shortDescription": {"text": "Dangling fetch: PATCH /api/problems/${editingProblem.problemId} (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:5529)"}, "fullDescription": {"text": "`src/app/dashboard/workflow/analyze/[jobId]/page.tsx:5529` calls `PATCH /api/problems/${editingProblem.problemId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-84d0c5be1db483a2", "name": "Dangling fetch: DELETE /api/problems/${editingProblem.problemId} (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:55", "shortDescription": {"text": "Dangling fetch: DELETE /api/problems/${editingProblem.problemId} (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:5597)"}, "fullDescription": {"text": "`src/app/dashboard/workflow/analyze/[jobId]/page.tsx:5597` calls `DELETE /api/problems/${editingProblem.problemId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9efea89364ceee70", "name": "Dangling fetch: GET /api/assignments (src/app/dashboard/class/page.tsx:38)", "shortDescription": {"text": "Dangling fetch: GET /api/assignments (src/app/dashboard/class/page.tsx:38)"}, "fullDescription": {"text": "`src/app/dashboard/class/page.tsx:38` calls `GET /api/assignments` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/assignments`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-68305838e517f0cb", "name": "Dangling fetch: GET /api/users/students (src/app/dashboard/class/page.tsx:39)", "shortDescription": {"text": "Dangling fetch: GET /api/users/students (src/app/dashboard/class/page.tsx:39)"}, "fullDescription": {"text": "`src/app/dashboard/class/page.tsx:39` calls `GET /api/users/students` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/users/students`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-01d90dde508305cb", "name": "Dangling fetch: GET /api/problems/search?${params} (src/app/dashboard/create/page.tsx:422)", "shortDescription": {"text": "Dangling fetch: GET /api/problems/search?${params} (src/app/dashboard/create/page.tsx:422)"}, "fullDescription": {"text": "`src/app/dashboard/create/page.tsx:422` calls `GET /api/problems/search?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/search`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-eeb47428d0406fd9", "name": "Dangling fetch: GET /api/mathsecr/tree (src/app/dashboard/create/page.tsx:1031)", "shortDescription": {"text": "Dangling fetch: GET /api/mathsecr/tree (src/app/dashboard/create/page.tsx:1031)"}, "fullDescription": {"text": "`src/app/dashboard/create/page.tsx:1031` calls `GET /api/mathsecr/tree` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/mathsecr/tree`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-97f6390389c5f305", "name": "Dangling fetch: GET /api/mathsecr/tree?subject=${selectedSubjectCode} (src/app/dashboard/create/page.tsx:1052)", "shortDescription": {"text": "Dangling fetch: GET /api/mathsecr/tree?subject=${selectedSubjectCode} (src/app/dashboard/create/page.tsx:1052)"}, "fullDescription": {"text": "`src/app/dashboard/create/page.tsx:1052` calls `GET /api/mathsecr/tree?subject=${selectedSubjectCode}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/mathsecr/tree`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d863d4c87f89dd83", "name": "Dangling fetch: POST /api/exams/generate (src/app/dashboard/create/page.tsx:1272)", "shortDescription": {"text": "Dangling fetch: POST /api/exams/generate (src/app/dashboard/create/page.tsx:1272)"}, "fullDescription": {"text": "`src/app/dashboard/create/page.tsx:1272` calls `POST /api/exams/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/generate`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b44f6b21a296b0f9", "name": "Dangling fetch: GET /api/exams/${data.examId} (src/app/dashboard/create/page.tsx:1285)", "shortDescription": {"text": "Dangling fetch: GET /api/exams/${data.examId} (src/app/dashboard/create/page.tsx:1285)"}, "fullDescription": {"text": "`src/app/dashboard/create/page.tsx:1285` calls `GET /api/exams/${data.examId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-07749884a16ee5bf", "name": "Dangling fetch: GET /api/mathsecr/tree (src/app/dashboard/problem-bank/page.tsx:139)", "shortDescription": {"text": "Dangling fetch: GET /api/mathsecr/tree (src/app/dashboard/problem-bank/page.tsx:139)"}, "fullDescription": {"text": "`src/app/dashboard/problem-bank/page.tsx:139` calls `GET /api/mathsecr/tree` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/mathsecr/tree`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6fca77ac924348e3", "name": "Dangling fetch: GET /api/mathsecr/tree?subject=${selectedSubject} (src/app/dashboard/problem-bank/page.tsx:150)", "shortDescription": {"text": "Dangling fetch: GET /api/mathsecr/tree?subject=${selectedSubject} (src/app/dashboard/problem-bank/page.tsx:150)"}, "fullDescription": {"text": "`src/app/dashboard/problem-bank/page.tsx:150` calls `GET /api/mathsecr/tree?subject=${selectedSubject}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/mathsecr/tree`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-26e5e20c1ab197fb", "name": "Dangling fetch: GET /api/problems/search?${params.toString()} (src/app/dashboard/problem-bank/page.tsx:173)", "shortDescription": {"text": "Dangling fetch: GET /api/problems/search?${params.toString()} (src/app/dashboard/problem-bank/page.tsx:173)"}, "fullDescription": {"text": "`src/app/dashboard/problem-bank/page.tsx:173` calls `GET /api/problems/search?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/search`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-aa11521446e8be01", "name": "Dangling fetch: POST /api/exams/generate (src/app/dashboard/problem-bank/page.tsx:247)", "shortDescription": {"text": "Dangling fetch: POST /api/exams/generate (src/app/dashboard/problem-bank/page.tsx:247)"}, "fullDescription": {"text": "`src/app/dashboard/problem-bank/page.tsx:247` calls `POST /api/exams/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/generate`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9df4e61c9f062c8e", "name": "Dangling fetch: GET /api/exams?is_diagnostic=true (src/app/dashboard/materials/page.tsx:543)", "shortDescription": {"text": "Dangling fetch: GET /api/exams?is_diagnostic=true (src/app/dashboard/materials/page.tsx:543)"}, "fullDescription": {"text": "`src/app/dashboard/materials/page.tsx:543` calls `GET /api/exams?is_diagnostic=true` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-46efefded9236f43", "name": "Dangling fetch: GET /api/exams/${material.id}/breakdown (src/app/dashboard/materials/page.tsx:655)", "shortDescription": {"text": "Dangling fetch: GET /api/exams/${material.id}/breakdown (src/app/dashboard/materials/page.tsx:655)"}, "fullDescription": {"text": "`src/app/dashboard/materials/page.tsx:655` calls `GET /api/exams/${material.id}/breakdown` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/breakdown`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5a5a5d0d9b379790", "name": "Dangling fetch: DELETE /api/diagram-images?id=${imageId} (src/app/dashboard/materials/diagrams/DiagramsClient.tsx:71)", "shortDescription": {"text": "Dangling fetch: DELETE /api/diagram-images?id=${imageId} (src/app/dashboard/materials/diagrams/DiagramsClient.tsx:71)"}, "fullDescription": {"text": "`src/app/dashboard/materials/diagrams/DiagramsClient.tsx:71` calls `DELETE /api/diagram-images?id=${imageId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/diagram-images`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ba4870310977b00e", "name": "Dangling fetch: DELETE /api/diagram-images?source=${encodeURIComponent(sourceName)} (src/app/dashboard/materials/diagram", "shortDescription": {"text": "Dangling fetch: DELETE /api/diagram-images?source=${encodeURIComponent(sourceName)} (src/app/dashboard/materials/diagrams/DiagramsClient.tsx:85)"}, "fullDescription": {"text": "`src/app/dashboard/materials/diagrams/DiagramsClient.tsx:85` calls `DELETE /api/diagram-images?source=${encodeURIComponent(sourceName)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/diagram-images`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-027bc13eee513cd5", "name": "Dangling fetch: POST /api/image-pipeline/tag (src/app/dashboard/materials/diagrams/DiagramsClient.tsx:112)", "shortDescription": {"text": "Dangling fetch: POST /api/image-pipeline/tag (src/app/dashboard/materials/diagrams/DiagramsClient.tsx:112)"}, "fullDescription": {"text": "`src/app/dashboard/materials/diagrams/DiagramsClient.tsx:112` calls `POST /api/image-pipeline/tag` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/image-pipeline/tag`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ff879193d2f10fc5", "name": "Dangling fetch: GET /api/diagram-images?${params} (src/app/dashboard/materials/diagrams/DiagramsClient.tsx:143)", "shortDescription": {"text": "Dangling fetch: GET /api/diagram-images?${params} (src/app/dashboard/materials/diagrams/DiagramsClient.tsx:143)"}, "fullDescription": {"text": "`src/app/dashboard/materials/diagrams/DiagramsClient.tsx:143` calls `GET /api/diagram-images?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/diagram-images`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-83138833ea9e8d74", "name": "Dangling fetch: GET /api/image-pipeline/health (src/app/dashboard/materials/diagrams/DiagramsClient.tsx:167)", "shortDescription": {"text": "Dangling fetch: GET /api/image-pipeline/health (src/app/dashboard/materials/diagrams/DiagramsClient.tsx:167)"}, "fullDescription": {"text": "`src/app/dashboard/materials/diagrams/DiagramsClient.tsx:167` calls `GET /api/image-pipeline/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/image-pipeline/health`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7d8270fc3eb8b1a2", "name": "Dangling fetch: GET /api/book-groups (src/app/dashboard/exam-management/page.tsx:106)", "shortDescription": {"text": "Dangling fetch: GET /api/book-groups (src/app/dashboard/exam-management/page.tsx:106)"}, "fullDescription": {"text": "`src/app/dashboard/exam-management/page.tsx:106` calls `GET /api/book-groups` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/book-groups`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-20bb03d4e5601553", "name": "Dangling fetch: PATCH /api/exams/${selectedExamId} (src/app/dashboard/exam-management/page.tsx:681)", "shortDescription": {"text": "Dangling fetch: PATCH /api/exams/${selectedExamId} (src/app/dashboard/exam-management/page.tsx:681)"}, "fullDescription": {"text": "`src/app/dashboard/exam-management/page.tsx:681` calls `PATCH /api/exams/${selectedExamId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-01dc189f5265f269", "name": "Dangling fetch: DELETE /api/exams/${selectedExamId} (src/app/dashboard/exam-management/page.tsx:748)", "shortDescription": {"text": "Dangling fetch: DELETE /api/exams/${selectedExamId} (src/app/dashboard/exam-management/page.tsx:748)"}, "fullDescription": {"text": "`src/app/dashboard/exam-management/page.tsx:748` calls `DELETE /api/exams/${selectedExamId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8cc2ad72a2b871fb", "name": "Dangling fetch: POST /api/exams/${selectedExamId}/create-similar (src/app/dashboard/exam-management/page.tsx:770)", "shortDescription": {"text": "Dangling fetch: POST /api/exams/${selectedExamId}/create-similar (src/app/dashboard/exam-management/page.tsx:770)"}, "fullDescription": {"text": "`src/app/dashboard/exam-management/page.tsx:770` calls `POST /api/exams/${selectedExamId}/create-similar` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/create-similar`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ee6262dbca075d52", "name": "Dangling fetch: GET /api/sessions?exam_id=${examId}&limit=200 (src/app/dashboard/exam-management/page.tsx:796)", "shortDescription": {"text": "Dangling fetch: GET /api/sessions?exam_id=${examId}&limit=200 (src/app/dashboard/exam-management/page.tsx:796)"}, "fullDescription": {"text": "`src/app/dashboard/exam-management/page.tsx:796` calls `GET /api/sessions?exam_id=${examId}&limit=200` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sessions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fc7682227de6db71", "name": "Dangling fetch: GET /api/exams/${selectedExamId}/export-hwp?withAnswer=true&withSolutions=true&columns=${columns}&gap=${", "shortDescription": {"text": "Dangling fetch: GET /api/exams/${selectedExamId}/export-hwp?withAnswer=true&withSolutions=true&columns=${columns}&gap=${gap}${perPageQ} (src/app/dashboard/exam-management/page.tsx:844)"}, "fullDescription": {"text": "`src/app/dashboard/exam-management/page.tsx:844` calls `GET /api/exams/${selectedExamId}/export-hwp?withAnswer=true&withSolutions=true&columns=${columns}&gap=${gap}${perPageQ}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/export-hwp`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b14fe9856f11694c", "name": "Dangling fetch: POST /api/problems/${unsolved[i].id}/generate-solution (src/app/dashboard/exam-management/page.tsx:891)", "shortDescription": {"text": "Dangling fetch: POST /api/problems/${unsolved[i].id}/generate-solution (src/app/dashboard/exam-management/page.tsx:891)"}, "fullDescription": {"text": "`src/app/dashboard/exam-management/page.tsx:891` calls `POST /api/problems/${unsolved[i].id}/generate-solution` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/problems/<p>/generate-solution`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4452ea2cf4f3d256", "name": "Dangling fetch: GET /api/reports/by-school (src/app/dashboard/reports/page.tsx:65)", "shortDescription": {"text": "Dangling fetch: GET /api/reports/by-school (src/app/dashboard/reports/page.tsx:65)"}, "fullDescription": {"text": "`src/app/dashboard/reports/page.tsx:65` calls `GET /api/reports/by-school` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/reports/by-school`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-99155481eec00652", "name": "Dangling fetch: GET /api/reports/${encodeURIComponent(schoolParam)} (src/app/dashboard/reports/[school]/page.tsx:91)", "shortDescription": {"text": "Dangling fetch: GET /api/reports/${encodeURIComponent(schoolParam)} (src/app/dashboard/reports/[school]/page.tsx:91)"}, "fullDescription": {"text": "`src/app/dashboard/reports/[school]/page.tsx:91` calls `GET /api/reports/${encodeURIComponent(schoolParam)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/reports/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e798322c0f5d6eef", "name": "Dangling fetch: GET /api/reports/by-school (src/app/dashboard/reports/aggregate/page.tsx:156)", "shortDescription": {"text": "Dangling fetch: GET /api/reports/by-school (src/app/dashboard/reports/aggregate/page.tsx:156)"}, "fullDescription": {"text": "`src/app/dashboard/reports/aggregate/page.tsx:156` calls `GET /api/reports/by-school` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/reports/by-school`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-08950b598ed4821c", "name": "Dangling fetch: GET /api/reports/aggregate?${buildQueryString()} (src/app/dashboard/reports/aggregate/page.tsx:184)", "shortDescription": {"text": "Dangling fetch: GET /api/reports/aggregate?${buildQueryString()} (src/app/dashboard/reports/aggregate/page.tsx:184)"}, "fullDescription": {"text": "`src/app/dashboard/reports/aggregate/page.tsx:184` calls `GET /api/reports/aggregate?${buildQueryString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/reports/aggregate`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-08f94ac0714f445b", "name": "Dangling fetch: GET /api/me/active-institute (src/app/dashboard/exam-analysis/[examId]/StudentsTab.tsx:89)", "shortDescription": {"text": "Dangling fetch: GET /api/me/active-institute (src/app/dashboard/exam-analysis/[examId]/StudentsTab.tsx:89)"}, "fullDescription": {"text": "`src/app/dashboard/exam-analysis/[examId]/StudentsTab.tsx:89` calls `GET /api/me/active-institute` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/me/active-institute`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c6779b5135b9b772", "name": "Dangling fetch: GET /api/exams/${examId}/students (src/app/dashboard/exam-analysis/[examId]/StudentsTab.tsx:110)", "shortDescription": {"text": "Dangling fetch: GET /api/exams/${examId}/students (src/app/dashboard/exam-analysis/[examId]/StudentsTab.tsx:110)"}, "fullDescription": {"text": "`src/app/dashboard/exam-analysis/[examId]/StudentsTab.tsx:110` calls `GET /api/exams/${examId}/students` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/students`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8b5718ee48de6986", "name": "Dangling fetch: POST /api/exams/${examId}/student-responses (src/app/dashboard/exam-analysis/[examId]/StudentsTab.tsx:14", "shortDescription": {"text": "Dangling fetch: POST /api/exams/${examId}/student-responses (src/app/dashboard/exam-analysis/[examId]/StudentsTab.tsx:143)"}, "fullDescription": {"text": "`src/app/dashboard/exam-analysis/[examId]/StudentsTab.tsx:143` calls `POST /api/exams/${examId}/student-responses` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/student-responses`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-df5ea9c351a80df4", "name": "Dangling fetch: DELETE /api/exams/${examId}/students?sessionId=${encodeURIComponent(s.sessionId)} (src/app/dashboard/exa", "shortDescription": {"text": "Dangling fetch: DELETE /api/exams/${examId}/students?sessionId=${encodeURIComponent(s.sessionId)} (src/app/dashboard/exam-analysis/[examId]/StudentsTab.tsx:169)"}, "fullDescription": {"text": "`src/app/dashboard/exam-analysis/[examId]/StudentsTab.tsx:169` calls `DELETE /api/exams/${examId}/students?sessionId=${encodeURIComponent(s.sessionId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/students`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-de2d3895b2f0ae08", "name": "Dangling fetch: GET /api/exams/${examId}/ai-analysis (src/app/dashboard/exam-analysis/[examId]/page.tsx:99)", "shortDescription": {"text": "Dangling fetch: GET /api/exams/${examId}/ai-analysis (src/app/dashboard/exam-analysis/[examId]/page.tsx:99)"}, "fullDescription": {"text": "`src/app/dashboard/exam-analysis/[examId]/page.tsx:99` calls `GET /api/exams/${examId}/ai-analysis` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/ai-analysis`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a097ae224bbe7937", "name": "Dangling fetch: GET /api/exams/${examId}/share (src/app/dashboard/exam-analysis/[examId]/page.tsx:122)", "shortDescription": {"text": "Dangling fetch: GET /api/exams/${examId}/share (src/app/dashboard/exam-analysis/[examId]/page.tsx:122)"}, "fullDescription": {"text": "`src/app/dashboard/exam-analysis/[examId]/page.tsx:122` calls `GET /api/exams/${examId}/share` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/share`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3b75fa7f4038cdc5", "name": "Dangling fetch: POST /api/exams/${examId}/share (src/app/dashboard/exam-analysis/[examId]/page.tsx:128)", "shortDescription": {"text": "Dangling fetch: POST /api/exams/${examId}/share (src/app/dashboard/exam-analysis/[examId]/page.tsx:128)"}, "fullDescription": {"text": "`src/app/dashboard/exam-analysis/[examId]/page.tsx:128` calls `POST /api/exams/${examId}/share` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/share`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-623ddd484d670f2e", "name": "Dangling fetch: POST /api/exams/${examId}/ai-analysis (src/app/dashboard/exam-analysis/[examId]/page.tsx:156)", "shortDescription": {"text": "Dangling fetch: POST /api/exams/${examId}/ai-analysis (src/app/dashboard/exam-analysis/[examId]/page.tsx:156)"}, "fullDescription": {"text": "`src/app/dashboard/exam-analysis/[examId]/page.tsx:156` calls `POST /api/exams/${examId}/ai-analysis` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/ai-analysis`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bc866a316dda73ec", "name": "Dangling fetch: GET /api/mathsecr/tree?subject=${code} (src/app/dashboard/exam-analysis/[examId]/page.tsx:191)", "shortDescription": {"text": "Dangling fetch: GET /api/mathsecr/tree?subject=${code} (src/app/dashboard/exam-analysis/[examId]/page.tsx:191)"}, "fullDescription": {"text": "`src/app/dashboard/exam-analysis/[examId]/page.tsx:191` calls `GET /api/mathsecr/tree?subject=${code}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/mathsecr/tree`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2cfa7d9ae80da717", "name": "Dangling fetch: POST /api/exams/${examId}/students/${studentId}/share (src/app/dashboard/exam-analysis/[examId]/students", "shortDescription": {"text": "Dangling fetch: POST /api/exams/${examId}/students/${studentId}/share (src/app/dashboard/exam-analysis/[examId]/students/[studentId]/page.tsx:653)"}, "fullDescription": {"text": "`src/app/dashboard/exam-analysis/[examId]/students/[studentId]/page.tsx:653` calls `POST /api/exams/${examId}/students/${studentId}/share` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/students/<p>/share`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d2bb5ede28d266fe", "name": "Dangling fetch: DELETE /api/exams/${examId}/students/${studentId}/share (src/app/dashboard/exam-analysis/[examId]/studen", "shortDescription": {"text": "Dangling fetch: DELETE /api/exams/${examId}/students/${studentId}/share (src/app/dashboard/exam-analysis/[examId]/students/[studentId]/page.tsx:693)"}, "fullDescription": {"text": "`src/app/dashboard/exam-analysis/[examId]/students/[studentId]/page.tsx:693` calls `DELETE /api/exams/${examId}/students/${studentId}/share` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/students/<p>/share`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5ff85d240221975b", "name": "Dangling fetch: POST /api/exams/${examId}/students/${studentId}/report/ai-comment (src/app/dashboard/exam-analysis/[exam", "shortDescription": {"text": "Dangling fetch: POST /api/exams/${examId}/students/${studentId}/report/ai-comment (src/app/dashboard/exam-analysis/[examId]/students/[studentId]/page.tsx:716)"}, "fullDescription": {"text": "`src/app/dashboard/exam-analysis/[examId]/students/[studentId]/page.tsx:716` calls `POST /api/exams/${examId}/students/${studentId}/report/ai-comment` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/students/<p>/report/ai-comment`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-102f3a30d4bd23ff", "name": "Dangling fetch: PUT /api/exams/${examId}/students/${studentId}/report/ai-comment (src/app/dashboard/exam-analysis/[examI", "shortDescription": {"text": "Dangling fetch: PUT /api/exams/${examId}/students/${studentId}/report/ai-comment (src/app/dashboard/exam-analysis/[examId]/students/[studentId]/page.tsx:753)"}, "fullDescription": {"text": "`src/app/dashboard/exam-analysis/[examId]/students/[studentId]/page.tsx:753` calls `PUT /api/exams/${examId}/students/${studentId}/report/ai-comment` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/students/<p>/report/ai-comment`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-af9ed3ea342f999d", "name": "Dangling fetch: GET /api/exams/${examId}/students/${studentId}/report (src/app/dashboard/exam-analysis/[examId]/students", "shortDescription": {"text": "Dangling fetch: GET /api/exams/${examId}/students/${studentId}/report (src/app/dashboard/exam-analysis/[examId]/students/[studentId]/page.tsx:804)"}, "fullDescription": {"text": "`src/app/dashboard/exam-analysis/[examId]/students/[studentId]/page.tsx:804` calls `GET /api/exams/${examId}/students/${studentId}/report` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/students/<p>/report`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7a25df036e3bd25c", "name": "Dangling fetch: POST /api/admin/users/backfill-names (src/app/dashboard/grading/page.tsx:142)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/users/backfill-names (src/app/dashboard/grading/page.tsx:142)"}, "fullDescription": {"text": "`src/app/dashboard/grading/page.tsx:142` calls `POST /api/admin/users/backfill-names` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/users/backfill-names`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c3f5a09705dc527e", "name": "Dangling fetch: DELETE /api/sessions/${sessionId} (src/app/dashboard/grading/page.tsx:168)", "shortDescription": {"text": "Dangling fetch: DELETE /api/sessions/${sessionId} (src/app/dashboard/grading/page.tsx:168)"}, "fullDescription": {"text": "`src/app/dashboard/grading/page.tsx:168` calls `DELETE /api/sessions/${sessionId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sessions/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-101246f4fd70d2b0", "name": "Dangling fetch: GET /api/sessions?${qs.toString()} (src/app/dashboard/grading/page.tsx:195)", "shortDescription": {"text": "Dangling fetch: GET /api/sessions?${qs.toString()} (src/app/dashboard/grading/page.tsx:195)"}, "fullDescription": {"text": "`src/app/dashboard/grading/page.tsx:195` calls `GET /api/sessions?${qs.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sessions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-acd8626b3e63be7b", "name": "Dangling fetch: GET /api/users/students (src/app/dashboard/grading/page.tsx:211)", "shortDescription": {"text": "Dangling fetch: GET /api/users/students (src/app/dashboard/grading/page.tsx:211)"}, "fullDescription": {"text": "`src/app/dashboard/grading/page.tsx:211` calls `GET /api/users/students` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/users/students`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6d1989597705fa5d", "name": "Dangling fetch: GET /api/users/students (src/app/tutor/analytics/page.tsx:129)", "shortDescription": {"text": "Dangling fetch: GET /api/users/students (src/app/tutor/analytics/page.tsx:129)"}, "fullDescription": {"text": "`src/app/tutor/analytics/page.tsx:129` calls `GET /api/users/students` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/users/students`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-56a9ba800a183506", "name": "Dangling fetch: GET /api/students/${selectedStudent}/analytics (src/app/tutor/analytics/page.tsx:153)", "shortDescription": {"text": "Dangling fetch: GET /api/students/${selectedStudent}/analytics (src/app/tutor/analytics/page.tsx:153)"}, "fullDescription": {"text": "`src/app/tutor/analytics/page.tsx:153` calls `GET /api/students/${selectedStudent}/analytics` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/students/<p>/analytics`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-68f2659162883355", "name": "Dangling fetch: GET /api/classes (src/app/tutor/students/page.tsx:89)", "shortDescription": {"text": "Dangling fetch: GET /api/classes (src/app/tutor/students/page.tsx:89)"}, "fullDescription": {"text": "`src/app/tutor/students/page.tsx:89` calls `GET /api/classes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/classes`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7339caf68a550511", "name": "Dangling fetch: POST /api/students (src/app/tutor/students/page.tsx:146)", "shortDescription": {"text": "Dangling fetch: POST /api/students (src/app/tutor/students/page.tsx:146)"}, "fullDescription": {"text": "`src/app/tutor/students/page.tsx:146` calls `POST /api/students` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/students`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5c36546dadc2eb0b", "name": "Dangling fetch: PATCH /api/students/${editingStudent.id} (src/app/tutor/students/page.tsx:172)", "shortDescription": {"text": "Dangling fetch: PATCH /api/students/${editingStudent.id} (src/app/tutor/students/page.tsx:172)"}, "fullDescription": {"text": "`src/app/tutor/students/page.tsx:172` calls `PATCH /api/students/${editingStudent.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/students/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-eb37e9e2aee69337", "name": "Dangling fetch: POST /api/students/${s.id}/reset-password (src/app/tutor/students/page.tsx:196)", "shortDescription": {"text": "Dangling fetch: POST /api/students/${s.id}/reset-password (src/app/tutor/students/page.tsx:196)"}, "fullDescription": {"text": "`src/app/tutor/students/page.tsx:196` calls `POST /api/students/${s.id}/reset-password` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/students/<p>/reset-password`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-05b4900c417d0068", "name": "Dangling fetch: DELETE /api/students/${s.id} (src/app/tutor/students/page.tsx:208)", "shortDescription": {"text": "Dangling fetch: DELETE /api/students/${s.id} (src/app/tutor/students/page.tsx:208)"}, "fullDescription": {"text": "`src/app/tutor/students/page.tsx:208` calls `DELETE /api/students/${s.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/students/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8e17a0d06c4a108e", "name": "Dangling fetch: GET /api/students/${s.id}/exam-scores (src/app/tutor/students/page.tsx:223)", "shortDescription": {"text": "Dangling fetch: GET /api/students/${s.id}/exam-scores (src/app/tutor/students/page.tsx:223)"}, "fullDescription": {"text": "`src/app/tutor/students/page.tsx:223` calls `GET /api/students/${s.id}/exam-scores` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/students/<p>/exam-scores`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cbe3d7d89e606081", "name": "Dangling fetch: PUT /api/students/${examStudent.id}/exam-scores (src/app/tutor/students/page.tsx:266)", "shortDescription": {"text": "Dangling fetch: PUT /api/students/${examStudent.id}/exam-scores (src/app/tutor/students/page.tsx:266)"}, "fullDescription": {"text": "`src/app/tutor/students/page.tsx:266` calls `PUT /api/students/${examStudent.id}/exam-scores` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/students/<p>/exam-scores`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7a25d3a6fc78e85c", "name": "Dangling fetch: GET /api/users/students (src/app/tutor/students/page.tsx:347)", "shortDescription": {"text": "Dangling fetch: GET /api/users/students (src/app/tutor/students/page.tsx:347)"}, "fullDescription": {"text": "`src/app/tutor/students/page.tsx:347` calls `GET /api/users/students` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/users/students`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4d1d9fd1c5ae5202", "name": "Dangling fetch: POST /api/students (src/app/tutor/students/page.tsx:1025)", "shortDescription": {"text": "Dangling fetch: POST /api/students (src/app/tutor/students/page.tsx:1025)"}, "fullDescription": {"text": "`src/app/tutor/students/page.tsx:1025` calls `POST /api/students` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/students`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3788cf4573ab501f", "name": "Dangling fetch: GET /api/classes (src/app/tutor/classes/page.tsx:53)", "shortDescription": {"text": "Dangling fetch: GET /api/classes (src/app/tutor/classes/page.tsx:53)"}, "fullDescription": {"text": "`src/app/tutor/classes/page.tsx:53` calls `GET /api/classes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/classes`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-67245a7f57784f96", "name": "Dangling fetch: DELETE /api/classes/${classId} (src/app/tutor/classes/page.tsx:80)", "shortDescription": {"text": "Dangling fetch: DELETE /api/classes/${classId} (src/app/tutor/classes/page.tsx:80)"}, "fullDescription": {"text": "`src/app/tutor/classes/page.tsx:80` calls `DELETE /api/classes/${classId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/classes/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7ea8b0de2ad2f185", "name": "Dangling fetch: GET /api/classes/${classId}/enrollments (src/app/tutor/classes/[id]/page.tsx:110)", "shortDescription": {"text": "Dangling fetch: GET /api/classes/${classId}/enrollments (src/app/tutor/classes/[id]/page.tsx:110)"}, "fullDescription": {"text": "`src/app/tutor/classes/[id]/page.tsx:110` calls `GET /api/classes/${classId}/enrollments` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/classes/<p>/enrollments`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9606be309cc671a8", "name": "Dangling fetch: DELETE /api/enrollments/${enrollmentId} (src/app/tutor/classes/[id]/page.tsx:128)", "shortDescription": {"text": "Dangling fetch: DELETE /api/enrollments/${enrollmentId} (src/app/tutor/classes/[id]/page.tsx:128)"}, "fullDescription": {"text": "`src/app/tutor/classes/[id]/page.tsx:128` calls `DELETE /api/enrollments/${enrollmentId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/enrollments/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3995af89448c973b", "name": "Dangling fetch: GET /api/users/students (src/app/tutor/classes/[id]/page.tsx:360)", "shortDescription": {"text": "Dangling fetch: GET /api/users/students (src/app/tutor/classes/[id]/page.tsx:360)"}, "fullDescription": {"text": "`src/app/tutor/classes/[id]/page.tsx:360` calls `GET /api/users/students` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/users/students`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-df0c1fbe33773cb3", "name": "Dangling fetch: POST /api/classes/${classId}/enrollments (src/app/tutor/classes/[id]/page.tsx:401)", "shortDescription": {"text": "Dangling fetch: POST /api/classes/${classId}/enrollments (src/app/tutor/classes/[id]/page.tsx:401)"}, "fullDescription": {"text": "`src/app/tutor/classes/[id]/page.tsx:401` calls `POST /api/classes/${classId}/enrollments` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/classes/<p>/enrollments`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-75bcb30256c6d2bf", "name": "Dangling fetch: POST /api/classes/${classId}/students (src/app/tutor/classes/[id]/page.tsx:551)", "shortDescription": {"text": "Dangling fetch: POST /api/classes/${classId}/students (src/app/tutor/classes/[id]/page.tsx:551)"}, "fullDescription": {"text": "`src/app/tutor/classes/[id]/page.tsx:551` calls `POST /api/classes/${classId}/students` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/classes/<p>/students`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-685737df343f7d85", "name": "Dangling fetch: GET /api/classes/${classId} (src/app/tutor/classes/[id]/edit/page.tsx:78)", "shortDescription": {"text": "Dangling fetch: GET /api/classes/${classId} (src/app/tutor/classes/[id]/edit/page.tsx:78)"}, "fullDescription": {"text": "`src/app/tutor/classes/[id]/edit/page.tsx:78` calls `GET /api/classes/${classId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/classes/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c7642753c36cc0ff", "name": "Dangling fetch: PUT /api/classes/${classId} (src/app/tutor/classes/[id]/edit/page.tsx:115)", "shortDescription": {"text": "Dangling fetch: PUT /api/classes/${classId} (src/app/tutor/classes/[id]/edit/page.tsx:115)"}, "fullDescription": {"text": "`src/app/tutor/classes/[id]/edit/page.tsx:115` calls `PUT /api/classes/${classId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/classes/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a417ac84ee051c98", "name": "Dangling fetch: DELETE /api/enrollments/${student.enrollmentId} (src/app/tutor/classes/[id]/edit/page.tsx:140)", "shortDescription": {"text": "Dangling fetch: DELETE /api/enrollments/${student.enrollmentId} (src/app/tutor/classes/[id]/edit/page.tsx:140)"}, "fullDescription": {"text": "`src/app/tutor/classes/[id]/edit/page.tsx:140` calls `DELETE /api/enrollments/${student.enrollmentId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/enrollments/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c6bacec16ea2cdfc", "name": "Dangling fetch: POST /api/workflow/grading (src/app/tutor/workflow/page.tsx:188)", "shortDescription": {"text": "Dangling fetch: POST /api/workflow/grading (src/app/tutor/workflow/page.tsx:188)"}, "fullDescription": {"text": "`src/app/tutor/workflow/page.tsx:188` calls `POST /api/workflow/grading` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workflow/grading`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0201221372b6a225", "name": "Dangling fetch: GET /api/sessions/${sessionId} (src/app/grade/[session_id]/page.tsx:90)", "shortDescription": {"text": "Dangling fetch: GET /api/sessions/${sessionId} (src/app/grade/[session_id]/page.tsx:90)"}, "fullDescription": {"text": "`src/app/grade/[session_id]/page.tsx:90` calls `GET /api/sessions/${sessionId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sessions/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6c4fcf07551cb6f5", "name": "Dangling fetch: POST /api/session-results (src/app/grade/[session_id]/page.tsx:135)", "shortDescription": {"text": "Dangling fetch: POST /api/session-results (src/app/grade/[session_id]/page.tsx:135)"}, "fullDescription": {"text": "`src/app/grade/[session_id]/page.tsx:135` calls `POST /api/session-results` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/session-results`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a2d85cacdcd846a9", "name": "Dangling fetch: POST /api/sessions/${sessionId}/complete (src/app/grade/[session_id]/page.tsx:224)", "shortDescription": {"text": "Dangling fetch: POST /api/sessions/${sessionId}/complete (src/app/grade/[session_id]/page.tsx:224)"}, "fullDescription": {"text": "`src/app/grade/[session_id]/page.tsx:224` calls `POST /api/sessions/${sessionId}/complete` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sessions/<p>/complete`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0c771f58b2849cb1", "name": "Dangling fetch: GET /api/admin/users?limit=500 (src/app/admin/users/page.tsx:55)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/users?limit=500 (src/app/admin/users/page.tsx:55)"}, "fullDescription": {"text": "`src/app/admin/users/page.tsx:55` calls `GET /api/admin/users?limit=500` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/users`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5be59d1ccd299c3c", "name": "Dangling fetch: GET /api/admin/tenancy/organizations (src/app/admin/users/page.tsx:56)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/tenancy/organizations (src/app/admin/users/page.tsx:56)"}, "fullDescription": {"text": "`src/app/admin/users/page.tsx:56` calls `GET /api/admin/tenancy/organizations` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/tenancy/organizations`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-38a280b519910c5a", "name": "Dangling fetch: GET /api/admin/tenancy/institutes (src/app/admin/users/page.tsx:57)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/tenancy/institutes (src/app/admin/users/page.tsx:57)"}, "fullDescription": {"text": "`src/app/admin/users/page.tsx:57` calls `GET /api/admin/tenancy/institutes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/tenancy/institutes`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-da220bf048b18cf3", "name": "Dangling fetch: PATCH /api/admin/tenancy/users/${editingId} (src/app/admin/users/page.tsx:89)", "shortDescription": {"text": "Dangling fetch: PATCH /api/admin/tenancy/users/${editingId} (src/app/admin/users/page.tsx:89)"}, "fullDescription": {"text": "`src/app/admin/users/page.tsx:89` calls `PATCH /api/admin/tenancy/users/${editingId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/tenancy/users/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a356746b1ffec160", "name": "Dangling fetch: GET /api/admin/objective-answer-broken?limit=${pageSize}&offset=${offset} (src/app/admin/answer-fix/page", "shortDescription": {"text": "Dangling fetch: GET /api/admin/objective-answer-broken?limit=${pageSize}&offset=${offset} (src/app/admin/answer-fix/page.tsx:46)"}, "fullDescription": {"text": "`src/app/admin/answer-fix/page.tsx:46` calls `GET /api/admin/objective-answer-broken?limit=${pageSize}&offset=${offset}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/objective-answer-broken`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-baa4263d9d459898", "name": "Dangling fetch: PATCH /api/admin/objective-answer-fix (src/app/admin/answer-fix/page.tsx:68)", "shortDescription": {"text": "Dangling fetch: PATCH /api/admin/objective-answer-fix (src/app/admin/answer-fix/page.tsx:68)"}, "fullDescription": {"text": "`src/app/admin/answer-fix/page.tsx:68` calls `PATCH /api/admin/objective-answer-fix` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/objective-answer-fix`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-190dea80d4f41c72", "name": "Dangling fetch: PATCH /api/admin/objective-answer-fix (src/app/admin/answer-fix/page.tsx:111)", "shortDescription": {"text": "Dangling fetch: PATCH /api/admin/objective-answer-fix (src/app/admin/answer-fix/page.tsx:111)"}, "fullDescription": {"text": "`src/app/admin/answer-fix/page.tsx:111` calls `PATCH /api/admin/objective-answer-fix` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/objective-answer-fix`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-53d08001794eb923", "name": "Dangling fetch: GET /api/organization-applications?status=${statusFilter} (src/app/admin/organization-applications/page.", "shortDescription": {"text": "Dangling fetch: GET /api/organization-applications?status=${statusFilter} (src/app/admin/organization-applications/page.tsx:95)"}, "fullDescription": {"text": "`src/app/admin/organization-applications/page.tsx:95` calls `GET /api/organization-applications?status=${statusFilter}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/organization-applications`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4baddd4d0b9457a4", "name": "Dangling fetch: GET /api/admin/tenancy/organizations (src/app/admin/organization-applications/page.tsx:96)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/tenancy/organizations (src/app/admin/organization-applications/page.tsx:96)"}, "fullDescription": {"text": "`src/app/admin/organization-applications/page.tsx:96` calls `GET /api/admin/tenancy/organizations` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/tenancy/organizations`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-95059efc95bef8dc", "name": "Dangling fetch: PATCH /api/organization-applications/${approving.id} (src/app/admin/organization-applications/page.tsx:1", "shortDescription": {"text": "Dangling fetch: PATCH /api/organization-applications/${approving.id} (src/app/admin/organization-applications/page.tsx:155)"}, "fullDescription": {"text": "`src/app/admin/organization-applications/page.tsx:155` calls `PATCH /api/organization-applications/${approving.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/organization-applications/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9876aa115372d68f", "name": "Dangling fetch: PATCH /api/organization-applications/${rejecting.id} (src/app/admin/organization-applications/page.tsx:1", "shortDescription": {"text": "Dangling fetch: PATCH /api/organization-applications/${rejecting.id} (src/app/admin/organization-applications/page.tsx:175)"}, "fullDescription": {"text": "`src/app/admin/organization-applications/page.tsx:175` calls `PATCH /api/organization-applications/${rejecting.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/organization-applications/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f79e94ce1c9e6b2b", "name": "Dangling fetch: GET /api/admin/tenancy/organizations (src/app/admin/institutes/page.tsx:55)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/tenancy/organizations (src/app/admin/institutes/page.tsx:55)"}, "fullDescription": {"text": "`src/app/admin/institutes/page.tsx:55` calls `GET /api/admin/tenancy/organizations` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/tenancy/organizations`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-406c6828830f5618", "name": "Dangling fetch: GET /api/admin/tenancy/institutes (src/app/admin/institutes/page.tsx:56)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/tenancy/institutes (src/app/admin/institutes/page.tsx:56)"}, "fullDescription": {"text": "`src/app/admin/institutes/page.tsx:56` calls `GET /api/admin/tenancy/institutes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/tenancy/institutes`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3320712c6a905971", "name": "Dangling fetch: POST /api/admin/tenancy/organizations (src/app/admin/institutes/page.tsx:82)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/tenancy/organizations (src/app/admin/institutes/page.tsx:82)"}, "fullDescription": {"text": "`src/app/admin/institutes/page.tsx:82` calls `POST /api/admin/tenancy/organizations` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/tenancy/organizations`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-974fc2d1783eac47", "name": "Dangling fetch: POST /api/admin/tenancy/institutes (src/app/admin/institutes/page.tsx:99)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/tenancy/institutes (src/app/admin/institutes/page.tsx:99)"}, "fullDescription": {"text": "`src/app/admin/institutes/page.tsx:99` calls `POST /api/admin/tenancy/institutes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/tenancy/institutes`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-226f331d2d45ac6f", "name": "Dangling fetch: PATCH /api/admin/tenancy/institutes (src/app/admin/institutes/page.tsx:118)", "shortDescription": {"text": "Dangling fetch: PATCH /api/admin/tenancy/institutes (src/app/admin/institutes/page.tsx:118)"}, "fullDescription": {"text": "`src/app/admin/institutes/page.tsx:118` calls `PATCH /api/admin/tenancy/institutes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/tenancy/institutes`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-86444dc30f4a1b5b", "name": "Dangling fetch: GET /api/share/student-report/${token} (src/app/share/student-report/[token]/page.tsx:378)", "shortDescription": {"text": "Dangling fetch: GET /api/share/student-report/${token} (src/app/share/student-report/[token]/page.tsx:378)"}, "fullDescription": {"text": "`src/app/share/student-report/[token]/page.tsx:378` calls `GET /api/share/student-report/${token}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/share/student-report/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4b9606b7d6f9c319", "name": "Dangling fetch: GET /api/reports/aggregate?${sp.toString()} (src/app/share/aggregate/ShareAggregateClient.tsx:159)", "shortDescription": {"text": "Dangling fetch: GET /api/reports/aggregate?${sp.toString()} (src/app/share/aggregate/ShareAggregateClient.tsx:159)"}, "fullDescription": {"text": "`src/app/share/aggregate/ShareAggregateClient.tsx:159` calls `GET /api/reports/aggregate?${sp.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/reports/aggregate`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f78a4679fdb69695", "name": "Dangling fetch: GET /api/share/diagnostic-report/${token} (src/app/share/diagnostic-report/[token]/page.tsx:27)", "shortDescription": {"text": "Dangling fetch: GET /api/share/diagnostic-report/${token} (src/app/share/diagnostic-report/[token]/page.tsx:27)"}, "fullDescription": {"text": "`src/app/share/diagnostic-report/[token]/page.tsx:27` calls `GET /api/share/diagnostic-report/${token}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/share/diagnostic-report/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-364bff2495790a11", "name": "Dangling fetch: POST /api/rendering-errors (src/lib/error-logger.ts:20)", "shortDescription": {"text": "Dangling fetch: POST /api/rendering-errors (src/lib/error-logger.ts:20)"}, "fullDescription": {"text": "`src/lib/error-logger.ts:20` calls `POST /api/rendering-errors` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/rendering-errors`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4db7230ad7ae26fc", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/vision/image-interpreter.ts:1855)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/vision/image-interpreter.ts:1855)"}, "fullDescription": {"text": "`src/lib/vision/image-interpreter.ts:1855` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d45c1f344b715b11", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/vision/image-interpreter.ts:1960)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/vision/image-interpreter.ts:1960)"}, "fullDescription": {"text": "`src/lib/vision/image-interpreter.ts:1960` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9b99f8c192a1b94a", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/workflow/classify.ts:236)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/workflow/classify.ts:236)"}, "fullDescription": {"text": "`src/lib/workflow/classify.ts:236` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fc9b279b18bb6dd2", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/workflow/classify.ts:275)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/workflow/classify.ts:275)"}, "fullDescription": {"text": "`src/lib/workflow/classify.ts:275` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3f3913339913171a", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/workflow/classify.ts:675)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/workflow/classify.ts:675)"}, "fullDescription": {"text": "`src/lib/workflow/classify.ts:675` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4f3661687d416f00", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/workflow/cloud-flow.ts:1594)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/workflow/cloud-flow.ts:1594)"}, "fullDescription": {"text": "`src/lib/workflow/cloud-flow.ts:1594` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-af756725380162fb", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/workflow/cloud-flow.ts:1671)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/workflow/cloud-flow.ts:1671)"}, "fullDescription": {"text": "`src/lib/workflow/cloud-flow.ts:1671` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e3be4c817630fa9e", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/workflow/twin-generator.ts:543)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/workflow/twin-generator.ts:543)"}, "fullDescription": {"text": "`src/lib/workflow/twin-generator.ts:543` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-55ca422d711e1d64", "name": "Dangling fetch: POST /api/image-pipeline/tag (src/lib/image-pipeline/client.ts:233)", "shortDescription": {"text": "Dangling fetch: POST /api/image-pipeline/tag (src/lib/image-pipeline/client.ts:233)"}, "fullDescription": {"text": "`src/lib/image-pipeline/client.ts:233` calls `POST /api/image-pipeline/tag` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/image-pipeline/tag`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f2d57966a8bb7f99", "name": "Dangling fetch: POST /api/image-pipeline/tag (src/lib/image-pipeline/client.ts:253)", "shortDescription": {"text": "Dangling fetch: POST /api/image-pipeline/tag (src/lib/image-pipeline/client.ts:253)"}, "fullDescription": {"text": "`src/lib/image-pipeline/client.ts:253` calls `POST /api/image-pipeline/tag` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/image-pipeline/tag`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-862f6c79349135f9", "name": "Dangling fetch: POST https://api.mathpix.com/v3/pdf (src/lib/ocr/mathpix.ts:129)", "shortDescription": {"text": "Dangling fetch: POST https://api.mathpix.com/v3/pdf (src/lib/ocr/mathpix.ts:129)"}, "fullDescription": {"text": "`src/lib/ocr/mathpix.ts:129` calls `POST https://api.mathpix.com/v3/pdf` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.mathpix.com/v3/pdf`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1ccf8a949c638f12", "name": "Dangling fetch: GET /api/dashboard/stats (src/hooks/useDashboardStats.ts:47)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/stats (src/hooks/useDashboardStats.ts:47)"}, "fullDescription": {"text": "`src/hooks/useDashboardStats.ts:47` calls `GET /api/dashboard/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/stats`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4ecd2fb117b35e79", "name": "Dangling fetch: GET /api/exams/${examId} (src/hooks/useExamProblems.ts:482)", "shortDescription": {"text": "Dangling fetch: GET /api/exams/${examId} (src/hooks/useExamProblems.ts:482)"}, "fullDescription": {"text": "`src/hooks/useExamProblems.ts:482` calls `GET /api/exams/${examId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-eeb38e9d859cd51a", "name": "Dangling fetch: POST /api/exams/${examId}/problems (src/hooks/useExamProblems.ts:544)", "shortDescription": {"text": "Dangling fetch: POST /api/exams/${examId}/problems (src/hooks/useExamProblems.ts:544)"}, "fullDescription": {"text": "`src/hooks/useExamProblems.ts:544` calls `POST /api/exams/${examId}/problems` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams/<p>/problems`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4b210b3ab480cc48", "name": "Dangling fetch: GET /api/exams (src/hooks/useExamProblems.ts:675)", "shortDescription": {"text": "Dangling fetch: GET /api/exams (src/hooks/useExamProblems.ts:675)"}, "fullDescription": {"text": "`src/hooks/useExamProblems.ts:675` calls `GET /api/exams` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exams`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-562bed92cd93f68f", "name": "Dangling fetch: GET /api/me/scope (src/hooks/useUserScope.ts:58)", "shortDescription": {"text": "Dangling fetch: GET /api/me/scope (src/hooks/useUserScope.ts:58)"}, "fullDescription": {"text": "`src/hooks/useUserScope.ts:58` calls `GET /api/me/scope` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/me/scope`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fb00ddcb6fe8d855", "name": "Dangling fetch: GET /api/expanded-types/tree?${params} (src/hooks/useExpandedTypes.ts:43)", "shortDescription": {"text": "Dangling fetch: GET /api/expanded-types/tree?${params} (src/hooks/useExpandedTypes.ts:43)"}, "fullDescription": {"text": "`src/hooks/useExpandedTypes.ts:43` calls `GET /api/expanded-types/tree?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/expanded-types/tree`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e20ec0acc3615fd4", "name": "Dangling fetch: GET /api/expanded-types/${encodeURIComponent(typeCode)} (src/hooks/useExpandedTypes.ts:94)", "shortDescription": {"text": "Dangling fetch: GET /api/expanded-types/${encodeURIComponent(typeCode)} (src/hooks/useExpandedTypes.ts:94)"}, "fullDescription": {"text": "`src/hooks/useExpandedTypes.ts:94` calls `GET /api/expanded-types/${encodeURIComponent(typeCode)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/expanded-types/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9684e23c63539340", "name": "Dangling fetch: GET /api/expanded-types/stats (src/hooks/useExpandedTypes.ts:140)", "shortDescription": {"text": "Dangling fetch: GET /api/expanded-types/stats (src/hooks/useExpandedTypes.ts:140)"}, "fullDescription": {"text": "`src/hooks/useExpandedTypes.ts:140` calls `GET /api/expanded-types/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/expanded-types/stats`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bd0c2cf391d9c242", "name": "Dangling fetch: GET /api/expanded-types?${qs} (src/hooks/useExpandedTypes.ts:184)", "shortDescription": {"text": "Dangling fetch: GET /api/expanded-types?${qs} (src/hooks/useExpandedTypes.ts:184)"}, "fullDescription": {"text": "`src/hooks/useExpandedTypes.ts:184` calls `GET /api/expanded-types?${qs}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/expanded-types`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ffb37fd06493c50f", "name": "Dangling fetch: GET /api/mathsecr-types?${params} (src/hooks/useExpandedTypes.ts:238)", "shortDescription": {"text": "Dangling fetch: GET /api/mathsecr-types?${params} (src/hooks/useExpandedTypes.ts:238)"}, "fullDescription": {"text": "`src/hooks/useExpandedTypes.ts:238` calls `GET /api/mathsecr-types?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/mathsecr-types`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-aa11ba9351e569ed", "name": "Unused endpoint: POST /detect", "shortDescription": {"text": "Unused endpoint: POST /detect"}, "fullDescription": {"text": "`yolo-server/server.py` declares `POST /detect` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ee3d59c4e847ff77", "name": "Unused endpoint: POST /annotate", "shortDescription": {"text": "Unused endpoint: POST /annotate"}, "fullDescription": {"text": "`yolo-server/server.py` declares `POST /annotate` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d87c0a26b4e7dfd5", "name": "Unused endpoint: POST /clean-handwriting", "shortDescription": {"text": "Unused endpoint: POST /clean-handwriting"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `POST /clean-handwriting` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a5f67659162bb378", "name": "Unused endpoint: POST /clean-pdf", "shortDescription": {"text": "Unused endpoint: POST /clean-pdf"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `POST /clean-pdf` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-298e1b2613a4c4ef", "name": "Unused endpoint: POST /clean-pdf-base64", "shortDescription": {"text": "Unused endpoint: POST /clean-pdf-base64"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `POST /clean-pdf-base64` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fc64766db06080e0", "name": "Unused endpoint: POST /detect-figures-cv", "shortDescription": {"text": "Unused endpoint: POST /detect-figures-cv"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `POST /detect-figures-cv` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f2f9067af02735c9", "name": "Unused endpoint: POST /render-pdf-pages", "shortDescription": {"text": "Unused endpoint: POST /render-pdf-pages"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `POST /render-pdf-pages` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4e679e98dab6dce4", "name": "Unused endpoint: POST /crop-figure", "shortDescription": {"text": "Unused endpoint: POST /crop-figure"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `POST /crop-figure` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0a71894a8648a458", "name": "Unused endpoint: POST /clean-handwriting-base64", "shortDescription": {"text": "Unused endpoint: POST /clean-handwriting-base64"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `POST /clean-handwriting-base64` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-82062857c3457fc6", "name": "Unused endpoint: POST /clean-handwriting-local", "shortDescription": {"text": "Unused endpoint: POST /clean-handwriting-local"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `POST /clean-handwriting-local` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-77163074065a1ad7", "name": "Unused endpoint: POST /extract-local", "shortDescription": {"text": "Unused endpoint: POST /extract-local"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `POST /extract-local` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-af4de720f651079e", "name": "Unused endpoint: POST /extract", "shortDescription": {"text": "Unused endpoint: POST /extract"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `POST /extract` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5ab43392431b2017", "name": "Unused endpoint: POST /detect-problems-yolo", "shortDescription": {"text": "Unused endpoint: POST /detect-problems-yolo"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `POST /detect-problems-yolo` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0c00d76f5c767d88", "name": "Unused endpoint: POST /enhance", "shortDescription": {"text": "Unused endpoint: POST /enhance"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `POST /enhance` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-80f6956b7d5354e1", "name": "Unused endpoint: GET /db/stats", "shortDescription": {"text": "Unused endpoint: GET /db/stats"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `GET /db/stats` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-023afb85a8e33cf6", "name": "Unused endpoint: GET /db/search", "shortDescription": {"text": "Unused endpoint: GET /db/search"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `GET /db/search` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-59f4958a9cfc380f", "name": "Unused endpoint: POST /db/find-similar", "shortDescription": {"text": "Unused endpoint: POST /db/find-similar"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `POST /db/find-similar` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f1ad431fcfdff5a8", "name": "Unused endpoint: POST /tag", "shortDescription": {"text": "Unused endpoint: POST /tag"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `POST /tag` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cbd4114f7809eef1", "name": "Unused endpoint: POST /tag/batch", "shortDescription": {"text": "Unused endpoint: POST /tag/batch"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `POST /tag/batch` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cbba100f5143d8dd", "name": "Unused endpoint: POST /tag/retag-all", "shortDescription": {"text": "Unused endpoint: POST /tag/retag-all"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `POST /tag/retag-all` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f55f5f95d4bef1d1", "name": "Unused endpoint: GET /tag/status", "shortDescription": {"text": "Unused endpoint: GET /tag/status"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `GET /tag/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1482168005fb340a", "name": "Unused endpoint: GET /tag/batch/{batch_id}", "shortDescription": {"text": "Unused endpoint: GET /tag/batch/{batch_id}"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `GET /tag/batch/{batch_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8c436869d081bf12", "name": "Unused endpoint: POST /match", "shortDescription": {"text": "Unused endpoint: POST /match"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `POST /match` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-50017d3a34134d2a", "name": "Unused endpoint: POST /match/batch", "shortDescription": {"text": "Unused endpoint: POST /match/batch"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `POST /match/batch` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-344d030d42cb9387", "name": "Unused endpoint: DELETE /db/image/{image_id}", "shortDescription": {"text": "Unused endpoint: DELETE /db/image/{image_id}"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `DELETE /db/image/{image_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-818da98a551cdbd2", "name": "Unused endpoint: DELETE /db/source/{source_name:path}", "shortDescription": {"text": "Unused endpoint: DELETE /db/source/{source_name:path}"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `DELETE /db/source/{source_name:path}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-96669e4405c776ab", "name": "Unused endpoint: GET /db/image/{filepath:path}", "shortDescription": {"text": "Unused endpoint: GET /db/image/{filepath:path}"}, "fullDescription": {"text": "`image-pipeline/server.py` declares `GET /db/image/{filepath:path}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/19932"}, "properties": {"repository": "snaker8/wp-math-science-project", "repoUrl": "https://github.com/snaker8/wp-math-science-project", "branch": "main"}, "results": [{"ruleId": "scanner-85412bdb4e9c8f39", "level": "note", "message": {"text": "Possibly dead Python function: find_match_with_ai"}, "properties": {"repobilityId": "09a8d77829a46745", "scanner": "scanner-primary", "fingerprint": "85412bdb4e9c8f39", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "\uacfc\ud559\ubaa8\ub4c8\ud1b5\ud569\ud3f4\ub354/science_diagram_pipeline.py:466"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-856bc20d6e911a8f", "level": "note", "message": {"text": "Possibly dead Python function: matrix_replace"}, "properties": {"repobilityId": "2b370d31f76c442e", "scanner": "scanner-primary", "fingerprint": "856bc20d6e911a8f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate-hwpx.py:67"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2da57025f2ce9e13", "level": "note", "message": {"text": "Possibly dead Python function: log_progress"}, "properties": {"repobilityId": "c1add1ac54b85f36", "scanner": "scanner-primary", "fingerprint": "2da57025f2ce9e13", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "image-pipeline/server.py:907"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-06b6f7f51871580a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-problem3-crop.js:11"}, "properties": {"repobilityId": "4ad9e6ca7ad343d1", "scanner": "scanner-primary", "fingerprint": "06b6f7f51871580a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c1fef1404006bbd5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/recover-singok-orphans.ts:32"}, "properties": {"repobilityId": "3b8313fa6e262b61", "scanner": "scanner-primary", "fingerprint": "c1fef1404006bbd5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dd680110e39e72a7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-seed-sql.ts:152"}, "properties": {"repobilityId": "4334b3354bf3592a", "scanner": "scanner-primary", "fingerprint": "dd680110e39e72a7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-878e44b4278e84ef", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-figures.js:13"}, "properties": {"repobilityId": "5c18b702434f112e", "scanner": "scanner-primary", "fingerprint": "878e44b4278e84ef", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fc315530b3324cf2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/apply-seed-to-supabase.ts:38"}, "properties": {"repobilityId": "90064c38b6dcc710", "scanner": "scanner-primary", "fingerprint": "fc315530b3324cf2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1b4de59bb3b765eb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-render-repair.ts:68"}, "properties": {"repobilityId": "90284d56568a189f", "scanner": "scanner-primary", "fingerprint": "1b4de59bb3b765eb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7691c4afb7a85b4c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-proxy.js:10"}, "properties": {"repobilityId": "ef77d73d9eadd173", "scanner": "scanner-primary", "fingerprint": "7691c4afb7a85b4c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-01252acddbb1c8d0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-figures5.js:8"}, "properties": {"repobilityId": "a6cdaa032192ebad", "scanner": "scanner-primary", "fingerprint": "01252acddbb1c8d0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9dd0696323566a40", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/reclassify-all-orphans.ts:118"}, "properties": {"repobilityId": "45e85790bb5dd58c", "scanner": "scanner-primary", "fingerprint": "9dd0696323566a40", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-09644f26f8bfe874", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/reclassify-science.js:118"}, "properties": {"repobilityId": "f67d4d276aab75e1", "scanner": "scanner-primary", "fingerprint": "09644f26f8bfe874", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1369285602fb56a1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-expanded-types.ts:297"}, "properties": {"repobilityId": "381cb2f9cce3ea2d", "scanner": "scanner-primary", "fingerprint": "1369285602fb56a1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1586880174fa3abc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-glm-classify.ts:127"}, "properties": {"repobilityId": "55c761643e001c19", "scanner": "scanner-primary", "fingerprint": "1586880174fa3abc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-06adf772d8996b1e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-recent-exams.ts:34"}, "properties": {"repobilityId": "a46c7c25ca715039", "scanner": "scanner-primary", "fingerprint": "06adf772d8996b1e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b9527cf1090454a5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-repair-existing-broken-latex.ts:20"}, "properties": {"repobilityId": "830fb2094ae64869", "scanner": "scanner-primary", "fingerprint": "b9527cf1090454a5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e9974e0647e5097f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/export-obsidian-students.ts:138"}, "properties": {"repobilityId": "09e768c6ad6a16a6", "scanner": "scanner-primary", "fingerprint": "e9974e0647e5097f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-404baa95df5b7ef0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/scan-all-orphan-codes.ts:21"}, "properties": {"repobilityId": "d2fd2bd0e926da97", "scanner": "scanner-primary", "fingerprint": "404baa95df5b7ef0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-06007240b5cc0201", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-figures4.js:9"}, "properties": {"repobilityId": "3de7cab45d2ed753", "scanner": "scanner-primary", "fingerprint": "06007240b5cc0201", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bfab0d08f3dd320f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-db-state.ts:18"}, "properties": {"repobilityId": "8fde416e44a64103", "scanner": "scanner-primary", "fingerprint": "bfab0d08f3dd320f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3c03f89dd1d79776", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/find-bad-difficulty.ts:52"}, "properties": {"repobilityId": "8974657ffb675fcc", "scanner": "scanner-primary", "fingerprint": "3c03f89dd1d79776", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-35d3f6f52d5c9da1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-glm-detect.ts:116"}, "properties": {"repobilityId": "77eb05b93cbe58bf", "scanner": "scanner-primary", "fingerprint": "35d3f6f52d5c9da1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-789a5dff1b6e43ab", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-p17.js:18"}, "properties": {"repobilityId": "ea6dc1ce6b4e9556", "scanner": "scanner-primary", "fingerprint": "789a5dff1b6e43ab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9e44599c0c13ae40", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/find-orphan-uploads.ts:24"}, "properties": {"repobilityId": "41902e64a829de33", "scanner": "scanner-primary", "fingerprint": "9e44599c0c13ae40", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-816273e01eb8ad70", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-figures7.js:20"}, "properties": {"repobilityId": "45573385c4b8f010", "scanner": "scanner-primary", "fingerprint": "816273e01eb8ad70", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3c3c3f7ea29c6921", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/export-yolo-dataset.ts:101"}, "properties": {"repobilityId": "1b49909e173a2763", "scanner": "scanner-primary", "fingerprint": "3c3c3f7ea29c6921", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fae593939d670dcc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/inspect-sangdang.ts:29"}, "properties": {"repobilityId": "70dfc8994898f8e3", "scanner": "scanner-primary", "fingerprint": "fae593939d670dcc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0365f4e456c2c520", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/extract-bible-solutions.ts:16"}, "properties": {"repobilityId": "bcb82982972b31d6", "scanner": "scanner-primary", "fingerprint": "0365f4e456c2c520", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-883753d4d79fb936", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/dump-problem-10.ts:31"}, "properties": {"repobilityId": "6c0f1b9b995a0033", "scanner": "scanner-primary", "fingerprint": "883753d4d79fb936", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8c18325eb62f5979", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-two-stage-classify.ts:80"}, "properties": {"repobilityId": "62d7b22c1ed14201", "scanner": "scanner-primary", "fingerprint": "8c18325eb62f5979", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-aa5d6fb108996912", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-exam-classification.ts:48"}, "properties": {"repobilityId": "bdde01feae6dca60", "scanner": "scanner-primary", "fingerprint": "aa5d6fb108996912", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-37f938a57b239856", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-sangdang-orphan.ts:22"}, "properties": {"repobilityId": "a63e69974dc146c0", "scanner": "scanner-primary", "fingerprint": "37f938a57b239856", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-63448ef0a68470d7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-glm-graph.ts:181"}, "properties": {"repobilityId": "2f409fa163f14b28", "scanner": "scanner-primary", "fingerprint": "63448ef0a68470d7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7d77f7e5dde85fd4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-figures2.js:10"}, "properties": {"repobilityId": "8ba7126299516173", "scanner": "scanner-primary", "fingerprint": "7d77f7e5dde85fd4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ab21ba8d407fd7f2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-haegang-3-1.ts:32"}, "properties": {"repobilityId": "028c5485faa35363", "scanner": "scanner-primary", "fingerprint": "ab21ba8d407fd7f2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-528a7191a55c73af", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-figures8.js:17"}, "properties": {"repobilityId": "eb737048a9f7a7c4", "scanner": "scanner-primary", "fingerprint": "528a7191a55c73af", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1da14657a0fd59ca", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-upscaled.js:8"}, "properties": {"repobilityId": "39442cce1777c9f1", "scanner": "scanner-primary", "fingerprint": "1da14657a0fd59ca", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6a789ee56224543a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-p20.js:13"}, "properties": {"repobilityId": "c29848a734f28682", "scanner": "scanner-primary", "fingerprint": "6a789ee56224543a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-258ceb26aaeb3354", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-crop-mapping.js:23"}, "properties": {"repobilityId": "ea07050b5883377f", "scanner": "scanner-primary", "fingerprint": "258ceb26aaeb3354", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6a10b61e21c4866b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-mathsecr-types.ts:104"}, "properties": {"repobilityId": "7fb5df2f3aee3e10", "scanner": "scanner-primary", "fingerprint": "6a10b61e21c4866b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bfbcc01b2b69f93d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-figures3.js:11"}, "properties": {"repobilityId": "a400396fcc1450c8", "scanner": "scanner-primary", "fingerprint": "bfbcc01b2b69f93d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ca34728d41abb1db", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-glm-graph-full.ts:115"}, "properties": {"repobilityId": "3b7e37d3d8e6f86b", "scanner": "scanner-primary", "fingerprint": "ca34728d41abb1db", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-58754ee260a0f3bf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-title-detect.ts:44"}, "properties": {"repobilityId": "f09ada14e0cb9cee", "scanner": "scanner-primary", "fingerprint": "58754ee260a0f3bf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4d0b345dd5fa0859", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/reclassify-haegang.ts:34"}, "properties": {"repobilityId": "3fe4f37a045f9c6e", "scanner": "scanner-primary", "fingerprint": "4d0b345dd5fa0859", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-31846f73d89f12ec", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-figures6.js:8"}, "properties": {"repobilityId": "ba804ef8ef0b6bd9", "scanner": "scanner-primary", "fingerprint": "31846f73d89f12ec", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2401aa4d2c11ec0c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-upscaled-urls.js:16"}, "properties": {"repobilityId": "71081ddefbf0ffce", "scanner": "scanner-primary", "fingerprint": "2401aa4d2c11ec0c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-33806f852c530e50", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/clear-wrong-crop.js:8"}, "properties": {"repobilityId": "91a0b471ac241ef6", "scanner": "scanner-primary", "fingerprint": "33806f852c530e50", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e87848fa4a205d46", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/BatchSolutionNotifier.tsx:140"}, "properties": {"repobilityId": "c0d898f8be577bc8", "scanner": "scanner-primary", "fingerprint": "e87848fa4a205d46", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f08779e7aecaa6da", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/exam/AnswerMatchModal.tsx:476"}, "properties": {"repobilityId": "2a7a30e6f66a5187", "scanner": "scanner-primary", "fingerprint": "f08779e7aecaa6da", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-362898032e839f46", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/exam/AnswerMatchModal.tsx:231"}, "properties": {"repobilityId": "c4acb82647721b4e", "scanner": "scanner-primary", "fingerprint": "362898032e839f46", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0433da54b4c48177", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/exam/DeployExamModal.tsx:145"}, "properties": {"repobilityId": "e9db6458bc9ba9fd", "scanner": "scanner-primary", "fingerprint": "0433da54b4c48177", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-71bccd70182b980c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/shared/InlineDesmosGraph.tsx:156"}, "properties": {"repobilityId": "215d91ba43190c85", "scanner": "scanner-primary", "fingerprint": "71bccd70182b980c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4d05b799b9f155a4", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/shared/InlineDesmosGraph.tsx:421"}, "properties": {"repobilityId": "25fe6a8bf03d3ae7", "scanner": "scanner-primary", "fingerprint": "4d05b799b9f155a4", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-834223d978b7d38a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/shared/MixedContentRenderer.tsx:149"}, "properties": {"repobilityId": "31e2b700fa001420", "scanner": "scanner-primary", "fingerprint": "834223d978b7d38a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3eb2f20dfd93946e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/shared/MixedContentRenderer.tsx:36"}, "properties": {"repobilityId": "ed0ffce95ea029d5", "scanner": "scanner-primary", "fingerprint": "3eb2f20dfd93946e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b53c9ba50dc3d68c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/shared/FigureRenderer.tsx:220"}, "properties": {"repobilityId": "8a93beae936986ba", "scanner": "scanner-primary", "fingerprint": "b53c9ba50dc3d68c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6678fd4e4be91a13", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/shared/FigureRenderer.tsx:258"}, "properties": {"repobilityId": "caabe35da9aedd3f", "scanner": "scanner-primary", "fingerprint": "6678fd4e4be91a13", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c34602621f9e5829", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/shared/MathRenderer.tsx:115"}, "properties": {"repobilityId": "f49861eaced7dc7f", "scanner": "scanner-primary", "fingerprint": "c34602621f9e5829", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-65ea9ae4b5c8af01", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/exam-create/SelectionTray.tsx:91"}, "properties": {"repobilityId": "a7a2daadada492e1", "scanner": "scanner-primary", "fingerprint": "65ea9ae4b5c8af01", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3e68d22a63992925", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/Sidebar.tsx:66"}, "properties": {"repobilityId": "5f95109246c12ca3", "scanner": "scanner-primary", "fingerprint": "3e68d22a63992925", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-271ea5aadcc52816", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/prescription/StudentPitfallSummary.tsx:171"}, "properties": {"repobilityId": "2ebefdd8a731eee0", "scanner": "scanner-primary", "fingerprint": "271ea5aadcc52816", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-db9481233ef05c43", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/prescription/CreateSessionsModal.tsx:218"}, "properties": {"repobilityId": "9998e6b0bc9832f9", "scanner": "scanner-primary", "fingerprint": "db9481233ef05c43", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e3303c5e6483b3d6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/prescription/WeeklyConnections.tsx:137"}, "properties": {"repobilityId": "de415e2e88b4afe9", "scanner": "scanner-primary", "fingerprint": "e3303c5e6483b3d6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bc67fd6189025121", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/prescription/PrescriptionRecommendation.tsx:172"}, "properties": {"repobilityId": "8a52c247a96b23f1", "scanner": "scanner-primary", "fingerprint": "bc67fd6189025121", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-388708ff5781e786", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/prescription/RecommendedProblems.tsx:136"}, "properties": {"repobilityId": "959cf2c7a3c5b92d", "scanner": "scanner-primary", "fingerprint": "388708ff5781e786", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f14dd9650ca95ab6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/students/StudentDetailContent.tsx:231"}, "properties": {"repobilityId": "3fd159f25cd2abea", "scanner": "scanner-primary", "fingerprint": "f14dd9650ca95ab6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-641d763d647b58c7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/class/StudentTreePanel.tsx:142"}, "properties": {"repobilityId": "bed72d34b28ddb95", "scanner": "scanner-primary", "fingerprint": "641d763d647b58c7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-16fd18d323f47f65", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/class/StudentLearningReport.tsx:212"}, "properties": {"repobilityId": "051a7e9ff1205171", "scanner": "scanner-primary", "fingerprint": "16fd18d323f47f65", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-58a433ffd2939ba9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/editor/MathEditor.tsx:141"}, "properties": {"repobilityId": "1a3081448b785098", "scanner": "scanner-primary", "fingerprint": "58a433ffd2939ba9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7de1bfe6dd7677c2", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/editor/LaTeXInputModal.tsx:144"}, "properties": {"repobilityId": "e6e1f231bd0d5399", "scanner": "scanner-primary", "fingerprint": "7de1bfe6dd7677c2", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-d81effc9b00b8157", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/editor/modals/GraphModal.tsx:134"}, "properties": {"repobilityId": "fd8b66dec69e571f", "scanner": "scanner-primary", "fingerprint": "d81effc9b00b8157", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-54c5276afae57755", "level": "note", "message": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/components/editor/modals/GraphModal.tsx:524"}, "properties": {"repobilityId": "5622671489431190", "scanner": "scanner-primary", "fingerprint": "54c5276afae57755", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.edge-label.no-bg"]}}, {"ruleId": "scanner-ffbe25b24d9b2411", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/editor/modals/MathSymbolPicker.tsx:281"}, "properties": {"repobilityId": "dd0e71fff828edf2", "scanner": "scanner-primary", "fingerprint": "ffbe25b24d9b2411", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-57333bb460e03628", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/pdf/ExamTemplate.tsx:255"}, "properties": {"repobilityId": "faf50d29d9d2dadf", "scanner": "scanner-primary", "fingerprint": "57333bb460e03628", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-cd8211148c1eb54e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/papers/ProblemEditModal.tsx:1120"}, "properties": {"repobilityId": "24f6310853fcc992", "scanner": "scanner-primary", "fingerprint": "cd8211148c1eb54e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d3ada243dda67c98", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/papers/MathsecrTreePicker.tsx:222"}, "properties": {"repobilityId": "fe39b0790bad6d95", "scanner": "scanner-primary", "fingerprint": "d3ada243dda67c98", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-44051196c17c2688", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/papers/DiagramBrowserModal.tsx:601"}, "properties": {"repobilityId": "fc25def2989c0c89", "scanner": "scanner-primary", "fingerprint": "44051196c17c2688", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5dd012aa02c3f09b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/papers/ExamStatsModal.tsx:365"}, "properties": {"repobilityId": "1ed4ff8e3d115a87", "scanner": "scanner-primary", "fingerprint": "5dd012aa02c3f09b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6abde7ccf3c3ecab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/papers/ExamAnalyticsSidebar.tsx:122"}, "properties": {"repobilityId": "c9877953ea0091d1", "scanner": "scanner-primary", "fingerprint": "6abde7ccf3c3ecab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e53f77d5916fba41", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/papers/TwinProblemModal.tsx:165"}, "properties": {"repobilityId": "93cba50ce6f90e29", "scanner": "scanner-primary", "fingerprint": "e53f77d5916fba41", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-cd1db2bc8edc772e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/grading/GradingSheetUpload.tsx:201"}, "properties": {"repobilityId": "d0472e2e2094ff2b", "scanner": "scanner-primary", "fingerprint": "cd1db2bc8edc772e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1879a8d915fb045f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/answer/[session_id]/page.tsx:209"}, "properties": {"repobilityId": "02516c4189f0c063", "scanner": "scanner-primary", "fingerprint": "1879a8d915fb045f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-073841a641e919a3", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/student/analytics/page.tsx:34"}, "properties": {"repobilityId": "d51e7a83db418a39", "scanner": "scanner-primary", "fingerprint": "073841a641e919a3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-c27770ecfbdcb837", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/student/analytics/page.tsx:56"}, "properties": {"repobilityId": "d160cf6ca57558f0", "scanner": "scanner-primary", "fingerprint": "c27770ecfbdcb837", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-39dc662df865cc95", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/student/sessions/[id]/page.tsx:163"}, "properties": {"repobilityId": "10f70d44669bd0b1", "scanner": "scanner-primary", "fingerprint": "39dc662df865cc95", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-89c24bcd8e44ed6b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/parent/[token]/page.tsx:234"}, "properties": {"repobilityId": "5a2b1512d9eca7e7", "scanner": "scanner-primary", "fingerprint": "89c24bcd8e44ed6b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9c00334390fdd1ac", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/print/session/[sessionId]/page.tsx:387"}, "properties": {"repobilityId": "b1e5c2f97ab4c6c7", "scanner": "scanner-primary", "fingerprint": "9c00334390fdd1ac", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8790b27c84ce5a62", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/route.ts:217"}, "properties": {"repobilityId": "cfc2acc83fd7d64f", "scanner": "scanner-primary", "fingerprint": "8790b27c84ce5a62", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e899e89d31ab594c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/generate/route.ts:64"}, "properties": {"repobilityId": "be02c65800504281", "scanner": "scanner-primary", "fingerprint": "e899e89d31ab594c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5bcf412d57f0601b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/[examId]/route.ts:361"}, "properties": {"repobilityId": "41ebee8016e7a38a", "scanner": "scanner-primary", "fingerprint": "5bcf412d57f0601b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-769610bb45d7d82f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/[examId]/create-similar/route.ts:143"}, "properties": {"repobilityId": "f268f49669208711", "scanner": "scanner-primary", "fingerprint": "769610bb45d7d82f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-106de4634d6ae701", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/[examId]/match-answers/route.ts:91"}, "properties": {"repobilityId": "0487189a8ca51453", "scanner": "scanner-primary", "fingerprint": "106de4634d6ae701", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a1519705580475be", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/[examId]/auto-fix/route.ts:79"}, "properties": {"repobilityId": "ca1ff79bf5e173e7", "scanner": "scanner-primary", "fingerprint": "a1519705580475be", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7c965161f1efd957", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/[examId]/sync-answers-from-solutions/route.ts:126"}, "properties": {"repobilityId": "c3bf54ec2d4c7fef", "scanner": "scanner-primary", "fingerprint": "7c965161f1efd957", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-48cb7b2453f5c401", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/[examId]/batch-solutions/route.ts:130"}, "properties": {"repobilityId": "618ad93e06ab0128", "scanner": "scanner-primary", "fingerprint": "48cb7b2453f5c401", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2a50c9328cb9194b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/exams/create-from-problems/route.ts:100"}, "properties": {"repobilityId": "4b36a3b285ac8163", "scanner": "scanner-primary", "fingerprint": "2a50c9328cb9194b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9aeab2445a5a44ce", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/analytics/heatmap/route.ts:31"}, "properties": {"repobilityId": "a1a9cd274c9116b9", "scanner": "scanner-primary", "fingerprint": "9aeab2445a5a44ce", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c87c022ce20968f6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sessions/[id]/complete/route.ts:68"}, "properties": {"repobilityId": "d5130e48b58c64e0", "scanner": "scanner-primary", "fingerprint": "c87c022ce20968f6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-43917fc7e4f73900", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/students/route.ts:238"}, "properties": {"repobilityId": "d368f77dfc2a6726", "scanner": "scanner-primary", "fingerprint": "43917fc7e4f73900", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0181b6e572188148", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/students/[studentId]/generate-recommended-session/route.ts:180"}, "properties": {"repobilityId": "cae9562e5d16e36a", "scanner": "scanner-primary", "fingerprint": "0181b6e572188148", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e0e0f7e87bd8656e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/vision/interpret/route.ts:71"}, "properties": {"repobilityId": "7be5d5caf04987dc", "scanner": "scanner-primary", "fingerprint": "e0e0f7e87bd8656e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1c9abff8741ac04b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/admin/users/backfill-names/route.ts:101"}, "properties": {"repobilityId": "f2ce3a0df022d8ac", "scanner": "scanner-primary", "fingerprint": "1c9abff8741ac04b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a1ed0222bb2eb17b", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/admin/reocr-points/route.ts:96"}, "properties": {"repobilityId": "d50ffef872183ba1", "scanner": "scanner-primary", "fingerprint": "a1ed0222bb2eb17b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-5d406e7245bafce1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/admin/reocr-points/route.ts:233"}, "properties": {"repobilityId": "d59d740d0b9b1cdb", "scanner": "scanner-primary", "fingerprint": "5d406e7245bafce1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ec8fdf4d93caff31", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/detect-problems-yolo/route.ts:50"}, "properties": {"repobilityId": "bf16cde141dcbb18", "scanner": "scanner-primary", "fingerprint": "ec8fdf4d93caff31", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-406c0e9ab0bb4ed8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/upload/route.ts:190"}, "properties": {"repobilityId": "71a58bd9124ce363", "scanner": "scanner-primary", "fingerprint": "406c0e9ab0bb4ed8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0f83b116e911acfa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/detect-problems/route.ts:96"}, "properties": {"repobilityId": "d9da0f51f6c0f501", "scanner": "scanner-primary", "fingerprint": "0f83b116e911acfa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9b72116aacb30a19", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/upload-science-perproblem/route.ts:124"}, "properties": {"repobilityId": "28bfa821bf06919b", "scanner": "scanner-primary", "fingerprint": "9b72116aacb30a19", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8a52b6dabfa1ff87", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/upload-science-gemini/route.ts:112"}, "properties": {"repobilityId": "10937ecd885c1d16", "scanner": "scanner-primary", "fingerprint": "8a52b6dabfa1ff87", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ceda6daa211ef1b7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/reanalyze-crop/route.ts:70"}, "properties": {"repobilityId": "2502f26eacd0ce3c", "scanner": "scanner-primary", "fingerprint": "ceda6daa211ef1b7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3778089e53c6aea4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/detect-from-ocr/route.ts:90"}, "properties": {"repobilityId": "bdb300e0b87d03fd", "scanner": "scanner-primary", "fingerprint": "3778089e53c6aea4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a88b1bb3b79c1f18", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/detect-figures-gpt/route.ts:150"}, "properties": {"repobilityId": "2333195ed7e34401", "scanner": "scanner-primary", "fingerprint": "a88b1bb3b79c1f18", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cd4acec83fe6ae21", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/pdf-proxy/route.ts:32"}, "properties": {"repobilityId": "8bf1db65c0c79517", "scanner": "scanner-primary", "fingerprint": "cd4acec83fe6ae21", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-89a3ad1ff9efa8a6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/workflow/twin/route.ts:91"}, "properties": {"repobilityId": "70d2121efcee2391", "scanner": "scanner-primary", "fingerprint": "89a3ad1ff9efa8a6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-57aeca8640a2d739", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/session-results/route.ts:186"}, "properties": {"repobilityId": "983c2f314ad60abf", "scanner": "scanner-primary", "fingerprint": "57aeca8640a2d739", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-077d10df1e72d5ec", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/diagram-images/route.ts:212"}, "properties": {"repobilityId": "f0a24b4a99e9b027", "scanner": "scanner-primary", "fingerprint": "077d10df1e72d5ec", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-818f14f5fe3ffc47", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/diagram-images/upload/route.ts:74"}, "properties": {"repobilityId": "a342c354f53a194e", "scanner": "scanner-primary", "fingerprint": "818f14f5fe3ffc47", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8c3f57dce4f2f49d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/share/exam/[token]/route.ts:33"}, "properties": {"repobilityId": "96f6c71cf1089608", "scanner": "scanner-primary", "fingerprint": "8c3f57dce4f2f49d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3cf5c03f1ea51787", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/figure-corrections/route.ts:124"}, "properties": {"repobilityId": "49815d11db4120dd", "scanner": "scanner-primary", "fingerprint": "3cf5c03f1ea51787", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d6952c2d5f1d6f97", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/problems/route.ts:144"}, "properties": {"repobilityId": "03883c8e80979bce", "scanner": "scanner-primary", "fingerprint": "d6952c2d5f1d6f97", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-55247c7876db096d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/problems/[problemId]/route.ts:84"}, "properties": {"repobilityId": "160993c596cacfe6", "scanner": "scanner-primary", "fingerprint": "55247c7876db096d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-35fe9c033e6f9d1d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/problems/[problemId]/update-figure/route.ts:92"}, "properties": {"repobilityId": "27a5acc9d16a0b44", "scanner": "scanner-primary", "fingerprint": "35fe9c033e6f9d1d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-663b2d87cf066f06", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/problems/[problemId]/delete-figure/route.ts:55"}, "properties": {"repobilityId": "5fe79cc384fee7e8", "scanner": "scanner-primary", "fingerprint": "663b2d87cf066f06", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-25c7a2a0bcb66ac0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/problems/[problemId]/generate-solution/route.ts:437"}, "properties": {"repobilityId": "e8784f3f32ff8021", "scanner": "scanner-primary", "fingerprint": "25c7a2a0bcb66ac0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d67f204374d7d0f9", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/problems/[problemId]/generate-figure/route.ts:17"}, "properties": {"repobilityId": "ae0a8fc7590cd731", "scanner": "scanner-primary", "fingerprint": "d67f204374d7d0f9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-7ef9698fa320bd76", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/problems/[problemId]/generate-figure/route.ts:82"}, "properties": {"repobilityId": "34cdb5d4c3f5375b", "scanner": "scanner-primary", "fingerprint": "7ef9698fa320bd76", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d6a9976a31ec0193", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/problems/[problemId]/reanalyze/route.ts:109"}, "properties": {"repobilityId": "78f078fddf4a7b8e", "scanner": "scanner-primary", "fingerprint": "d6a9976a31ec0193", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4c1a9ef1d1d3b547", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/storage/upload-image/route.ts:65"}, "properties": {"repobilityId": "46a835fd689b416a", "scanner": "scanner-primary", "fingerprint": "4c1a9ef1d1d3b547", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bbcdb38d003913a4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/export/hwpx/route.ts:51"}, "properties": {"repobilityId": "e8ddf189cc7f23b5", "scanner": "scanner-primary", "fingerprint": "bbcdb38d003913a4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-451f0c5f4512ee0c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/shared/chat/page.tsx:95"}, "properties": {"repobilityId": "8e16c0a6785809f6", "scanner": "scanner-primary", "fingerprint": "451f0c5f4512ee0c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-23ba8b22c31cd058", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/page.tsx:280"}, "properties": {"repobilityId": "4ba209c1bd3eacfd", "scanner": "scanner-primary", "fingerprint": "23ba8b22c31cd058", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-16f43589db0e815b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/similar/page.tsx:419"}, "properties": {"repobilityId": "fc7247be72fd680a", "scanner": "scanner-primary", "fingerprint": "16f43589db0e815b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0e0a3b776a039467", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/exam-create/page.tsx:726"}, "properties": {"repobilityId": "c032f27dfc0955e4", "scanner": "scanner-primary", "fingerprint": "0e0a3b776a039467", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-603b5dbd8bbe7913", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/prescription/page.tsx:719"}, "properties": {"repobilityId": "a4696f308d2a578e", "scanner": "scanner-primary", "fingerprint": "603b5dbd8bbe7913", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-156cb042216584c1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/prescription/report/page.tsx:209"}, "properties": {"repobilityId": "77da23471120a291", "scanner": "scanner-primary", "fingerprint": "156cb042216584c1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a6599c82f9387d8c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/cloud/CloudListClient.tsx:275"}, "properties": {"repobilityId": "74dc1a8ec4470239", "scanner": "scanner-primary", "fingerprint": "a6599c82f9387d8c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2d0079f0de27e610", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/cloud/CloudListClient.tsx:2628"}, "properties": {"repobilityId": "95eee458ebe74f6a", "scanner": "scanner-primary", "fingerprint": "2d0079f0de27e610", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-3b74dafb21518048", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/cloud/CloudListClient.tsx:1040"}, "properties": {"repobilityId": "142f5404e5b7a9d8", "scanner": "scanner-primary", "fingerprint": "3b74dafb21518048", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0ba3ee885e98bef6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/cloud/[examId]/page.tsx:821"}, "properties": {"repobilityId": "f2fc22b0b3b1c5e8", "scanner": "scanner-primary", "fingerprint": "0ba3ee885e98bef6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8cc6b527bcac2692", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/cloud/folder-import/page.tsx:482"}, "properties": {"repobilityId": "02761b97529b9328", "scanner": "scanner-primary", "fingerprint": "8cc6b527bcac2692", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-376c33ecf387ef64", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/repository/page.tsx:401"}, "properties": {"repobilityId": "9d255fc8a4398ef0", "scanner": "scanner-primary", "fingerprint": "376c33ecf387ef64", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-69f7bf243afa8213", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/repository/page.tsx:402"}, "properties": {"repobilityId": "1a07389175afe6e5", "scanner": "scanner-primary", "fingerprint": "69f7bf243afa8213", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4d8220ae0bb3a25f", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/app/dashboard/repository/page.tsx:340"}, "properties": {"repobilityId": "378ff2dd1f29068c", "scanner": "scanner-primary", "fingerprint": "4d8220ae0bb3a25f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-366932e809899432", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/repository/editor/page.tsx:67"}, "properties": {"repobilityId": "9d2acedaa9cc0407", "scanner": "scanner-primary", "fingerprint": "366932e809899432", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-30fa2de27255a221", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/repository/editor/page.tsx:103"}, "properties": {"repobilityId": "825a2837136dbb40", "scanner": "scanner-primary", "fingerprint": "30fa2de27255a221", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f1de872f2c0a190d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/assignments/page.tsx:354"}, "properties": {"repobilityId": "453c0d7ba5aa50ab", "scanner": "scanner-primary", "fingerprint": "f1de872f2c0a190d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e92d7fb6565dd33d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/corrections/page.tsx:174"}, "properties": {"repobilityId": "5044d445944d4e07", "scanner": "scanner-primary", "fingerprint": "e92d7fb6565dd33d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f67602da1fa48267", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/workflow/page.tsx:143"}, "properties": {"repobilityId": "fd6eb3e61fcbd04c", "scanner": "scanner-primary", "fingerprint": "f67602da1fa48267", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1c7b30ece12a10e2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/workflow/analyze/[jobId]/page.tsx:2179"}, "properties": {"repobilityId": "4eb32cec2150cad6", "scanner": "scanner-primary", "fingerprint": "1c7b30ece12a10e2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1f797e6d1a4eb79d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/workflow/analyze/[jobId]/page.tsx:986"}, "properties": {"repobilityId": "78d3a8e665ab7bbd", "scanner": "scanner-primary", "fingerprint": "1f797e6d1a4eb79d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a2b05b27e5042982", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/create/page.tsx:242"}, "properties": {"repobilityId": "fde283744433d0bb", "scanner": "scanner-primary", "fingerprint": "a2b05b27e5042982", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-65f062252272d842", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/materials/page.tsx:343"}, "properties": {"repobilityId": "bda7eb661ad63b8e", "scanner": "scanner-primary", "fingerprint": "65f062252272d842", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e9afd537ed91d34c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/materials/diagrams/DiagramsClient.tsx:432"}, "properties": {"repobilityId": "2c722071ddd66262", "scanner": "scanner-primary", "fingerprint": "e9afd537ed91d34c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3f5b71e19b8ad751", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/exam-management/page.tsx:195"}, "properties": {"repobilityId": "d921df7cc1046874", "scanner": "scanner-primary", "fingerprint": "3f5b71e19b8ad751", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-12d4387697da1731", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/dashboard/exam-management/page.tsx:1757"}, "properties": {"repobilityId": "0a3bed3763de6907", "scanner": "scanner-primary", "fingerprint": "12d4387697da1731", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-fd6004e4dd5a795d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/reports/aggregate/page.tsx:971"}, "properties": {"repobilityId": "e23beb0b35719e62", "scanner": "scanner-primary", "fingerprint": "fd6004e4dd5a795d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-557dbfaf320f4a25", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/skills/page.tsx:189"}, "properties": {"repobilityId": "6d5b08480261b17e", "scanner": "scanner-primary", "fingerprint": "557dbfaf320f4a25", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c6e559fa27f4197f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/editor/page.tsx:304"}, "properties": {"repobilityId": "faf85a4ec9ebab76", "scanner": "scanner-primary", "fingerprint": "c6e559fa27f4197f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8b8722d7e096bb79", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/exam-analysis/[examId]/students/[studentId]/page.tsx:446"}, "properties": {"repobilityId": "3763ce67da075b1f", "scanner": "scanner-primary", "fingerprint": "8b8722d7e096bb79", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b8bf76ee0bc7169e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/papers/page.tsx:376"}, "properties": {"repobilityId": "3fad901c439f7d2b", "scanner": "scanner-primary", "fingerprint": "b8bf76ee0bc7169e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-33294903536bfeea", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/grading/page.tsx:432"}, "properties": {"repobilityId": "8d4cc67add14d532", "scanner": "scanner-primary", "fingerprint": "33294903536bfeea", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9e1d4de8c09b9e0c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/tutor/analytics/page.tsx:326"}, "properties": {"repobilityId": "051ffa121f9086ac", "scanner": "scanner-primary", "fingerprint": "9e1d4de8c09b9e0c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eebaeb94f6c15170", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/tutor/classes/[id]/page.tsx:269"}, "properties": {"repobilityId": "5172687d0ea98719", "scanner": "scanner-primary", "fingerprint": "eebaeb94f6c15170", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-176456a4a891e051", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/tutor/workflow/page.tsx:140"}, "properties": {"repobilityId": "39e8f67d0ad7f10e", "scanner": "scanner-primary", "fingerprint": "176456a4a891e051", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-ac86226b6382afde", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/tutor/workflow/page.tsx:61"}, "properties": {"repobilityId": "3b1708d571e995e0", "scanner": "scanner-primary", "fingerprint": "ac86226b6382afde", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f8f403db10f89e1d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/grade/[session_id]/page.tsx:302"}, "properties": {"repobilityId": "e4a7ce260d94a709", "scanner": "scanner-primary", "fingerprint": "f8f403db10f89e1d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1270778b022a5fc8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/answer-fix/page.tsx:242"}, "properties": {"repobilityId": "3ee38986c35a8822", "scanner": "scanner-primary", "fingerprint": "1270778b022a5fc8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6376897fd3673716", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/share/student-report/[token]/page.tsx:286"}, "properties": {"repobilityId": "3ac2f17e31ef22c7", "scanner": "scanner-primary", "fingerprint": "6376897fd3673716", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d514075bd9a408d6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/editor/page.tsx:34"}, "properties": {"repobilityId": "0e80736860059e97", "scanner": "scanner-primary", "fingerprint": "d514075bd9a408d6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2222eede7b3bbf5b", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/api/analytics.ts:166"}, "properties": {"repobilityId": "bfd5754f49104753", "scanner": "scanner-primary", "fingerprint": "2222eede7b3bbf5b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-41d6f56a4438da50", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/api/grading.ts:161"}, "properties": {"repobilityId": "c8b138ef09a9df8f", "scanner": "scanner-primary", "fingerprint": "41d6f56a4438da50", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-22db15fd36b82ad1", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/utils/sanitize-svg.ts:2"}, "properties": {"repobilityId": "5524a7ec262f6121", "scanner": "scanner-primary", "fingerprint": "22db15fd36b82ad1", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9252610312ddd8fd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/utils/auto-folder.ts:91"}, "properties": {"repobilityId": "a4815060ae34df51", "scanner": "scanner-primary", "fingerprint": "9252610312ddd8fd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-958fa518d5f57097", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/vision/image-upscaler.ts:214"}, "properties": {"repobilityId": "e23759d9c09f6b90", "scanner": "scanner-primary", "fingerprint": "958fa518d5f57097", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5ff74afdd019d04e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/vision/image-interpreter.ts:522"}, "properties": {"repobilityId": "174b0ec8d1f98694", "scanner": "scanner-primary", "fingerprint": "5ff74afdd019d04e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-39f93f846a5ff823", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/vision/figure-renderer.ts:711"}, "properties": {"repobilityId": "bdac1a7691762b55", "scanner": "scanner-primary", "fingerprint": "39f93f846a5ff823", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b7355aa7d6b5c11b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/vision/visual-prompting.ts:129"}, "properties": {"repobilityId": "cad0abbd75a1e244", "scanner": "scanner-primary", "fingerprint": "b7355aa7d6b5c11b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-39296964d45a6ac0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/workflow/classify.ts:222"}, "properties": {"repobilityId": "0272a19e9c6fdeec", "scanner": "scanner-primary", "fingerprint": "39296964d45a6ac0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-77d4cdd9c3a20b7e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/workflow/cloud-flow.ts:128"}, "properties": {"repobilityId": "299488f7a32c40d9", "scanner": "scanner-primary", "fingerprint": "77d4cdd9c3a20b7e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a036a40db010ac07", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/workflow/science-gemini-flow.ts:118"}, "properties": {"repobilityId": "c90deb2aec4b6572", "scanner": "scanner-primary", "fingerprint": "a036a40db010ac07", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7a0c15f22040eb29", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/workflow/twin-generator.ts:469"}, "properties": {"repobilityId": "745cfa1789cb4810", "scanner": "scanner-primary", "fingerprint": "7a0c15f22040eb29", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6428226db751fab4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/workflow/hwp-converter.ts:64"}, "properties": {"repobilityId": "a6ee6926aa1a4de1", "scanner": "scanner-primary", "fingerprint": "6428226db751fab4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a47622ee07cc1742", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/image-pipeline/workflow-integration.ts:60"}, "properties": {"repobilityId": "f51a5e575736c1b2", "scanner": "scanner-primary", "fingerprint": "a47622ee07cc1742", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fc518f9aa1f83135", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/image-pipeline/client.ts:72"}, "properties": {"repobilityId": "2bf6c1380d45906a", "scanner": "scanner-primary", "fingerprint": "fc518f9aa1f83135", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4070952998ebe102", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/pdf/auto-crop.ts:189"}, "properties": {"repobilityId": "c58e28f31f774c28", "scanner": "scanner-primary", "fingerprint": "4070952998ebe102", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-48922e848711f05c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/ocr/symbol-detector.ts:164"}, "properties": {"repobilityId": "40fd25f94c26eab3", "scanner": "scanner-primary", "fingerprint": "48922e848711f05c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-895e3564c3af5dd5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/ocr/question-parser.ts:126"}, "properties": {"repobilityId": "4b4e5e08e6b11c82", "scanner": "scanner-primary", "fingerprint": "895e3564c3af5dd5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-43a87259cc42a215", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/ocr/vision-verifier.ts:203"}, "properties": {"repobilityId": "7392072ff91bbbdd", "scanner": "scanner-primary", "fingerprint": "43a87259cc42a215", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-30d817e487bdf46b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/ocr/mathpix.ts:88"}, "properties": {"repobilityId": "5d6e8ffd5a4d0333", "scanner": "scanner-primary", "fingerprint": "30d817e487bdf46b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8197548433f5cc5f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/export/docx-generator.ts:703"}, "properties": {"repobilityId": "edf2c7e829eea3a5", "scanner": "scanner-primary", "fingerprint": "8197548433f5cc5f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-89be6b8adddfc301", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useExams.ts:104"}, "properties": {"repobilityId": "4db057318c72aed0", "scanner": "scanner-primary", "fingerprint": "89be6b8adddfc301", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d4c66234c8013276", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useDashboardStats.ts:51"}, "properties": {"repobilityId": "3ea9e28b1ee75e4a", "scanner": "scanner-primary", "fingerprint": "d4c66234c8013276", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e0a3c1f60d3653dc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useActivityLogs.ts:31"}, "properties": {"repobilityId": "7b93db1b48e826d2", "scanner": "scanner-primary", "fingerprint": "e0a3c1f60d3653dc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a97a373b65d72a52", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useExamProblems.ts:379"}, "properties": {"repobilityId": "97fd78c6304fc7a9", "scanner": "scanner-primary", "fingerprint": "a97a373b65d72a52", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dca4d2a189c148f6", "level": "warning", "message": {"text": "Dockerfile runs as root: yolo-server/Dockerfile"}, "properties": {"repobilityId": "c1d511f96ea7616c", "scanner": "scanner-primary", "fingerprint": "dca4d2a189c148f6", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-89ebfa5d0d2d2c51", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "properties": {"repobilityId": "45a8f93e1d4bb921", "scanner": "scanner-primary", "fingerprint": "89ebfa5d0d2d2c51", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "yolo-server/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d1a23de9e5166113", "level": "warning", "message": {"text": "Dockerfile runs as root: image-pipeline/Dockerfile"}, "properties": {"repobilityId": "0dbe4283772a24c9", "scanner": "scanner-primary", "fingerprint": "d1a23de9e5166113", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-6adda056d06265e6", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "properties": {"repobilityId": "a0e7478c338e878b", "scanner": "scanner-primary", "fingerprint": "6adda056d06265e6", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "image-pipeline/Dockerfile"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-e284e6c58e4d105e", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/_shared/cors.ts:6"}, "properties": {"repobilityId": "7c8e268f4e944077", "scanner": "scanner-primary", "fingerprint": "e284e6c58e4d105e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/_shared/cors.ts"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-7f12204cadcb8516", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/shared/InlineDesmosGraph.tsx:421"}, "properties": {"repobilityId": "97a77e0340f1cece", "scanner": "scanner-primary", "fingerprint": "7f12204cadcb8516", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/shared/InlineDesmosGraph.tsx"}, "region": {"startLine": 421}}}]}, {"ruleId": "scanner-b4a48f4fb14a8f38", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/shared/MixedContentRenderer.tsx:36"}, "properties": {"repobilityId": "566c5723dfa8799c", "scanner": "scanner-primary", "fingerprint": "b4a48f4fb14a8f38", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/shared/MixedContentRenderer.tsx"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-7e69a8aff35089ad", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/shared/FigureRenderer.tsx:258"}, "properties": {"repobilityId": "ef26f03b9a76818e", "scanner": "scanner-primary", "fingerprint": "7e69a8aff35089ad", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/shared/FigureRenderer.tsx"}, "region": {"startLine": 258}}}]}, {"ruleId": "scanner-562d8c97fab92b19", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/shared/MathRenderer.tsx:115"}, "properties": {"repobilityId": "56f89263331a1f4d", "scanner": "scanner-primary", "fingerprint": "562d8c97fab92b19", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/shared/MathRenderer.tsx"}, "region": {"startLine": 115}}}]}, {"ruleId": "scanner-6de4190893facbc2", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/editor/LaTeXInputModal.tsx:144"}, "properties": {"repobilityId": "0709dfa62cd920cb", "scanner": "scanner-primary", "fingerprint": "6de4190893facbc2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/editor/LaTeXInputModal.tsx"}, "region": {"startLine": 144}}}]}, {"ruleId": "scanner-c112a4ed51268b42", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/editor/modals/MathSymbolPicker.tsx:281"}, "properties": {"repobilityId": "c18478980fb27097", "scanner": "scanner-primary", "fingerprint": "c112a4ed51268b42", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/editor/modals/MathSymbolPicker.tsx"}, "region": {"startLine": 281}}}]}, {"ruleId": "scanner-cb661ee9e5b4c4a8", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/print/session/[sessionId]/page.tsx:387"}, "properties": {"repobilityId": "bf3ed832fa8697a1", "scanner": "scanner-primary", "fingerprint": "cb661ee9e5b4c4a8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/print/session/[sessionId]/page.tsx"}, "region": {"startLine": 387}}}]}, {"ruleId": "scanner-a1ed4d9ae81d64c8", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in src/app/api/export/hwpx/route.ts:8"}, "properties": {"repobilityId": "49615fb0434d43d0", "scanner": "scanner-primary", "fingerprint": "a1ed4d9ae81d64c8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/export/hwpx/route.ts"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-ef7615433e1a2077", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/dashboard/exam-management/page.tsx:1757"}, "properties": {"repobilityId": "c9d6da29cb2cdced", "scanner": "scanner-primary", "fingerprint": "ef7615433e1a2077", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/dashboard/exam-management/page.tsx"}, "region": {"startLine": 1757}}}]}, {"ruleId": "scanner-06ecaf99f0f34258", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/lib/vision/figure-renderer.ts:705"}, "properties": {"repobilityId": "f8b4066f8b94ae25", "scanner": "scanner-primary", "fingerprint": "06ecaf99f0f34258", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/vision/figure-renderer.ts"}, "region": {"startLine": 705}}}]}, {"ruleId": "scanner-62f63c7196600e5d", "level": "error", "message": {"text": "Insecure pattern 'exec_used' in src/lib/workflow/hwp-converter.ts:69"}, "properties": {"repobilityId": "f2454dfc7a18c1c0", "scanner": "scanner-primary", "fingerprint": "62f63c7196600e5d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "exec_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/workflow/hwp-converter.ts"}, "region": {"startLine": 69}}}]}, {"ruleId": "scanner-175481056046a12c", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in src/lib/workflow/hwp-converter.ts:6"}, "properties": {"repobilityId": "8448d256007c40ba", "scanner": "scanner-primary", "fingerprint": "175481056046a12c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/workflow/hwp-converter.ts"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-68bf8a84dfda1ec1", "level": "note", "message": {"text": "Very large file: scripts/expansion-data-es.ts (1094 lines)"}, "properties": {"repobilityId": "ef820f248123e194", "scanner": "scanner-primary", "fingerprint": "68bf8a84dfda1ec1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-065351e32415afcc", "level": "note", "message": {"text": "Very large file: image-pipeline/server.py (1789 lines)"}, "properties": {"repobilityId": "a3fe2ecba193831c", "scanner": "scanner-primary", "fingerprint": "065351e32415afcc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1ca402a0e8b1c848", "level": "note", "message": {"text": "Very large file: src/components/shared/MixedContentRenderer.tsx (1564 lines)"}, "properties": {"repobilityId": "172d81834872329c", "scanner": "scanner-primary", "fingerprint": "1ca402a0e8b1c848", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-93ea91ba47077b49", "level": "note", "message": {"text": "Very large file: src/components/workflow/AnalyzeProblemEditModal.tsx (1713 lines)"}, "properties": {"repobilityId": "a88a0790fbb9effc", "scanner": "scanner-primary", "fingerprint": "93ea91ba47077b49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a226c8c55416ecdc", "level": "note", "message": {"text": "Very large file: src/components/workflow/CloudFlowUploader.tsx (1514 lines)"}, "properties": {"repobilityId": "b4509d8b14974a98", "scanner": "scanner-primary", "fingerprint": "a226c8c55416ecdc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c404a5afcf59c40b", "level": "note", "message": {"text": "Very large file: src/components/papers/ProblemEditModal.tsx (1551 lines)"}, "properties": {"repobilityId": "25f624ebc8b4212e", "scanner": "scanner-primary", "fingerprint": "c404a5afcf59c40b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-61364ca2d8551637", "level": "note", "message": {"text": "Very large file: src/app/api/workflow/upload/route.ts (3173 lines)"}, "properties": {"repobilityId": "560c30f4a3281921", "scanner": "scanner-primary", "fingerprint": "61364ca2d8551637", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6d582227ffcfef74", "level": "note", "message": {"text": "Very large file: src/app/api/workflow/reanalyze-crop/route.ts (1228 lines)"}, "properties": {"repobilityId": "9b714d781924186b", "scanner": "scanner-primary", "fingerprint": "6d582227ffcfef74", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1168be87e80995f3", "level": "note", "message": {"text": "Very large file: src/app/api/problems/[problemId]/generate-solution/route.ts (1334 lines)"}, "properties": {"repobilityId": "7a3a9c0de9e34284", "scanner": "scanner-primary", "fingerprint": "1168be87e80995f3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a24e9ae518c64a15", "level": "note", "message": {"text": "Very large file: src/app/dashboard/exam-create/page.tsx (2163 lines)"}, "properties": {"repobilityId": "34a3ed5feb32a92d", "scanner": "scanner-primary", "fingerprint": "a24e9ae518c64a15", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5b0934506a005203", "level": "note", "message": {"text": "Very large file: src/app/dashboard/cloud/CloudListClient.tsx (2665 lines)"}, "properties": {"repobilityId": "1635b1b89108f16a", "scanner": "scanner-primary", "fingerprint": "5b0934506a005203", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e457a4ee6c194641", "level": "note", "message": {"text": "Very large file: src/app/dashboard/cloud/[examId]/page.tsx (4739 lines)"}, "properties": {"repobilityId": "da68d9c939f91f73", "scanner": "scanner-primary", "fingerprint": "e457a4ee6c194641", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ba1dff4b532de766", "level": "note", "message": {"text": "Very large file: src/app/dashboard/workflow/analyze/[jobId]/page.tsx (5631 lines)"}, "properties": {"repobilityId": "005e0b31fdf6dd58", "scanner": "scanner-primary", "fingerprint": "ba1dff4b532de766", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-28a0230a31e849ca", "level": "note", "message": {"text": "Very large file: src/app/dashboard/create/page.tsx (1631 lines)"}, "properties": {"repobilityId": "a905a1b5782cc9b2", "scanner": "scanner-primary", "fingerprint": "28a0230a31e849ca", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-54fe1bf85934a8cc", "level": "note", "message": {"text": "Very large file: src/app/dashboard/exam-management/page.tsx (1952 lines)"}, "properties": {"repobilityId": "688e13222a7ed9bf", "scanner": "scanner-primary", "fingerprint": "54fe1bf85934a8cc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-58558dfa34930f45", "level": "note", "message": {"text": "Very large file: src/app/dashboard/skills/page.tsx (1148 lines)"}, "properties": {"repobilityId": "4f3c9b9fb9a7e455", "scanner": "scanner-primary", "fingerprint": "58558dfa34930f45", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e1b49aadebc60cb6", "level": "note", "message": {"text": "Very large file: src/app/dashboard/exam-analysis/[examId]/students/[studentId]/page.tsx (1656 lines)"}, "properties": {"repobilityId": "a6a22266429455e5", "scanner": "scanner-primary", "fingerprint": "e1b49aadebc60cb6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-71e86ae512884153", "level": "note", "message": {"text": "Very large file: src/app/tutor/students/page.tsx (1601 lines)"}, "properties": {"repobilityId": "a45eee6ad40b30cd", "scanner": "scanner-primary", "fingerprint": "71e86ae512884153", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1855997ad0e85d9e", "level": "note", "message": {"text": "Very large file: src/app/share/aggregate/ShareAggregateClient.tsx (1225 lines)"}, "properties": {"repobilityId": "60375eb3e855dec8", "scanner": "scanner-primary", "fingerprint": "1855997ad0e85d9e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3beebd5d781cefc3", "level": "note", "message": {"text": "Very large file: src/lib/vision/image-interpreter.ts (2280 lines)"}, "properties": {"repobilityId": "64478308988bb876", "scanner": "scanner-primary", "fingerprint": "3beebd5d781cefc3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-011b27828f602ddf", "level": "note", "message": {"text": "Very large file: src/lib/vision/figure-renderer.ts (1489 lines)"}, "properties": {"repobilityId": "1a67ec4d23c7d611", "scanner": "scanner-primary", "fingerprint": "011b27828f602ddf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-71df577b8a4b26d2", "level": "note", "message": {"text": "Very large file: src/lib/workflow/cloud-flow.ts (2514 lines)"}, "properties": {"repobilityId": "81ed729810bf3856", "scanner": "scanner-primary", "fingerprint": "71df577b8a4b26d2", "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": "c085c13962d8b75b", "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": "d7a954606bb69d40", "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": "9fae8b42e083e84f", "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": "86384228c1de97c4", "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": "7751ee4388b48919", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "7e63fb0a41df8a08", "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": "a590bc527ce0e808", "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": "3c4da2d1f0b5c278", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-e06cd9972d1b0bc6", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 \uacfc\ud559\ubaa8\ub4c8\ud1b5\ud569\ud3f4\ub354/science_diagram_pipeline.py:151"}, "properties": {"repobilityId": "25aba7ee4f0a970c", "scanner": "scanner-primary", "fingerprint": "e06cd9972d1b0bc6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c899d4d6445c4a9e", "level": "note", "message": {"text": "Legacy-named symbol `seed_expanded_types_v2` in scripts/build-seed-sql.ts:163"}, "properties": {"repobilityId": "fb7a189958508693", "scanner": "scanner-primary", "fingerprint": "c899d4d6445c4a9e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-68da8a89de5902e3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/reclassify-science.js:108"}, "properties": {"repobilityId": "d56e4890f55e1175", "scanner": "scanner-primary", "fingerprint": "68da8a89de5902e3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d36b8345133c0682", "level": "note", "message": {"text": "Legacy-named symbol `seed_expanded_types_v2` in scripts/generate-expanded-types.ts:302"}, "properties": {"repobilityId": "bce4f75deb8d474b", "scanner": "scanner-primary", "fingerprint": "d36b8345133c0682", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-699ab8cacd64e1bf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-glm-classify.ts:80"}, "properties": {"repobilityId": "e60084b33f552e29", "scanner": "scanner-primary", "fingerprint": "699ab8cacd64e1bf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8a8edc9c9ba5a55d", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/export-obsidian-students.ts:4"}, "properties": {"repobilityId": "9d4d9c701b316c67", "scanner": "scanner-primary", "fingerprint": "8a8edc9c9ba5a55d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8da99966f3d35d62", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-glm-detect.ts:56"}, "properties": {"repobilityId": "f817d2b0740d0090", "scanner": "scanner-primary", "fingerprint": "8da99966f3d35d62", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9f964cf46650c60e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/fix-p17.js:20"}, "properties": {"repobilityId": "4319165453759bd0", "scanner": "scanner-primary", "fingerprint": "9f964cf46650c60e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3cd0ae91dfab3e10", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-two-stage-classify.ts:50"}, "properties": {"repobilityId": "9d2c1b157518fcea", "scanner": "scanner-primary", "fingerprint": "3cd0ae91dfab3e10", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3cf55425b3f09fc2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-glm-graph.ts:103"}, "properties": {"repobilityId": "7d83eef99d0f3f8a", "scanner": "scanner-primary", "fingerprint": "3cf55425b3f09fc2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5f79a53bf8924e1a", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/expansion-data-hs2-cal-prb-geo.ts:23"}, "properties": {"repobilityId": "cee542411ea7cd63", "scanner": "scanner-primary", "fingerprint": "5f79a53bf8924e1a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a663e014c9426ef9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-glm-graph-full.ts:92"}, "properties": {"repobilityId": "77dff0a97b5faaa1", "scanner": "scanner-primary", "fingerprint": "a663e014c9426ef9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-567cb40af6fa0c08", "level": "none", "message": {"text": "Commented-code block (5 lines) in image-pipeline/server.py:416"}, "properties": {"repobilityId": "d801e0b03d91a8b8", "scanner": "scanner-primary", "fingerprint": "567cb40af6fa0c08", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bc10c0f7a9ed2828", "level": "none", "message": {"text": "Commented-code block (7 lines) in supabase/functions/ai-twin-problem/index.ts:1"}, "properties": {"repobilityId": "0497299b951e3173", "scanner": "scanner-primary", "fingerprint": "bc10c0f7a9ed2828", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-90a63bc50b4eadd7", "level": "none", "message": {"text": "Commented-code block (7 lines) in supabase/functions/ai-auto-tag/index.ts:1"}, "properties": {"repobilityId": "90e4a12bc2904514", "scanner": "scanner-primary", "fingerprint": "90a63bc50b4eadd7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3aad42679b26d161", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/_shared/openai.ts:40"}, "properties": {"repobilityId": "a84b44113ec45e4c", "scanner": "scanner-primary", "fingerprint": "3aad42679b26d161", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-783a30a16ba7b61d", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/middleware.ts:1"}, "properties": {"repobilityId": "f046d5ca88b30538", "scanner": "scanner-primary", "fingerprint": "783a30a16ba7b61d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6fc74fa14617bfa8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/config/navigation.ts:159"}, "properties": {"repobilityId": "d71355c423a9b3b5", "scanner": "scanner-primary", "fingerprint": "6fc74fa14617bfa8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3e0d26bccf7e4af2", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/layout/TopNav.tsx:412"}, "properties": {"repobilityId": "463f15c50d810d21", "scanner": "scanner-primary", "fingerprint": "3e0d26bccf7e4af2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ab801d9414c1fb87", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/brand/Logo.tsx:6"}, "properties": {"repobilityId": "8559b8e36c7d002b", "scanner": "scanner-primary", "fingerprint": "ab801d9414c1fb87", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-91d703b788f675a3", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/exam-report/StudentExamReportDark.tsx:3"}, "properties": {"repobilityId": "f03f821db3db525c", "scanner": "scanner-primary", "fingerprint": "91d703b788f675a3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e0876792d0c519a1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/exam/AnswerMatchModal.tsx:288"}, "properties": {"repobilityId": "f20e0476d9403f48", "scanner": "scanner-primary", "fingerprint": "e0876792d0c519a1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6c7c7d754d95968c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/exam/EditableExamHeader.tsx:3"}, "properties": {"repobilityId": "f2d967cc0810c1f9", "scanner": "scanner-primary", "fingerprint": "6c7c7d754d95968c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9dac1914632e1d02", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/exam/DeployExamModal.tsx:3"}, "properties": {"repobilityId": "b0f2b56f8e75fe68", "scanner": "scanner-primary", "fingerprint": "9dac1914632e1d02", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2aa8c7814f0b7ba1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/shared/MixedContentRenderer.tsx:81"}, "properties": {"repobilityId": "40571ab6a27132e4", "scanner": "scanner-primary", "fingerprint": "2aa8c7814f0b7ba1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-432d4922d55ba7c5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/shared/FigureRenderer.tsx:202"}, "properties": {"repobilityId": "be2ee21a10d966ba", "scanner": "scanner-primary", "fingerprint": "432d4922d55ba7c5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-486329d81b8ea19b", "level": "none", "message": {"text": "Commented-code block (11 lines) in src/components/shared/MathRenderer.tsx:21"}, "properties": {"repobilityId": "d21cdb88da3edbf5", "scanner": "scanner-primary", "fingerprint": "486329d81b8ea19b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1aa33b6e85c0c502", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/shared/ExamProblemRenderer.tsx:321"}, "properties": {"repobilityId": "ee2e77b98bb3fa09", "scanner": "scanner-primary", "fingerprint": "1aa33b6e85c0c502", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e7ea64f7b3b4061", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/students/StudentDetailContent.tsx:3"}, "properties": {"repobilityId": "c624ca83677b8938", "scanner": "scanner-primary", "fingerprint": "8e7ea64f7b3b4061", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-38d0413bd62fe90a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/students/StudentDetailContent.tsx:180"}, "properties": {"repobilityId": "bfb3f33ff95c8638", "scanner": "scanner-primary", "fingerprint": "38d0413bd62fe90a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c93f502f8511d3a3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/students/StudentDetailModal.tsx:3"}, "properties": {"repobilityId": "8781d68d8705048e", "scanner": "scanner-primary", "fingerprint": "c93f502f8511d3a3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2f0167b671b13537", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/workflow/AnalyzeProblemEditModal.tsx:1126"}, "properties": {"repobilityId": "af44339884032179", "scanner": "scanner-primary", "fingerprint": "2f0167b671b13537", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-787d7ada7e4ef95c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/workflow/CloudFlowUploader.tsx:212"}, "properties": {"repobilityId": "9a1a46456182db81", "scanner": "scanner-primary", "fingerprint": "787d7ada7e4ef95c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3f82fc963146770d", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/class/StudentTreePanel.tsx:3"}, "properties": {"repobilityId": "534bcc97bdb5de89", "scanner": "scanner-primary", "fingerprint": "3f82fc963146770d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b59ef91e6434eb8b", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/class/StudentLearningReport.tsx:3"}, "properties": {"repobilityId": "318a55b525b6cc13", "scanner": "scanner-primary", "fingerprint": "b59ef91e6434eb8b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-716e9fee7503561e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/diagnostics/report-primitives.tsx:3"}, "properties": {"repobilityId": "5eacdaea692fa34e", "scanner": "scanner-primary", "fingerprint": "716e9fee7503561e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-62803f4b2aef9868", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/diagnostics/ComprehensiveReportView.tsx:3"}, "properties": {"repobilityId": "8f532eacfb7e752b", "scanner": "scanner-primary", "fingerprint": "62803f4b2aef9868", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-df48a197fe63d82f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/editor/modals/GraphModal.tsx:3"}, "properties": {"repobilityId": "b0a7b0670d9cde3f", "scanner": "scanner-primary", "fingerprint": "df48a197fe63d82f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b2d8366b70250343", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/track/TrackLink.tsx:3"}, "properties": {"repobilityId": "73b36ddebbc4030b", "scanner": "scanner-primary", "fingerprint": "b2d8366b70250343", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-df3476bf7c9cb1a6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/papers/AddProblemsModal.tsx:72"}, "properties": {"repobilityId": "8c2c6ba11c62b2da", "scanner": "scanner-primary", "fingerprint": "df3476bf7c9cb1a6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-67f89d3363d84753", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/papers/ProblemEditModal.tsx:483"}, "properties": {"repobilityId": "2d270b1d81f9f4c0", "scanner": "scanner-primary", "fingerprint": "67f89d3363d84753", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-efe68c7aa5b11db1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/papers/ProblemEditModal.tsx:866"}, "properties": {"repobilityId": "a66285ead8ea408a", "scanner": "scanner-primary", "fingerprint": "efe68c7aa5b11db1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-33ab7481e0576b0b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/papers/MathsecrTreePicker.tsx:11"}, "properties": {"repobilityId": "46f1dbca42b3c741", "scanner": "scanner-primary", "fingerprint": "33ab7481e0576b0b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a2cf25477ece7f97", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/papers/MathsecrTreePicker.tsx:66"}, "properties": {"repobilityId": "89b6e1c9edb70889", "scanner": "scanner-primary", "fingerprint": "a2cf25477ece7f97", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-12693c484c6f37a9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/papers/DiagramBrowserModal.tsx:126"}, "properties": {"repobilityId": "506576f2e4605d6a", "scanner": "scanner-primary", "fingerprint": "12693c484c6f37a9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e7b4f617511857ea", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/grading/GradingSheetUpload.tsx:6"}, "properties": {"repobilityId": "9b976f079a78bf6e", "scanner": "scanner-primary", "fingerprint": "e7b4f617511857ea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7847c5713d30d74d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/grading/GradingSheetUpload.tsx:126"}, "properties": {"repobilityId": "3251b135dfeb81b4", "scanner": "scanner-primary", "fingerprint": "7847c5713d30d74d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3d92c7e550093aa0", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/answer/[session_id]/page.tsx:3"}, "properties": {"repobilityId": "3ad58aff3fdf38fe", "scanner": "scanner-primary", "fingerprint": "3d92c7e550093aa0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7fe0b4e8c74ee61b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/answer/[session_id]/page.tsx:158"}, "properties": {"repobilityId": "464766b8488e9c87", "scanner": "scanner-primary", "fingerprint": "7fe0b4e8c74ee61b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3a145c8f05266a49", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/student/exams/page.tsx:17"}, "properties": {"repobilityId": "af2bf751da4d2973", "scanner": "scanner-primary", "fingerprint": "3a145c8f05266a49", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-57b1fa986b9056bd", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/student/sessions/[id]/page.tsx:3"}, "properties": {"repobilityId": "16e089a18a5ed2ec", "scanner": "scanner-primary", "fingerprint": "57b1fa986b9056bd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c3b7f171ff57ec0e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/auth/signup/page.tsx:70"}, "properties": {"repobilityId": "211cabe09033163e", "scanner": "scanner-primary", "fingerprint": "c3b7f171ff57ec0e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6a62f2fe9fbb7f59", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/print/session/[sessionId]/page.tsx:3"}, "properties": {"repobilityId": "6318e3cf2d9f39b9", "scanner": "scanner-primary", "fingerprint": "6a62f2fe9fbb7f59", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ed33d12abb2469d8", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/users/students/route.ts:5"}, "properties": {"repobilityId": "2c2886cf4195bcbd", "scanner": "scanner-primary", "fingerprint": "ed33d12abb2469d8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-95396776ac545c01", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/users/me/track/route.ts:7"}, "properties": {"repobilityId": "c741c7296f53addd", "scanner": "scanner-primary", "fingerprint": "95396776ac545c01", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0a9247bf5dc72d09", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/exams/route.ts:53"}, "properties": {"repobilityId": "2e19c3616310b827", "scanner": "scanner-primary", "fingerprint": "0a9247bf5dc72d09", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5eea068e2d74e82e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/exams/generate/route.ts:1"}, "properties": {"repobilityId": "f0cf3e896481b9cd", "scanner": "scanner-primary", "fingerprint": "5eea068e2d74e82e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-82007e1fec1f6031", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/exams/[examId]/route.ts:1"}, "properties": {"repobilityId": "bb0ba4a8ca7812d0", "scanner": "scanner-primary", "fingerprint": "82007e1fec1f6031", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f82811d4f54bbbfb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/exams/[examId]/upload/route.ts:53"}, "properties": {"repobilityId": "ec6c70230293487a", "scanner": "scanner-primary", "fingerprint": "f82811d4f54bbbfb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-43adc86d3ff9e1fb", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/exams/[examId]/print/route.ts:7"}, "properties": {"repobilityId": "af1bb3cc5b15e875", "scanner": "scanner-primary", "fingerprint": "43adc86d3ff9e1fb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-87869832c0e47c1e", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/exams/[examId]/ai-analysis/route.ts:225"}, "properties": {"repobilityId": "cbd1e2133a08e42c", "scanner": "scanner-primary", "fingerprint": "87869832c0e47c1e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-81f3377e4cf4c759", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/exams/[examId]/ai-analysis/route.ts:146"}, "properties": {"repobilityId": "237a6a18053f65c5", "scanner": "scanner-primary", "fingerprint": "81f3377e4cf4c759", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1886fbb71acebfb4", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/exams/[examId]/students/route.ts:81"}, "properties": {"repobilityId": "540d7e6e8d28c1a6", "scanner": "scanner-primary", "fingerprint": "1886fbb71acebfb4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-994d7433c4bcad18", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/exams/[examId]/students/[studentId]/report/route.ts:7"}, "properties": {"repobilityId": "5ff5cd539aa6b18d", "scanner": "scanner-primary", "fingerprint": "994d7433c4bcad18", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4b0be0be9fda591c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/exams/[examId]/students/[studentId]/report/ai-comment/route.ts:234"}, "properties": {"repobilityId": "87826d1036c0fd70", "scanner": "scanner-primary", "fingerprint": "4b0be0be9fda591c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e2e4f73d7a54cb45", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/exams/[examId]/students/[studentId]/report/ai-comment/route.ts:161"}, "properties": {"repobilityId": "d9ecf794aba7ae02", "scanner": "scanner-primary", "fingerprint": "e2e4f73d7a54cb45", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-878e08ac0460841a", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/exams/[examId]/students/[studentId]/share/route.ts:8"}, "properties": {"repobilityId": "906520c77b301a4a", "scanner": "scanner-primary", "fingerprint": "878e08ac0460841a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e35ad64228eff7dd", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/exams/[examId]/match-answers/route.ts:340"}, "properties": {"repobilityId": "a99fc53a273d0271", "scanner": "scanner-primary", "fingerprint": "e35ad64228eff7dd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2353ab502e83cc80", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/exams/[examId]/match-answers/route.ts:516"}, "properties": {"repobilityId": "d5bd0a36282bfb78", "scanner": "scanner-primary", "fingerprint": "2353ab502e83cc80", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-741ce411f9af5546", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/exams/[examId]/auto-fix/route.ts:564"}, "properties": {"repobilityId": "b660df146b6dba7b", "scanner": "scanner-primary", "fingerprint": "741ce411f9af5546", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-456c16d270865798", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/app/api/exams/[examId]/student-responses/route.ts:6"}, "properties": {"repobilityId": "e14e41b1dda07c33", "scanner": "scanner-primary", "fingerprint": "456c16d270865798", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cff2e94e704724f8", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/exams/[examId]/share/route.ts:1"}, "properties": {"repobilityId": "c3c0f36bef472576", "scanner": "scanner-primary", "fingerprint": "cff2e94e704724f8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ac923ab7d444e0d3", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/exams/[examId]/distribute-points/route.ts:1"}, "properties": {"repobilityId": "aad775392d2efc0f", "scanner": "scanner-primary", "fingerprint": "ac923ab7d444e0d3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7f12e0ce4dc8edf8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/exams/[examId]/problems/route.ts:82"}, "properties": {"repobilityId": "eb286337b7ec037f", "scanner": "scanner-primary", "fingerprint": "7f12e0ce4dc8edf8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f579a164cfebc24d", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/app/api/exams/[examId]/breakdown/route.ts:10"}, "properties": {"repobilityId": "ee12297265be3673", "scanner": "scanner-primary", "fingerprint": "f579a164cfebc24d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4e73d8efe999aadc", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/exams/[examId]/batch-solutions/route.ts:32"}, "properties": {"repobilityId": "b6af34e5845afc15", "scanner": "scanner-primary", "fingerprint": "4e73d8efe999aadc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a7cc6e37182d7744", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/exams/[examId]/reorder/route.ts:1"}, "properties": {"repobilityId": "2783ee315e3d661c", "scanner": "scanner-primary", "fingerprint": "a7cc6e37182d7744", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cca75f301a8cf244", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/app/api/exams/available-counts/route.ts:1"}, "properties": {"repobilityId": "7f59676e4b95e7f0", "scanner": "scanner-primary", "fingerprint": "cca75f301a8cf244", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7309c15dc20fa4cb", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/dashboard/stats/route.ts:1"}, "properties": {"repobilityId": "59f9e31c935bff00", "scanner": "scanner-primary", "fingerprint": "7309c15dc20fa4cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7e1b7e0ec3b75c3f", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/organization-applications/[id]/route.ts:5"}, "properties": {"repobilityId": "b067a989a20f88f4", "scanner": "scanner-primary", "fingerprint": "7e1b7e0ec3b75c3f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-91eb5ce26736b26a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/sessions/route.ts:8"}, "properties": {"repobilityId": "e29e1b0df89814ff", "scanner": "scanner-primary", "fingerprint": "91eb5ce26736b26a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c42742cc7dd064a7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/sessions/[id]/grading-sheet/route.ts:4"}, "properties": {"repobilityId": "b5081eeec5ec008a", "scanner": "scanner-primary", "fingerprint": "c42742cc7dd064a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-26e999a473792b55", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/sessions/[id]/complete/route.ts:1"}, "properties": {"repobilityId": "4f059c778b01b9bc", "scanner": "scanner-primary", "fingerprint": "26e999a473792b55", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2bb49d70c29d23c9", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/sessions/[id]/print-meta/route.ts:1"}, "properties": {"repobilityId": "26194047877020ef", "scanner": "scanner-primary", "fingerprint": "2bb49d70c29d23c9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c719aa506afe4d4f", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/grades/roster/route.ts:5"}, "properties": {"repobilityId": "1e5e0520ac674f88", "scanner": "scanner-primary", "fingerprint": "c719aa506afe4d4f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1856b1d51c3375c4", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/students/route.ts:1"}, "properties": {"repobilityId": "bd1eb28971360a20", "scanner": "scanner-primary", "fingerprint": "1856b1d51c3375c4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0fbe868a361026d6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/students/[studentId]/route.ts:11"}, "properties": {"repobilityId": "6e33bec14809a964", "scanner": "scanner-primary", "fingerprint": "0fbe868a361026d6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ea61b6be19c8d1cb", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/students/[studentId]/school-exam-scores/route.ts:88"}, "properties": {"repobilityId": "a547a504adb00c8d", "scanner": "scanner-primary", "fingerprint": "ea61b6be19c8d1cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c8afe77b1cc333cd", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/students/[studentId]/recommended-problems/route.ts:4"}, "properties": {"repobilityId": "23fcd0f1ecea03a1", "scanner": "scanner-primary", "fingerprint": "c8afe77b1cc333cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5c4fbfd8bcdfffd8", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/students/[studentId]/exam-scores/route.ts:78"}, "properties": {"repobilityId": "5fa1194ea454a2b0", "scanner": "scanner-primary", "fingerprint": "5c4fbfd8bcdfffd8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-af64aba63fb55131", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/students/me/sessions/route.ts:6"}, "properties": {"repobilityId": "0760d9661bea9182", "scanner": "scanner-primary", "fingerprint": "af64aba63fb55131", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9b98b892bb550849", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/classes/route.ts:4"}, "properties": {"repobilityId": "0a37f46037beccd1", "scanner": "scanner-primary", "fingerprint": "9b98b892bb550849", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1d15f757941225a8", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/classes/[classId]/route.ts:4"}, "properties": {"repobilityId": "4ce7621bf76a52cb", "scanner": "scanner-primary", "fingerprint": "1d15f757941225a8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8847814dd8be6121", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/classes/[classId]/students/route.ts:1"}, "properties": {"repobilityId": "cf4ccd7f97c5dca2", "scanner": "scanner-primary", "fingerprint": "8847814dd8be6121", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-103002909c02787a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/classes/[classId]/enrollments/route.ts:4"}, "properties": {"repobilityId": "5dcfae3aedb334f8", "scanner": "scanner-primary", "fingerprint": "103002909c02787a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-429ee10d5af5434a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/assignments/route.ts:1"}, "properties": {"repobilityId": "5d1585b57104e166", "scanner": "scanner-primary", "fingerprint": "429ee10d5af5434a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bbbeb9d94935c38a", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/corrections/summary/route.ts:4"}, "properties": {"repobilityId": "7958e47be8586fdc", "scanner": "scanner-primary", "fingerprint": "bbbeb9d94935c38a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-14c26f19a65fead2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/admin/users/backfill-names/route.ts:9"}, "properties": {"repobilityId": "b36ab87cd92df700", "scanner": "scanner-primary", "fingerprint": "14c26f19a65fead2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-25eb36c25f7876ec", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/admin/tenancy/organizations/route.ts:1"}, "properties": {"repobilityId": "061339f84366e76e", "scanner": "scanner-primary", "fingerprint": "25eb36c25f7876ec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2fce8c4a59249c94", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/admin/tenancy/institutes/route.ts:1"}, "properties": {"repobilityId": "a567deba6cfcc6ba", "scanner": "scanner-primary", "fingerprint": "2fce8c4a59249c94", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0916b725f706ef11", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/admin/reocr-points/route.ts:1"}, "properties": {"repobilityId": "e3e9a9a0b25a7c3f", "scanner": "scanner-primary", "fingerprint": "0916b725f706ef11", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1c81c5b522e11c1a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/admin/restore-all-points/route.ts:1"}, "properties": {"repobilityId": "ce28bd8acb6f42ff", "scanner": "scanner-primary", "fingerprint": "1c81c5b522e11c1a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6b802e3546f4b01c", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/admin/objective-answer-fix/route.ts:1"}, "properties": {"repobilityId": "20d83bdca24fc2a3", "scanner": "scanner-primary", "fingerprint": "6b802e3546f4b01c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e2d03ce9a4720279", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/msb/students/route.ts:5"}, "properties": {"repobilityId": "0f5db53d21a945e0", "scanner": "scanner-primary", "fingerprint": "e2d03ce9a4720279", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-56ce8ce12ad7f278", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/msb/students/[id]/diagnostics/route.ts:5"}, "properties": {"repobilityId": "18fc43ae7c1e2e08", "scanner": "scanner-primary", "fingerprint": "56ce8ce12ad7f278", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-928d94ea3d7d60de", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/workflow/yolo-export/route.ts:9"}, "properties": {"repobilityId": "9a791803588e81e4", "scanner": "scanner-primary", "fingerprint": "928d94ea3d7d60de", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-69603fc28baca48c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/workflow/detect-problems-yolo/route.ts:124"}, "properties": {"repobilityId": "42b4c21e2e540ab2", "scanner": "scanner-primary", "fingerprint": "69603fc28baca48c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7160d42e25f42155", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/workflow/upload/route.ts:27"}, "properties": {"repobilityId": "ab69443ca325028f", "scanner": "scanner-primary", "fingerprint": "7160d42e25f42155", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-770e7a50daea602d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/workflow/upload/route.ts:3069"}, "properties": {"repobilityId": "e896552dd1f48875", "scanner": "scanner-primary", "fingerprint": "770e7a50daea602d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e3256876ed0ab857", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/workflow/upload-science-perproblem/route.ts:7"}, "properties": {"repobilityId": "724d23edd52b0a84", "scanner": "scanner-primary", "fingerprint": "e3256876ed0ab857", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3ef42644d0217d20", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/workflow/upload-science-perproblem/route.ts:373"}, "properties": {"repobilityId": "546152720d7793a0", "scanner": "scanner-primary", "fingerprint": "3ef42644d0217d20", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8a02a8ae151e64bb", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/workflow/reanalyze-crop/route.ts:1"}, "properties": {"repobilityId": "9af43273f0d428f2", "scanner": "scanner-primary", "fingerprint": "8a02a8ae151e64bb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4ea639c9cbd0a4a1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/workflow/reanalyze-crop/route.ts:1117"}, "properties": {"repobilityId": "c4029bf059f42e46", "scanner": "scanner-primary", "fingerprint": "4ea639c9cbd0a4a1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a985498acfa7cba4", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/workflow/crop-figure/route.ts:7"}, "properties": {"repobilityId": "91d020c7286cb5ae", "scanner": "scanner-primary", "fingerprint": "a985498acfa7cba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5428425e474c95ff", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/workflow/crop-figure/route.ts:96"}, "properties": {"repobilityId": "be6b43c1f8a8ff54", "scanner": "scanner-primary", "fingerprint": "5428425e474c95ff", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a2f091c22a43cab7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/workflow/detect-figures-gpt/route.ts:1"}, "properties": {"repobilityId": "4aef32beb7744828", "scanner": "scanner-primary", "fingerprint": "a2f091c22a43cab7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-232e9f6a004f4a5a", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/workflow/twin/route.ts:231"}, "properties": {"repobilityId": "09b549b1e28e4355", "scanner": "scanner-primary", "fingerprint": "232e9f6a004f4a5a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a59c97506e4c92ca", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/session-results/route.ts:11"}, "properties": {"repobilityId": "d811e463d16fee0e", "scanner": "scanner-primary", "fingerprint": "a59c97506e4c92ca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f280eb2c71193001", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/session-results/from-student/route.ts:15"}, "properties": {"repobilityId": "918bf7a99184cfa7", "scanner": "scanner-primary", "fingerprint": "f280eb2c71193001", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-480b17de3a324877", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/organizations/[id]/public/route.ts:1"}, "properties": {"repobilityId": "ad1370f964ff5895", "scanner": "scanner-primary", "fingerprint": "480b17de3a324877", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6b70432cd71fefd8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/organizations/search/route.ts:6"}, "properties": {"repobilityId": "53bbbd21fa475a92", "scanner": "scanner-primary", "fingerprint": "6b70432cd71fefd8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3d9f44310e9ade6f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/image-pipeline/extract/route.ts:58"}, "properties": {"repobilityId": "8739c76714dd6eb7", "scanner": "scanner-primary", "fingerprint": "3d9f44310e9ade6f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aaf8faf45d8928d5", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/diagnostics/analytics/route.ts:5"}, "properties": {"repobilityId": "3f2fd09e0e4a7099", "scanner": "scanner-primary", "fingerprint": "aaf8faf45d8928d5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dc33155effdf6963", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/diagnostics/report-tokens/route.ts:1"}, "properties": {"repobilityId": "cc10344c5b598677", "scanner": "scanner-primary", "fingerprint": "dc33155effdf6963", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f1c24e761cae0364", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/diagnostics/report/issue/route.ts:1"}, "properties": {"repobilityId": "4ec39d7c818308dc", "scanner": "scanner-primary", "fingerprint": "f1c24e761cae0364", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f80b04973af4a5a7", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/me/change-password/route.ts:8"}, "properties": {"repobilityId": "ec5199b4d32d7c49", "scanner": "scanner-primary", "fingerprint": "f80b04973af4a5a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-39b16cd329b5d229", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/share/exam/[token]/route.ts:1"}, "properties": {"repobilityId": "a4af027b7eeb5e35", "scanner": "scanner-primary", "fingerprint": "39b16cd329b5d229", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3b55d99caea9ed42", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/share/student-report/[token]/route.ts:7"}, "properties": {"repobilityId": "3cbb1e933b53da60", "scanner": "scanner-primary", "fingerprint": "3b55d99caea9ed42", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-02870808db947bd5", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/share/diagnostic-report/[token]/route.ts:1"}, "properties": {"repobilityId": "e4f5d1517d1e4d4a", "scanner": "scanner-primary", "fingerprint": "02870808db947bd5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9ae144743c3dc3f7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/reports/by-school/route.ts:1"}, "properties": {"repobilityId": "04c191442aefdf44", "scanner": "scanner-primary", "fingerprint": "9ae144743c3dc3f7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-86ffae2812d75db9", "level": "none", "message": {"text": "Commented-code block (11 lines) in src/app/api/reports/aggregate/route.ts:5"}, "properties": {"repobilityId": "5bfb4dbd5f8f4836", "scanner": "scanner-primary", "fingerprint": "86ffae2812d75db9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4686557fbdf1c15f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/problems/[problemId]/route.ts:1"}, "properties": {"repobilityId": "c6f4e3eac9ce9756", "scanner": "scanner-primary", "fingerprint": "4686557fbdf1c15f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6e09b09889534aa4", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/problems/[problemId]/generate-solution/route.ts:1"}, "properties": {"repobilityId": "4aecbc2c2abdfb89", "scanner": "scanner-primary", "fingerprint": "6e09b09889534aa4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1a48be92e629e628", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/problems/[problemId]/generate-solution/route.ts:631"}, "properties": {"repobilityId": "5cadb006decf667a", "scanner": "scanner-primary", "fingerprint": "1a48be92e629e628", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d3f70fa405e1fe27", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/problems/[problemId]/generate-figure/route.ts:1"}, "properties": {"repobilityId": "1f72dfdfd65d5d7e", "scanner": "scanner-primary", "fingerprint": "d3f70fa405e1fe27", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2597a4630ba9d88c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/problems/[problemId]/generate-figure/route.ts:186"}, "properties": {"repobilityId": "cc83ac37c1a79bc2", "scanner": "scanner-primary", "fingerprint": "2597a4630ba9d88c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bd40009a5bdfcb1d", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/problems/[problemId]/reanalyze/route.ts:1"}, "properties": {"repobilityId": "bb3b72e7557b539c", "scanner": "scanner-primary", "fingerprint": "bd40009a5bdfcb1d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c97e56c0855dddfc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/problems/[problemId]/reanalyze/route.ts:531"}, "properties": {"repobilityId": "8c33df21121164ad", "scanner": "scanner-primary", "fingerprint": "c97e56c0855dddfc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0e2603a3048b1c82", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/export/hwpx/route.ts:1"}, "properties": {"repobilityId": "5c347ae2ecbc440c", "scanner": "scanner-primary", "fingerprint": "0e2603a3048b1c82", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-562bf56529955407", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/dashboard/exam-create/page.tsx:10"}, "properties": {"repobilityId": "57fa80ca7ed61b6b", "scanner": "scanner-primary", "fingerprint": "562bf56529955407", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7060b1e66f54dcab", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/dashboard/prescription/report/page.tsx:3"}, "properties": {"repobilityId": "1b85917f87fa5790", "scanner": "scanner-primary", "fingerprint": "7060b1e66f54dcab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-20e37a335890dd7e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/prescription/report/page.tsx:100"}, "properties": {"repobilityId": "4266e3812db40081", "scanner": "scanner-primary", "fingerprint": "20e37a335890dd7e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f86fbc505ced5a6a", "level": "note", "message": {"text": "Legacy-named symbol `pinOld` in src/app/dashboard/cloud/CloudListClient.tsx:944"}, "properties": {"repobilityId": "965adfaedd0a2574", "scanner": "scanner-primary", "fingerprint": "f86fbc505ced5a6a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d553076fa49f0cca", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/dashboard/cloud/CloudListClient.tsx:1261"}, "properties": {"repobilityId": "4b9cccace92fab44", "scanner": "scanner-primary", "fingerprint": "d553076fa49f0cca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cf452b9f77f9629c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/cloud/CloudListClient.tsx:1030"}, "properties": {"repobilityId": "f2d78a20eb28fb09", "scanner": "scanner-primary", "fingerprint": "cf452b9f77f9629c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bdd2e7129df8cd4a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/dashboard/cloud/[examId]/page.tsx:1178"}, "properties": {"repobilityId": "10bf158b9c435f99", "scanner": "scanner-primary", "fingerprint": "bdd2e7129df8cd4a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-df48971e7fd37c6a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/cloud/[examId]/page.tsx:958"}, "properties": {"repobilityId": "9fc5c74acfe7768f", "scanner": "scanner-primary", "fingerprint": "df48971e7fd37c6a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1de78cf14f62c586", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/dashboard/cloud/folder-import/page.tsx:6"}, "properties": {"repobilityId": "c7bdbab901ea5001", "scanner": "scanner-primary", "fingerprint": "1de78cf14f62c586", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-184ccc4ec16ca830", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/cloud/folder-import/page.tsx:88"}, "properties": {"repobilityId": "f4cd7b43c20d910c", "scanner": "scanner-primary", "fingerprint": "184ccc4ec16ca830", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6c8fcd69a0ea13dc", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/dashboard/assignments/page.tsx:3"}, "properties": {"repobilityId": "836f8714ad7555e6", "scanner": "scanner-primary", "fingerprint": "6c8fcd69a0ea13dc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4129667c5f2edd06", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3"}, "properties": {"repobilityId": "e68cf8c48b490b3f", "scanner": "scanner-primary", "fingerprint": "4129667c5f2edd06", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c5b71fb564372193", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3332"}, "properties": {"repobilityId": "2a862f93e413b7cc", "scanner": "scanner-primary", "fingerprint": "c5b71fb564372193", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-14856b203fdac47f", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/dashboard/class/page.tsx:3"}, "properties": {"repobilityId": "6ef26af60d2c49db", "scanner": "scanner-primary", "fingerprint": "14856b203fdac47f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c670c851f4154600", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/create/page.tsx:422"}, "properties": {"repobilityId": "21142db96306e675", "scanner": "scanner-primary", "fingerprint": "c670c851f4154600", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0578d04d6aefecaa", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/dashboard/problem-bank/page.tsx:3"}, "properties": {"repobilityId": "315f0474b4e0c11c", "scanner": "scanner-primary", "fingerprint": "0578d04d6aefecaa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-31fdc681c70dbd63", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/dashboard/account/page.tsx:3"}, "properties": {"repobilityId": "1af7c3460cf7c7fe", "scanner": "scanner-primary", "fingerprint": "31fdc681c70dbd63", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-75a8a9cb012c01be", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/materials/page.tsx:650"}, "properties": {"repobilityId": "78a19ccd7994f135", "scanner": "scanner-primary", "fingerprint": "75a8a9cb012c01be", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-89fecc067715d31c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/materials/diagrams/DiagramsClient.tsx:167"}, "properties": {"repobilityId": "0f6a715909e11eb7", "scanner": "scanner-primary", "fingerprint": "89fecc067715d31c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7cb8d8020fd41a12", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/reports/aggregate/page.tsx:156"}, "properties": {"repobilityId": "89198932ff86c9de", "scanner": "scanner-primary", "fingerprint": "7cb8d8020fd41a12", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cb923f4fb5ad1275", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/dashboard/exam-analysis/[examId]/StudentsTab.tsx:6"}, "properties": {"repobilityId": "fa2bc6b97428cd11", "scanner": "scanner-primary", "fingerprint": "cb923f4fb5ad1275", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eeb239bb052a52df", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/exam-analysis/[examId]/page.tsx:128"}, "properties": {"repobilityId": "7e9c7c16956ca979", "scanner": "scanner-primary", "fingerprint": "eeb239bb052a52df", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-91d65dd01ab4f7c5", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/dashboard/grading/page.tsx:6"}, "properties": {"repobilityId": "41aeddc97567dc7e", "scanner": "scanner-primary", "fingerprint": "91d65dd01ab4f7c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bd2d2df6cf4b5d81", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/tutor/students/page.tsx:146"}, "properties": {"repobilityId": "d4885a43dbb13536", "scanner": "scanner-primary", "fingerprint": "bd2d2df6cf4b5d81", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-07df2e54db7b30e3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/tutor/students/[studentId]/page.tsx:3"}, "properties": {"repobilityId": "59a557504dfa8c0b", "scanner": "scanner-primary", "fingerprint": "07df2e54db7b30e3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-62edda81757d57ad", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/tutor/classes/page.tsx:53"}, "properties": {"repobilityId": "bd1aa2fe04ee84e5", "scanner": "scanner-primary", "fingerprint": "62edda81757d57ad", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2016d719830d9252", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/tutor/classes/[id]/page.tsx:110"}, "properties": {"repobilityId": "009b57a0b1e51945", "scanner": "scanner-primary", "fingerprint": "2016d719830d9252", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-25ecc57760b4137e", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/tutor/classes/[id]/edit/page.tsx:3"}, "properties": {"repobilityId": "ee97d235b979252f", "scanner": "scanner-primary", "fingerprint": "25ecc57760b4137e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6ada00d30f667c6f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/admin/layout.tsx:8"}, "properties": {"repobilityId": "ffc9449ea0f270c1", "scanner": "scanner-primary", "fingerprint": "6ada00d30f667c6f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-028632c8693bb3ed", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/admin/answer-fix/page.tsx:3"}, "properties": {"repobilityId": "4ca28e042c4169d3", "scanner": "scanner-primary", "fingerprint": "028632c8693bb3ed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-41b576ab825729f6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/admin/staff/page.tsx:4"}, "properties": {"repobilityId": "aac879f95cb389eb", "scanner": "scanner-primary", "fingerprint": "41b576ab825729f6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9fbabc1bc1035c88", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/organization-applications/page.tsx:155"}, "properties": {"repobilityId": "6eed1b04bf73886e", "scanner": "scanner-primary", "fingerprint": "9fbabc1bc1035c88", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f5e11f5fe8e072e1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/admin/institutes/page.tsx:1"}, "properties": {"repobilityId": "8da9dea4f38b5833", "scanner": "scanner-primary", "fingerprint": "f5e11f5fe8e072e1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e146b7bb941b4227", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/admin/teachers/page.tsx:74"}, "properties": {"repobilityId": "79a25e436256b5f1", "scanner": "scanner-primary", "fingerprint": "e146b7bb941b4227", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-13d942df5915c827", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/(tracks)/[track]/dashboard/layout.tsx:3"}, "properties": {"repobilityId": "e163c810e3e908e3", "scanner": "scanner-primary", "fingerprint": "13d942df5915c827", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6c59f1570cf11df7", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/test-science/page.tsx:3"}, "properties": {"repobilityId": "897cc0674faa995f", "scanner": "scanner-primary", "fingerprint": "6c59f1570cf11df7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3f96ddf302734e69", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/select-track/page.tsx:10"}, "properties": {"repobilityId": "c5c51fd8d0def9c8", "scanner": "scanner-primary", "fingerprint": "3f96ddf302734e69", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bb7141b6d85dc73d", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/share/exam/[token]/opengraph-image.tsx:1"}, "properties": {"repobilityId": "1fdec33b8eed4e4a", "scanner": "scanner-primary", "fingerprint": "bb7141b6d85dc73d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-98b8a33e11719a4b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/share/exam/[token]/page.tsx:1"}, "properties": {"repobilityId": "dcb553e003e61ffa", "scanner": "scanner-primary", "fingerprint": "98b8a33e11719a4b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-40d2119cce2bc4c4", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/share/exam/[token]/ShareReportClient.tsx:3"}, "properties": {"repobilityId": "a562a9315993a510", "scanner": "scanner-primary", "fingerprint": "40d2119cce2bc4c4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d7feea0c3849e5ca", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/share/student-report/[token]/page.tsx:7"}, "properties": {"repobilityId": "d76a3139b1bc9327", "scanner": "scanner-primary", "fingerprint": "d7feea0c3849e5ca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2227856ab91cc342", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/subject-track.ts:1"}, "properties": {"repobilityId": "7bf1d840c9a71469", "scanner": "scanner-primary", "fingerprint": "2227856ab91cc342", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9b729e8d1f0d44d7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/security/msb-auth.ts:18"}, "properties": {"repobilityId": "d302075915a49217", "scanner": "scanner-primary", "fingerprint": "9b729e8d1f0d44d7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a57ddbfd1099cfa1", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/security/institute-guard.ts:21"}, "properties": {"repobilityId": "91b08abfbc622f3a", "scanner": "scanner-primary", "fingerprint": "a57ddbfd1099cfa1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d7b1a2bce89ced45", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/navigation/useSmartBack.ts:3"}, "properties": {"repobilityId": "e1dca5fdeb1b157e", "scanner": "scanner-primary", "fingerprint": "d7b1a2bce89ced45", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-feb47569e2a3e6ed", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/auth/get-active-track.ts:1"}, "properties": {"repobilityId": "33c1ca7d415fca98", "scanner": "scanner-primary", "fingerprint": "feb47569e2a3e6ed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1d8babcc78c4d2fc", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/print/exam-print.ts:1"}, "properties": {"repobilityId": "14c3c62548c675bf", "scanner": "scanner-primary", "fingerprint": "1d8babcc78c4d2fc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ed4ba0c4a0948a81", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/api/validation.ts:7"}, "properties": {"repobilityId": "4f33930255d43bb2", "scanner": "scanner-primary", "fingerprint": "ed4ba0c4a0948a81", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1c955be41f804ef5", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/utils/school-extract.ts:1"}, "properties": {"repobilityId": "83dc897db183c9e7", "scanner": "scanner-primary", "fingerprint": "1c955be41f804ef5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c56f225fd3fadb26", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/utils/clean-latex.test.ts:1"}, "properties": {"repobilityId": "36fc78e8187eabc4", "scanner": "scanner-primary", "fingerprint": "c56f225fd3fadb26", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cbc59322d9723076", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/utils/clean-latex.ts:17"}, "properties": {"repobilityId": "08126a4e10c2f2a3", "scanner": "scanner-primary", "fingerprint": "cbc59322d9723076", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e69d230fcc864bb1", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/utils/exam-meta-extract.ts:1"}, "properties": {"repobilityId": "9a1d99f84474af82", "scanner": "scanner-primary", "fingerprint": "e69d230fcc864bb1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cd450e062dbd0c83", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/lib/utils/year-extract.ts:1"}, "properties": {"repobilityId": "2da1e3d94cfd28a5", "scanner": "scanner-primary", "fingerprint": "cd450e062dbd0c83", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-27b174fcaa36ff09", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/latex/renderRepair.ts:28"}, "properties": {"repobilityId": "03445dbccebbe212", "scanner": "scanner-primary", "fingerprint": "27b174fcaa36ff09", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-012577a7c5b2c25a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/students/phone-id.ts:7"}, "properties": {"repobilityId": "713b27fb65d51cac", "scanner": "scanner-primary", "fingerprint": "012577a7c5b2c25a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be248731bd20eb70", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/vision/image-interpreter.ts:1"}, "properties": {"repobilityId": "4247e6c9143a7aa5", "scanner": "scanner-primary", "fingerprint": "be248731bd20eb70", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aa33fa5d5a821de9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/vision/image-interpreter.ts:1084"}, "properties": {"repobilityId": "c19feb13937540b2", "scanner": "scanner-primary", "fingerprint": "aa33fa5d5a821de9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-30e47e7fbee3a82c", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/workflow/classify.ts:4"}, "properties": {"repobilityId": "5c7c4410222447ce", "scanner": "scanner-primary", "fingerprint": "30e47e7fbee3a82c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0fcebfafefc5f94c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/workflow/classify.ts:236"}, "properties": {"repobilityId": "f5ab034d258155ff", "scanner": "scanner-primary", "fingerprint": "0fcebfafefc5f94c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ce4f91a1ea460db0", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/workflow/apply-learned-rules.ts:12"}, "properties": {"repobilityId": "90140eb6f09674cf", "scanner": "scanner-primary", "fingerprint": "ce4f91a1ea460db0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e7ba04cbc4f694ac", "level": "none", "message": {"text": "Commented-code block (12 lines) in src/lib/workflow/cloud-flow.ts:555"}, "properties": {"repobilityId": "9e5264080c17cee3", "scanner": "scanner-primary", "fingerprint": "e7ba04cbc4f694ac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ae38a652d6abf2fa", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/workflow/science-gemini-flow.ts:8"}, "properties": {"repobilityId": "abb3beba91406c81", "scanner": "scanner-primary", "fingerprint": "ae38a652d6abf2fa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2bc87ac82becae16", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/workflow/science-gemini-flow.ts:415"}, "properties": {"repobilityId": "ec579e56d5a030ea", "scanner": "scanner-primary", "fingerprint": "2bc87ac82becae16", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ee2324ca6570b938", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/workflow/mathsecr-prompt.test.ts:1"}, "properties": {"repobilityId": "6ba0fed208f9e3fa", "scanner": "scanner-primary", "fingerprint": "ee2324ca6570b938", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-009ad20a074ae475", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/workflow/title-detect.ts:159"}, "properties": {"repobilityId": "61a764cc8123bee1", "scanner": "scanner-primary", "fingerprint": "009ad20a074ae475", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fdafd85bb067e91c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/image-pipeline/client.ts:159"}, "properties": {"repobilityId": "eb26e2e842af8263", "scanner": "scanner-primary", "fingerprint": "fdafd85bb067e91c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7cf75739925b2acf", "level": "none", "message": {"text": "Commented-code block (11 lines) in src/lib/diagnostics/exam-sets.ts:4"}, "properties": {"repobilityId": "d3512e722fb874ff", "scanner": "scanner-primary", "fingerprint": "7cf75739925b2acf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-03921c5e11240933", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/pdf/auto-crop.ts:1"}, "properties": {"repobilityId": "b1823ec8bad5ee04", "scanner": "scanner-primary", "fingerprint": "03921c5e11240933", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-53693ebd79274d3b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ocr/symbol-detector.ts:9"}, "properties": {"repobilityId": "71d3ded882778a97", "scanner": "scanner-primary", "fingerprint": "53693ebd79274d3b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e02cc3d2510013d2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ocr/gemini-science.ts:5"}, "properties": {"repobilityId": "86af1a65efeec85e", "scanner": "scanner-primary", "fingerprint": "e02cc3d2510013d2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d05b5ea9b434c7d0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ocr/gemini-science.ts:159"}, "properties": {"repobilityId": "fa48c711ab0f4a08", "scanner": "scanner-primary", "fingerprint": "d05b5ea9b434c7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2ce45fe32330b0a1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ocr/question-parser.ts:133"}, "properties": {"repobilityId": "cf2a087085aec0cb", "scanner": "scanner-primary", "fingerprint": "2ce45fe32330b0a1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f07f6068b67ce940", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ocr/gemini-science-segmenter.ts:98"}, "properties": {"repobilityId": "f009d94143ca2a9e", "scanner": "scanner-primary", "fingerprint": "f07f6068b67ce940", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bcac8c57b94aec5e", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/lib/ocr/apply-answer-sheet.ts:4"}, "properties": {"repobilityId": "3cb32a8879af08d6", "scanner": "scanner-primary", "fingerprint": "bcac8c57b94aec5e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5bed514b8dddd0fc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ocr/gemini-science-perproblem.ts:133"}, "properties": {"repobilityId": "0792deb83436c1f2", "scanner": "scanner-primary", "fingerprint": "5bed514b8dddd0fc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-472c4f788bbb1915", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ocr/answer-vision.ts:47"}, "properties": {"repobilityId": "3fdc65681ae1bc6d", "scanner": "scanner-primary", "fingerprint": "472c4f788bbb1915", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-32e846a49b07a5d4", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ocr/vision-verifier.ts:6"}, "properties": {"repobilityId": "7bb32b7b40a187b3", "scanner": "scanner-primary", "fingerprint": "32e846a49b07a5d4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d6d8f824630176f8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ocr/mathpix.ts:52"}, "properties": {"repobilityId": "67c055f04f013a2b", "scanner": "scanner-primary", "fingerprint": "d6d8f824630176f8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c62f7a38054aae65", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/track/filter.ts:1"}, "properties": {"repobilityId": "29ddf1caf930476c", "scanner": "scanner-primary", "fingerprint": "c62f7a38054aae65", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9bebe3b70e111bec", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/track/hooks.ts:3"}, "properties": {"repobilityId": "bbb74badeecb50a1", "scanner": "scanner-primary", "fingerprint": "9bebe3b70e111bec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ad71f0e867c8c8e7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/track/href.ts:1"}, "properties": {"repobilityId": "aa50a990561af650", "scanner": "scanner-primary", "fingerprint": "ad71f0e867c8c8e7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4e4d70bb6aeb0308", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/track/nav.ts:1"}, "properties": {"repobilityId": "d0ad714599bfb8be", "scanner": "scanner-primary", "fingerprint": "4e4d70bb6aeb0308", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a47a8c260ada756d", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/grading/parse-student-sheet.ts:13"}, "properties": {"repobilityId": "7e12cb7314030e13", "scanner": "scanner-primary", "fingerprint": "a47a8c260ada756d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-659a64d9451f8d69", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/claude/cache.ts:11"}, "properties": {"repobilityId": "ab452a6729fb7f7a", "scanner": "scanner-primary", "fingerprint": "659a64d9451f8d69", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2528078410821310", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/export/docx-generator.ts:246"}, "properties": {"repobilityId": "214fe87339c4049a", "scanner": "scanner-primary", "fingerprint": "2528078410821310", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-43ecb7074048ff9d", "level": "none", "message": {"text": "Commented-code block (14 lines) in src/lib/export/hwpx-generator.ts:1"}, "properties": {"repobilityId": "5bf034b1341c15d9", "scanner": "scanner-primary", "fingerprint": "43ecb7074048ff9d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6727b4fb025554fe", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/hooks/useExamProblems.ts:187"}, "properties": {"repobilityId": "91582974ab60eb6e", "scanner": "scanner-primary", "fingerprint": "6727b4fb025554fe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-11b4af7e15408bbe", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/hooks/useUserScope.ts:47"}, "properties": {"repobilityId": "d1d1ea01833c03ce", "scanner": "scanner-primary", "fingerprint": "11b4af7e15408bbe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f697022b8ecb2933", "level": "note", "message": {"text": "46 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "ced2925b2cb9d989", "scanner": "scanner-primary", "fingerprint": "f697022b8ecb2933", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "9e485b7a3b9d3b09", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "e8ec9a7d50c3171a", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "8668b2ee7a7ce831", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "2ea8af292a4289a7", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-f13cd461ec6e5e85", "level": "error", "message": {"text": "FastAPI POST `detect_problems` without auth dependency \u2014 yolo-server/server.py:74"}, "properties": {"repobilityId": "a0142e3375757927", "scanner": "scanner-primary", "fingerprint": "f13cd461ec6e5e85", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "yolo-server/server.py"}, "region": {"startLine": 74}}}]}, {"ruleId": "scanner-92e2da99d16ba6b8", "level": "error", "message": {"text": "FastAPI POST `annotate_endpoint` without auth dependency \u2014 yolo-server/server.py:177"}, "properties": {"repobilityId": "9c6fc7d88fedb399", "scanner": "scanner-primary", "fingerprint": "92e2da99d16ba6b8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "yolo-server/server.py"}, "region": {"startLine": 177}}}]}, {"ruleId": "scanner-225a27fe0ff9c387", "level": "error", "message": {"text": "FastAPI POST `clean_handwriting` without auth dependency \u2014 image-pipeline/server.py:94"}, "properties": {"repobilityId": "c25be60c0af501ce", "scanner": "scanner-primary", "fingerprint": "225a27fe0ff9c387", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "image-pipeline/server.py"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-166399642c6ee214", "level": "error", "message": {"text": "FastAPI POST `clean_pdf_handwriting` without auth dependency \u2014 image-pipeline/server.py:134"}, "properties": {"repobilityId": "8415ff3aa0a40ddf", "scanner": "scanner-primary", "fingerprint": "166399642c6ee214", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "image-pipeline/server.py"}, "region": {"startLine": 134}}}]}, {"ruleId": "scanner-374a888e82570d49", "level": "error", "message": {"text": "FastAPI POST `clean_pdf_base64` without auth dependency \u2014 image-pipeline/server.py:192"}, "properties": {"repobilityId": "61b6aa3bf3120cd6", "scanner": "scanner-primary", "fingerprint": "374a888e82570d49", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "image-pipeline/server.py"}, "region": {"startLine": 192}}}]}, {"ruleId": "scanner-1b4ad9bb4785428d", "level": "error", "message": {"text": "FastAPI POST `detect_figures_cv` without auth dependency \u2014 image-pipeline/server.py:499"}, "properties": {"repobilityId": "5bda8bb201a5ad7c", "scanner": "scanner-primary", "fingerprint": "1b4ad9bb4785428d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "image-pipeline/server.py"}, "region": {"startLine": 499}}}]}, {"ruleId": "scanner-ca149539fb7c4637", "level": "error", "message": {"text": "FastAPI POST `render_pdf_pages` without auth dependency \u2014 image-pipeline/server.py:599"}, "properties": {"repobilityId": "a729d4a6affae0fd", "scanner": "scanner-primary", "fingerprint": "ca149539fb7c4637", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "image-pipeline/server.py"}, "region": {"startLine": 599}}}]}, {"ruleId": "scanner-f8caaa711ac28dd9", "level": "error", "message": {"text": "FastAPI POST `crop_figure` without auth dependency \u2014 image-pipeline/server.py:664"}, "properties": {"repobilityId": "2a7b1879586a574b", "scanner": "scanner-primary", "fingerprint": "f8caaa711ac28dd9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "image-pipeline/server.py"}, "region": {"startLine": 664}}}]}, {"ruleId": "scanner-3f00a977e0bd16a1", "level": "error", "message": {"text": "FastAPI POST `clean_handwriting_base64` without auth dependency \u2014 image-pipeline/server.py:760"}, "properties": {"repobilityId": "6156a3bd18abe486", "scanner": "scanner-primary", "fingerprint": "3f00a977e0bd16a1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "image-pipeline/server.py"}, "region": {"startLine": 760}}}]}, {"ruleId": "scanner-3fca70e06b05b4a2", "level": "error", "message": {"text": "FastAPI POST `clean_handwriting_local` without auth dependency \u2014 image-pipeline/server.py:808"}, "properties": {"repobilityId": "f7157a9478bf46ad", "scanner": "scanner-primary", "fingerprint": "3fca70e06b05b4a2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "image-pipeline/server.py"}, "region": {"startLine": 808}}}]}, {"ruleId": "scanner-591585ec4d0e4c59", "level": "error", "message": {"text": "FastAPI POST `extract_images_local` without auth dependency \u2014 image-pipeline/server.py:836"}, "properties": {"repobilityId": "cbcfb1dbd5f63d67", "scanner": "scanner-primary", "fingerprint": "591585ec4d0e4c59", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "image-pipeline/server.py"}, "region": {"startLine": 836}}}]}, {"ruleId": "scanner-e3809dce3913f259", "level": "error", "message": {"text": "FastAPI POST `extract_images` without auth dependency \u2014 image-pipeline/server.py:866"}, "properties": {"repobilityId": "41644ef873132121", "scanner": "scanner-primary", "fingerprint": "e3809dce3913f259", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "image-pipeline/server.py"}, "region": {"startLine": 866}}}]}, {"ruleId": "scanner-b894c50d13c732e2", "level": "error", "message": {"text": "FastAPI POST `detect_problems_yolo` without auth dependency \u2014 image-pipeline/server.py:1098"}, "properties": {"repobilityId": "bed0d68f9852fc08", "scanner": "scanner-primary", "fingerprint": "b894c50d13c732e2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "image-pipeline/server.py"}, "region": {"startLine": 1098}}}]}, {"ruleId": "scanner-a02d4f3945cd911d", "level": "error", "message": {"text": "FastAPI POST `enhance_single` without auth dependency \u2014 image-pipeline/server.py:1176"}, "properties": {"repobilityId": "f991f4d84b88d178", "scanner": "scanner-primary", "fingerprint": "a02d4f3945cd911d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "image-pipeline/server.py"}, "region": {"startLine": 1176}}}]}, {"ruleId": "scanner-18cba5dc553f67fb", "level": "error", "message": {"text": "FastAPI POST `find_similar` without auth dependency \u2014 image-pipeline/server.py:1236"}, "properties": {"repobilityId": "804f8ac949a1c183", "scanner": "scanner-primary", "fingerprint": "18cba5dc553f67fb", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "image-pipeline/server.py"}, "region": {"startLine": 1236}}}]}, {"ruleId": "scanner-0e50098e5ff540c8", "level": "error", "message": {"text": "FastAPI POST `tag_image` without auth dependency \u2014 image-pipeline/server.py:1263"}, "properties": {"repobilityId": "78b9926c4a9b9043", "scanner": "scanner-primary", "fingerprint": "0e50098e5ff540c8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "image-pipeline/server.py"}, "region": {"startLine": 1263}}}]}, {"ruleId": "scanner-da75b736e7d393d8", "level": "error", "message": {"text": "FastAPI POST `tag_images_batch` without auth dependency \u2014 image-pipeline/server.py:1336"}, "properties": {"repobilityId": "b4356d716bca0e40", "scanner": "scanner-primary", "fingerprint": "da75b736e7d393d8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "image-pipeline/server.py"}, "region": {"startLine": 1336}}}]}, {"ruleId": "scanner-ae940c7424afc078", "level": "error", "message": {"text": "FastAPI POST `retag_all_images` without auth dependency \u2014 image-pipeline/server.py:1392"}, "properties": {"repobilityId": "5ef5a879102bfbe2", "scanner": "scanner-primary", "fingerprint": "ae940c7424afc078", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "image-pipeline/server.py"}, "region": {"startLine": 1392}}}]}, {"ruleId": "scanner-785b8e71c62853f7", "level": "error", "message": {"text": "FastAPI POST `match_image` without auth dependency \u2014 image-pipeline/server.py:1487"}, "properties": {"repobilityId": "80b835ab2d2f46fe", "scanner": "scanner-primary", "fingerprint": "785b8e71c62853f7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "image-pipeline/server.py"}, "region": {"startLine": 1487}}}]}, {"ruleId": "scanner-e1eb8e38c003c336", "level": "error", "message": {"text": "FastAPI POST `match_images_batch` without auth dependency \u2014 image-pipeline/server.py:1537"}, "properties": {"repobilityId": "68f3a7bd26a04f60", "scanner": "scanner-primary", "fingerprint": "e1eb8e38c003c336", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "image-pipeline/server.py"}, "region": {"startLine": 1537}}}]}, {"ruleId": "scanner-66ce388fab653c6a", "level": "error", "message": {"text": "FastAPI DELETE `delete_image` without auth dependency \u2014 image-pipeline/server.py:1579"}, "properties": {"repobilityId": "e6f356328cee0b5e", "scanner": "scanner-primary", "fingerprint": "66ce388fab653c6a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "image-pipeline/server.py"}, "region": {"startLine": 1579}}}]}, {"ruleId": "scanner-fbf94085b28dcba0", "level": "error", "message": {"text": "FastAPI DELETE `delete_source` without auth dependency \u2014 image-pipeline/server.py:1604"}, "properties": {"repobilityId": "9290c8917e41235e", "scanner": "scanner-primary", "fingerprint": "fbf94085b28dcba0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "image-pipeline/server.py"}, "region": {"startLine": 1604}}}]}, {"ruleId": "scanner-6259b4013cd738e0", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (scripts/reclassify-science.js:132)"}, "properties": {"repobilityId": "68efb25e5cf5df5a", "scanner": "scanner-primary", "fingerprint": "6259b4013cd738e0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c2af19a0602498c7", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (scripts/fix-p17.js:20)"}, "properties": {"repobilityId": "7a2617ec58a3fd01", "scanner": "scanner-primary", "fingerprint": "c2af19a0602498c7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bcb406831fcd77f3", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (scripts/test-glm-classify.ts:80)"}, "properties": {"repobilityId": "7d56cf17f929d0fe", "scanner": "scanner-primary", "fingerprint": "bcb406831fcd77f3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-58ce5abffba9d843", "level": "error", "message": {"text": "Dangling fetch: POST https://api.z.ai/api/paas/v4/chat/completions (scripts/test-glm-classify.ts:107)"}, "properties": {"repobilityId": "16111a86b3ad5ac2", "scanner": "scanner-primary", "fingerprint": "58ce5abffba9d843", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f3b9b9a1fe9ca883", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (scripts/test-glm-detect.ts:56)"}, "properties": {"repobilityId": "81aee2dd50391eb5", "scanner": "scanner-primary", "fingerprint": "f3b9b9a1fe9ca883", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-788839e78157692d", "level": "error", "message": {"text": "Dangling fetch: POST https://api.z.ai/api/paas/v4/chat/completions (scripts/test-glm-detect.ts:84)"}, "properties": {"repobilityId": "2f9c0017990ba20a", "scanner": "scanner-primary", "fingerprint": "788839e78157692d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1acc781486120f5b", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (scripts/test-two-stage-classify.ts:50)"}, "properties": {"repobilityId": "6e1e7007a7758898", "scanner": "scanner-primary", "fingerprint": "1acc781486120f5b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-aa775de0b88ab9b8", "level": "error", "message": {"text": "Dangling fetch: POST https://api.z.ai/api/paas/v4/chat/completions (scripts/test-glm-graph.ts:103)"}, "properties": {"repobilityId": "26106abd5261c62d", "scanner": "scanner-primary", "fingerprint": "aa775de0b88ab9b8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f57df195bb2cf037", "level": "error", "message": {"text": "Dangling fetch: POST https://api.z.ai/api/paas/v4/chat/completions (scripts/test-glm-graph.ts:132)"}, "properties": {"repobilityId": "843a9d7cdd3674a3", "scanner": "scanner-primary", "fingerprint": "f57df195bb2cf037", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-63fc86d9630321de", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams/${w.examId}/batch-solutions (src/components/BatchSolutionNotifier.tsx:75)"}, "properties": {"repobilityId": "66380d0998198927", "scanner": "scanner-primary", "fingerprint": "63fc86d9630321de", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b98a8b2b5f9b276b", "level": "error", "message": {"text": "Dangling fetch: GET /api/me/active-institute (src/components/layout/ActiveInstituteSwitcher.tsx:24)"}, "properties": {"repobilityId": "9a2c585456286cad", "scanner": "scanner-primary", "fingerprint": "b98a8b2b5f9b276b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0198909eb6f172d8", "level": "error", "message": {"text": "Dangling fetch: POST /api/me/active-institute (src/components/layout/ActiveInstituteSwitcher.tsx:49)"}, "properties": {"repobilityId": "01eb5cd18092f259", "scanner": "scanner-primary", "fingerprint": "0198909eb6f172d8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cc823774b1b425f4", "level": "error", "message": {"text": "Dangling fetch: POST /api/exams/${examId}/match-answers (src/components/exam/AnswerMatchModal.tsx:232)"}, "properties": {"repobilityId": "775b35fdc17df3af", "scanner": "scanner-primary", "fingerprint": "cc823774b1b425f4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c23a5854bdcdce22", "level": "error", "message": {"text": "Dangling fetch: PUT /api/exams/${examId}/match-answers (src/components/exam/AnswerMatchModal.tsx:288)"}, "properties": {"repobilityId": "c76e6e1600dc964b", "scanner": "scanner-primary", "fingerprint": "c23a5854bdcdce22", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d13679dc34132f8c", "level": "error", "message": {"text": "Dangling fetch: GET /api/users/students${qs} (src/components/exam/DeployExamModal.tsx:67)"}, "properties": {"repobilityId": "cf1eb4ad68b35554", "scanner": "scanner-primary", "fingerprint": "d13679dc34132f8c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4a88ffd4d216bacc", "level": "error", "message": {"text": "Dangling fetch: POST /api/sessions (src/components/exam/DeployExamModal.tsx:116)"}, "properties": {"repobilityId": "822e3d3ea160b59b", "scanner": "scanner-primary", "fingerprint": "4a88ffd4d216bacc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-49e95ac43a268b84", "level": "error", "message": {"text": "Dangling fetch: POST /api/problems/${problemId}/update-figure (src/components/shared/FigureRenderer.tsx:130)"}, "properties": {"repobilityId": "f742f1392c6347f4", "scanner": "scanner-primary", "fingerprint": "49e95ac43a268b84", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-13e5789f68ffeff8", "level": "error", "message": {"text": "Dangling fetch: POST /api/problems/${problemId}/update-figure (src/components/shared/FigureRenderer.tsx:202)"}, "properties": {"repobilityId": "aad56d0d8f7b6cd8", "scanner": "scanner-primary", "fingerprint": "13e5789f68ffeff8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fa006d7581b2dbb6", "level": "error", "message": {"text": "Dangling fetch: GET /api/students/${encodeURIComponent(studentId)}/pitfall-summary (src/components/prescription/StudentPitfallSummary.tsx:66)"}, "properties": {"repobilityId": "1c812e4ffca19d5e", "scanner": "scanner-primary", "fingerprint": "fa006d7581b2dbb6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-92ee82a093c2a87d", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams (src/components/prescription/CreateSessionsModal.tsx:86)"}, "properties": {"repobilityId": "9804bd0ee0d5ead0", "scanner": "scanner-primary", "fingerprint": "92ee82a093c2a87d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5e7dda99e4834a18", "level": "error", "message": {"text": "Dangling fetch: POST /api/sessions (src/components/prescription/CreateSessionsModal.tsx:140)"}, "properties": {"repobilityId": "141d20cbf5cdbf01", "scanner": "scanner-primary", "fingerprint": "5e7dda99e4834a18", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-340151f51b1251b6", "level": "error", "message": {"text": "Dangling fetch: GET /api/students/${encodeURIComponent(studentId)}/pitfall-summary (src/components/prescription/WeeklyConnections.tsx:59)"}, "properties": {"repobilityId": "8f9f69cf1894fb2b", "scanner": "scanner-primary", "fingerprint": "340151f51b1251b6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2a7d5a714fc82885", "level": "error", "message": {"text": "Dangling fetch: GET /api/students/${encodeURIComponent(studentId)}/pitfall-summary (src/components/prescription/PrescriptionRecommendation.tsx:66)"}, "properties": {"repobilityId": "fef40d95af211bec", "scanner": "scanner-primary", "fingerprint": "2a7d5a714fc82885", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-26088cf55dcb4638", "level": "error", "message": {"text": "Dangling fetch: GET /api/students/${encodeURIComponent(studentId)}/recommended-problems?topN=10 (src/components/prescription/RecommendedProblems.tsx:58)"}, "properties": {"repobilityId": "3c87ac78c2776f22", "scanner": "scanner-primary", "fingerprint": "26088cf55dcb4638", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1623976dccff37ce", "level": "error", "message": {"text": "Dangling fetch: POST /api/students/${encodeURIComponent(studentId)}/generate-recommended-session (src/components/prescription/RecommendedProblems.tsx:220)"}, "properties": {"repobilityId": "ed857e5a5e88e75e", "scanner": "scanner-primary", "fingerprint": "1623976dccff37ce", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8d91dfa7311a845b", "level": "error", "message": {"text": "Dangling fetch: GET /api/grades/roster (src/components/grades/GradeRosterTable.tsx:60)"}, "properties": {"repobilityId": "0b0b15c67fb8da90", "scanner": "scanner-primary", "fingerprint": "8d91dfa7311a845b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c3959c1a8a4543b1", "level": "error", "message": {"text": "Dangling fetch: GET /api/students/${studentId}/analytics (src/components/students/StudentDetailContent.tsx:144)"}, "properties": {"repobilityId": "9c08547420c665b0", "scanner": "scanner-primary", "fingerprint": "c3959c1a8a4543b1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7d3416f482c00986", "level": "error", "message": {"text": "Dangling fetch: GET /api/users/students (src/components/students/StudentDetailContent.tsx:160)"}, "properties": {"repobilityId": "1f357f230608f769", "scanner": "scanner-primary", "fingerprint": "7d3416f482c00986", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e53d21659ca64129", "level": "error", "message": {"text": "Dangling fetch: GET /api/diagnostics/exam-sets (src/components/students/StudentDetailContent.tsx:180)"}, "properties": {"repobilityId": "779f15a4e5c620bb", "scanner": "scanner-primary", "fingerprint": "e53d21659ca64129", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3179d1ad657ddad8", "level": "error", "message": {"text": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/components/workflow/AnalyzeProblemEditModal.tsx:1126)"}, "properties": {"repobilityId": "841bc887b7c52dd8", "scanner": "scanner-primary", "fingerprint": "3179d1ad657ddad8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9e94292c328ad41c", "level": "error", "message": {"text": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/components/workflow/AnalyzeProblemEditModal.tsx:1217)"}, "properties": {"repobilityId": "b9f971d276805b11", "scanner": "scanner-primary", "fingerprint": "9e94292c328ad41c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5b0ed65f5562626e", "level": "error", "message": {"text": "Dangling fetch: POST /api/workflow/twin (src/components/workflow/ZeroWrongLoop.tsx:98)"}, "properties": {"repobilityId": "623d1085e32178aa", "scanner": "scanner-primary", "fingerprint": "5b0ed65f5562626e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c0b1bfbc2311b8fe", "level": "error", "message": {"text": "Dangling fetch: POST /api/workflow/twin (src/components/workflow/ZeroWrongLoop.tsx:142)"}, "properties": {"repobilityId": "84ea0dd7e06e2ac7", "scanner": "scanner-primary", "fingerprint": "c0b1bfbc2311b8fe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5a23f3fbd36689ab", "level": "error", "message": {"text": "Dangling fetch: POST /api/workflow/upload-url (src/components/workflow/CloudFlowUploader.tsx:195)"}, "properties": {"repobilityId": "55a457d46ccc8f14", "scanner": "scanner-primary", "fingerprint": "5a23f3fbd36689ab", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3fa7d80501abc417", "level": "error", "message": {"text": "Dangling fetch: POST /api/workflow/upload (src/components/workflow/CloudFlowUploader.tsx:312)"}, "properties": {"repobilityId": "2d71d02962174ad0", "scanner": "scanner-primary", "fingerprint": "3fa7d80501abc417", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c0136fbc1f232171", "level": "error", "message": {"text": "Dangling fetch: GET /api/workflow/upload?jobId=${jobId} (src/components/workflow/CloudFlowUploader.tsx:406)"}, "properties": {"repobilityId": "ead694960cbac8eb", "scanner": "scanner-primary", "fingerprint": "c0136fbc1f232171", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-001fa6050693dbf1", "level": "error", "message": {"text": "Dangling fetch: POST /api/workflow/twin (src/components/workflow/TwinProblemButton.tsx:44)"}, "properties": {"repobilityId": "3088abf25a8af4e9", "scanner": "scanner-primary", "fingerprint": "001fa6050693dbf1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3a6ee078a91e3e85", "level": "error", "message": {"text": "Dangling fetch: GET /api/diagnostics/exam-sets (src/components/class/StudentLearningReport.tsx:87)"}, "properties": {"repobilityId": "4481da8a4167d7d1", "scanner": "scanner-primary", "fingerprint": "3a6ee078a91e3e85", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8a1caa78a413c0be", "level": "error", "message": {"text": "Dangling fetch: GET /api/diagnostics/report-tokens?studentId=${encodeURIComponent(sid)} (src/components/class/StudentLearningReport.tsx:98)"}, "properties": {"repobilityId": "4440ce18a4bb4489", "scanner": "scanner-primary", "fingerprint": "8a1caa78a413c0be", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8ddf5e087a0f7a0e", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/diagnostics/report-tokens (src/components/class/StudentLearningReport.tsx:118)"}, "properties": {"repobilityId": "1488400ce9e4260e", "scanner": "scanner-primary", "fingerprint": "8ddf5e087a0f7a0e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0371a7c514958c4c", "level": "error", "message": {"text": "Dangling fetch: POST /api/me/change-password (src/components/account/ChangePasswordCard.tsx:43)"}, "properties": {"repobilityId": "2143d83a0056daf2", "scanner": "scanner-primary", "fingerprint": "0371a7c514958c4c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3e5e715e8a014625", "level": "error", "message": {"text": "Dangling fetch: GET /api/problems/search?${params} (src/components/papers/AddProblemsModal.tsx:72)"}, "properties": {"repobilityId": "be10cf46dd5b4eac", "scanner": "scanner-primary", "fingerprint": "3e5e715e8a014625", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5ebeeec8c963bbbd", "level": "error", "message": {"text": "Dangling fetch: POST /api/exams/${examId}/problems (src/components/papers/AddProblemsModal.tsx:252)"}, "properties": {"repobilityId": "a8e532dcda0a1ed2", "scanner": "scanner-primary", "fingerprint": "5ebeeec8c963bbbd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f77826e0b6827917", "level": "error", "message": {"text": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/components/papers/ProblemEditModal.tsx:866)"}, "properties": {"repobilityId": "70f45e07ceab08c5", "scanner": "scanner-primary", "fingerprint": "f77826e0b6827917", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-075ccc31e32eac9b", "level": "error", "message": {"text": "Dangling fetch: POST /api/storage/upload-image (src/components/papers/ProblemEditModal.tsx:966)"}, "properties": {"repobilityId": "27a3ddb33b04b0bc", "scanner": "scanner-primary", "fingerprint": "075ccc31e32eac9b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2080454f27e5126e", "level": "error", "message": {"text": "Dangling fetch: POST /api/problems/${problemId}/generate-solution (src/components/papers/ProblemEditModal.tsx:1078)"}, "properties": {"repobilityId": "80e43c5161c9cb93", "scanner": "scanner-primary", "fingerprint": "2080454f27e5126e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5fc3dbecb7efe24c", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/problems/${problemId} (src/components/papers/ProblemEditModal.tsx:1179)"}, "properties": {"repobilityId": "64b2b064f6e4f7bc", "scanner": "scanner-primary", "fingerprint": "5fc3dbecb7efe24c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c22a23bc4a0e1e42", "level": "error", "message": {"text": "Dangling fetch: POST /api/latex-corrections (src/components/papers/ProblemEditModal.tsx:1220)"}, "properties": {"repobilityId": "e70c44ba8bbe202b", "scanner": "scanner-primary", "fingerprint": "c22a23bc4a0e1e42", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-63e7552ad5b684a3", "level": "error", "message": {"text": "Dangling fetch: POST /api/latex-corrections (src/components/papers/ProblemEditModal.tsx:1232)"}, "properties": {"repobilityId": "89fa617845f380f4", "scanner": "scanner-primary", "fingerprint": "63e7552ad5b684a3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5e78e235edb43767", "level": "error", "message": {"text": "Dangling fetch: POST /api/problems/${problemId}/reanalyze (src/components/papers/ProblemEditModal.tsx:1265)"}, "properties": {"repobilityId": "4536e3d2847f5f98", "scanner": "scanner-primary", "fingerprint": "5e78e235edb43767", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a34652264610a123", "level": "error", "message": {"text": "Dangling fetch: GET /api/mathsecr-types?subject=${subjectCode} (src/components/papers/MathsecrTreePicker.tsx:66)"}, "properties": {"repobilityId": "ee1c02a38bae3dad", "scanner": "scanner-primary", "fingerprint": "a34652264610a123", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b9f2f7025c529c94", "level": "error", "message": {"text": "Dangling fetch: GET /api/diagram-images?${params} (src/components/papers/DiagramBrowserModal.tsx:126)"}, "properties": {"repobilityId": "ebed06b1938703ee", "scanner": "scanner-primary", "fingerprint": "b9f2f7025c529c94", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b2e1c3467c565ce5", "level": "error", "message": {"text": "Dangling fetch: POST /api/diagram-images/upload (src/components/papers/DiagramBrowserModal.tsx:224)"}, "properties": {"repobilityId": "929739a74fb53e51", "scanner": "scanner-primary", "fingerprint": "b2e1c3467c565ce5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4b78082502716ace", "level": "error", "message": {"text": "Dangling fetch: POST /api/diagram-images/upload (src/components/papers/DiagramBrowserModal.tsx:284)"}, "properties": {"repobilityId": "cdfd66f5894cb247", "scanner": "scanner-primary", "fingerprint": "4b78082502716ace", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e76bc46a50e83c0f", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams/${examId} (src/components/papers/ExamViewerModal.tsx:76)"}, "properties": {"repobilityId": "396b8467fee12f14", "scanner": "scanner-primary", "fingerprint": "e76bc46a50e83c0f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ed3f9840addef3f1", "level": "error", "message": {"text": "Dangling fetch: GET /api/latex-corrections (src/components/papers/RenderRepairPanel.tsx:65)"}, "properties": {"repobilityId": "c76022c29f05c949", "scanner": "scanner-primary", "fingerprint": "ed3f9840addef3f1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f429f080797c5999", "level": "error", "message": {"text": "Dangling fetch: POST /api/workflow/twin (src/components/papers/TwinProblemModal.tsx:100)"}, "properties": {"repobilityId": "ef7435057ce3f366", "scanner": "scanner-primary", "fingerprint": "f429f080797c5999", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-72fa672ef8420a42", "level": "error", "message": {"text": "Dangling fetch: POST /api/sessions/${sessionId}/grading-sheet (src/components/grading/GradingSheetUpload.tsx:80)"}, "properties": {"repobilityId": "8ba2ca90affb807d", "scanner": "scanner-primary", "fingerprint": "72fa672ef8420a42", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ec4f12c07f2850f4", "level": "error", "message": {"text": "Dangling fetch: PUT /api/sessions/${sessionId}/grading-sheet (src/components/grading/GradingSheetUpload.tsx:126)"}, "properties": {"repobilityId": "76e6085532d03a77", "scanner": "scanner-primary", "fingerprint": "ec4f12c07f2850f4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-538a4f73f101fa3b", "level": "error", "message": {"text": "Dangling fetch: GET /api/users/me/track (src/contexts/SubjectTrackContext.tsx:50)"}, "properties": {"repobilityId": "ce5b98a857b1d365", "scanner": "scanner-primary", "fingerprint": "538a4f73f101fa3b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-01fd5db20ba1c101", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/users/me/track (src/contexts/SubjectTrackContext.tsx:128)"}, "properties": {"repobilityId": "2a2579acabaf252e", "scanner": "scanner-primary", "fingerprint": "01fd5db20ba1c101", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8645830def290949", "level": "error", "message": {"text": "Dangling fetch: GET /api/sessions/${sessionId} (src/app/answer/[session_id]/page.tsx:109)"}, "properties": {"repobilityId": "ccef5ee80e4fcceb", "scanner": "scanner-primary", "fingerprint": "8645830def290949", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ca7d3a8d629e5eb3", "level": "error", "message": {"text": "Dangling fetch: POST /api/session-results/from-student (src/app/answer/[session_id]/page.tsx:158)"}, "properties": {"repobilityId": "f629c44e80f80880", "scanner": "scanner-primary", "fingerprint": "ca7d3a8d629e5eb3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-63b67fccf4c7b914", "level": "error", "message": {"text": "Dangling fetch: GET /api/students/me/sessions (src/app/student/exams/page.tsx:74)"}, "properties": {"repobilityId": "4d2e6795f5731dfd", "scanner": "scanner-primary", "fingerprint": "63b67fccf4c7b914", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-673e93d2a186aad0", "level": "error", "message": {"text": "Dangling fetch: GET /api/analytics/heatmap?range=${dateRange} (src/app/student/analytics/page.tsx:35)"}, "properties": {"repobilityId": "21ddd30a8f442ff9", "scanner": "scanner-primary", "fingerprint": "673e93d2a186aad0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-38ac6f4006835656", "level": "error", "message": {"text": "Dangling fetch: GET /api/sessions/${sessionId} (src/app/student/sessions/[id]/page.tsx:82)"}, "properties": {"repobilityId": "9d172e407ac47d0b", "scanner": "scanner-primary", "fingerprint": "38ac6f4006835656", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3eadca03daf39918", "level": "error", "message": {"text": "Dangling fetch: GET /api/organizations/${orgId}/public (src/app/auth/login/page.tsx:37)"}, "properties": {"repobilityId": "a182b5798f9e5f0c", "scanner": "scanner-primary", "fingerprint": "3eadca03daf39918", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-310604bc2b6131c8", "level": "error", "message": {"text": "Dangling fetch: GET /api/institutes/public?organization_id=${selectedOrg.id} (src/app/auth/signup/page.tsx:128)"}, "properties": {"repobilityId": "99a94d7ca41c34a7", "scanner": "scanner-primary", "fingerprint": "310604bc2b6131c8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ecb0c2be716a36e7", "level": "error", "message": {"text": "Dangling fetch: POST /api/organization-applications (src/app/auth/signup/page.tsx:302)"}, "properties": {"repobilityId": "384db85df0c0b323", "scanner": "scanner-primary", "fingerprint": "ecb0c2be716a36e7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-754eab2a13c5b533", "level": "error", "message": {"text": "Dangling fetch: GET /api/parent/${encodeURIComponent(token)} (src/app/parent/[token]/page.tsx:64)"}, "properties": {"repobilityId": "1f3b9ca838f64c79", "scanner": "scanner-primary", "fingerprint": "754eab2a13c5b533", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b4fccfdbfff98604", "level": "error", "message": {"text": "Dangling fetch: GET /api/sessions/${id}/print-meta?variant=${variant} (src/app/print/session/[sessionId]/page.tsx:77)"}, "properties": {"repobilityId": "797db9a579d44b3e", "scanner": "scanner-primary", "fingerprint": "b4fccfdbfff98604", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-eb391b0f920790af", "level": "error", "message": {"text": "Dangling fetch: POST https://api.mathpix.com/v3/pdf (src/app/api/exams/[examId]/match-answers/route.ts:949)"}, "properties": {"repobilityId": "c85c8cbf98286a8e", "scanner": "scanner-primary", "fingerprint": "eb391b0f920790af", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-07db532c0e8748e0", "level": "error", "message": {"text": "Dangling fetch: GET https://api.mathpix.com/v3/pdf/${pdfId} (src/app/api/exams/[examId]/match-answers/route.ts:967)"}, "properties": {"repobilityId": "fdbd7b82c4f49818", "scanner": "scanner-primary", "fingerprint": "07db532c0e8748e0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-280e3b1231cf5635", "level": "error", "message": {"text": "Dangling fetch: GET https://api.mathpix.com/v3/pdf/${pdfId}.mmd (src/app/api/exams/[examId]/match-answers/route.ts:976)"}, "properties": {"repobilityId": "32f617423a798109", "scanner": "scanner-primary", "fingerprint": "280e3b1231cf5635", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-894f7c0512173b75", "level": "error", "message": {"text": "Dangling fetch: POST https://api.mathpix.com/v3/text (src/app/api/exams/[examId]/match-answers/route.ts:1008)"}, "properties": {"repobilityId": "ed0f1a42fe9daa4c", "scanner": "scanner-primary", "fingerprint": "894f7c0512173b75", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-70b0730581dfb309", "level": "error", "message": {"text": "Dangling fetch: POST https://api.mathpix.com/v3/text (src/app/api/admin/reocr-points/route.ts:72)"}, "properties": {"repobilityId": "f234b92bc73141a8", "scanner": "scanner-primary", "fingerprint": "70b0730581dfb309", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e151e97cb2bb8b9c", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/api/workflow/detect-problems/route.ts:132)"}, "properties": {"repobilityId": "90536a643967ffc7", "scanner": "scanner-primary", "fingerprint": "e151e97cb2bb8b9c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-48bfe93102649246", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/api/workflow/reanalyze-crop/route.ts:994)"}, "properties": {"repobilityId": "a042b494c91292a1", "scanner": "scanner-primary", "fingerprint": "48bfe93102649246", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d5df3180093e103a", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/api/workflow/reanalyze-crop/route.ts:1117)"}, "properties": {"repobilityId": "1f0caabe32b5c5e6", "scanner": "scanner-primary", "fingerprint": "d5df3180093e103a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e3bc6309cd04df9a", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/app/api/workflow/reanalyze-crop/route.ts:1203)"}, "properties": {"repobilityId": "6e411f1348b2717a", "scanner": "scanner-primary", "fingerprint": "e3bc6309cd04df9a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0011f62229c077e9", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/api/workflow/detect-figures-gpt/route.ts:92)"}, "properties": {"repobilityId": "89aa9f17fb77cffb", "scanner": "scanner-primary", "fingerprint": "0011f62229c077e9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-37dbf1552e94bcd3", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/app/api/problems/[problemId]/generate-solution/route.ts:488)"}, "properties": {"repobilityId": "81ed733ccd1dd438", "scanner": "scanner-primary", "fingerprint": "37dbf1552e94bcd3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3ca2c5a0f0df39b9", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/app/api/problems/[problemId]/generate-solution/route.ts:534)"}, "properties": {"repobilityId": "6376dd9da58fab74", "scanner": "scanner-primary", "fingerprint": "3ca2c5a0f0df39b9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3c92418f7a16dbf5", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/app/api/problems/[problemId]/generate-solution/route.ts:571)"}, "properties": {"repobilityId": "8c4928e17aab36c6", "scanner": "scanner-primary", "fingerprint": "3c92418f7a16dbf5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bb1be0819ccafa6b", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/api/problems/[problemId]/generate-solution/route.ts:631)"}, "properties": {"repobilityId": "ba61be71cf7b2b31", "scanner": "scanner-primary", "fingerprint": "bb1be0819ccafa6b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-723fe14755987e7e", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/app/api/problems/[problemId]/generate-solution/route.ts:860)"}, "properties": {"repobilityId": "0927863df5ebf554", "scanner": "scanner-primary", "fingerprint": "723fe14755987e7e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-31f875d61524943c", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/app/api/problems/[problemId]/generate-solution/route.ts:950)"}, "properties": {"repobilityId": "eb7c508d5aeb07ce", "scanner": "scanner-primary", "fingerprint": "31f875d61524943c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-91b9c9a4a7abdeb9", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/api/problems/[problemId]/reanalyze/route.ts:531)"}, "properties": {"repobilityId": "95149d607ead805a", "scanner": "scanner-primary", "fingerprint": "91b9c9a4a7abdeb9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-da6e9554f96ed292", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/users?${params.toString()} (src/app/dashboard/settings/page.tsx:99)"}, "properties": {"repobilityId": "fedb93a057e7046e", "scanner": "scanner-primary", "fingerprint": "da6e9554f96ed292", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2e1caf73354dcdb5", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/system-stats (src/app/dashboard/settings/page.tsx:118)"}, "properties": {"repobilityId": "0ea24c8896fce4ed", "scanner": "scanner-primary", "fingerprint": "2e1caf73354dcdb5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cb770588c758e09d", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams?is_diagnostic=true (src/app/dashboard/exam-create/page.tsx:258)"}, "properties": {"repobilityId": "cc18930df7ba9892", "scanner": "scanner-primary", "fingerprint": "cb770588c758e09d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-40b3e14acc17631c", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams?is_diagnostic=false (src/app/dashboard/exam-create/page.tsx:281)"}, "properties": {"repobilityId": "ce09ab40f7ff1736", "scanner": "scanner-primary", "fingerprint": "40b3e14acc17631c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9b33fb06a97a9996", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams/school-filter-options (src/app/dashboard/exam-create/page.tsx:307)"}, "properties": {"repobilityId": "d0fc6397336762c9", "scanner": "scanner-primary", "fingerprint": "9b33fb06a97a9996", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7aadcd0ce2d7ee72", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams/${selectedSchoolExamId} (src/app/dashboard/exam-create/page.tsx:336)"}, "properties": {"repobilityId": "b3eba75b22171cc8", "scanner": "scanner-primary", "fingerprint": "7aadcd0ce2d7ee72", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b9bfa4b9f3069c27", "level": "error", "message": {"text": "Dangling fetch: GET /api/book-groups (src/app/dashboard/exam-create/page.tsx:369)"}, "properties": {"repobilityId": "568c61ad0e14fc80", "scanner": "scanner-primary", "fingerprint": "b9bfa4b9f3069c27", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-99ae9412340c0fd9", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams?is_diagnostic=false (src/app/dashboard/exam-create/page.tsx:370)"}, "properties": {"repobilityId": "a11a4a7dcaff4e31", "scanner": "scanner-primary", "fingerprint": "99ae9412340c0fd9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c4693cf159e07734", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams?is_diagnostic=false (src/app/dashboard/exam-create/page.tsx:401)"}, "properties": {"repobilityId": "60b8f221fc0596d8", "scanner": "scanner-primary", "fingerprint": "c4693cf159e07734", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9fd8ed50fd9f1ef6", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams/${selectedMockExamId} (src/app/dashboard/exam-create/page.tsx:445)"}, "properties": {"repobilityId": "287f82234f338a0b", "scanner": "scanner-primary", "fingerprint": "9fd8ed50fd9f1ef6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6ec00d8775f1860c", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams/${selectedTextbookExamId} (src/app/dashboard/exam-create/page.tsx:478)"}, "properties": {"repobilityId": "4de890d75f181d7b", "scanner": "scanner-primary", "fingerprint": "6ec00d8775f1860c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-98915a07a86b5207", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams/${selectedDiagExamId} (src/app/dashboard/exam-create/page.tsx:511)"}, "properties": {"repobilityId": "3774eeba636362c3", "scanner": "scanner-primary", "fingerprint": "98915a07a86b5207", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c40d47ad30a22b22", "level": "error", "message": {"text": "Dangling fetch: GET /api/problems/search?${params.toString()} (src/app/dashboard/exam-create/page.tsx:547)"}, "properties": {"repobilityId": "8362a1e36ee00593", "scanner": "scanner-primary", "fingerprint": "c40d47ad30a22b22", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3926e8307b0c8087", "level": "error", "message": {"text": "Dangling fetch: POST /api/exams/create-from-problems (src/app/dashboard/exam-create/page.tsx:1930)"}, "properties": {"repobilityId": "adab8b834ebde034", "scanner": "scanner-primary", "fingerprint": "3926e8307b0c8087", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0402afc0098993ef", "level": "error", "message": {"text": "Dangling fetch: GET /api/users/students (src/app/dashboard/prescription/page.tsx:131)"}, "properties": {"repobilityId": "191d1e59cdd9c1d0", "scanner": "scanner-primary", "fingerprint": "0402afc0098993ef", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ede50ef0c27b7f5f", "level": "error", "message": {"text": "Dangling fetch: GET /api/students/${student.id}/analytics (src/app/dashboard/prescription/page.tsx:200)"}, "properties": {"repobilityId": "26925a18950ec415", "scanner": "scanner-primary", "fingerprint": "ede50ef0c27b7f5f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5082069a73f4094c", "level": "error", "message": {"text": "Dangling fetch: POST /api/parent/issue (src/app/dashboard/prescription/page.tsx:553)"}, "properties": {"repobilityId": "714d610936510f12", "scanner": "scanner-primary", "fingerprint": "5082069a73f4094c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7b599ef8497e87b1", "level": "error", "message": {"text": "Dangling fetch: GET /api/diagnostics/analytics (src/app/dashboard/prescription/analytics/page.tsx:83)"}, "properties": {"repobilityId": "56b6f29646eada62", "scanner": "scanner-primary", "fingerprint": "7b599ef8497e87b1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5c9238f46a85058b", "level": "error", "message": {"text": "Dangling fetch: GET /api/diagnostics/exam-sets (src/app/dashboard/prescription/report/page.tsx:43)"}, "properties": {"repobilityId": "12dcf1e6dabdbc2a", "scanner": "scanner-primary", "fingerprint": "5c9238f46a85058b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4968ddc34874ade8", "level": "error", "message": {"text": "Dangling fetch: GET /api/users/students (src/app/dashboard/prescription/report/page.tsx:70)"}, "properties": {"repobilityId": "10f438bb18e25ff0", "scanner": "scanner-primary", "fingerprint": "4968ddc34874ade8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-20b47319589942b4", "level": "error", "message": {"text": "Dangling fetch: GET /api/diagnostics/comprehensive-report?${qs} (src/app/dashboard/prescription/report/page.tsx:100)"}, "properties": {"repobilityId": "0f388a442e0009e9", "scanner": "scanner-primary", "fingerprint": "20b47319589942b4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f0c18558d67eb585", "level": "error", "message": {"text": "Dangling fetch: POST /api/diagnostics/report/issue (src/app/dashboard/prescription/report/page.tsx:252)"}, "properties": {"repobilityId": "0fd6555f7fc4f2ed", "scanner": "scanner-primary", "fingerprint": "f0c18558d67eb585", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0052ba9edd56f034", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/exams/${examId} (src/app/dashboard/cloud/CloudListClient.tsx:993)"}, "properties": {"repobilityId": "4d63639f342a5cbd", "scanner": "scanner-primary", "fingerprint": "0052ba9edd56f034", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e8923f945ca812ac", "level": "error", "message": {"text": "Dangling fetch: GET /api/book-groups${subjectParam} (src/app/dashboard/cloud/CloudListClient.tsx:1030)"}, "properties": {"repobilityId": "490da72bfd244676", "scanner": "scanner-primary", "fingerprint": "e8923f945ca812ac", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b1cce26b5831b62b", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams${subjectParam} (src/app/dashboard/cloud/CloudListClient.tsx:1031)"}, "properties": {"repobilityId": "9b14288a5e2d8f9e", "scanner": "scanner-primary", "fingerprint": "b1cce26b5831b62b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b929018bac7659df", "level": "error", "message": {"text": "Dangling fetch: POST /api/book-groups (src/app/dashboard/cloud/CloudListClient.tsx:1154)"}, "properties": {"repobilityId": "eba75ae7a8e7a9c6", "scanner": "scanner-primary", "fingerprint": "b929018bac7659df", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e3c1e71027b0ffd7", "level": "error", "message": {"text": "Dangling fetch: PUT /api/book-groups/${renamingGroupId} (src/app/dashboard/cloud/CloudListClient.tsx:1198)"}, "properties": {"repobilityId": "1517779e936f8baa", "scanner": "scanner-primary", "fingerprint": "e3c1e71027b0ffd7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3433457058803e4c", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/book-groups/${id} (src/app/dashboard/cloud/CloudListClient.tsx:1220)"}, "properties": {"repobilityId": "e8c0b9d98fdb1801", "scanner": "scanner-primary", "fingerprint": "3433457058803e4c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-78316de30b88001d", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/exams/${renamingExamId} (src/app/dashboard/cloud/CloudListClient.tsx:1541)"}, "properties": {"repobilityId": "f1f9a8819b51be88", "scanner": "scanner-primary", "fingerprint": "78316de30b88001d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-80110fa8ac052acc", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/exams/${movingExam.id} (src/app/dashboard/cloud/CloudListClient.tsx:1563)"}, "properties": {"repobilityId": "e37cf222e60d8c21", "scanner": "scanner-primary", "fingerprint": "80110fa8ac052acc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6103543e3a07b1b0", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/exams/${deleteModal.examId} (src/app/dashboard/cloud/CloudListClient.tsx:1607)"}, "properties": {"repobilityId": "c0a0ad0cb42ffc8e", "scanner": "scanner-primary", "fingerprint": "6103543e3a07b1b0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7d4c8d0bfed121e3", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/exams/${exam.id} (src/app/dashboard/cloud/CloudListClient.tsx:1618)"}, "properties": {"repobilityId": "0eb07aaf2bc95fb4", "scanner": "scanner-primary", "fingerprint": "7d4c8d0bfed121e3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3966796818f180e2", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/problems/${problemId} (src/app/dashboard/cloud/[examId]/page.tsx:701)"}, "properties": {"repobilityId": "770b7019064c8a6c", "scanner": "scanner-primary", "fingerprint": "3966796818f180e2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3ff2a8d845636289", "level": "error", "message": {"text": "Dangling fetch: GET /api/problems/${problem.id} (src/app/dashboard/cloud/[examId]/page.tsx:946)"}, "properties": {"repobilityId": "5b2d52e5ec79f122", "scanner": "scanner-primary", "fingerprint": "3ff2a8d845636289", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-72c6735b9f2f23a1", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/problems/${problem.id} (src/app/dashboard/cloud/[examId]/page.tsx:958)"}, "properties": {"repobilityId": "35dda1cf5151da99", "scanner": "scanner-primary", "fingerprint": "72c6735b9f2f23a1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f76531ae617e90d9", "level": "error", "message": {"text": "Dangling fetch: POST /api/figure-corrections (src/app/dashboard/cloud/[examId]/page.tsx:964)"}, "properties": {"repobilityId": "1300b57134204732", "scanner": "scanner-primary", "fingerprint": "f76531ae617e90d9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-68f739a32fd338a2", "level": "error", "message": {"text": "Dangling fetch: POST /api/exams/${examId}/distribute-points (src/app/dashboard/cloud/[examId]/page.tsx:1891)"}, "properties": {"repobilityId": "eaa7281230136af0", "scanner": "scanner-primary", "fingerprint": "68f739a32fd338a2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-15d3dd0b8b0d8acb", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/exams/${examId}/distribute-points (src/app/dashboard/cloud/[examId]/page.tsx:1917)"}, "properties": {"repobilityId": "e80499406dc443ba", "scanner": "scanner-primary", "fingerprint": "15d3dd0b8b0d8acb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7b04b5a2623cfdb2", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams/${examId}/batch-solutions (src/app/dashboard/cloud/[examId]/page.tsx:2509)"}, "properties": {"repobilityId": "14a24e4aabc86d26", "scanner": "scanner-primary", "fingerprint": "7b04b5a2623cfdb2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-758a97c1009e20cc", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams/${examId}/batch-solutions (src/app/dashboard/cloud/[examId]/page.tsx:2565)"}, "properties": {"repobilityId": "7143e189d2757386", "scanner": "scanner-primary", "fingerprint": "758a97c1009e20cc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b8dd80e3cdfd5a20", "level": "error", "message": {"text": "Dangling fetch: POST /api/exams/${examId}/distribute-points (src/app/dashboard/cloud/[examId]/page.tsx:2761)"}, "properties": {"repobilityId": "e0e2a4827356744b", "scanner": "scanner-primary", "fingerprint": "b8dd80e3cdfd5a20", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a64dee6629eac065", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/exams/${examId}/distribute-points (src/app/dashboard/cloud/[examId]/page.tsx:2788)"}, "properties": {"repobilityId": "3573ea0a5ecb8d30", "scanner": "scanner-primary", "fingerprint": "a64dee6629eac065", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4c6007f75a8bfcf1", "level": "error", "message": {"text": "Dangling fetch: POST /api/exams/${examId}/batch-solutions (src/app/dashboard/cloud/[examId]/page.tsx:2947)"}, "properties": {"repobilityId": "2fe0d29a47fb8edf", "scanner": "scanner-primary", "fingerprint": "4c6007f75a8bfcf1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e140c14af76d848d", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/exams/${examId} (src/app/dashboard/cloud/[examId]/page.tsx:3268)"}, "properties": {"repobilityId": "ff820307d04b26fd", "scanner": "scanner-primary", "fingerprint": "e140c14af76d848d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2cdb39c3b60962b1", "level": "error", "message": {"text": "Dangling fetch: GET /api/problems/${diagramBrowserProblem.id} (src/app/dashboard/cloud/[examId]/page.tsx:3320)"}, "properties": {"repobilityId": "15cf35f3f5b62211", "scanner": "scanner-primary", "fingerprint": "2cdb39c3b60962b1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-adc43f5ff4a86f56", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/problems/${diagramBrowserProblem.id} (src/app/dashboard/cloud/[examId]/page.tsx:3347)"}, "properties": {"repobilityId": "f03da30c989d6d3e", "scanner": "scanner-primary", "fingerprint": "adc43f5ff4a86f56", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-eb13f0a3656e0799", "level": "error", "message": {"text": "Dangling fetch: POST /api/figure-corrections (src/app/dashboard/cloud/[examId]/page.tsx:3362)"}, "properties": {"repobilityId": "34b83a3f1f7886c4", "scanner": "scanner-primary", "fingerprint": "eb13f0a3656e0799", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-966dd9c9248392a9", "level": "error", "message": {"text": "Dangling fetch: POST /api/problems/${problem.id}/generate-figure (src/app/dashboard/cloud/[examId]/page.tsx:3402)"}, "properties": {"repobilityId": "0fdb4100a23dd0a7", "scanner": "scanner-primary", "fingerprint": "966dd9c9248392a9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3c98d387131ad42d", "level": "error", "message": {"text": "Dangling fetch: POST /api/problems/${problem.id}/generate-figure (src/app/dashboard/cloud/[examId]/page.tsx:3444)"}, "properties": {"repobilityId": "c7972e25522476cc", "scanner": "scanner-primary", "fingerprint": "3c98d387131ad42d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ca6d86b9c438a665", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/problems/${problemId} (src/app/dashboard/cloud/[examId]/page.tsx:3521)"}, "properties": {"repobilityId": "01746d74e93bcc4d", "scanner": "scanner-primary", "fingerprint": "ca6d86b9c438a665", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-85e1ac94f35697b6", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/exams/${examId}/problems (src/app/dashboard/cloud/[examId]/page.tsx:3540)"}, "properties": {"repobilityId": "5d4b07d2e8c56baa", "scanner": "scanner-primary", "fingerprint": "85e1ac94f35697b6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4e4285c263b109c4", "level": "error", "message": {"text": "Dangling fetch: POST /api/problems/${problem.id}/delete-figure (src/app/dashboard/cloud/[examId]/page.tsx:3581)"}, "properties": {"repobilityId": "8247baf1343a242f", "scanner": "scanner-primary", "fingerprint": "4e4285c263b109c4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-58ad0280d54bc5ee", "level": "error", "message": {"text": "Dangling fetch: GET /api/problems/${diagramBrowserProblem.id} (src/app/dashboard/cloud/[examId]/page.tsx:3611)"}, "properties": {"repobilityId": "d1b1346abe09f7f4", "scanner": "scanner-primary", "fingerprint": "58ad0280d54bc5ee", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b6d7946b11578c6c", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/problems/${diagramBrowserProblem.id} (src/app/dashboard/cloud/[examId]/page.tsx:3626)"}, "properties": {"repobilityId": "5536c7191dc10d0b", "scanner": "scanner-primary", "fingerprint": "b6d7946b11578c6c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-84cb67bafd8676e8", "level": "error", "message": {"text": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/app/dashboard/cloud/[examId]/page.tsx:3676)"}, "properties": {"repobilityId": "e2f80f1882e6ed9c", "scanner": "scanner-primary", "fingerprint": "84cb67bafd8676e8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4104798525497d14", "level": "error", "message": {"text": "Dangling fetch: GET /api/problems/${problem.id} (src/app/dashboard/cloud/[examId]/page.tsx:3714)"}, "properties": {"repobilityId": "e2968aed18a9238a", "scanner": "scanner-primary", "fingerprint": "4104798525497d14", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-10bebd65f28ad201", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/problems/${problem.id} (src/app/dashboard/cloud/[examId]/page.tsx:3754)"}, "properties": {"repobilityId": "fb70e7b2ec616c78", "scanner": "scanner-primary", "fingerprint": "10bebd65f28ad201", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1ea58ffac2534716", "level": "error", "message": {"text": "Dangling fetch: POST /api/exams/${examId}/sync-answers-from-solutions (src/app/dashboard/cloud/[examId]/page.tsx:3790)"}, "properties": {"repobilityId": "128455351379d0ed", "scanner": "scanner-primary", "fingerprint": "1ea58ffac2534716", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bd21ba3464a0bd7c", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/exams/${examId}/reorder (src/app/dashboard/cloud/[examId]/page.tsx:3839)"}, "properties": {"repobilityId": "1ff6619151d098e1", "scanner": "scanner-primary", "fingerprint": "bd21ba3464a0bd7c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-957ca5ebdfcb46b7", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/problems/${problemId} (src/app/dashboard/cloud/[examId]/page.tsx:3949)"}, "properties": {"repobilityId": "1029c5e2a4f8503a", "scanner": "scanner-primary", "fingerprint": "957ca5ebdfcb46b7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-157dc1fc44a23a10", "level": "error", "message": {"text": "Dangling fetch: POST /api/exams/${examId}/auto-fix?force=1 (src/app/dashboard/cloud/[examId]/page.tsx:4054)"}, "properties": {"repobilityId": "83fd78a103aeca23", "scanner": "scanner-primary", "fingerprint": "157dc1fc44a23a10", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3e513e8241b4fe30", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/exams/${examId} (src/app/dashboard/cloud/[examId]/page.tsx:4196)"}, "properties": {"repobilityId": "a39fbbeffa14e737", "scanner": "scanner-primary", "fingerprint": "3e513e8241b4fe30", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2ab7bfa0b2e0d8db", "level": "error", "message": {"text": "Dangling fetch: POST /api/exams/${examId}/auto-fix?mode=fix (src/app/dashboard/cloud/[examId]/page.tsx:4323)"}, "properties": {"repobilityId": "25e2fd9ddcbf0e86", "scanner": "scanner-primary", "fingerprint": "2ab7bfa0b2e0d8db", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-39a467911862b271", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/problems/${editModalProblem.id} (src/app/dashboard/cloud/[examId]/page.tsx:4702)"}, "properties": {"repobilityId": "ac6ebf838cd6d085", "scanner": "scanner-primary", "fingerprint": "39a467911862b271", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-032df3ddaae394e3", "level": "error", "message": {"text": "Dangling fetch: GET /api/book-groups (src/app/dashboard/cloud/create-exam/page.tsx:54)"}, "properties": {"repobilityId": "9e10f4c9f0b5d483", "scanner": "scanner-primary", "fingerprint": "032df3ddaae394e3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-86dd413293405fa4", "level": "error", "message": {"text": "Dangling fetch: POST /api/exams/duplicate-check (src/app/dashboard/cloud/folder-import/page.tsx:88)"}, "properties": {"repobilityId": "f8c984b8eb5b172b", "scanner": "scanner-primary", "fingerprint": "86dd413293405fa4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f2c027560dc7f93f", "level": "error", "message": {"text": "Dangling fetch: POST /api/workflow/upload (src/app/dashboard/cloud/folder-import/page.tsx:171)"}, "properties": {"repobilityId": "01cbc061d12c675e", "scanner": "scanner-primary", "fingerprint": "f2c027560dc7f93f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d6f19cfd3d920217", "level": "error", "message": {"text": "Dangling fetch: GET /api/assignments (src/app/dashboard/assignments/page.tsx:59)"}, "properties": {"repobilityId": "d449ccd69c92a3bb", "scanner": "scanner-primary", "fingerprint": "d6f19cfd3d920217", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a1847cc4bd9cc984", "level": "error", "message": {"text": "Dangling fetch: GET /api/users/students (src/app/dashboard/assignments/page.tsx:60)"}, "properties": {"repobilityId": "b1878c77111e36bc", "scanner": "scanner-primary", "fingerprint": "a1847cc4bd9cc984", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9d4c13c02a918b84", "level": "error", "message": {"text": "Dangling fetch: GET /api/corrections/summary (src/app/dashboard/corrections/page.tsx:62)"}, "properties": {"repobilityId": "ad8f347314cb6186", "scanner": "scanner-primary", "fingerprint": "9d4c13c02a918b84", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e2ddbfe0b1416909", "level": "error", "message": {"text": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:1494)"}, "properties": {"repobilityId": "e7c5d1eed3fd76c4", "scanner": "scanner-primary", "fingerprint": "e2ddbfe0b1416909", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7dd6e08fc6e98337", "level": "error", "message": {"text": "Dangling fetch: POST /api/workflow/detect-problems-yolo (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:2676)"}, "properties": {"repobilityId": "f312e88c3e508e59", "scanner": "scanner-primary", "fingerprint": "7dd6e08fc6e98337", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3daf95f227959770", "level": "error", "message": {"text": "Dangling fetch: POST /api/workflow/detect-figures-gpt (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:2692)"}, "properties": {"repobilityId": "61041dda71e36dbe", "scanner": "scanner-primary", "fingerprint": "3daf95f227959770", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7a767876853a83f8", "level": "error", "message": {"text": "Dangling fetch: POST /api/workflow/detect-from-ocr (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3049)"}, "properties": {"repobilityId": "e0625697d7829efe", "scanner": "scanner-primary", "fingerprint": "7a767876853a83f8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-da933c6a0cb8f2a7", "level": "error", "message": {"text": "Dangling fetch: POST /api/workflow/detect-problems-yolo (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3332)"}, "properties": {"repobilityId": "03f344783d7b606e", "scanner": "scanner-primary", "fingerprint": "da933c6a0cb8f2a7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6e687ef113c652b1", "level": "error", "message": {"text": "Dangling fetch: GET /api/workflow/upload?jobId=${jobId} (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3639)"}, "properties": {"repobilityId": "295a1434dd983f1c", "scanner": "scanner-primary", "fingerprint": "6e687ef113c652b1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5dc4ca06fe2ee1d8", "level": "error", "message": {"text": "Dangling fetch: POST /api/storage/upload-image (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3754)"}, "properties": {"repobilityId": "d024bc8efd2fba9f", "scanner": "scanner-primary", "fingerprint": "5dc4ca06fe2ee1d8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0718a5d4a0837763", "level": "error", "message": {"text": "Dangling fetch: PUT /api/workflow/upload (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:3905)"}, "properties": {"repobilityId": "019bc6b3867588fe", "scanner": "scanner-primary", "fingerprint": "0718a5d4a0837763", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-97e82f11931bb204", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/problems/${selectedProblem.problemId} (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:4113)"}, "properties": {"repobilityId": "53617a0d2cfafcba", "scanner": "scanner-primary", "fingerprint": "97e82f11931bb204", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9584f9cbc21ea7fe", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/problems/${problem.problemId} (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:4155)"}, "properties": {"repobilityId": "d0b811e460d4bab5", "scanner": "scanner-primary", "fingerprint": "9584f9cbc21ea7fe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-66c9c6ee7b0d66f9", "level": "error", "message": {"text": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:4702)"}, "properties": {"repobilityId": "47a57b6e1fa61190", "scanner": "scanner-primary", "fingerprint": "66c9c6ee7b0d66f9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cac926d113332bcc", "level": "error", "message": {"text": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:4849)"}, "properties": {"repobilityId": "3de5d46323adc282", "scanner": "scanner-primary", "fingerprint": "cac926d113332bcc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-572b97b5097af184", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/problems/${dbProblemId} (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:4940)"}, "properties": {"repobilityId": "c1b692de96705741", "scanner": "scanner-primary", "fingerprint": "572b97b5097af184", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4ea3744ffa56fbd6", "level": "error", "message": {"text": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:5058)"}, "properties": {"repobilityId": "2e3c1d9c32f97e99", "scanner": "scanner-primary", "fingerprint": "4ea3744ffa56fbd6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ff3df6278ed9d21f", "level": "error", "message": {"text": "Dangling fetch: POST /api/workflow/reanalyze-crop (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:5093)"}, "properties": {"repobilityId": "ad838c451bed238d", "scanner": "scanner-primary", "fingerprint": "ff3df6278ed9d21f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-161ae211029c5fd1", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/problems/${editingProblem.problemId} (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:5529)"}, "properties": {"repobilityId": "f47abaa6ad009ef9", "scanner": "scanner-primary", "fingerprint": "161ae211029c5fd1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-84d0c5be1db483a2", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/problems/${editingProblem.problemId} (src/app/dashboard/workflow/analyze/[jobId]/page.tsx:5597)"}, "properties": {"repobilityId": "aac941822b22bdea", "scanner": "scanner-primary", "fingerprint": "84d0c5be1db483a2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9efea89364ceee70", "level": "error", "message": {"text": "Dangling fetch: GET /api/assignments (src/app/dashboard/class/page.tsx:38)"}, "properties": {"repobilityId": "1eccae51575ec706", "scanner": "scanner-primary", "fingerprint": "9efea89364ceee70", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-68305838e517f0cb", "level": "error", "message": {"text": "Dangling fetch: GET /api/users/students (src/app/dashboard/class/page.tsx:39)"}, "properties": {"repobilityId": "d6ac31028ed76664", "scanner": "scanner-primary", "fingerprint": "68305838e517f0cb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-01d90dde508305cb", "level": "error", "message": {"text": "Dangling fetch: GET /api/problems/search?${params} (src/app/dashboard/create/page.tsx:422)"}, "properties": {"repobilityId": "0c0a214f1405ab46", "scanner": "scanner-primary", "fingerprint": "01d90dde508305cb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-eeb47428d0406fd9", "level": "error", "message": {"text": "Dangling fetch: GET /api/mathsecr/tree (src/app/dashboard/create/page.tsx:1031)"}, "properties": {"repobilityId": "5fcf805f27014d70", "scanner": "scanner-primary", "fingerprint": "eeb47428d0406fd9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-97f6390389c5f305", "level": "error", "message": {"text": "Dangling fetch: GET /api/mathsecr/tree?subject=${selectedSubjectCode} (src/app/dashboard/create/page.tsx:1052)"}, "properties": {"repobilityId": "a79c99e6d26eca65", "scanner": "scanner-primary", "fingerprint": "97f6390389c5f305", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d863d4c87f89dd83", "level": "error", "message": {"text": "Dangling fetch: POST /api/exams/generate (src/app/dashboard/create/page.tsx:1272)"}, "properties": {"repobilityId": "e8e0752dd7d36c2f", "scanner": "scanner-primary", "fingerprint": "d863d4c87f89dd83", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b44f6b21a296b0f9", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams/${data.examId} (src/app/dashboard/create/page.tsx:1285)"}, "properties": {"repobilityId": "03774688dd7447d4", "scanner": "scanner-primary", "fingerprint": "b44f6b21a296b0f9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-07749884a16ee5bf", "level": "error", "message": {"text": "Dangling fetch: GET /api/mathsecr/tree (src/app/dashboard/problem-bank/page.tsx:139)"}, "properties": {"repobilityId": "752ba14da7147702", "scanner": "scanner-primary", "fingerprint": "07749884a16ee5bf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6fca77ac924348e3", "level": "error", "message": {"text": "Dangling fetch: GET /api/mathsecr/tree?subject=${selectedSubject} (src/app/dashboard/problem-bank/page.tsx:150)"}, "properties": {"repobilityId": "a86b94a2d7c8336e", "scanner": "scanner-primary", "fingerprint": "6fca77ac924348e3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-26e5e20c1ab197fb", "level": "error", "message": {"text": "Dangling fetch: GET /api/problems/search?${params.toString()} (src/app/dashboard/problem-bank/page.tsx:173)"}, "properties": {"repobilityId": "c340579b6ca8f804", "scanner": "scanner-primary", "fingerprint": "26e5e20c1ab197fb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-aa11521446e8be01", "level": "error", "message": {"text": "Dangling fetch: POST /api/exams/generate (src/app/dashboard/problem-bank/page.tsx:247)"}, "properties": {"repobilityId": "cdb91b4b3340e7e7", "scanner": "scanner-primary", "fingerprint": "aa11521446e8be01", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9df4e61c9f062c8e", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams?is_diagnostic=true (src/app/dashboard/materials/page.tsx:543)"}, "properties": {"repobilityId": "a9a8e4e5a58f7fe0", "scanner": "scanner-primary", "fingerprint": "9df4e61c9f062c8e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-46efefded9236f43", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams/${material.id}/breakdown (src/app/dashboard/materials/page.tsx:655)"}, "properties": {"repobilityId": "71368e20b113c891", "scanner": "scanner-primary", "fingerprint": "46efefded9236f43", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5a5a5d0d9b379790", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/diagram-images?id=${imageId} (src/app/dashboard/materials/diagrams/DiagramsClient.tsx:71)"}, "properties": {"repobilityId": "12f4aaadc4ceadc5", "scanner": "scanner-primary", "fingerprint": "5a5a5d0d9b379790", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ba4870310977b00e", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/diagram-images?source=${encodeURIComponent(sourceName)} (src/app/dashboard/materials/diagrams/DiagramsClient.tsx:85)"}, "properties": {"repobilityId": "cf9f01ae5006493b", "scanner": "scanner-primary", "fingerprint": "ba4870310977b00e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-027bc13eee513cd5", "level": "error", "message": {"text": "Dangling fetch: POST /api/image-pipeline/tag (src/app/dashboard/materials/diagrams/DiagramsClient.tsx:112)"}, "properties": {"repobilityId": "218228d81e8d8c6c", "scanner": "scanner-primary", "fingerprint": "027bc13eee513cd5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ff879193d2f10fc5", "level": "error", "message": {"text": "Dangling fetch: GET /api/diagram-images?${params} (src/app/dashboard/materials/diagrams/DiagramsClient.tsx:143)"}, "properties": {"repobilityId": "65b85652b83a46ef", "scanner": "scanner-primary", "fingerprint": "ff879193d2f10fc5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-83138833ea9e8d74", "level": "error", "message": {"text": "Dangling fetch: GET /api/image-pipeline/health (src/app/dashboard/materials/diagrams/DiagramsClient.tsx:167)"}, "properties": {"repobilityId": "5b663767e277c589", "scanner": "scanner-primary", "fingerprint": "83138833ea9e8d74", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7d8270fc3eb8b1a2", "level": "error", "message": {"text": "Dangling fetch: GET /api/book-groups (src/app/dashboard/exam-management/page.tsx:106)"}, "properties": {"repobilityId": "9dd565980890f713", "scanner": "scanner-primary", "fingerprint": "7d8270fc3eb8b1a2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-20bb03d4e5601553", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/exams/${selectedExamId} (src/app/dashboard/exam-management/page.tsx:681)"}, "properties": {"repobilityId": "db9882b4246e1808", "scanner": "scanner-primary", "fingerprint": "20bb03d4e5601553", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-01dc189f5265f269", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/exams/${selectedExamId} (src/app/dashboard/exam-management/page.tsx:748)"}, "properties": {"repobilityId": "82ebca098430c6a2", "scanner": "scanner-primary", "fingerprint": "01dc189f5265f269", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8cc2ad72a2b871fb", "level": "error", "message": {"text": "Dangling fetch: POST /api/exams/${selectedExamId}/create-similar (src/app/dashboard/exam-management/page.tsx:770)"}, "properties": {"repobilityId": "27558dbe03e7e2c4", "scanner": "scanner-primary", "fingerprint": "8cc2ad72a2b871fb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ee6262dbca075d52", "level": "error", "message": {"text": "Dangling fetch: GET /api/sessions?exam_id=${examId}&limit=200 (src/app/dashboard/exam-management/page.tsx:796)"}, "properties": {"repobilityId": "1b44cc7af1c1aa83", "scanner": "scanner-primary", "fingerprint": "ee6262dbca075d52", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fc7682227de6db71", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams/${selectedExamId}/export-hwp?withAnswer=true&withSolutions=true&columns=${columns}&gap=${gap}${perPageQ} (src/app/dashboard/exam-management/page.tsx:844)"}, "properties": {"repobilityId": "2943bdd3b01df7cb", "scanner": "scanner-primary", "fingerprint": "fc7682227de6db71", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b14fe9856f11694c", "level": "error", "message": {"text": "Dangling fetch: POST /api/problems/${unsolved[i].id}/generate-solution (src/app/dashboard/exam-management/page.tsx:891)"}, "properties": {"repobilityId": "eaf24c2065e18e09", "scanner": "scanner-primary", "fingerprint": "b14fe9856f11694c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4452ea2cf4f3d256", "level": "error", "message": {"text": "Dangling fetch: GET /api/reports/by-school (src/app/dashboard/reports/page.tsx:65)"}, "properties": {"repobilityId": "12153f7fb092b4e2", "scanner": "scanner-primary", "fingerprint": "4452ea2cf4f3d256", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-99155481eec00652", "level": "error", "message": {"text": "Dangling fetch: GET /api/reports/${encodeURIComponent(schoolParam)} (src/app/dashboard/reports/[school]/page.tsx:91)"}, "properties": {"repobilityId": "acdb027964922c2f", "scanner": "scanner-primary", "fingerprint": "99155481eec00652", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e798322c0f5d6eef", "level": "error", "message": {"text": "Dangling fetch: GET /api/reports/by-school (src/app/dashboard/reports/aggregate/page.tsx:156)"}, "properties": {"repobilityId": "df76569d2ab01594", "scanner": "scanner-primary", "fingerprint": "e798322c0f5d6eef", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-08950b598ed4821c", "level": "error", "message": {"text": "Dangling fetch: GET /api/reports/aggregate?${buildQueryString()} (src/app/dashboard/reports/aggregate/page.tsx:184)"}, "properties": {"repobilityId": "912fc9247ca90172", "scanner": "scanner-primary", "fingerprint": "08950b598ed4821c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-08f94ac0714f445b", "level": "error", "message": {"text": "Dangling fetch: GET /api/me/active-institute (src/app/dashboard/exam-analysis/[examId]/StudentsTab.tsx:89)"}, "properties": {"repobilityId": "abfe838adc358a1c", "scanner": "scanner-primary", "fingerprint": "08f94ac0714f445b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c6779b5135b9b772", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams/${examId}/students (src/app/dashboard/exam-analysis/[examId]/StudentsTab.tsx:110)"}, "properties": {"repobilityId": "9e000dc4703649c7", "scanner": "scanner-primary", "fingerprint": "c6779b5135b9b772", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8b5718ee48de6986", "level": "error", "message": {"text": "Dangling fetch: POST /api/exams/${examId}/student-responses (src/app/dashboard/exam-analysis/[examId]/StudentsTab.tsx:143)"}, "properties": {"repobilityId": "002fac80171c09c8", "scanner": "scanner-primary", "fingerprint": "8b5718ee48de6986", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-df5ea9c351a80df4", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/exams/${examId}/students?sessionId=${encodeURIComponent(s.sessionId)} (src/app/dashboard/exam-analysis/[examId]/StudentsTab.tsx:169)"}, "properties": {"repobilityId": "95e4930b198292a9", "scanner": "scanner-primary", "fingerprint": "df5ea9c351a80df4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-de2d3895b2f0ae08", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams/${examId}/ai-analysis (src/app/dashboard/exam-analysis/[examId]/page.tsx:99)"}, "properties": {"repobilityId": "3b24c8efe2366fcc", "scanner": "scanner-primary", "fingerprint": "de2d3895b2f0ae08", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a097ae224bbe7937", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams/${examId}/share (src/app/dashboard/exam-analysis/[examId]/page.tsx:122)"}, "properties": {"repobilityId": "21f6ab7270a9c1b1", "scanner": "scanner-primary", "fingerprint": "a097ae224bbe7937", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3b75fa7f4038cdc5", "level": "error", "message": {"text": "Dangling fetch: POST /api/exams/${examId}/share (src/app/dashboard/exam-analysis/[examId]/page.tsx:128)"}, "properties": {"repobilityId": "4efd65e3b71cfe70", "scanner": "scanner-primary", "fingerprint": "3b75fa7f4038cdc5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-623ddd484d670f2e", "level": "error", "message": {"text": "Dangling fetch: POST /api/exams/${examId}/ai-analysis (src/app/dashboard/exam-analysis/[examId]/page.tsx:156)"}, "properties": {"repobilityId": "0b8530c9a993ad87", "scanner": "scanner-primary", "fingerprint": "623ddd484d670f2e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bc866a316dda73ec", "level": "error", "message": {"text": "Dangling fetch: GET /api/mathsecr/tree?subject=${code} (src/app/dashboard/exam-analysis/[examId]/page.tsx:191)"}, "properties": {"repobilityId": "317402eba16ce5b8", "scanner": "scanner-primary", "fingerprint": "bc866a316dda73ec", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2cfa7d9ae80da717", "level": "error", "message": {"text": "Dangling fetch: POST /api/exams/${examId}/students/${studentId}/share (src/app/dashboard/exam-analysis/[examId]/students/[studentId]/page.tsx:653)"}, "properties": {"repobilityId": "c11536b369d7e724", "scanner": "scanner-primary", "fingerprint": "2cfa7d9ae80da717", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d2bb5ede28d266fe", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/exams/${examId}/students/${studentId}/share (src/app/dashboard/exam-analysis/[examId]/students/[studentId]/page.tsx:693)"}, "properties": {"repobilityId": "2983d80f20597352", "scanner": "scanner-primary", "fingerprint": "d2bb5ede28d266fe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5ff85d240221975b", "level": "error", "message": {"text": "Dangling fetch: POST /api/exams/${examId}/students/${studentId}/report/ai-comment (src/app/dashboard/exam-analysis/[examId]/students/[studentId]/page.tsx:716)"}, "properties": {"repobilityId": "2a2d7707756cf4d0", "scanner": "scanner-primary", "fingerprint": "5ff85d240221975b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-102f3a30d4bd23ff", "level": "error", "message": {"text": "Dangling fetch: PUT /api/exams/${examId}/students/${studentId}/report/ai-comment (src/app/dashboard/exam-analysis/[examId]/students/[studentId]/page.tsx:753)"}, "properties": {"repobilityId": "e7fbbc578290c06a", "scanner": "scanner-primary", "fingerprint": "102f3a30d4bd23ff", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-af9ed3ea342f999d", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams/${examId}/students/${studentId}/report (src/app/dashboard/exam-analysis/[examId]/students/[studentId]/page.tsx:804)"}, "properties": {"repobilityId": "37283c52741f3f11", "scanner": "scanner-primary", "fingerprint": "af9ed3ea342f999d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7a25df036e3bd25c", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/users/backfill-names (src/app/dashboard/grading/page.tsx:142)"}, "properties": {"repobilityId": "c9174497bbc20d66", "scanner": "scanner-primary", "fingerprint": "7a25df036e3bd25c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c3f5a09705dc527e", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/sessions/${sessionId} (src/app/dashboard/grading/page.tsx:168)"}, "properties": {"repobilityId": "512a9b6ceb5ab6a3", "scanner": "scanner-primary", "fingerprint": "c3f5a09705dc527e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-101246f4fd70d2b0", "level": "error", "message": {"text": "Dangling fetch: GET /api/sessions?${qs.toString()} (src/app/dashboard/grading/page.tsx:195)"}, "properties": {"repobilityId": "ca5499cba8eda566", "scanner": "scanner-primary", "fingerprint": "101246f4fd70d2b0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-acd8626b3e63be7b", "level": "error", "message": {"text": "Dangling fetch: GET /api/users/students (src/app/dashboard/grading/page.tsx:211)"}, "properties": {"repobilityId": "a5bd7aea5760a8d4", "scanner": "scanner-primary", "fingerprint": "acd8626b3e63be7b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6d1989597705fa5d", "level": "error", "message": {"text": "Dangling fetch: GET /api/users/students (src/app/tutor/analytics/page.tsx:129)"}, "properties": {"repobilityId": "c1e27f23c9d86d75", "scanner": "scanner-primary", "fingerprint": "6d1989597705fa5d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-56a9ba800a183506", "level": "error", "message": {"text": "Dangling fetch: GET /api/students/${selectedStudent}/analytics (src/app/tutor/analytics/page.tsx:153)"}, "properties": {"repobilityId": "885ed19bafb94372", "scanner": "scanner-primary", "fingerprint": "56a9ba800a183506", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-68f2659162883355", "level": "error", "message": {"text": "Dangling fetch: GET /api/classes (src/app/tutor/students/page.tsx:89)"}, "properties": {"repobilityId": "95612177384fde0b", "scanner": "scanner-primary", "fingerprint": "68f2659162883355", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7339caf68a550511", "level": "error", "message": {"text": "Dangling fetch: POST /api/students (src/app/tutor/students/page.tsx:146)"}, "properties": {"repobilityId": "c96ce2f4a6462fef", "scanner": "scanner-primary", "fingerprint": "7339caf68a550511", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5c36546dadc2eb0b", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/students/${editingStudent.id} (src/app/tutor/students/page.tsx:172)"}, "properties": {"repobilityId": "bdc088622bf039d7", "scanner": "scanner-primary", "fingerprint": "5c36546dadc2eb0b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-eb37e9e2aee69337", "level": "error", "message": {"text": "Dangling fetch: POST /api/students/${s.id}/reset-password (src/app/tutor/students/page.tsx:196)"}, "properties": {"repobilityId": "a8425863049e0ea4", "scanner": "scanner-primary", "fingerprint": "eb37e9e2aee69337", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-05b4900c417d0068", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/students/${s.id} (src/app/tutor/students/page.tsx:208)"}, "properties": {"repobilityId": "fe6cfdc5867f13a6", "scanner": "scanner-primary", "fingerprint": "05b4900c417d0068", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8e17a0d06c4a108e", "level": "error", "message": {"text": "Dangling fetch: GET /api/students/${s.id}/exam-scores (src/app/tutor/students/page.tsx:223)"}, "properties": {"repobilityId": "8de036fab36a11ae", "scanner": "scanner-primary", "fingerprint": "8e17a0d06c4a108e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cbe3d7d89e606081", "level": "error", "message": {"text": "Dangling fetch: PUT /api/students/${examStudent.id}/exam-scores (src/app/tutor/students/page.tsx:266)"}, "properties": {"repobilityId": "afef9586389b3127", "scanner": "scanner-primary", "fingerprint": "cbe3d7d89e606081", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7a25d3a6fc78e85c", "level": "error", "message": {"text": "Dangling fetch: GET /api/users/students (src/app/tutor/students/page.tsx:347)"}, "properties": {"repobilityId": "945c4f40386ababb", "scanner": "scanner-primary", "fingerprint": "7a25d3a6fc78e85c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4d1d9fd1c5ae5202", "level": "error", "message": {"text": "Dangling fetch: POST /api/students (src/app/tutor/students/page.tsx:1025)"}, "properties": {"repobilityId": "8dea935430b01a59", "scanner": "scanner-primary", "fingerprint": "4d1d9fd1c5ae5202", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3788cf4573ab501f", "level": "error", "message": {"text": "Dangling fetch: GET /api/classes (src/app/tutor/classes/page.tsx:53)"}, "properties": {"repobilityId": "f34584a8a2d7a398", "scanner": "scanner-primary", "fingerprint": "3788cf4573ab501f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-67245a7f57784f96", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/classes/${classId} (src/app/tutor/classes/page.tsx:80)"}, "properties": {"repobilityId": "ee6918df60207ee1", "scanner": "scanner-primary", "fingerprint": "67245a7f57784f96", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7ea8b0de2ad2f185", "level": "error", "message": {"text": "Dangling fetch: GET /api/classes/${classId}/enrollments (src/app/tutor/classes/[id]/page.tsx:110)"}, "properties": {"repobilityId": "9bacfbbdd8e974d1", "scanner": "scanner-primary", "fingerprint": "7ea8b0de2ad2f185", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9606be309cc671a8", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/enrollments/${enrollmentId} (src/app/tutor/classes/[id]/page.tsx:128)"}, "properties": {"repobilityId": "a559e55119b2cddc", "scanner": "scanner-primary", "fingerprint": "9606be309cc671a8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3995af89448c973b", "level": "error", "message": {"text": "Dangling fetch: GET /api/users/students (src/app/tutor/classes/[id]/page.tsx:360)"}, "properties": {"repobilityId": "39151cc5f2c8393e", "scanner": "scanner-primary", "fingerprint": "3995af89448c973b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-df0c1fbe33773cb3", "level": "error", "message": {"text": "Dangling fetch: POST /api/classes/${classId}/enrollments (src/app/tutor/classes/[id]/page.tsx:401)"}, "properties": {"repobilityId": "4c28952260a235a0", "scanner": "scanner-primary", "fingerprint": "df0c1fbe33773cb3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-75bcb30256c6d2bf", "level": "error", "message": {"text": "Dangling fetch: POST /api/classes/${classId}/students (src/app/tutor/classes/[id]/page.tsx:551)"}, "properties": {"repobilityId": "8632934da0801400", "scanner": "scanner-primary", "fingerprint": "75bcb30256c6d2bf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-685737df343f7d85", "level": "error", "message": {"text": "Dangling fetch: GET /api/classes/${classId} (src/app/tutor/classes/[id]/edit/page.tsx:78)"}, "properties": {"repobilityId": "f118698c827b9428", "scanner": "scanner-primary", "fingerprint": "685737df343f7d85", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c7642753c36cc0ff", "level": "error", "message": {"text": "Dangling fetch: PUT /api/classes/${classId} (src/app/tutor/classes/[id]/edit/page.tsx:115)"}, "properties": {"repobilityId": "dbe5625da4c04456", "scanner": "scanner-primary", "fingerprint": "c7642753c36cc0ff", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a417ac84ee051c98", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/enrollments/${student.enrollmentId} (src/app/tutor/classes/[id]/edit/page.tsx:140)"}, "properties": {"repobilityId": "7f1275703c1e46a5", "scanner": "scanner-primary", "fingerprint": "a417ac84ee051c98", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c6bacec16ea2cdfc", "level": "error", "message": {"text": "Dangling fetch: POST /api/workflow/grading (src/app/tutor/workflow/page.tsx:188)"}, "properties": {"repobilityId": "109db14d02bec574", "scanner": "scanner-primary", "fingerprint": "c6bacec16ea2cdfc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0201221372b6a225", "level": "error", "message": {"text": "Dangling fetch: GET /api/sessions/${sessionId} (src/app/grade/[session_id]/page.tsx:90)"}, "properties": {"repobilityId": "5d60a13816a7c9a4", "scanner": "scanner-primary", "fingerprint": "0201221372b6a225", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6c4fcf07551cb6f5", "level": "error", "message": {"text": "Dangling fetch: POST /api/session-results (src/app/grade/[session_id]/page.tsx:135)"}, "properties": {"repobilityId": "76553783aa167b8c", "scanner": "scanner-primary", "fingerprint": "6c4fcf07551cb6f5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a2d85cacdcd846a9", "level": "error", "message": {"text": "Dangling fetch: POST /api/sessions/${sessionId}/complete (src/app/grade/[session_id]/page.tsx:224)"}, "properties": {"repobilityId": "7d501e641d37c3b8", "scanner": "scanner-primary", "fingerprint": "a2d85cacdcd846a9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0c771f58b2849cb1", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/users?limit=500 (src/app/admin/users/page.tsx:55)"}, "properties": {"repobilityId": "d23db354d3ec12b2", "scanner": "scanner-primary", "fingerprint": "0c771f58b2849cb1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5be59d1ccd299c3c", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/tenancy/organizations (src/app/admin/users/page.tsx:56)"}, "properties": {"repobilityId": "05b2d5b2b20f5908", "scanner": "scanner-primary", "fingerprint": "5be59d1ccd299c3c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-38a280b519910c5a", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/tenancy/institutes (src/app/admin/users/page.tsx:57)"}, "properties": {"repobilityId": "42b1cedb00f91cd6", "scanner": "scanner-primary", "fingerprint": "38a280b519910c5a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-da220bf048b18cf3", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/admin/tenancy/users/${editingId} (src/app/admin/users/page.tsx:89)"}, "properties": {"repobilityId": "28bb49886f294dc5", "scanner": "scanner-primary", "fingerprint": "da220bf048b18cf3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a356746b1ffec160", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/objective-answer-broken?limit=${pageSize}&offset=${offset} (src/app/admin/answer-fix/page.tsx:46)"}, "properties": {"repobilityId": "da36c757f507b802", "scanner": "scanner-primary", "fingerprint": "a356746b1ffec160", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-baa4263d9d459898", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/admin/objective-answer-fix (src/app/admin/answer-fix/page.tsx:68)"}, "properties": {"repobilityId": "b6a59c2e42da814e", "scanner": "scanner-primary", "fingerprint": "baa4263d9d459898", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-190dea80d4f41c72", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/admin/objective-answer-fix (src/app/admin/answer-fix/page.tsx:111)"}, "properties": {"repobilityId": "c0f46325a9140e6b", "scanner": "scanner-primary", "fingerprint": "190dea80d4f41c72", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-53d08001794eb923", "level": "error", "message": {"text": "Dangling fetch: GET /api/organization-applications?status=${statusFilter} (src/app/admin/organization-applications/page.tsx:95)"}, "properties": {"repobilityId": "bac0ab8f5f60cb6c", "scanner": "scanner-primary", "fingerprint": "53d08001794eb923", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4baddd4d0b9457a4", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/tenancy/organizations (src/app/admin/organization-applications/page.tsx:96)"}, "properties": {"repobilityId": "4f87db968a86a622", "scanner": "scanner-primary", "fingerprint": "4baddd4d0b9457a4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-95059efc95bef8dc", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/organization-applications/${approving.id} (src/app/admin/organization-applications/page.tsx:155)"}, "properties": {"repobilityId": "4c859147369669e4", "scanner": "scanner-primary", "fingerprint": "95059efc95bef8dc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9876aa115372d68f", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/organization-applications/${rejecting.id} (src/app/admin/organization-applications/page.tsx:175)"}, "properties": {"repobilityId": "f77fea4e8537d2cf", "scanner": "scanner-primary", "fingerprint": "9876aa115372d68f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f79e94ce1c9e6b2b", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/tenancy/organizations (src/app/admin/institutes/page.tsx:55)"}, "properties": {"repobilityId": "36b73becee5e57e0", "scanner": "scanner-primary", "fingerprint": "f79e94ce1c9e6b2b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-406c6828830f5618", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/tenancy/institutes (src/app/admin/institutes/page.tsx:56)"}, "properties": {"repobilityId": "158ecfd3c443ed8a", "scanner": "scanner-primary", "fingerprint": "406c6828830f5618", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3320712c6a905971", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/tenancy/organizations (src/app/admin/institutes/page.tsx:82)"}, "properties": {"repobilityId": "e397d5162e37e9eb", "scanner": "scanner-primary", "fingerprint": "3320712c6a905971", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-974fc2d1783eac47", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/tenancy/institutes (src/app/admin/institutes/page.tsx:99)"}, "properties": {"repobilityId": "5b5f70338fa4a759", "scanner": "scanner-primary", "fingerprint": "974fc2d1783eac47", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-226f331d2d45ac6f", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/admin/tenancy/institutes (src/app/admin/institutes/page.tsx:118)"}, "properties": {"repobilityId": "f5b86ab85be0c255", "scanner": "scanner-primary", "fingerprint": "226f331d2d45ac6f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-86444dc30f4a1b5b", "level": "error", "message": {"text": "Dangling fetch: GET /api/share/student-report/${token} (src/app/share/student-report/[token]/page.tsx:378)"}, "properties": {"repobilityId": "f6d4e05896f0080e", "scanner": "scanner-primary", "fingerprint": "86444dc30f4a1b5b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4b9606b7d6f9c319", "level": "error", "message": {"text": "Dangling fetch: GET /api/reports/aggregate?${sp.toString()} (src/app/share/aggregate/ShareAggregateClient.tsx:159)"}, "properties": {"repobilityId": "253213e2f9bb280e", "scanner": "scanner-primary", "fingerprint": "4b9606b7d6f9c319", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f78a4679fdb69695", "level": "error", "message": {"text": "Dangling fetch: GET /api/share/diagnostic-report/${token} (src/app/share/diagnostic-report/[token]/page.tsx:27)"}, "properties": {"repobilityId": "0af0af3d50b0e413", "scanner": "scanner-primary", "fingerprint": "f78a4679fdb69695", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-364bff2495790a11", "level": "error", "message": {"text": "Dangling fetch: POST /api/rendering-errors (src/lib/error-logger.ts:20)"}, "properties": {"repobilityId": "f08756e9fa279e06", "scanner": "scanner-primary", "fingerprint": "364bff2495790a11", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4db7230ad7ae26fc", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/vision/image-interpreter.ts:1855)"}, "properties": {"repobilityId": "848fecb1848a6b95", "scanner": "scanner-primary", "fingerprint": "4db7230ad7ae26fc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d45c1f344b715b11", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/vision/image-interpreter.ts:1960)"}, "properties": {"repobilityId": "0cd35bdddffd2644", "scanner": "scanner-primary", "fingerprint": "d45c1f344b715b11", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9b99f8c192a1b94a", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/workflow/classify.ts:236)"}, "properties": {"repobilityId": "b57fb2b61cc25f71", "scanner": "scanner-primary", "fingerprint": "9b99f8c192a1b94a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fc9b279b18bb6dd2", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/workflow/classify.ts:275)"}, "properties": {"repobilityId": "b23ebfedb37dde95", "scanner": "scanner-primary", "fingerprint": "fc9b279b18bb6dd2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3f3913339913171a", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/workflow/classify.ts:675)"}, "properties": {"repobilityId": "6af025a6efc9ed6a", "scanner": "scanner-primary", "fingerprint": "3f3913339913171a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4f3661687d416f00", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/workflow/cloud-flow.ts:1594)"}, "properties": {"repobilityId": "6f3706581991c7d7", "scanner": "scanner-primary", "fingerprint": "4f3661687d416f00", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-af756725380162fb", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/workflow/cloud-flow.ts:1671)"}, "properties": {"repobilityId": "55525ec2251d7b46", "scanner": "scanner-primary", "fingerprint": "af756725380162fb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e3be4c817630fa9e", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/workflow/twin-generator.ts:543)"}, "properties": {"repobilityId": "eea3de761e41561a", "scanner": "scanner-primary", "fingerprint": "e3be4c817630fa9e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-55ca422d711e1d64", "level": "error", "message": {"text": "Dangling fetch: POST /api/image-pipeline/tag (src/lib/image-pipeline/client.ts:233)"}, "properties": {"repobilityId": "18d118e558d472c0", "scanner": "scanner-primary", "fingerprint": "55ca422d711e1d64", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f2d57966a8bb7f99", "level": "error", "message": {"text": "Dangling fetch: POST /api/image-pipeline/tag (src/lib/image-pipeline/client.ts:253)"}, "properties": {"repobilityId": "b889a86ca75593e7", "scanner": "scanner-primary", "fingerprint": "f2d57966a8bb7f99", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-862f6c79349135f9", "level": "error", "message": {"text": "Dangling fetch: POST https://api.mathpix.com/v3/pdf (src/lib/ocr/mathpix.ts:129)"}, "properties": {"repobilityId": "0b93899a12b2190f", "scanner": "scanner-primary", "fingerprint": "862f6c79349135f9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1ccf8a949c638f12", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/stats (src/hooks/useDashboardStats.ts:47)"}, "properties": {"repobilityId": "60d2b3a50bbeddeb", "scanner": "scanner-primary", "fingerprint": "1ccf8a949c638f12", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4ecd2fb117b35e79", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams/${examId} (src/hooks/useExamProblems.ts:482)"}, "properties": {"repobilityId": "4f0a05f6f294a189", "scanner": "scanner-primary", "fingerprint": "4ecd2fb117b35e79", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-eeb38e9d859cd51a", "level": "error", "message": {"text": "Dangling fetch: POST /api/exams/${examId}/problems (src/hooks/useExamProblems.ts:544)"}, "properties": {"repobilityId": "5f44689d63b69b42", "scanner": "scanner-primary", "fingerprint": "eeb38e9d859cd51a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4b210b3ab480cc48", "level": "error", "message": {"text": "Dangling fetch: GET /api/exams (src/hooks/useExamProblems.ts:675)"}, "properties": {"repobilityId": "f5babad34114302e", "scanner": "scanner-primary", "fingerprint": "4b210b3ab480cc48", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-562bed92cd93f68f", "level": "error", "message": {"text": "Dangling fetch: GET /api/me/scope (src/hooks/useUserScope.ts:58)"}, "properties": {"repobilityId": "83b315895a38c6e1", "scanner": "scanner-primary", "fingerprint": "562bed92cd93f68f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fb00ddcb6fe8d855", "level": "error", "message": {"text": "Dangling fetch: GET /api/expanded-types/tree?${params} (src/hooks/useExpandedTypes.ts:43)"}, "properties": {"repobilityId": "d1798b2ae927466a", "scanner": "scanner-primary", "fingerprint": "fb00ddcb6fe8d855", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e20ec0acc3615fd4", "level": "error", "message": {"text": "Dangling fetch: GET /api/expanded-types/${encodeURIComponent(typeCode)} (src/hooks/useExpandedTypes.ts:94)"}, "properties": {"repobilityId": "3fb6ec9708543148", "scanner": "scanner-primary", "fingerprint": "e20ec0acc3615fd4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9684e23c63539340", "level": "error", "message": {"text": "Dangling fetch: GET /api/expanded-types/stats (src/hooks/useExpandedTypes.ts:140)"}, "properties": {"repobilityId": "a7dd30c0f123b125", "scanner": "scanner-primary", "fingerprint": "9684e23c63539340", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bd0c2cf391d9c242", "level": "error", "message": {"text": "Dangling fetch: GET /api/expanded-types?${qs} (src/hooks/useExpandedTypes.ts:184)"}, "properties": {"repobilityId": "8e45761782cbb2e0", "scanner": "scanner-primary", "fingerprint": "bd0c2cf391d9c242", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ffb37fd06493c50f", "level": "error", "message": {"text": "Dangling fetch: GET /api/mathsecr-types?${params} (src/hooks/useExpandedTypes.ts:238)"}, "properties": {"repobilityId": "0cb50a1d6cdb6ec4", "scanner": "scanner-primary", "fingerprint": "ffb37fd06493c50f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-aa11ba9351e569ed", "level": "note", "message": {"text": "Unused endpoint: POST /detect"}, "properties": {"repobilityId": "1f8ed76139771475", "scanner": "scanner-primary", "fingerprint": "aa11ba9351e569ed", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ee3d59c4e847ff77", "level": "note", "message": {"text": "Unused endpoint: POST /annotate"}, "properties": {"repobilityId": "9f10698d74968795", "scanner": "scanner-primary", "fingerprint": "ee3d59c4e847ff77", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d87c0a26b4e7dfd5", "level": "note", "message": {"text": "Unused endpoint: POST /clean-handwriting"}, "properties": {"repobilityId": "43f8b0d19eda2ec2", "scanner": "scanner-primary", "fingerprint": "d87c0a26b4e7dfd5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a5f67659162bb378", "level": "note", "message": {"text": "Unused endpoint: POST /clean-pdf"}, "properties": {"repobilityId": "fa2d269df4f6a179", "scanner": "scanner-primary", "fingerprint": "a5f67659162bb378", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-298e1b2613a4c4ef", "level": "note", "message": {"text": "Unused endpoint: POST /clean-pdf-base64"}, "properties": {"repobilityId": "d7b053ad62e097d5", "scanner": "scanner-primary", "fingerprint": "298e1b2613a4c4ef", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fc64766db06080e0", "level": "note", "message": {"text": "Unused endpoint: POST /detect-figures-cv"}, "properties": {"repobilityId": "12e719224a5dc4a8", "scanner": "scanner-primary", "fingerprint": "fc64766db06080e0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f2f9067af02735c9", "level": "note", "message": {"text": "Unused endpoint: POST /render-pdf-pages"}, "properties": {"repobilityId": "d5f75f89fc03d119", "scanner": "scanner-primary", "fingerprint": "f2f9067af02735c9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4e679e98dab6dce4", "level": "note", "message": {"text": "Unused endpoint: POST /crop-figure"}, "properties": {"repobilityId": "d2e0c05fac9d0584", "scanner": "scanner-primary", "fingerprint": "4e679e98dab6dce4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0a71894a8648a458", "level": "note", "message": {"text": "Unused endpoint: POST /clean-handwriting-base64"}, "properties": {"repobilityId": "34efc66ac4ea709f", "scanner": "scanner-primary", "fingerprint": "0a71894a8648a458", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-82062857c3457fc6", "level": "note", "message": {"text": "Unused endpoint: POST /clean-handwriting-local"}, "properties": {"repobilityId": "f7131317b1546bc6", "scanner": "scanner-primary", "fingerprint": "82062857c3457fc6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-77163074065a1ad7", "level": "note", "message": {"text": "Unused endpoint: POST /extract-local"}, "properties": {"repobilityId": "90e68dc28afae66b", "scanner": "scanner-primary", "fingerprint": "77163074065a1ad7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-af4de720f651079e", "level": "note", "message": {"text": "Unused endpoint: POST /extract"}, "properties": {"repobilityId": "83fa03bcb80e61ce", "scanner": "scanner-primary", "fingerprint": "af4de720f651079e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5ab43392431b2017", "level": "note", "message": {"text": "Unused endpoint: POST /detect-problems-yolo"}, "properties": {"repobilityId": "84637f93a7e129ce", "scanner": "scanner-primary", "fingerprint": "5ab43392431b2017", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0c00d76f5c767d88", "level": "note", "message": {"text": "Unused endpoint: POST /enhance"}, "properties": {"repobilityId": "4f012a2a03ff737f", "scanner": "scanner-primary", "fingerprint": "0c00d76f5c767d88", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-80f6956b7d5354e1", "level": "note", "message": {"text": "Unused endpoint: GET /db/stats"}, "properties": {"repobilityId": "f7b5fed0febd2685", "scanner": "scanner-primary", "fingerprint": "80f6956b7d5354e1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-023afb85a8e33cf6", "level": "note", "message": {"text": "Unused endpoint: GET /db/search"}, "properties": {"repobilityId": "52d812c384ee90f3", "scanner": "scanner-primary", "fingerprint": "023afb85a8e33cf6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-59f4958a9cfc380f", "level": "note", "message": {"text": "Unused endpoint: POST /db/find-similar"}, "properties": {"repobilityId": "d972a9b9fb10bb45", "scanner": "scanner-primary", "fingerprint": "59f4958a9cfc380f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f1ad431fcfdff5a8", "level": "note", "message": {"text": "Unused endpoint: POST /tag"}, "properties": {"repobilityId": "c537b3e9c8b04cac", "scanner": "scanner-primary", "fingerprint": "f1ad431fcfdff5a8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cbd4114f7809eef1", "level": "note", "message": {"text": "Unused endpoint: POST /tag/batch"}, "properties": {"repobilityId": "0cd12510de5a5383", "scanner": "scanner-primary", "fingerprint": "cbd4114f7809eef1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cbba100f5143d8dd", "level": "note", "message": {"text": "Unused endpoint: POST /tag/retag-all"}, "properties": {"repobilityId": "e3ff315ee4450109", "scanner": "scanner-primary", "fingerprint": "cbba100f5143d8dd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f55f5f95d4bef1d1", "level": "note", "message": {"text": "Unused endpoint: GET /tag/status"}, "properties": {"repobilityId": "e3ff8d671a60effd", "scanner": "scanner-primary", "fingerprint": "f55f5f95d4bef1d1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1482168005fb340a", "level": "note", "message": {"text": "Unused endpoint: GET /tag/batch/{batch_id}"}, "properties": {"repobilityId": "0c2e77b5c20d154e", "scanner": "scanner-primary", "fingerprint": "1482168005fb340a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8c436869d081bf12", "level": "note", "message": {"text": "Unused endpoint: POST /match"}, "properties": {"repobilityId": "c682443d9b8e0558", "scanner": "scanner-primary", "fingerprint": "8c436869d081bf12", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-50017d3a34134d2a", "level": "note", "message": {"text": "Unused endpoint: POST /match/batch"}, "properties": {"repobilityId": "fd694edbe2b6b95e", "scanner": "scanner-primary", "fingerprint": "50017d3a34134d2a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-344d030d42cb9387", "level": "note", "message": {"text": "Unused endpoint: DELETE /db/image/{image_id}"}, "properties": {"repobilityId": "afaf8d000077c8e7", "scanner": "scanner-primary", "fingerprint": "344d030d42cb9387", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-818da98a551cdbd2", "level": "note", "message": {"text": "Unused endpoint: DELETE /db/source/{source_name:path}"}, "properties": {"repobilityId": "88ce7c73de2a8936", "scanner": "scanner-primary", "fingerprint": "818da98a551cdbd2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-96669e4405c776ab", "level": "note", "message": {"text": "Unused endpoint: GET /db/image/{filepath:path}"}, "properties": {"repobilityId": "6875ae91b6e53cac", "scanner": "scanner-primary", "fingerprint": "96669e4405c776ab", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}