{"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-44bdb2fdd1449a50", "name": "Possibly dead Python function: construct", "shortDescription": {"text": "Possibly dead Python function: construct"}, "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-a7b0c2ee4e9a38e7", "name": "Stray `console.log` in TS/JS \u2014 railway_client.js:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 railway_client.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-60438433fb8996b4", "name": "Stray `console.log` in TS/JS \u2014 roster-server/receipts.js:94", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 roster-server/receipts.js:94"}, "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-995429eb316b060a", "name": "Stray `console.log` in TS/JS \u2014 roster-server/server.js:364", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 roster-server/server.js:364"}, "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-8588daae38d129cf", "name": "Stray `console.log` in TS/JS \u2014 lib/html5-qrcode.min.js:1", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/html5-qrcode.min.js:1"}, "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-95cfa94e2fc86a3d", "name": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 lib/chart.min.js:13", "shortDescription": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 lib/chart.min.js:13"}, "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-c63673b5f6d99f6c", "name": "Stray `console.log` in TS/JS \u2014 ti84-trainer-v2/native/event-bus.js:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ti84-trainer-v2/native/event-bus.js:7"}, "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-9710c8d059e53154", "name": "No frontend routes/components detected", "shortDescription": {"text": "No frontend routes/components detected"}, "fullDescription": {"text": "No React/Vue/Next routes were found. This is fine for backend-only repos."}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3998d848ff058b38", "name": "Insecure pattern 'direct_innerhtml_assignment' in mit_ocw_6.0001_lec2_live.html:870", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mit_ocw_6.0001_lec2_live.html:870"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b5b7af67275bbe57", "name": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson3_live.html:1049", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson3_live.html:1049"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-efe18f3577ada867", "name": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson3_live.html:1154", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson3_live.html:1154"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-26aae7e61048ea90", "name": "Insecure pattern 'direct_innerhtml_assignment' in teacher-guest-reconcile.html:119", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in teacher-guest-reconcile.html:119"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cd478512e6b2af24", "name": "Insecure pattern 'local_storage_auth_token' in teacher-guest-reconcile.html:168", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in teacher-guest-reconcile.html:168"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b38c976e630419ba", "name": "Insecure pattern 'direct_innerhtml_assignment' in teacher-classroom.html:1007", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in teacher-classroom.html:1007"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dc1255906bfd9689", "name": "Insecure pattern 'direct_innerhtml_assignment' in u9_lesson1_live.html:1040", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u9_lesson1_live.html:1040"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2b7ba18716210d51", "name": "Insecure pattern 'direct_innerhtml_assignment' in u3_lesson4_live.html:990", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u3_lesson4_live.html:990"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9331d468098ae9d2", "name": "Insecure pattern 'direct_innerhtml_assignment' in u3_lesson1_live.html:962", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u3_lesson1_live.html:962"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4233bc3bd5ab1521", "name": "Insecure pattern 'direct_innerhtml_assignment' in u8_lesson3_live.html:1186", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u8_lesson3_live.html:1186"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5a3c0c61b41cd524", "name": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson4_live.html:1066", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson4_live.html:1066"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7c3715717a4a4fdf", "name": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson6_live.html:1056", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson6_live.html:1056"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-68b2371a49f0694a", "name": "Insecure pattern 'direct_innerhtml_assignment' in roster-prefill.js:70", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in roster-prefill.js:70"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2940e284755ccf4b", "name": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson4_live.html:1064", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson4_live.html:1064"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7306e1db5c4b91c8", "name": "Insecure pattern 'direct_innerhtml_assignment' in u3_lesson6-7_live.html:1653", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u3_lesson6-7_live.html:1653"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-39707d384972c279", "name": "Insecure pattern 'direct_innerhtml_assignment' in u9_lesson2_live.html:1186", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u9_lesson2_live.html:1186"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-17c0f116846f2748", "name": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson2_live.html:1026", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson2_live.html:1026"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-eb3d897f2a9e4780", "name": "Insecure pattern 'direct_innerhtml_assignment' in u8_lesson4_live.html:1080", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u8_lesson4_live.html:1080"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b35daf4baf15bf1d", "name": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson4_live.html:1036", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson4_live.html:1036"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cbba9681958a84c0", "name": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson6_live.html:1072", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson6_live.html:1072"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bb9a832ff36bf53e", "name": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson6_live.html:857", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson6_live.html:857"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8f1e7f2a880387b1", "name": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson5_live.html:1140", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson5_live.html:1140"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c623a739aade343b", "name": "Insecure pattern 'direct_innerhtml_assignment' in u5_lesson8_live.html:1086", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u5_lesson8_live.html:1086"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-357fd5f760e6a978", "name": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson2_live.html:1066", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson2_live.html:1066"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d0a457abca245254", "name": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson7_live.html:1122", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson7_live.html:1122"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d1d3ec89ac1956b2", "name": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson6_live.html:990", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson6_live.html:990"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4d5bfdcbad21568f", "name": "Insecure pattern 'direct_innerhtml_assignment' in ti84-verify.html:258", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in ti84-verify.html:258"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea7207308a2169e0", "name": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson3_live.html:1031", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson3_live.html:1031"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2961b0c8c62b1da4", "name": "Insecure pattern 'direct_innerhtml_assignment' in u5_lesson3_live.html:1005", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u5_lesson3_live.html:1005"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a1843a80589ad4df", "name": "Insecure pattern 'direct_innerhtml_assignment' in u3_lesson2_live.html:1000", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u3_lesson2_live.html:1000"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c0f517a076e62064", "name": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson2_live.html:1042", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson2_live.html:1042"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3c2ca4914f4af6e7", "name": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson9_live.html:1082", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson9_live.html:1082"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a77304c1678f34d6", "name": "Insecure pattern 'cors_wildcard' in CLAUDE.md:175", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in CLAUDE.md:175"}, "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-700aecbc9d4dde8e", "name": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson7_live.html:1007", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson7_live.html:1007"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5459016d78789c92", "name": "Insecure pattern 'node_child_process' in video-ingest-whisper.mjs:12", "shortDescription": {"text": "Insecure pattern 'node_child_process' in video-ingest-whisper.mjs:12"}, "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-78267465b5f1cb8e", "name": "Insecure pattern 'direct_innerhtml_assignment' in u4_lesson3-4-5_live.html:1258", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u4_lesson3-4-5_live.html:1258"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4ce23f329b0dd5b6", "name": "Insecure pattern 'direct_innerhtml_assignment' in teacher-dashboard.html:962", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in teacher-dashboard.html:962"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a4695c676f5f7362", "name": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson1-2_live.html:1163", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson1-2_live.html:1163"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e4e36a844774f94e", "name": "Insecure pattern 'direct_innerhtml_assignment' in u5_lesson1-2_live.html:1092", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u5_lesson1-2_live.html:1092"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1ccae3953e1f444d", "name": "Insecure pattern 'direct_innerhtml_assignment' in u9_lesson5_live.html:1140", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u9_lesson5_live.html:1140"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-695707ca6e17036c", "name": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson8_live.html:1085", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson8_live.html:1085"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-756d8c342b1b0b5e", "name": "Insecure pattern 'direct_innerhtml_assignment' in study_guide_diagnostic.html:2294", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in study_guide_diagnostic.html:2294"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ef01f8cc5ef3549d", "name": "Insecure pattern 'direct_innerhtml_assignment' in teacher-code-generator.html:553", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in teacher-code-generator.html:553"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c8591483b5a10759", "name": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson1_live.html:1041", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson1_live.html:1041"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-641e31d872d73f01", "name": "Insecure pattern 'direct_innerhtml_assignment' in u4_lesson1-2-3_live.html:1306", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u4_lesson1-2-3_live.html:1306"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b17cbbabca0ed412", "name": "Insecure pattern 'direct_innerhtml_assignment' in u8_lesson6_live.html:1189", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u8_lesson6_live.html:1189"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-030bba56f0472b06", "name": "Insecure pattern 'direct_innerhtml_assignment' in u8_lesson2_live.html:1107", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u8_lesson2_live.html:1107"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-73725d707336ff37", "name": "Insecure pattern 'direct_innerhtml_assignment' in u4_lesson1-2_live.html:1084", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u4_lesson1-2_live.html:1084"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0654fa9f9dfc7bb0", "name": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson7_live.html:857", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson7_live.html:857"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-93330d786037faf2", "name": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson5_live.html:1086", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson5_live.html:1086"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f8901e4559f77276", "name": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson4_live.html:1072", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson4_live.html:1072"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a35143782044248b", "name": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson1_live.html:983", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson1_live.html:983"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ac782525e18941e3", "name": "Insecure pattern 'direct_innerhtml_assignment' in u8_lesson5_live.html:1199", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u8_lesson5_live.html:1199"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e03da849eb5ddf9e", "name": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson10_live.html:1070", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson10_live.html:1070"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c3fa1911789fc7b1", "name": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson8_live.html:850", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson8_live.html:850"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-151152ab581612ff", "name": "Insecure pattern 'direct_innerhtml_assignment' in mit_ocw_6.0001_lec1_live.html:830", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mit_ocw_6.0001_lec1_live.html:830"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dcf4ea2f3e854b0c", "name": "Insecure pattern 'direct_innerhtml_assignment' in ti84_trainer.html:3189", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in ti84_trainer.html:3189"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-992ab9d87aa02838", "name": "Insecure pattern 'direct_innerhtml_assignment' in u9_lesson3_live.html:1101", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u9_lesson3_live.html:1101"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-23972270555be1a5", "name": "Insecure pattern 'direct_innerhtml_assignment' in u4_lesson10-12_live.html:1237", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u4_lesson10-12_live.html:1237"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1f06e6c517dcdd50", "name": "Insecure pattern 'direct_innerhtml_assignment' in u4_lesson9_live.html:1040", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u4_lesson9_live.html:1040"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2cd96f130988de77", "name": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson9_live.html:1000", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson9_live.html:1000"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9fb5b8969757d760", "name": "Possible secret in teacher-roster-console.html", "shortDescription": {"text": "Possible secret in teacher-roster-console.html"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-03dc26d6c2fb2c78", "name": "Insecure pattern 'direct_innerhtml_assignment' in teacher-roster-console.html:543", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in teacher-roster-console.html:543"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9b57e87524ef4fce", "name": "Insecure pattern 'direct_innerhtml_assignment' in classroom-board.js:4086", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in classroom-board.js:4086"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a828fe5defd54237", "name": "Insecure pattern 'direct_innerhtml_assignment' in u4_lesson6_live.html:919", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u4_lesson6_live.html:919"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-29f4bb33545c6c63", "name": "Insecure pattern 'direct_innerhtml_assignment' in u5_lesson4_live.html:975", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u5_lesson4_live.html:975"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-56b4e5559f0b85f1", "name": "Insecure pattern 'direct_innerhtml_assignment' in u5_lesson6_live.html:1103", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u5_lesson6_live.html:1103"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e104d0cba534d6c9", "name": "Insecure pattern 'direct_innerhtml_assignment' in u9_lesson4_live.html:1112", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u9_lesson4_live.html:1112"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-839733fe7372786c", "name": "Insecure pattern 'direct_innerhtml_assignment' in u3_lesson5_live.html:1064", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u3_lesson5_live.html:1064"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e0127b97300f54ca", "name": "Insecure pattern 'direct_innerhtml_assignment' in u3_lesson3_live.html:1007", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u3_lesson3_live.html:1007"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-91eca9632cb22128", "name": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson3_live.html:1093", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson3_live.html:1093"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-31faf2866a90d543", "name": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson9_live.html:1065", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson9_live.html:1065"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cad33cbf1e95353e", "name": "Insecure pattern 'direct_innerhtml_assignment' in u5_lesson5_live.html:1118", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u5_lesson5_live.html:1118"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-49ddfd1fb76f8c1c", "name": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson8_live.html:1068", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson8_live.html:1068"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4ad66f8db87960e6", "name": "Insecure pattern 'direct_innerhtml_assignment' in u4_lesson7-8_live.html:1076", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u4_lesson7-8_live.html:1076"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-781edc738b5a276f", "name": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson1_live.html:1025", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson1_live.html:1025"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-11286d56968354b7", "name": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson8_live.html:1062", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson8_live.html:1062"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-93b430f6417a3727", "name": "Insecure pattern 'direct_innerhtml_assignment' in edgar_u6_conceptual_driller_live.html:1695", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in edgar_u6_conceptual_driller_live.html:1695"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4e6d55f2779ce4bf", "name": "Insecure pattern 'direct_innerhtml_assignment' in u8_lesson1_live.html:1048", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u8_lesson1_live.html:1048"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-01b496af1f88ab7d", "name": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson9_live.html:854", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson9_live.html:854"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-35d57f9356dabe80", "name": "Insecure pattern 'direct_innerhtml_assignment' in start-here.html:837", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in start-here.html:837"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f38586bc156c833d", "name": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson5_live.html:858", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson5_live.html:858"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c204316d259a6f9c", "name": "Insecure pattern 'document_write' in ap_stats_roadmap_square_mode.html:11038", "shortDescription": {"text": "Insecure pattern 'document_write' in ap_stats_roadmap_square_mode.html:11038"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8c70acb73b9234dc", "name": "Insecure pattern 'direct_innerhtml_assignment' in ap_stats_roadmap_square_mode.html:5035", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in ap_stats_roadmap_square_mode.html:5035"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c6496126967a64d0", "name": "Insecure pattern 'insert_adjacent_html' in ap_stats_roadmap_square_mode.html:15765", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in ap_stats_roadmap_square_mode.html:15765"}, "fullDescription": {"text": "Found a known-risky pattern (insert_adjacent_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5be95b7f42cb5d11", "name": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson11_live.html:1126", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson11_live.html:1126"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f452da941ddcefad", "name": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson10_live.html:867", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson10_live.html:867"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9998a034ffb7d558", "name": "Insecure pattern 'direct_innerhtml_assignment' in u5_lesson7_live.html:1087", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u5_lesson7_live.html:1087"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-edc08510593585e9", "name": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson7_live.html:1032", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson7_live.html:1032"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d3856d39db1d2736", "name": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson5_live.html:1014", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson5_live.html:1014"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fe9e3a47ba870a55", "name": "Possible secret in roster-server/README.md", "shortDescription": {"text": "Possible secret in roster-server/README.md"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-e7ea215a16d96275", "name": "Insecure pattern 'cors_wildcard' in roster-server/server.js:53", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in roster-server/server.js:53"}, "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-4580e96e7646e837", "name": "Insecure pattern 'new_function_used' in scripts/audit-question-context.mjs:113", "shortDescription": {"text": "Insecure pattern 'new_function_used' in scripts/audit-question-context.mjs:113"}, "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-8df038dad0adb6ff", "name": "Insecure pattern 'new_function_used' in scripts/disambiguate-skills.mjs:203", "shortDescription": {"text": "Insecure pattern 'new_function_used' in scripts/disambiguate-skills.mjs:203"}, "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-082b7d012bcc972e", "name": "Insecure pattern 'node_child_process' in scripts/disambiguate-skills.mjs:66", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/disambiguate-skills.mjs:66"}, "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-21264cc6b00c6835", "name": "Insecure pattern 'direct_innerhtml_assignment' in scripts/wire-reflection-persistence.mjs:100", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scripts/wire-reflection-persistence.mjs:100"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ae789ba57bc47fad", "name": "Insecure pattern 'new_function_used' in scripts/build-answer-key.mjs:45", "shortDescription": {"text": "Insecure pattern 'new_function_used' in scripts/build-answer-key.mjs:45"}, "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-eba5d7433b0b4374", "name": "Insecure pattern 'new_function_used' in scripts/build-skill-map.mjs:216", "shortDescription": {"text": "Insecure pattern 'new_function_used' in scripts/build-skill-map.mjs:216"}, "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-c31d98c33c7be22f", "name": "Insecure pattern 'new_function_used' in scripts/audit-skill-tagging.mjs:251", "shortDescription": {"text": "Insecure pattern 'new_function_used' in scripts/audit-skill-tagging.mjs:251"}, "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-6f6187744ba4f3e0", "name": "Insecure pattern 'direct_innerhtml_assignment' in scripts/ti84-trainer-runtime.js:1259", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scripts/ti84-trainer-runtime.js:1259"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2435be7a550569d5", "name": "Possible secret in scripts/teacher-roster.mjs", "shortDescription": {"text": "Possible secret in scripts/teacher-roster.mjs"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-164c269632a82c49", "name": "Insecure pattern 'direct_innerhtml_assignment' in scripts/wire-ai-worksheet-grade.mjs:403", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scripts/wire-ai-worksheet-grade.mjs:403"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d318e5b380a2ad30", "name": "Insecure pattern 'new_function_used' in lib/validate-dag-topology.mjs:7", "shortDescription": {"text": "Insecure pattern 'new_function_used' in lib/validate-dag-topology.mjs:7"}, "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-2b3f683c71fab2d1", "name": "Insecure pattern 'new_function_used' in lib/html5-qrcode.min.js:1", "shortDescription": {"text": "Insecure pattern 'new_function_used' in lib/html5-qrcode.min.js:1"}, "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-66194dee5a0c0c2e", "name": "Insecure pattern 'direct_innerhtml_assignment' in lib/html5-qrcode.min.js:1", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in lib/html5-qrcode.min.js:1"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-17536ee30056f845", "name": "Insecure pattern 'new_function_used' in lib/question-lo-tagger.mjs:108", "shortDescription": {"text": "Insecure pattern 'new_function_used' in lib/question-lo-tagger.mjs:108"}, "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-472c28ae31ea3034", "name": "Insecure pattern 'direct_innerhtml_assignment' in lib/qrcode.min.js:1", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in lib/qrcode.min.js:1"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2f62c74320084759", "name": "Insecure pattern 'new_function_used' in lib/dag-topology-builder.mjs:39", "shortDescription": {"text": "Insecure pattern 'new_function_used' in lib/dag-topology-builder.mjs:39"}, "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-2899a3a753cb4bc8", "name": "Insecure pattern 'direct_innerhtml_assignment' in ti84-trainer-v2/app.js:3894", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in ti84-trainer-v2/app.js:3894"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-175f0485e7215f2c", "name": "Insecure pattern 'direct_innerhtml_assignment' in ti84-trainer-v2/standalone.html:12193", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in ti84-trainer-v2/standalone.html:12193"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5cb1bdf59886423f", "name": "Insecure pattern 'direct_innerhtml_assignment' in tools/level-editor-ui.js:679", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tools/level-editor-ui.js:679"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bd3998fd78ba60be", "name": "Insecure pattern 'eval_used' in tools/cdp/edge.py:369", "shortDescription": {"text": "Insecure pattern 'eval_used' in tools/cdp/edge.py:369"}, "fullDescription": {"text": "Found a known-risky pattern (eval_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cd59a05c27fd9b52", "name": "Very large file: classroom-board.js (6530 lines)", "shortDescription": {"text": "Very large file: classroom-board.js (6530 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-09a5dd5cb81c4492", "name": "Very large file: tests/study-guide.test.js (1670 lines)", "shortDescription": {"text": "Very large file: tests/study-guide.test.js (1670 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-f087a726376c4cd2", "name": "Very large file: tests/classroom-board-zone5.test.js (1398 lines)", "shortDescription": {"text": "Very large file: tests/classroom-board-zone5.test.js (1398 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-4a64002107f30014", "name": "Very large file: tests/classroom-board.test.js (6984 lines)", "shortDescription": {"text": "Very large file: tests/classroom-board.test.js (6984 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-75b4a0f0d07238dc", "name": "Very large file: roster-server/lesson-grade.js (1129 lines)", "shortDescription": {"text": "Very large file: roster-server/lesson-grade.js (1129 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-a6d25cf812982cda", "name": "Very large file: roster-server/server.js (1174 lines)", "shortDescription": {"text": "Very large file: roster-server/server.js (1174 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-cc8784db8de813d3", "name": "Very large file: scripts/wire-ai-worksheet-grade.mjs (859 lines)", "shortDescription": {"text": "Very large file: scripts/wire-ai-worksheet-grade.mjs (859 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-fad723e5c7980904", "name": "Very large file: lib/curriculum-charts.js (1938 lines)", "shortDescription": {"text": "Very large file: lib/curriculum-charts.js (1938 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-799e885c4adcfbec", "name": "Very large file: ti84-trainer-v2/app.js (4337 lines)", "shortDescription": {"text": "Very large file: ti84-trainer-v2/app.js (4337 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-c52321e0789e412f", "name": "Very large file: tools/level-editor-ui.js (2046 lines)", "shortDescription": {"text": "Very large file: tools/level-editor-ui.js (2046 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 487 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 62 placeholder/mock markers across 28 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-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. 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-17d866d91a7c451e", "name": "Agent instruction/config may expose a secret: CLAUDE.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-122f91b7f2906dc4", "name": "Agent authority lacks a verifier contract: .claude/settings.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ecb0d2c55ed6875d", "name": "Agent authority lacks a verifier contract: .claude/settings.local.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.local.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8ad917c589941989", "name": "Agent authority lacks a verifier contract: .claude/skills/gitnexus/gitnexus-guide/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gitnexus/gitnexus-guide/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b7af0ebca00c8e7b", "name": "Agent authority lacks a verifier contract: .claude/skills/gitnexus/gitnexus-exploring/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gitnexus/gitnexus-exploring/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2a26879567d53bb0", "name": "Agent authority lacks a verifier contract: .claude/skills/gitnexus/gitnexus-debugging/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gitnexus/gitnexus-debugging/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e725d2ab884fbd49", "name": "Multiple root agent instruction files without precedence", "shortDescription": {"text": "Multiple root agent instruction files without precedence"}, "fullDescription": {"text": "The repo has multiple top-level AI-coder instruction files. Without precedence rules, different agents may follow different policies."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4ff1f8c833bbbfac", "name": "Commented-code block (5 lines) in .v4-logic-block.js:580", "shortDescription": {"text": "Commented-code block (5 lines) in .v4-logic-block.js:580"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2a3a306d8a515a7e", "name": "Commented-code block (11 lines) in roster-prefill.js:6", "shortDescription": {"text": "Commented-code block (11 lines) in roster-prefill.js: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-59e1aa58cc4b3d90", "name": "Legacy-named symbol `p_old` in ai-grading-prompts-u6-l9.js:91", "shortDescription": {"text": "Legacy-named symbol `p_old` in ai-grading-prompts-u6-l9.js:91"}, "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-308a3733717e0351", "name": "`fetch()` without try/.catch or AbortSignal \u2014 video-ingest-whisper.mjs:540", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 video-ingest-whisper.mjs:540"}, "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-af83d0ad00b9c9d4", "name": "Commented-code block (7 lines) in canvas_engine.js:65", "shortDescription": {"text": "Commented-code block (7 lines) in canvas_engine.js:65"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9e5fbaea8d3024bb", "name": "Legacy-named symbol `p_old` in ai-grading-prompts-u6-l8.js:94", "shortDescription": {"text": "Legacy-named symbol `p_old` in ai-grading-prompts-u6-l8.js:94"}, "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-8c80d199e2f730f7", "name": "Commented-code block (13 lines) in roster_config.js:3", "shortDescription": {"text": "Commented-code block (13 lines) in roster_config.js: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-ea1a511353a94868", "name": "`fetch()` without try/.catch or AbortSignal \u2014 video-ingest.mjs:85", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 video-ingest.mjs:85"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6e01b9bcf36276fd", "name": "Commented-code block (10 lines) in classroom-board.js:48", "shortDescription": {"text": "Commented-code block (10 lines) in classroom-board.js:48"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5ac9dea04bcda8cd", "name": "Commented-code block (7 lines) in railway_client.js:70", "shortDescription": {"text": "Commented-code block (7 lines) in railway_client.js: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-9bcdc26f907c9ed2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 railway_client.js:358", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 railway_client.js:358"}, "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-bec67f04edb15677", "name": "Commented-code block (5 lines) in activity-level.js:275", "shortDescription": {"text": "Commented-code block (5 lines) in activity-level.js:275"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1cfbcaafe6fc44df", "name": "Legacy-named symbol `desk_receipts_v1` in gradebook-client.js:65", "shortDescription": {"text": "Legacy-named symbol `desk_receipts_v1` in gradebook-client.js:65"}, "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-102317e64ab1d447", "name": "Commented-code block (5 lines) in gradebook-client.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in gradebook-client.js: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-5eafea4b5251701c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 gradebook-client.js:220", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 gradebook-client.js:220"}, "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-fb006ac2760af71f", "name": "Commented-code block (5 lines) in tests/level-editor-sim.test.js:760", "shortDescription": {"text": "Commented-code block (5 lines) in tests/level-editor-sim.test.js:760"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-078ae579b778161b", "name": "Commented-code block (6 lines) in tests/phase5-structure.test.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in tests/phase5-structure.test.js: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-5f540e8440dff02f", "name": "Commented-code block (9 lines) in tests/calendar-polish.test.js:229", "shortDescription": {"text": "Commented-code block (9 lines) in tests/calendar-polish.test.js:229"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-45e103f2c7334076", "name": "Commented-code block (6 lines) in tests/roster-console-structure.test.js:56", "shortDescription": {"text": "Commented-code block (6 lines) in tests/roster-console-structure.test.js:56"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1943e3a2016a299b", "name": "Commented-code block (5 lines) in tests/desk-calendar-sync.test.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in tests/desk-calendar-sync.test.js: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-4fe49f9a14826fd0", "name": "Commented-code block (10 lines) in tests/desk-modal-polish.test.js:1", "shortDescription": {"text": "Commented-code block (10 lines) in tests/desk-modal-polish.test.js: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-a88dcd35f20cbf05", "name": "Commented-code block (10 lines) in tests/cockpit-level.test.js:6", "shortDescription": {"text": "Commented-code block (10 lines) in tests/cockpit-level.test.js: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-d94568e116b50101", "name": "Commented-code block (5 lines) in tests/desk-receipt-row.test.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in tests/desk-receipt-row.test.js: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-c9e426362e551690", "name": "Commented-code block (5 lines) in tests/desk-menu-sprite-hue.test.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in tests/desk-menu-sprite-hue.test.js: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-541dc0c5ad4943b2", "name": "Commented-code block (7 lines) in tests/phase4b-structure.test.js:1", "shortDescription": {"text": "Commented-code block (7 lines) in tests/phase4b-structure.test.js: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-b3b0398bea1a10a1", "name": "Commented-code block (7 lines) in tests/ti84-expected-accuracy.test.js:3", "shortDescription": {"text": "Commented-code block (7 lines) in tests/ti84-expected-accuracy.test.js: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-2fb9f399b4f7aa6a", "name": "Commented-code block (5 lines) in tests/desk-auto-open-override.test.js:124", "shortDescription": {"text": "Commented-code block (5 lines) in tests/desk-auto-open-override.test.js:124"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-857597617253d5ee", "name": "Commented-code block (5 lines) in tests/v3-p4-doorways.test.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in tests/v3-p4-doorways.test.js: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-7385e43506fd7b18", "name": "Commented-code block (5 lines) in tests/classroom-board-shared-camera.test.js:334", "shortDescription": {"text": "Commented-code block (5 lines) in tests/classroom-board-shared-camera.test.js:334"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-949098ad00c7c539", "name": "Commented-code block (5 lines) in tests/desk-timed-deck.test.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in tests/desk-timed-deck.test.js: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-8d3c2ea9f3967490", "name": "Legacy-named symbol `buildProbesLegacy` in tests/study-guide.test.js:181", "shortDescription": {"text": "Legacy-named symbol `buildProbesLegacy` in tests/study-guide.test.js:181"}, "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-962df08d0c77763c", "name": "Commented-code block (8 lines) in tests/avatar-popup-inline-expansions.test.js:6", "shortDescription": {"text": "Commented-code block (8 lines) in tests/avatar-popup-inline-expansions.test.js: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-660f844eefc9630a", "name": "Commented-code block (6 lines) in tests/activity-level.test.js:4", "shortDescription": {"text": "Commented-code block (6 lines) in tests/activity-level.test.js: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-fc89b6f017df206e", "name": "Commented-code block (7 lines) in tests/grade-pipeline-w3-prompts.test.js:70", "shortDescription": {"text": "Commented-code block (7 lines) in tests/grade-pipeline-w3-prompts.test.js: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-58e403eb3eb854ba", "name": "Commented-code block (9 lines) in tests/desk-roster-signin.test.js:607", "shortDescription": {"text": "Commented-code block (9 lines) in tests/desk-roster-signin.test.js:607"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-74b25faca9a47e07", "name": "Commented-code block (6 lines) in tests/desk-activity-kbd.test.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in tests/desk-activity-kbd.test.js: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-f31573a23812ee18", "name": "Commented-code block (5 lines) in tests/desk-donow-ledger.test.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in tests/desk-donow-ledger.test.js: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-7fba5b4c1ba665ce", "name": "Commented-code block (6 lines) in tests/work-manifest.test.js:464", "shortDescription": {"text": "Commented-code block (6 lines) in tests/work-manifest.test.js:464"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b1053efa7e27bf75", "name": "Commented-code block (10 lines) in tests/roster-prefill.test.js:1", "shortDescription": {"text": "Commented-code block (10 lines) in tests/roster-prefill.test.js: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-d284fb1ed638ad47", "name": "Commented-code block (6 lines) in tests/ti84-data-trust.test.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in tests/ti84-data-trust.test.js: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-14cdb4d51708f80b", "name": "Commented-code block (5 lines) in tests/gradebook-feeder-wiring.test.js:322", "shortDescription": {"text": "Commented-code block (5 lines) in tests/gradebook-feeder-wiring.test.js:322"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-72721144273474e5", "name": "Commented-code block (6 lines) in tests/teacher-auth-pages.test.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in tests/teacher-auth-pages.test.js: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-8eb63ff18b48278c", "name": "Commented-code block (5 lines) in tests/poll-archive-cockpit.test.js:89", "shortDescription": {"text": "Commented-code block (5 lines) in tests/poll-archive-cockpit.test.js:89"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-711d743183ed46ff", "name": "Commented-code block (5 lines) in tests/teacher-student-console-nudges-pagination.test.js:5", "shortDescription": {"text": "Commented-code block (5 lines) in tests/teacher-student-console-nudges-pagination.test.js: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-99965755339c3f30", "name": "Commented-code block (5 lines) in tests/desk-level-integration.test.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in tests/desk-level-integration.test.js: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-37bef8a8942779df", "name": "Commented-code block (5 lines) in tests/teacher-student-console-drawer.test.js:4", "shortDescription": {"text": "Commented-code block (5 lines) in tests/teacher-student-console-drawer.test.js: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-84352e7d89929ed4", "name": "Commented-code block (9 lines) in tests/poll-archive-desk.test.js:4", "shortDescription": {"text": "Commented-code block (9 lines) in tests/poll-archive-desk.test.js: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-4261294b59e542f5", "name": "Commented-code block (5 lines) in tests/teacher-student-console-nudges.test.js:4", "shortDescription": {"text": "Commented-code block (5 lines) in tests/teacher-student-console-nudges.test.js: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-d1e148405b863fa2", "name": "Commented-code block (8 lines) in tests/cockpit-activity.test.js:5", "shortDescription": {"text": "Commented-code block (8 lines) in tests/cockpit-activity.test.js: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-8d24b0f96967c473", "name": "Commented-code block (7 lines) in tests/classroom-board-scroll.test.js:952", "shortDescription": {"text": "Commented-code block (7 lines) in tests/classroom-board-scroll.test.js:952"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b2bac1ee2811c636", "name": "Commented-code block (9 lines) in tests/desk-completion-gate.test.js:1", "shortDescription": {"text": "Commented-code block (9 lines) in tests/desk-completion-gate.test.js: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-512475779812c702", "name": "Commented-code block (5 lines) in tests/roster-client.test.js:443", "shortDescription": {"text": "Commented-code block (5 lines) in tests/roster-client.test.js:443"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1c2ff4527c9727d5", "name": "Commented-code block (5 lines) in tests/desk-user-role.test.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in tests/desk-user-role.test.js: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-985e76ace3b23aab", "name": "Commented-code block (5 lines) in tests/teacher-student-console-remediation.test.js:4", "shortDescription": {"text": "Commented-code block (5 lines) in tests/teacher-student-console-remediation.test.js: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-78cbd24e367fbe47", "name": "Commented-code block (7 lines) in tests/v3-p3-webrtc.test.js:359", "shortDescription": {"text": "Commented-code block (7 lines) in tests/v3-p3-webrtc.test.js:359"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-519c99a71915fbcc", "name": "Commented-code block (7 lines) in tests/broadcast-nudge-cockpit.test.js:6", "shortDescription": {"text": "Commented-code block (7 lines) in tests/broadcast-nudge-cockpit.test.js: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-9176e36a68f48463", "name": "Commented-code block (6 lines) in tests/classroom-board.test.js:4407", "shortDescription": {"text": "Commented-code block (6 lines) in tests/classroom-board.test.js:4407"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-21233f6291d5533f", "name": "Commented-code block (5 lines) in tests/teacher-student-console-unlocks.test.js:4", "shortDescription": {"text": "Commented-code block (5 lines) in tests/teacher-student-console-unlocks.test.js: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-ee324a7b6b4131b2", "name": "Commented-code block (6 lines) in tests/teacher-student-console-dashboard-deeplink.test.js:5", "shortDescription": {"text": "Commented-code block (6 lines) in tests/teacher-student-console-dashboard-deeplink.test.js: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-82c52c88a7d33381", "name": "Commented-code block (8 lines) in tests/classroom-structure.test.js:317", "shortDescription": {"text": "Commented-code block (8 lines) in tests/classroom-structure.test.js:317"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c77765a43948d715", "name": "Commented-code block (5 lines) in tests/desk-lesson-gate.test.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in tests/desk-lesson-gate.test.js: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-3f360b6a5bc3631f", "name": "Commented-code block (10 lines) in tests/phase4-structure.test.js:68", "shortDescription": {"text": "Commented-code block (10 lines) in tests/phase4-structure.test.js:68"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9e6a15788591706f", "name": "Commented-code block (6 lines) in tests/worksheet-identity-clean.test.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in tests/worksheet-identity-clean.test.js: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-fcf4e4bb42e26aa2", "name": "Commented-code block (6 lines) in tests/worksheet-signin-wall.test.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in tests/worksheet-signin-wall.test.js: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-29ce9a959b99e66a", "name": "Commented-code block (8 lines) in roster-server/donow.js:74", "shortDescription": {"text": "Commented-code block (8 lines) in roster-server/donow.js: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-eb6d5223db66247b", "name": "Commented-code block (6 lines) in roster-server/grade.js:4", "shortDescription": {"text": "Commented-code block (6 lines) in roster-server/grade.js: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-9a108f3c400901db", "name": "Commented-code block (5 lines) in roster-server/teacher-auth.js:3", "shortDescription": {"text": "Commented-code block (5 lines) in roster-server/teacher-auth.js: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-71888ef3b0a4f96d", "name": "Commented-code block (5 lines) in roster-server/teacher.js:203", "shortDescription": {"text": "Commented-code block (5 lines) in roster-server/teacher.js:203"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-784115492c556058", "name": "Commented-code block (5 lines) in roster-server/lesson-unlock-db.js:44", "shortDescription": {"text": "Commented-code block (5 lines) in roster-server/lesson-unlock-db.js:44"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-db537c0331c0288d", "name": "Commented-code block (5 lines) in roster-server/trainer-db.js:47", "shortDescription": {"text": "Commented-code block (5 lines) in roster-server/trainer-db.js: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-bd5d9994d543a4cb", "name": "Commented-code block (6 lines) in roster-server/rollup.js:4", "shortDescription": {"text": "Commented-code block (6 lines) in roster-server/rollup.js: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-0d0b31faf7fa8967", "name": "Commented-code block (5 lines) in roster-server/gradebook-grid.js:7", "shortDescription": {"text": "Commented-code block (5 lines) in roster-server/gradebook-grid.js: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-370c5fa7a1cf7719", "name": "Commented-code block (7 lines) in roster-server/db.js:26", "shortDescription": {"text": "Commented-code block (7 lines) in roster-server/db.js:26"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7272a39925f8c46b", "name": "Commented-code block (6 lines) in roster-server/signup-config.js:12", "shortDescription": {"text": "Commented-code block (6 lines) in roster-server/signup-config.js: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-7328fdf248b2336d", "name": "Commented-code block (8 lines) in roster-server/lesson-grade.js:6", "shortDescription": {"text": "Commented-code block (8 lines) in roster-server/lesson-grade.js: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-0360b0e5ce4df3d4", "name": "Commented-code block (5 lines) in roster-server/rate-limit.js:6", "shortDescription": {"text": "Commented-code block (5 lines) in roster-server/rate-limit.js: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-c4ea6c05dad91fc0", "name": "Commented-code block (5 lines) in roster-server/nudge.js:17", "shortDescription": {"text": "Commented-code block (5 lines) in roster-server/nudge.js: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-b9fa43bd6d72d1d6", "name": "Commented-code block (10 lines) in roster-server/lesson-unlock.js:20", "shortDescription": {"text": "Commented-code block (10 lines) in roster-server/lesson-unlock.js:20"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-958514b27614de02", "name": "Commented-code block (5 lines) in roster-server/remediation.js:4", "shortDescription": {"text": "Commented-code block (5 lines) in roster-server/remediation.js: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-25f944f6edd4a633", "name": "Commented-code block (6 lines) in roster-server/crypto.js:5", "shortDescription": {"text": "Commented-code block (6 lines) in roster-server/crypto.js: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-c69635e4c9add2e9", "name": "Commented-code block (9 lines) in roster-server/class.js:137", "shortDescription": {"text": "Commented-code block (9 lines) in roster-server/class.js:137"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7f1e71be9bced405", "name": "Commented-code block (5 lines) in roster-server/server.js:45", "shortDescription": {"text": "Commented-code block (5 lines) in roster-server/server.js:45"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9abca707c9f0ef47", "name": "Commented-code block (5 lines) in roster-server/trainer.js:6", "shortDescription": {"text": "Commented-code block (5 lines) in roster-server/trainer.js: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-1b832b3649574534", "name": "Commented-code block (5 lines) in roster-server/remediation-db.js:6", "shortDescription": {"text": "Commented-code block (5 lines) in roster-server/remediation-db.js: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-8bfffee92d437765", "name": "Commented-code block (5 lines) in roster-server/mastery.js:5", "shortDescription": {"text": "Commented-code block (5 lines) in roster-server/mastery.js: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-1c137037dc7733a9", "name": "Commented-code block (6 lines) in roster-server/ledger.js:5", "shortDescription": {"text": "Commented-code block (6 lines) in roster-server/ledger.js: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-f520a05046b4379c", "name": "Commented-code block (5 lines) in roster-server/poll-archive.js:4", "shortDescription": {"text": "Commented-code block (5 lines) in roster-server/poll-archive.js: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-94b8be1d1d4ee120", "name": "Commented-code block (5 lines) in roster-server/scoring.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in roster-server/scoring.js: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-ac7bbe3bef7ee0a8", "name": "Commented-code block (8 lines) in roster-server/grade-config.js:29", "shortDescription": {"text": "Commented-code block (8 lines) in roster-server/grade-config.js:29"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9974f05c261d43bf", "name": "Commented-code block (7 lines) in roster-server/tests/blooket.test.js:1", "shortDescription": {"text": "Commented-code block (7 lines) in roster-server/tests/blooket.test.js: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-b42980409e2db692", "name": "Commented-code block (6 lines) in roster-server/tests/lesson-grade-v3.test.js:295", "shortDescription": {"text": "Commented-code block (6 lines) in roster-server/tests/lesson-grade-v3.test.js:295"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2629f5768e3d54e9", "name": "Commented-code block (8 lines) in roster-server/tests/sprite-hue.test.js:1", "shortDescription": {"text": "Commented-code block (8 lines) in roster-server/tests/sprite-hue.test.js: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-35851a78519f9071", "name": "Commented-code block (5 lines) in roster-server/tests/remediation.test.js:146", "shortDescription": {"text": "Commented-code block (5 lines) in roster-server/tests/remediation.test.js:146"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-484bacbd2a9b15d4", "name": "Commented-code block (5 lines) in roster-server/tests/student-dm.test.js:524", "shortDescription": {"text": "Commented-code block (5 lines) in roster-server/tests/student-dm.test.js:524"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-733a1a2533ce2fdb", "name": "Commented-code block (5 lines) in roster-server/tests/grade.test.js:621", "shortDescription": {"text": "Commented-code block (5 lines) in roster-server/tests/grade.test.js:621"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7aafde3d06bb6539", "name": "Commented-code block (8 lines) in roster-server/tests/quarters-by-date.test.js:3", "shortDescription": {"text": "Commented-code block (8 lines) in roster-server/tests/quarters-by-date.test.js: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-e07017416dfdd553", "name": "Commented-code block (5 lines) in roster-server/tests/lesson-grade.test.js:806", "shortDescription": {"text": "Commented-code block (5 lines) in roster-server/tests/lesson-grade.test.js:806"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e30b5013f9e0ddf5", "name": "Commented-code block (6 lines) in roster-server/tests/gradebook-grid.test.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in roster-server/tests/gradebook-grid.test.js: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-6179ca447fcec3d5", "name": "Commented-code block (5 lines) in roster-server/tests/lesson-unlock-endpoints.test.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in roster-server/tests/lesson-unlock-endpoints.test.js: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-b07a17f7cfb3f6c5", "name": "Commented-code block (7 lines) in roster-server/tests/blooket-endpoint.test.js:1", "shortDescription": {"text": "Commented-code block (7 lines) in roster-server/tests/blooket-endpoint.test.js: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-0274b53d9c8c691d", "name": "Commented-code block (10 lines) in roster-server/tests/schoology-uid.test.js:1", "shortDescription": {"text": "Commented-code block (10 lines) in roster-server/tests/schoology-uid.test.js: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-c6ceded061dd2270", "name": "Commented-code block (10 lines) in roster-server/tests/teacher-auth.test.js:1", "shortDescription": {"text": "Commented-code block (10 lines) in roster-server/tests/teacher-auth.test.js: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-9c8905247c147f7e", "name": "Commented-code block (8 lines) in roster-server/tests/nudge-history.test.js:485", "shortDescription": {"text": "Commented-code block (8 lines) in roster-server/tests/nudge-history.test.js:485"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ed549a7ea4437b5a", "name": "Commented-code block (7 lines) in js/wallet_logic.js:449", "shortDescription": {"text": "Commented-code block (7 lines) in js/wallet_logic.js:449"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d47e8637af527936", "name": "Commented-code block (8 lines) in scripts/import-blooket.mjs:126", "shortDescription": {"text": "Commented-code block (8 lines) in scripts/import-blooket.mjs:126"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d80a7535ba5b3873", "name": "Commented-code block (6 lines) in scripts/wire-worksheet-script-paths.mjs:1", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/wire-worksheet-script-paths.mjs: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-6410e1671795bf9c", "name": "Legacy-named symbol `curriculum_render_v2` in scripts/disambiguate-skills.mjs:195", "shortDescription": {"text": "Legacy-named symbol `curriculum_render_v2` in scripts/disambiguate-skills.mjs:195"}, "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-a3a89a167ef545c5", "name": "Commented-code block (6 lines) in scripts/disambiguate-skills.mjs:703", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/disambiguate-skills.mjs:703"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d3b4e759e3f5c16b", "name": "Commented-code block (6 lines) in scripts/wire-reflection-persistence.mjs:54", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/wire-reflection-persistence.mjs:54"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b71646cb0e6c4de9", "name": "Commented-code block (7 lines) in scripts/dn2b-wire-feeders.mjs:47", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/dn2b-wire-feeders.mjs: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-2ed3d6ae6ab37514", "name": "Legacy-named symbol `curriculum_render_v2` in scripts/build-answer-key.mjs:37", "shortDescription": {"text": "Legacy-named symbol `curriculum_render_v2` in scripts/build-answer-key.mjs:37"}, "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-103da4fa02c49370", "name": "Legacy-named symbol `curriculum_render_v2` in scripts/build-skill-map.mjs:208", "shortDescription": {"text": "Legacy-named symbol `curriculum_render_v2` in scripts/build-skill-map.mjs:208"}, "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-b351ec659d0e8599", "name": "Commented-code block (6 lines) in scripts/build-skill-map.mjs:167", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/build-skill-map.mjs:167"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d3c84d688252c0e6", "name": "Legacy-named symbol `curriculum_render_v2` in scripts/audit-skill-tagging.mjs:243", "shortDescription": {"text": "Legacy-named symbol `curriculum_render_v2` in scripts/audit-skill-tagging.mjs:243"}, "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-db5248e5e801f802", "name": "Commented-code block (8 lines) in scripts/audit-skill-tagging.mjs:390", "shortDescription": {"text": "Commented-code block (8 lines) in scripts/audit-skill-tagging.mjs:390"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-24e1e854dcdd5c56", "name": "Legacy-named symbol `ti84trainer_state_v1` in scripts/ti84-trainer-runtime.js:4", "shortDescription": {"text": "Legacy-named symbol `ti84trainer_state_v1` in scripts/ti84-trainer-runtime.js:4"}, "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-526be56740c17d3a", "name": "Commented-code block (5 lines) in scripts/wire-verdict-prompt.mjs:46", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/wire-verdict-prompt.mjs:46"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8361286ea4b6766d", "name": "Commented-code block (5 lines) in scripts/wire-completion-tracker.mjs:58", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/wire-completion-tracker.mjs:58"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b1de6177d0c8186f", "name": "Commented-code block (6 lines) in scripts/wire-ledger-heal.mjs:60", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/wire-ledger-heal.mjs:60"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-576819500d77d01a", "name": "Commented-code block (10 lines) in scripts/build-sy2627-schedule.mjs:6", "shortDescription": {"text": "Commented-code block (10 lines) in scripts/build-sy2627-schedule.mjs: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-9a79ea775582aa44", "name": "Commented-code block (8 lines) in scripts/wire-verdict-parser.mjs:58", "shortDescription": {"text": "Commented-code block (8 lines) in scripts/wire-verdict-parser.mjs:58"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3d8f7b62d1e5f984", "name": "Commented-code block (7 lines) in scripts/wire-ai-worksheet-grade.mjs:47", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/wire-ai-worksheet-grade.mjs: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-4aa1d0f690d993e0", "name": "Commented-code block (5 lines) in scripts/wire-blank-scores.mjs:52", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/wire-blank-scores.mjs:52"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-55d0149e245c42ba", "name": "Commented-code block (10 lines) in lib/dag-topology-builder.mjs:4", "shortDescription": {"text": "Commented-code block (10 lines) in lib/dag-topology-builder.mjs:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ba04bf0e4c3ff2dd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 ti84-trainer-v2/bridge.js:417", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 ti84-trainer-v2/bridge.js:417"}, "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-f577dcc6a174e884", "name": "Commented-code block (5 lines) in ti84-trainer-v2/app.js:784", "shortDescription": {"text": "Commented-code block (5 lines) in ti84-trainer-v2/app.js:784"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ea7bbc0e88c0aaf7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 ti84-trainer-v2/wasm/WebCEmu.js:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 ti84-trainer-v2/wasm/WebCEmu.js:9"}, "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-0212f5ca68924ba9", "name": "Commented-code block (5 lines) in ti84-trainer-v2/native/stat-math.js:223", "shortDescription": {"text": "Commented-code block (5 lines) in ti84-trainer-v2/native/stat-math.js:223"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9c40f0a3b4b59373", "name": "Commented-code block (7 lines) in tools/schoology_components.py:273", "shortDescription": {"text": "Commented-code block (7 lines) in tools/schoology_components.py:273"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f14853bd21924e11", "name": "Commented-code block (6 lines) in tools/level-editor-ui.js:5", "shortDescription": {"text": "Commented-code block (6 lines) in tools/level-editor-ui.js: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-f2eaca66b8a5bcc2", "name": "Commented-code block (9 lines) in tools/level-editor-sim.js:12", "shortDescription": {"text": "Commented-code block (9 lines) in tools/level-editor-sim.js: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-6018a73719ed807b", "name": "Commented-code block (8 lines) in tools/level-editor-model.js:166", "shortDescription": {"text": "Commented-code block (8 lines) in tools/level-editor-model.js:166"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0e39f18e3ed7e624", "name": "Commented-code block (6 lines) in tools/schoology_ops.py:301", "shortDescription": {"text": "Commented-code block (6 lines) in tools/schoology_ops.py:301"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e121e15f2f5c1701", "name": "Commented-code block (5 lines) in tools/level-editor-render.js:229", "shortDescription": {"text": "Commented-code block (5 lines) in tools/level-editor-render.js:229"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5f25dbbfd32f6aac", "name": "`fetch()` without try/.catch or AbortSignal \u2014 tools/level-editor-render.js:164", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 tools/level-editor-render.js:164"}, "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-2f0f0b7477fa071a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 tools/sprite-regions.js:2", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 tools/sprite-regions.js:2"}, "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-1cb597a98b13ccd6", "name": "Commented-code block (5 lines) in tools/schoology_sync_section.py:71", "shortDescription": {"text": "Commented-code block (5 lines) in tools/schoology_sync_section.py:71"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-67e14aa9fcf18060", "name": "Commented-code block (8 lines) in tools/schoology-dom-helpers.js:27", "shortDescription": {"text": "Commented-code block (8 lines) in tools/schoology-dom-helpers.js: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-cfd87903c715306c", "name": "Commented-code block (5 lines) in tools/level-editor-lint.js:12", "shortDescription": {"text": "Commented-code block (5 lines) in tools/level-editor-lint.js: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-f3ba2dccde76bcd2", "name": "Network/subprocess call without timeout or try/except \u2014 tools/cdp/edge.py:125", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 tools/cdp/edge.py:125"}, "fullDescription": {"text": "`subprocess.Popen(...)` 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-a260e355ea7d9f89", "name": "32 env vars used in code but missing from .env.example", "shortDescription": {"text": "32 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANSWER_KEY_PATH`, `CC_TEST_CREDS`, `CC_TEST_PASSWORD`, `CODEX_JS`, `EDGE_EXE`, `LESSON_SCHEDULE_PATH`, `NODE_ENV`, `OPENAI_API_KEY` + 24 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:\ntools/schoology_ops.py:add_assignment_url, tools/schoology_ops.py:add_assignment\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-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\ntools/schoology_sync_section.py:get_assignment, tools/schoology_sync_section.py:get_assignment, tools/schoology_sync_section.py:get_assignment\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-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nu9/animations_9_3.py:construct, u9/animations_9_3.py:construct, u9/animations_9_3.py:construct, u9/animations_9_3.py:construct\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-516e1292fc4ea4dc", "name": "Dangling fetch: POST https://api.openai.com/v1/audio/transcriptions (video-ingest-whisper.mjs:540)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/audio/transcriptions (video-ingest-whisper.mjs:540)"}, "fullDescription": {"text": "`video-ingest-whisper.mjs:540` calls `POST https://api.openai.com/v1/audio/transcriptions` 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/audio/transcriptions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fa5e010d848260c1", "name": "Unused endpoint: GET /donow", "shortDescription": {"text": "Unused endpoint: GET /donow"}, "fullDescription": {"text": "`roster-server/donow.js` declares `GET /donow` 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-f6babf6651017e26", "name": "Unused endpoint: GET /grade", "shortDescription": {"text": "Unused endpoint: GET /grade"}, "fullDescription": {"text": "`roster-server/grade.js` declares `GET /grade` 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-edba0bf657d88af8", "name": "Unused endpoint: GET /transcript", "shortDescription": {"text": "Unused endpoint: GET /transcript"}, "fullDescription": {"text": "`roster-server/transcript.js` declares `GET /transcript` 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-809d84c07d673157", "name": "Unused endpoint: GET /teacher/student/:studentId/profile", "shortDescription": {"text": "Unused endpoint: GET /teacher/student/:studentId/profile"}, "fullDescription": {"text": "`roster-server/teacher.js` declares `GET /teacher/student/:studentId/profile` 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-133b075e25a3d8f3", "name": "Unused endpoint: GET /teacher/student/:studentId/grade", "shortDescription": {"text": "Unused endpoint: GET /teacher/student/:studentId/grade"}, "fullDescription": {"text": "`roster-server/teacher.js` declares `GET /teacher/student/:studentId/grade` 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-48c42e4146288f17", "name": "Unused endpoint: GET /teacher/student/:studentId/recent", "shortDescription": {"text": "Unused endpoint: GET /teacher/student/:studentId/recent"}, "fullDescription": {"text": "`roster-server/teacher.js` declares `GET /teacher/student/:studentId/recent` 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-a0242d69f3540126", "name": "Unused endpoint: GET /teacher/student/:studentId/donow", "shortDescription": {"text": "Unused endpoint: GET /teacher/student/:studentId/donow"}, "fullDescription": {"text": "`roster-server/teacher.js` declares `GET /teacher/student/:studentId/donow` 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-4d32979656f8176b", "name": "Unused endpoint: GET /teacher/student/:studentId/poll-archive", "shortDescription": {"text": "Unused endpoint: GET /teacher/student/:studentId/poll-archive"}, "fullDescription": {"text": "`roster-server/teacher.js` declares `GET /teacher/student/:studentId/poll-archive` 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-440a2309a192a858", "name": "Unused endpoint: GET /rollup", "shortDescription": {"text": "Unused endpoint: GET /rollup"}, "fullDescription": {"text": "`roster-server/rollup.js` declares `GET /rollup` 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-4d45bce38d1ee222", "name": "Unused endpoint: GET /receipts/issuer", "shortDescription": {"text": "Unused endpoint: GET /receipts/issuer"}, "fullDescription": {"text": "`roster-server/receipts.js` declares `GET /receipts/issuer` 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-f5abb3710532e440", "name": "Unused endpoint: POST /teacher/nudge", "shortDescription": {"text": "Unused endpoint: POST /teacher/nudge"}, "fullDescription": {"text": "`roster-server/nudge.js` declares `POST /teacher/nudge` 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-ed25a9263b51d5bb", "name": "Unused endpoint: GET /teacher/nudge-history", "shortDescription": {"text": "Unused endpoint: GET /teacher/nudge-history"}, "fullDescription": {"text": "`roster-server/nudge.js` declares `GET /teacher/nudge-history` 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-562c9eefc3778f12", "name": "Unused endpoint: POST /student/nudge", "shortDescription": {"text": "Unused endpoint: POST /student/nudge"}, "fullDescription": {"text": "`roster-server/nudge.js` declares `POST /student/nudge` 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-21f0cd18d046a43b", "name": "Unused endpoint: GET /student/nudge-history", "shortDescription": {"text": "Unused endpoint: GET /student/nudge-history"}, "fullDescription": {"text": "`roster-server/nudge.js` declares `GET /student/nudge-history` 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-e79cfc872171908d", "name": "Unused endpoint: POST /student/nudge-reply", "shortDescription": {"text": "Unused endpoint: POST /student/nudge-reply"}, "fullDescription": {"text": "`roster-server/nudge.js` declares `POST /student/nudge-reply` 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-084e7efa3c0fc2ff", "name": "Unused endpoint: POST /teacher/lesson-unlock", "shortDescription": {"text": "Unused endpoint: POST /teacher/lesson-unlock"}, "fullDescription": {"text": "`roster-server/lesson-unlock.js` declares `POST /teacher/lesson-unlock` 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-431ee6c1667983f5", "name": "Unused endpoint: POST /teacher/lesson-unlock/revoke", "shortDescription": {"text": "Unused endpoint: POST /teacher/lesson-unlock/revoke"}, "fullDescription": {"text": "`roster-server/lesson-unlock.js` declares `POST /teacher/lesson-unlock/revoke` 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-3bc74a3ba5ca0c90", "name": "Unused endpoint: GET /student/lesson-unlocks", "shortDescription": {"text": "Unused endpoint: GET /student/lesson-unlocks"}, "fullDescription": {"text": "`roster-server/lesson-unlock.js` declares `GET /student/lesson-unlocks` 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-34bfdb766993c08b", "name": "Unused endpoint: GET /teacher/student/:studentId/lesson-unlocks", "shortDescription": {"text": "Unused endpoint: GET /teacher/student/:studentId/lesson-unlocks"}, "fullDescription": {"text": "`roster-server/lesson-unlock.js` declares `GET /teacher/student/:studentId/lesson-unlocks` 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-597932dc559ac3a2", "name": "Unused endpoint: POST /remediation/propose", "shortDescription": {"text": "Unused endpoint: POST /remediation/propose"}, "fullDescription": {"text": "`roster-server/remediation.js` declares `POST /remediation/propose` 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-6031a590a2fa9394", "name": "Unused endpoint: POST /remediation/approve", "shortDescription": {"text": "Unused endpoint: POST /remediation/approve"}, "fullDescription": {"text": "`roster-server/remediation.js` declares `POST /remediation/approve` 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-bedd60655d068ded", "name": "Unused endpoint: POST /remediation/complete", "shortDescription": {"text": "Unused endpoint: POST /remediation/complete"}, "fullDescription": {"text": "`roster-server/remediation.js` declares `POST /remediation/complete` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-774f702be9c331de", "name": "Unused endpoint: POST /remediation/waive", "shortDescription": {"text": "Unused endpoint: POST /remediation/waive"}, "fullDescription": {"text": "`roster-server/remediation.js` declares `POST /remediation/waive` 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-5b88b5136c1cc95f", "name": "Unused endpoint: GET /remediation/student", "shortDescription": {"text": "Unused endpoint: GET /remediation/student"}, "fullDescription": {"text": "`roster-server/remediation.js` declares `GET /remediation/student` 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-fc21e2c6618fea32", "name": "Unused endpoint: GET /remediation/list", "shortDescription": {"text": "Unused endpoint: GET /remediation/list"}, "fullDescription": {"text": "`roster-server/remediation.js` declares `GET /remediation/list` 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-cc5b7a6a319a99eb", "name": "Unused endpoint: GET /remediation/unlocks", "shortDescription": {"text": "Unused endpoint: GET /remediation/unlocks"}, "fullDescription": {"text": "`roster-server/remediation.js` declares `GET /remediation/unlocks` 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-901a85bcae797edf", "name": "Unused endpoint: POST /remediation/propose-from-mastery", "shortDescription": {"text": "Unused endpoint: POST /remediation/propose-from-mastery"}, "fullDescription": {"text": "`roster-server/remediation.js` declares `POST /remediation/propose-from-mastery` 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-4eaf772f445473fc", "name": "Unused endpoint: GET /class/blank/:itemId", "shortDescription": {"text": "Unused endpoint: GET /class/blank/:itemId"}, "fullDescription": {"text": "`roster-server/class.js` declares `GET /class/blank/:itemId` 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-b699716137bf843f", "name": "Unused endpoint: GET /class/grades", "shortDescription": {"text": "Unused endpoint: GET /class/grades"}, "fullDescription": {"text": "`roster-server/class.js` declares `GET /class/grades` 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-01548d5469e9f139", "name": "Unused endpoint: POST /class/blooket", "shortDescription": {"text": "Unused endpoint: POST /class/blooket"}, "fullDescription": {"text": "`roster-server/class.js` declares `POST /class/blooket` 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-4c71528c170928ee", "name": "Unused endpoint: POST /class/backfill-receipts", "shortDescription": {"text": "Unused endpoint: POST /class/backfill-receipts"}, "fullDescription": {"text": "`roster-server/class.js` declares `POST /class/backfill-receipts` 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-fa4e2e44d20a1a95", "name": "Unused endpoint: GET /class/mastery", "shortDescription": {"text": "Unused endpoint: GET /class/mastery"}, "fullDescription": {"text": "`roster-server/class.js` declares `GET /class/mastery` 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-f4894ac3c2140883", "name": "Unused endpoint: POST /roster/enroll", "shortDescription": {"text": "Unused endpoint: POST /roster/enroll"}, "fullDescription": {"text": "`roster-server/server.js` declares `POST /roster/enroll` 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-afbb2b454032423f", "name": "Unused endpoint: POST /roster/verify", "shortDescription": {"text": "Unused endpoint: POST /roster/verify"}, "fullDescription": {"text": "`roster-server/server.js` declares `POST /roster/verify` 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-6a133aed29dfb5ff", "name": "Unused endpoint: POST /roster/resolve", "shortDescription": {"text": "Unused endpoint: POST /roster/resolve"}, "fullDescription": {"text": "`roster-server/server.js` declares `POST /roster/resolve` 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-c388654c85f190e6", "name": "Unused endpoint: POST /roster/change-password", "shortDescription": {"text": "Unused endpoint: POST /roster/change-password"}, "fullDescription": {"text": "`roster-server/server.js` declares `POST /roster/change-password` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d74dc38ecc62b76d", "name": "Unused endpoint: GET /roster/open-sections", "shortDescription": {"text": "Unused endpoint: GET /roster/open-sections"}, "fullDescription": {"text": "`roster-server/server.js` declares `GET /roster/open-sections` 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-02aa36fe45539cdf", "name": "Unused endpoint: POST /roster/claim", "shortDescription": {"text": "Unused endpoint: POST /roster/claim"}, "fullDescription": {"text": "`roster-server/server.js` declares `POST /roster/claim` 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-680ed05b5585bf88", "name": "Unused endpoint: GET /roster/list", "shortDescription": {"text": "Unused endpoint: GET /roster/list"}, "fullDescription": {"text": "`roster-server/server.js` declares `GET /roster/list` 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-7c8d1ff4d2f30754", "name": "Unused endpoint: PATCH /roster/:studentId", "shortDescription": {"text": "Unused endpoint: PATCH /roster/:studentId"}, "fullDescription": {"text": "`roster-server/server.js` declares `PATCH /roster/:studentId` 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-8aa5ac7de00b89e8", "name": "Unused endpoint: DELETE /roster/:studentId", "shortDescription": {"text": "Unused endpoint: DELETE /roster/:studentId"}, "fullDescription": {"text": "`roster-server/server.js` declares `DELETE /roster/:studentId` 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-8bade24464b8f0c7", "name": "Unused endpoint: PATCH /roster/:studentId/sprite-hue", "shortDescription": {"text": "Unused endpoint: PATCH /roster/:studentId/sprite-hue"}, "fullDescription": {"text": "`roster-server/server.js` declares `PATCH /roster/:studentId/sprite-hue` 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-80a003b17717b223", "name": "Unused endpoint: PATCH /roster/:studentId/schoology-uid", "shortDescription": {"text": "Unused endpoint: PATCH /roster/:studentId/schoology-uid"}, "fullDescription": {"text": "`roster-server/server.js` declares `PATCH /roster/:studentId/schoology-uid` 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-7cb99a045bfd151f", "name": "Unused endpoint: GET /roster/section/:section", "shortDescription": {"text": "Unused endpoint: GET /roster/section/:section"}, "fullDescription": {"text": "`roster-server/server.js` declares `GET /roster/section/:section` 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-ec74d126a451ee33", "name": "Unused endpoint: GET /trainer/state/:deckId", "shortDescription": {"text": "Unused endpoint: GET /trainer/state/:deckId"}, "fullDescription": {"text": "`roster-server/trainer.js` declares `GET /trainer/state/:deckId` 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-01d363ede1a21cea", "name": "Unused endpoint: PUT /trainer/state/:deckId", "shortDescription": {"text": "Unused endpoint: PUT /trainer/state/:deckId"}, "fullDescription": {"text": "`roster-server/trainer.js` declares `PUT /trainer/state/:deckId` 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-2ff94df079523b34", "name": "Unused endpoint: PATCH /trainer/state/:deckId", "shortDescription": {"text": "Unused endpoint: PATCH /trainer/state/:deckId"}, "fullDescription": {"text": "`roster-server/trainer.js` declares `PATCH /trainer/state/:deckId` 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-c0413d996b88f8da", "name": "Unused endpoint: GET /trainer/leaderboard/:section/:deckId", "shortDescription": {"text": "Unused endpoint: GET /trainer/leaderboard/:section/:deckId"}, "fullDescription": {"text": "`roster-server/trainer.js` declares `GET /trainer/leaderboard/:section/:deckId` 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-f25e919857faaafb", "name": "Unused endpoint: GET /trainer/section/:section/summary/:deckId", "shortDescription": {"text": "Unused endpoint: GET /trainer/section/:section/summary/:deckId"}, "fullDescription": {"text": "`roster-server/trainer.js` declares `GET /trainer/section/:section/summary/:deckId` 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-76cb1190cd494e1f", "name": "Unused endpoint: GET /mastery", "shortDescription": {"text": "Unused endpoint: GET /mastery"}, "fullDescription": {"text": "`roster-server/mastery.js` declares `GET /mastery` 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/18318"}, "properties": {"repository": "robjohncolson/apstats-live-worksheet", "repoUrl": "https://github.com/robjohncolson/apstats-live-worksheet", "branch": "main"}, "results": [{"ruleId": "scanner-44bdb2fdd1449a50", "level": "note", "message": {"text": "Possibly dead Python function: construct"}, "properties": {"repobilityId": "495aa6ceaa730f6f", "scanner": "scanner-primary", "fingerprint": "44bdb2fdd1449a50", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u9/animations_9_3.py:265"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a7b0c2ee4e9a38e7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 railway_client.js:18"}, "properties": {"repobilityId": "0a3708c96e6521d9", "scanner": "scanner-primary", "fingerprint": "a7b0c2ee4e9a38e7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-60438433fb8996b4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 roster-server/receipts.js:94"}, "properties": {"repobilityId": "37372a96dbd12a9f", "scanner": "scanner-primary", "fingerprint": "60438433fb8996b4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-995429eb316b060a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 roster-server/server.js:364"}, "properties": {"repobilityId": "dc2111359ff19fbf", "scanner": "scanner-primary", "fingerprint": "995429eb316b060a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8588daae38d129cf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/html5-qrcode.min.js:1"}, "properties": {"repobilityId": "5e7dd4da43798355", "scanner": "scanner-primary", "fingerprint": "8588daae38d129cf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-95cfa94e2fc86a3d", "level": "note", "message": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 lib/chart.min.js:13"}, "properties": {"repobilityId": "3429b205043818e3", "scanner": "scanner-primary", "fingerprint": "95cfa94e2fc86a3d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.edge-label.no-bg"]}}, {"ruleId": "scanner-c63673b5f6d99f6c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ti84-trainer-v2/native/event-bus.js:7"}, "properties": {"repobilityId": "cc9196ecc62454fd", "scanner": "scanner-primary", "fingerprint": "c63673b5f6d99f6c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9710c8d059e53154", "level": "none", "message": {"text": "No frontend routes/components detected"}, "properties": {"repobilityId": "44ca61485762e494", "scanner": "scanner-primary", "fingerprint": "9710c8d059e53154", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-3998d848ff058b38", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mit_ocw_6.0001_lec2_live.html:870"}, "properties": {"repobilityId": "c7b9f462d863cc85", "scanner": "scanner-primary", "fingerprint": "3998d848ff058b38", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mit_ocw_6.0001_lec2_live.html"}, "region": {"startLine": 870}}}]}, {"ruleId": "scanner-b5b7af67275bbe57", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson3_live.html:1049"}, "properties": {"repobilityId": "70695e5837254f96", "scanner": "scanner-primary", "fingerprint": "b5b7af67275bbe57", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u2_lesson3_live.html"}, "region": {"startLine": 1049}}}]}, {"ruleId": "scanner-efe18f3577ada867", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson3_live.html:1154"}, "properties": {"repobilityId": "a37ee7e0a246c767", "scanner": "scanner-primary", "fingerprint": "efe18f3577ada867", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u6_lesson3_live.html"}, "region": {"startLine": 1154}}}]}, {"ruleId": "scanner-26aae7e61048ea90", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in teacher-guest-reconcile.html:119"}, "properties": {"repobilityId": "b46078ed03b69110", "scanner": "scanner-primary", "fingerprint": "26aae7e61048ea90", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "teacher-guest-reconcile.html"}, "region": {"startLine": 119}}}]}, {"ruleId": "scanner-cd478512e6b2af24", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in teacher-guest-reconcile.html:168"}, "properties": {"repobilityId": "c33f6d9e20c2ec13", "scanner": "scanner-primary", "fingerprint": "cd478512e6b2af24", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "teacher-guest-reconcile.html"}, "region": {"startLine": 168}}}]}, {"ruleId": "scanner-b38c976e630419ba", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in teacher-classroom.html:1007"}, "properties": {"repobilityId": "17c37b43b9ac282f", "scanner": "scanner-primary", "fingerprint": "b38c976e630419ba", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "teacher-classroom.html"}, "region": {"startLine": 1007}}}]}, {"ruleId": "scanner-dc1255906bfd9689", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u9_lesson1_live.html:1040"}, "properties": {"repobilityId": "b9b31dabd93e9da9", "scanner": "scanner-primary", "fingerprint": "dc1255906bfd9689", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u9_lesson1_live.html"}, "region": {"startLine": 1040}}}]}, {"ruleId": "scanner-2b7ba18716210d51", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u3_lesson4_live.html:990"}, "properties": {"repobilityId": "9da7a8bbed8169a8", "scanner": "scanner-primary", "fingerprint": "2b7ba18716210d51", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u3_lesson4_live.html"}, "region": {"startLine": 990}}}]}, {"ruleId": "scanner-9331d468098ae9d2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u3_lesson1_live.html:962"}, "properties": {"repobilityId": "52fd6662a58785ef", "scanner": "scanner-primary", "fingerprint": "9331d468098ae9d2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u3_lesson1_live.html"}, "region": {"startLine": 962}}}]}, {"ruleId": "scanner-4233bc3bd5ab1521", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u8_lesson3_live.html:1186"}, "properties": {"repobilityId": "31d608e157411216", "scanner": "scanner-primary", "fingerprint": "4233bc3bd5ab1521", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u8_lesson3_live.html"}, "region": {"startLine": 1186}}}]}, {"ruleId": "scanner-5a3c0c61b41cd524", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson4_live.html:1066"}, "properties": {"repobilityId": "1871fa8495141950", "scanner": "scanner-primary", "fingerprint": "5a3c0c61b41cd524", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u6_lesson4_live.html"}, "region": {"startLine": 1066}}}]}, {"ruleId": "scanner-7c3715717a4a4fdf", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson6_live.html:1056"}, "properties": {"repobilityId": "e3a9904dbc5e2e47", "scanner": "scanner-primary", "fingerprint": "7c3715717a4a4fdf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u6_lesson6_live.html"}, "region": {"startLine": 1056}}}]}, {"ruleId": "scanner-68b2371a49f0694a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in roster-prefill.js:70"}, "properties": {"repobilityId": "e42c7d91bdd21ef6", "scanner": "scanner-primary", "fingerprint": "68b2371a49f0694a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "roster-prefill.js"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-2940e284755ccf4b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson4_live.html:1064"}, "properties": {"repobilityId": "ad66b0415e70654e", "scanner": "scanner-primary", "fingerprint": "2940e284755ccf4b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u7_lesson4_live.html"}, "region": {"startLine": 1064}}}]}, {"ruleId": "scanner-7306e1db5c4b91c8", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u3_lesson6-7_live.html:1653"}, "properties": {"repobilityId": "81ec32034d3d077c", "scanner": "scanner-primary", "fingerprint": "7306e1db5c4b91c8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u3_lesson6-7_live.html"}, "region": {"startLine": 1653}}}]}, {"ruleId": "scanner-39707d384972c279", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u9_lesson2_live.html:1186"}, "properties": {"repobilityId": "2316ba019422e4b7", "scanner": "scanner-primary", "fingerprint": "39707d384972c279", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u9_lesson2_live.html"}, "region": {"startLine": 1186}}}]}, {"ruleId": "scanner-17c0f116846f2748", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson2_live.html:1026"}, "properties": {"repobilityId": "76c18c5985418e69", "scanner": "scanner-primary", "fingerprint": "17c0f116846f2748", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u1_lesson2_live.html"}, "region": {"startLine": 1026}}}]}, {"ruleId": "scanner-eb3d897f2a9e4780", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u8_lesson4_live.html:1080"}, "properties": {"repobilityId": "f973eb4fa2b3f24f", "scanner": "scanner-primary", "fingerprint": "eb3d897f2a9e4780", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u8_lesson4_live.html"}, "region": {"startLine": 1080}}}]}, {"ruleId": "scanner-b35daf4baf15bf1d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson4_live.html:1036"}, "properties": {"repobilityId": "5ae8be80bfb85858", "scanner": "scanner-primary", "fingerprint": "b35daf4baf15bf1d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u2_lesson4_live.html"}, "region": {"startLine": 1036}}}]}, {"ruleId": "scanner-cbba9681958a84c0", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson6_live.html:1072"}, "properties": {"repobilityId": "6eb932bc1d174570", "scanner": "scanner-primary", "fingerprint": "cbba9681958a84c0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u7_lesson6_live.html"}, "region": {"startLine": 1072}}}]}, {"ruleId": "scanner-bb9a832ff36bf53e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson6_live.html:857"}, "properties": {"repobilityId": "41f090bc17b2bc0d", "scanner": "scanner-primary", "fingerprint": "bb9a832ff36bf53e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u1_lesson6_live.html"}, "region": {"startLine": 857}}}]}, {"ruleId": "scanner-8f1e7f2a880387b1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson5_live.html:1140"}, "properties": {"repobilityId": "054eb4d30bee0765", "scanner": "scanner-primary", "fingerprint": "8f1e7f2a880387b1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u7_lesson5_live.html"}, "region": {"startLine": 1140}}}]}, {"ruleId": "scanner-c623a739aade343b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u5_lesson8_live.html:1086"}, "properties": {"repobilityId": "7522eaa364c4f056", "scanner": "scanner-primary", "fingerprint": "c623a739aade343b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u5_lesson8_live.html"}, "region": {"startLine": 1086}}}]}, {"ruleId": "scanner-357fd5f760e6a978", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson2_live.html:1066"}, "properties": {"repobilityId": "9d47486dcb7bea79", "scanner": "scanner-primary", "fingerprint": "357fd5f760e6a978", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u7_lesson2_live.html"}, "region": {"startLine": 1066}}}]}, {"ruleId": "scanner-d0a457abca245254", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson7_live.html:1122"}, "properties": {"repobilityId": "966d3397812a2766", "scanner": "scanner-primary", "fingerprint": "d0a457abca245254", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u7_lesson7_live.html"}, "region": {"startLine": 1122}}}]}, {"ruleId": "scanner-d1d3ec89ac1956b2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson6_live.html:990"}, "properties": {"repobilityId": "82174de44d159b47", "scanner": "scanner-primary", "fingerprint": "d1d3ec89ac1956b2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u2_lesson6_live.html"}, "region": {"startLine": 990}}}]}, {"ruleId": "scanner-4d5bfdcbad21568f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in ti84-verify.html:258"}, "properties": {"repobilityId": "36dad57bc54d72b3", "scanner": "scanner-primary", "fingerprint": "4d5bfdcbad21568f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ti84-verify.html"}, "region": {"startLine": 258}}}]}, {"ruleId": "scanner-ea7207308a2169e0", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson3_live.html:1031"}, "properties": {"repobilityId": "d3c0ff14bf29997d", "scanner": "scanner-primary", "fingerprint": "ea7207308a2169e0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u1_lesson3_live.html"}, "region": {"startLine": 1031}}}]}, {"ruleId": "scanner-2961b0c8c62b1da4", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u5_lesson3_live.html:1005"}, "properties": {"repobilityId": "059575bf633ff862", "scanner": "scanner-primary", "fingerprint": "2961b0c8c62b1da4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u5_lesson3_live.html"}, "region": {"startLine": 1005}}}]}, {"ruleId": "scanner-a1843a80589ad4df", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u3_lesson2_live.html:1000"}, "properties": {"repobilityId": "13efb62a204b354a", "scanner": "scanner-primary", "fingerprint": "a1843a80589ad4df", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u3_lesson2_live.html"}, "region": {"startLine": 1000}}}]}, {"ruleId": "scanner-c0f517a076e62064", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson2_live.html:1042"}, "properties": {"repobilityId": "dbc1f356ed68d274", "scanner": "scanner-primary", "fingerprint": "c0f517a076e62064", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u2_lesson2_live.html"}, "region": {"startLine": 1042}}}]}, {"ruleId": "scanner-3c2ca4914f4af6e7", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson9_live.html:1082"}, "properties": {"repobilityId": "fd3326c6f0a1fbc2", "scanner": "scanner-primary", "fingerprint": "3c2ca4914f4af6e7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u6_lesson9_live.html"}, "region": {"startLine": 1082}}}]}, {"ruleId": "scanner-a77304c1678f34d6", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in CLAUDE.md:175"}, "properties": {"repobilityId": "357ad155aeba7b11", "scanner": "scanner-primary", "fingerprint": "a77304c1678f34d6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 175}}}]}, {"ruleId": "scanner-700aecbc9d4dde8e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson7_live.html:1007"}, "properties": {"repobilityId": "a5d649311a9c9290", "scanner": "scanner-primary", "fingerprint": "700aecbc9d4dde8e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u2_lesson7_live.html"}, "region": {"startLine": 1007}}}]}, {"ruleId": "scanner-5459016d78789c92", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in video-ingest-whisper.mjs:12"}, "properties": {"repobilityId": "0e3821a78b3962b7", "scanner": "scanner-primary", "fingerprint": "5459016d78789c92", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "video-ingest-whisper.mjs"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-78267465b5f1cb8e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u4_lesson3-4-5_live.html:1258"}, "properties": {"repobilityId": "c630ab440c93f27d", "scanner": "scanner-primary", "fingerprint": "78267465b5f1cb8e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u4_lesson3-4-5_live.html"}, "region": {"startLine": 1258}}}]}, {"ruleId": "scanner-4ce23f329b0dd5b6", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in teacher-dashboard.html:962"}, "properties": {"repobilityId": "ed2bde79e15699b6", "scanner": "scanner-primary", "fingerprint": "4ce23f329b0dd5b6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "teacher-dashboard.html"}, "region": {"startLine": 962}}}]}, {"ruleId": "scanner-a4695c676f5f7362", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson1-2_live.html:1163"}, "properties": {"repobilityId": "75519f485de6fafe", "scanner": "scanner-primary", "fingerprint": "a4695c676f5f7362", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u6_lesson1-2_live.html"}, "region": {"startLine": 1163}}}]}, {"ruleId": "scanner-e4e36a844774f94e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u5_lesson1-2_live.html:1092"}, "properties": {"repobilityId": "46edd8b207796872", "scanner": "scanner-primary", "fingerprint": "e4e36a844774f94e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u5_lesson1-2_live.html"}, "region": {"startLine": 1092}}}]}, {"ruleId": "scanner-1ccae3953e1f444d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u9_lesson5_live.html:1140"}, "properties": {"repobilityId": "f2c519aafd851e44", "scanner": "scanner-primary", "fingerprint": "1ccae3953e1f444d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u9_lesson5_live.html"}, "region": {"startLine": 1140}}}]}, {"ruleId": "scanner-695707ca6e17036c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson8_live.html:1085"}, "properties": {"repobilityId": "0c606718d75d719d", "scanner": "scanner-primary", "fingerprint": "695707ca6e17036c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u6_lesson8_live.html"}, "region": {"startLine": 1085}}}]}, {"ruleId": "scanner-756d8c342b1b0b5e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in study_guide_diagnostic.html:2294"}, "properties": {"repobilityId": "3eb40dac161cd78e", "scanner": "scanner-primary", "fingerprint": "756d8c342b1b0b5e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "study_guide_diagnostic.html"}, "region": {"startLine": 2294}}}]}, {"ruleId": "scanner-ef01f8cc5ef3549d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in teacher-code-generator.html:553"}, "properties": {"repobilityId": "16ba0cc07771387c", "scanner": "scanner-primary", "fingerprint": "ef01f8cc5ef3549d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "teacher-code-generator.html"}, "region": {"startLine": 553}}}]}, {"ruleId": "scanner-c8591483b5a10759", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson1_live.html:1041"}, "properties": {"repobilityId": "88f51d71c44107c8", "scanner": "scanner-primary", "fingerprint": "c8591483b5a10759", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u7_lesson1_live.html"}, "region": {"startLine": 1041}}}]}, {"ruleId": "scanner-641e31d872d73f01", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u4_lesson1-2-3_live.html:1306"}, "properties": {"repobilityId": "66c49a1230ecca17", "scanner": "scanner-primary", "fingerprint": "641e31d872d73f01", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u4_lesson1-2-3_live.html"}, "region": {"startLine": 1306}}}]}, {"ruleId": "scanner-b17cbbabca0ed412", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u8_lesson6_live.html:1189"}, "properties": {"repobilityId": "b9117b3ba03fe2da", "scanner": "scanner-primary", "fingerprint": "b17cbbabca0ed412", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u8_lesson6_live.html"}, "region": {"startLine": 1189}}}]}, {"ruleId": "scanner-030bba56f0472b06", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u8_lesson2_live.html:1107"}, "properties": {"repobilityId": "ca2ad19d599fc01c", "scanner": "scanner-primary", "fingerprint": "030bba56f0472b06", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u8_lesson2_live.html"}, "region": {"startLine": 1107}}}]}, {"ruleId": "scanner-73725d707336ff37", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u4_lesson1-2_live.html:1084"}, "properties": {"repobilityId": "4eafb4f42be3d6df", "scanner": "scanner-primary", "fingerprint": "73725d707336ff37", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u4_lesson1-2_live.html"}, "region": {"startLine": 1084}}}]}, {"ruleId": "scanner-0654fa9f9dfc7bb0", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson7_live.html:857"}, "properties": {"repobilityId": "2e904e8a4862d645", "scanner": "scanner-primary", "fingerprint": "0654fa9f9dfc7bb0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u1_lesson7_live.html"}, "region": {"startLine": 857}}}]}, {"ruleId": "scanner-93330d786037faf2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson5_live.html:1086"}, "properties": {"repobilityId": "6f65107b905827d0", "scanner": "scanner-primary", "fingerprint": "93330d786037faf2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u6_lesson5_live.html"}, "region": {"startLine": 1086}}}]}, {"ruleId": "scanner-f8901e4559f77276", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson4_live.html:1072"}, "properties": {"repobilityId": "b4efa607c5251df7", "scanner": "scanner-primary", "fingerprint": "f8901e4559f77276", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u1_lesson4_live.html"}, "region": {"startLine": 1072}}}]}, {"ruleId": "scanner-a35143782044248b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson1_live.html:983"}, "properties": {"repobilityId": "6fc6490a45757279", "scanner": "scanner-primary", "fingerprint": "a35143782044248b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u1_lesson1_live.html"}, "region": {"startLine": 983}}}]}, {"ruleId": "scanner-ac782525e18941e3", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u8_lesson5_live.html:1199"}, "properties": {"repobilityId": "62932f2c647e4663", "scanner": "scanner-primary", "fingerprint": "ac782525e18941e3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u8_lesson5_live.html"}, "region": {"startLine": 1199}}}]}, {"ruleId": "scanner-e03da849eb5ddf9e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson10_live.html:1070"}, "properties": {"repobilityId": "93723189a30c4564", "scanner": "scanner-primary", "fingerprint": "e03da849eb5ddf9e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u6_lesson10_live.html"}, "region": {"startLine": 1070}}}]}, {"ruleId": "scanner-c3fa1911789fc7b1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson8_live.html:850"}, "properties": {"repobilityId": "058c652f9e941531", "scanner": "scanner-primary", "fingerprint": "c3fa1911789fc7b1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u1_lesson8_live.html"}, "region": {"startLine": 850}}}]}, {"ruleId": "scanner-151152ab581612ff", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mit_ocw_6.0001_lec1_live.html:830"}, "properties": {"repobilityId": "b2103549dfdcfb39", "scanner": "scanner-primary", "fingerprint": "151152ab581612ff", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mit_ocw_6.0001_lec1_live.html"}, "region": {"startLine": 830}}}]}, {"ruleId": "scanner-dcf4ea2f3e854b0c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in ti84_trainer.html:3189"}, "properties": {"repobilityId": "4d85a336ca2892aa", "scanner": "scanner-primary", "fingerprint": "dcf4ea2f3e854b0c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ti84_trainer.html"}, "region": {"startLine": 3189}}}]}, {"ruleId": "scanner-992ab9d87aa02838", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u9_lesson3_live.html:1101"}, "properties": {"repobilityId": "466d407fe7ebac2a", "scanner": "scanner-primary", "fingerprint": "992ab9d87aa02838", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u9_lesson3_live.html"}, "region": {"startLine": 1101}}}]}, {"ruleId": "scanner-23972270555be1a5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u4_lesson10-12_live.html:1237"}, "properties": {"repobilityId": "5df5214e119b3ac1", "scanner": "scanner-primary", "fingerprint": "23972270555be1a5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u4_lesson10-12_live.html"}, "region": {"startLine": 1237}}}]}, {"ruleId": "scanner-1f06e6c517dcdd50", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u4_lesson9_live.html:1040"}, "properties": {"repobilityId": "cea4a9d5f28bfcdb", "scanner": "scanner-primary", "fingerprint": "1f06e6c517dcdd50", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u4_lesson9_live.html"}, "region": {"startLine": 1040}}}]}, {"ruleId": "scanner-2cd96f130988de77", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson9_live.html:1000"}, "properties": {"repobilityId": "3a601a681668750f", "scanner": "scanner-primary", "fingerprint": "2cd96f130988de77", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u2_lesson9_live.html"}, "region": {"startLine": 1000}}}]}, {"ruleId": "scanner-9fb5b8969757d760", "level": "error", "message": {"text": "Possible secret in teacher-roster-console.html"}, "properties": {"repobilityId": "0998a8e669a1169f", "scanner": "scanner-primary", "fingerprint": "9fb5b8969757d760", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "teacher-roster-console.html"}, "region": {"startLine": 599}}}]}, {"ruleId": "scanner-03dc26d6c2fb2c78", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in teacher-roster-console.html:543"}, "properties": {"repobilityId": "6dcc09988f5b501d", "scanner": "scanner-primary", "fingerprint": "03dc26d6c2fb2c78", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "teacher-roster-console.html"}, "region": {"startLine": 543}}}]}, {"ruleId": "scanner-9b57e87524ef4fce", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in classroom-board.js:4086"}, "properties": {"repobilityId": "ac5634539fa5116a", "scanner": "scanner-primary", "fingerprint": "9b57e87524ef4fce", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "classroom-board.js"}, "region": {"startLine": 4086}}}]}, {"ruleId": "scanner-a828fe5defd54237", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u4_lesson6_live.html:919"}, "properties": {"repobilityId": "8970d23ac6f9860d", "scanner": "scanner-primary", "fingerprint": "a828fe5defd54237", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u4_lesson6_live.html"}, "region": {"startLine": 919}}}]}, {"ruleId": "scanner-29f4bb33545c6c63", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u5_lesson4_live.html:975"}, "properties": {"repobilityId": "25ac695c447ff40e", "scanner": "scanner-primary", "fingerprint": "29f4bb33545c6c63", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u5_lesson4_live.html"}, "region": {"startLine": 975}}}]}, {"ruleId": "scanner-56b4e5559f0b85f1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u5_lesson6_live.html:1103"}, "properties": {"repobilityId": "bc192e19905d291a", "scanner": "scanner-primary", "fingerprint": "56b4e5559f0b85f1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u5_lesson6_live.html"}, "region": {"startLine": 1103}}}]}, {"ruleId": "scanner-e104d0cba534d6c9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u9_lesson4_live.html:1112"}, "properties": {"repobilityId": "a81f740ec74fbebd", "scanner": "scanner-primary", "fingerprint": "e104d0cba534d6c9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u9_lesson4_live.html"}, "region": {"startLine": 1112}}}]}, {"ruleId": "scanner-839733fe7372786c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u3_lesson5_live.html:1064"}, "properties": {"repobilityId": "73ad3731b01c4dba", "scanner": "scanner-primary", "fingerprint": "839733fe7372786c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u3_lesson5_live.html"}, "region": {"startLine": 1064}}}]}, {"ruleId": "scanner-e0127b97300f54ca", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u3_lesson3_live.html:1007"}, "properties": {"repobilityId": "4847261ca1212abe", "scanner": "scanner-primary", "fingerprint": "e0127b97300f54ca", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u3_lesson3_live.html"}, "region": {"startLine": 1007}}}]}, {"ruleId": "scanner-91eca9632cb22128", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson3_live.html:1093"}, "properties": {"repobilityId": "cb1c01cedc2acf4e", "scanner": "scanner-primary", "fingerprint": "91eca9632cb22128", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u7_lesson3_live.html"}, "region": {"startLine": 1093}}}]}, {"ruleId": "scanner-31faf2866a90d543", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson9_live.html:1065"}, "properties": {"repobilityId": "e257a1ee98e61f10", "scanner": "scanner-primary", "fingerprint": "31faf2866a90d543", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u7_lesson9_live.html"}, "region": {"startLine": 1065}}}]}, {"ruleId": "scanner-cad33cbf1e95353e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u5_lesson5_live.html:1118"}, "properties": {"repobilityId": "546883f81af394ce", "scanner": "scanner-primary", "fingerprint": "cad33cbf1e95353e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u5_lesson5_live.html"}, "region": {"startLine": 1118}}}]}, {"ruleId": "scanner-49ddfd1fb76f8c1c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u7_lesson8_live.html:1068"}, "properties": {"repobilityId": "75a0322c81916d96", "scanner": "scanner-primary", "fingerprint": "49ddfd1fb76f8c1c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u7_lesson8_live.html"}, "region": {"startLine": 1068}}}]}, {"ruleId": "scanner-4ad66f8db87960e6", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u4_lesson7-8_live.html:1076"}, "properties": {"repobilityId": "d23dc9e330c19d12", "scanner": "scanner-primary", "fingerprint": "4ad66f8db87960e6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u4_lesson7-8_live.html"}, "region": {"startLine": 1076}}}]}, {"ruleId": "scanner-781edc738b5a276f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson1_live.html:1025"}, "properties": {"repobilityId": "495eca0af9ef7ceb", "scanner": "scanner-primary", "fingerprint": "781edc738b5a276f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u2_lesson1_live.html"}, "region": {"startLine": 1025}}}]}, {"ruleId": "scanner-11286d56968354b7", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson8_live.html:1062"}, "properties": {"repobilityId": "1b8575eb07a47744", "scanner": "scanner-primary", "fingerprint": "11286d56968354b7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u2_lesson8_live.html"}, "region": {"startLine": 1062}}}]}, {"ruleId": "scanner-93b430f6417a3727", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in edgar_u6_conceptual_driller_live.html:1695"}, "properties": {"repobilityId": "62f570d77ea9f9fa", "scanner": "scanner-primary", "fingerprint": "93b430f6417a3727", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "edgar_u6_conceptual_driller_live.html"}, "region": {"startLine": 1695}}}]}, {"ruleId": "scanner-4e6d55f2779ce4bf", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u8_lesson1_live.html:1048"}, "properties": {"repobilityId": "8f91ee2d15759639", "scanner": "scanner-primary", "fingerprint": "4e6d55f2779ce4bf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u8_lesson1_live.html"}, "region": {"startLine": 1048}}}]}, {"ruleId": "scanner-01b496af1f88ab7d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson9_live.html:854"}, "properties": {"repobilityId": "5ae824cb5a27a09f", "scanner": "scanner-primary", "fingerprint": "01b496af1f88ab7d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u1_lesson9_live.html"}, "region": {"startLine": 854}}}]}, {"ruleId": "scanner-35d57f9356dabe80", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in start-here.html:837"}, "properties": {"repobilityId": "99afed5c7e72b659", "scanner": "scanner-primary", "fingerprint": "35d57f9356dabe80", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "start-here.html"}, "region": {"startLine": 837}}}]}, {"ruleId": "scanner-f38586bc156c833d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson5_live.html:858"}, "properties": {"repobilityId": "636ec6b8ecdb92f9", "scanner": "scanner-primary", "fingerprint": "f38586bc156c833d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u1_lesson5_live.html"}, "region": {"startLine": 858}}}]}, {"ruleId": "scanner-c204316d259a6f9c", "level": "note", "message": {"text": "Insecure pattern 'document_write' in ap_stats_roadmap_square_mode.html:11038"}, "properties": {"repobilityId": "2d9a47e7fc87fdee", "scanner": "scanner-primary", "fingerprint": "c204316d259a6f9c", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ap_stats_roadmap_square_mode.html"}, "region": {"startLine": 11038}}}]}, {"ruleId": "scanner-8c70acb73b9234dc", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in ap_stats_roadmap_square_mode.html:5035"}, "properties": {"repobilityId": "654792b104d2b45f", "scanner": "scanner-primary", "fingerprint": "8c70acb73b9234dc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ap_stats_roadmap_square_mode.html"}, "region": {"startLine": 5035}}}]}, {"ruleId": "scanner-c6496126967a64d0", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in ap_stats_roadmap_square_mode.html:15765"}, "properties": {"repobilityId": "181dca769d5729de", "scanner": "scanner-primary", "fingerprint": "c6496126967a64d0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ap_stats_roadmap_square_mode.html"}, "region": {"startLine": 15765}}}]}, {"ruleId": "scanner-5be95b7f42cb5d11", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson11_live.html:1126"}, "properties": {"repobilityId": "fc70c3795ec996c7", "scanner": "scanner-primary", "fingerprint": "5be95b7f42cb5d11", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u6_lesson11_live.html"}, "region": {"startLine": 1126}}}]}, {"ruleId": "scanner-f452da941ddcefad", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u1_lesson10_live.html:867"}, "properties": {"repobilityId": "9018f1dce0dbaabc", "scanner": "scanner-primary", "fingerprint": "f452da941ddcefad", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u1_lesson10_live.html"}, "region": {"startLine": 867}}}]}, {"ruleId": "scanner-9998a034ffb7d558", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u5_lesson7_live.html:1087"}, "properties": {"repobilityId": "2fed6f0a3b3d819b", "scanner": "scanner-primary", "fingerprint": "9998a034ffb7d558", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u5_lesson7_live.html"}, "region": {"startLine": 1087}}}]}, {"ruleId": "scanner-edc08510593585e9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u6_lesson7_live.html:1032"}, "properties": {"repobilityId": "be38f9e859c3ae52", "scanner": "scanner-primary", "fingerprint": "edc08510593585e9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u6_lesson7_live.html"}, "region": {"startLine": 1032}}}]}, {"ruleId": "scanner-d3856d39db1d2736", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in u2_lesson5_live.html:1014"}, "properties": {"repobilityId": "2fa295bb272668f5", "scanner": "scanner-primary", "fingerprint": "d3856d39db1d2736", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "u2_lesson5_live.html"}, "region": {"startLine": 1014}}}]}, {"ruleId": "scanner-fe9e3a47ba870a55", "level": "error", "message": {"text": "Possible secret in roster-server/README.md"}, "properties": {"repobilityId": "9fe998eabb7c5bf7", "scanner": "scanner-primary", "fingerprint": "fe9e3a47ba870a55", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "roster-server/README.md"}, "region": {"startLine": 447}}}]}, {"ruleId": "scanner-e7ea215a16d96275", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in roster-server/server.js:53"}, "properties": {"repobilityId": "dfcf1ee80a284f23", "scanner": "scanner-primary", "fingerprint": "e7ea215a16d96275", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "roster-server/server.js"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-4580e96e7646e837", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in scripts/audit-question-context.mjs:113"}, "properties": {"repobilityId": "fe94e88851c79e1f", "scanner": "scanner-primary", "fingerprint": "4580e96e7646e837", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/audit-question-context.mjs"}, "region": {"startLine": 113}}}]}, {"ruleId": "scanner-8df038dad0adb6ff", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in scripts/disambiguate-skills.mjs:203"}, "properties": {"repobilityId": "c8e76160bead6f88", "scanner": "scanner-primary", "fingerprint": "8df038dad0adb6ff", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/disambiguate-skills.mjs"}, "region": {"startLine": 203}}}]}, {"ruleId": "scanner-082b7d012bcc972e", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/disambiguate-skills.mjs:66"}, "properties": {"repobilityId": "691b5f4aabb032d2", "scanner": "scanner-primary", "fingerprint": "082b7d012bcc972e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/disambiguate-skills.mjs"}, "region": {"startLine": 66}}}]}, {"ruleId": "scanner-21264cc6b00c6835", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scripts/wire-reflection-persistence.mjs:100"}, "properties": {"repobilityId": "6c0b153717bac20b", "scanner": "scanner-primary", "fingerprint": "21264cc6b00c6835", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/wire-reflection-persistence.mjs"}, "region": {"startLine": 100}}}]}, {"ruleId": "scanner-ae789ba57bc47fad", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in scripts/build-answer-key.mjs:45"}, "properties": {"repobilityId": "5748ee83351b57bf", "scanner": "scanner-primary", "fingerprint": "ae789ba57bc47fad", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build-answer-key.mjs"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-eba5d7433b0b4374", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in scripts/build-skill-map.mjs:216"}, "properties": {"repobilityId": "ad529ac8162897bb", "scanner": "scanner-primary", "fingerprint": "eba5d7433b0b4374", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build-skill-map.mjs"}, "region": {"startLine": 216}}}]}, {"ruleId": "scanner-c31d98c33c7be22f", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in scripts/audit-skill-tagging.mjs:251"}, "properties": {"repobilityId": "23f892a84aaef353", "scanner": "scanner-primary", "fingerprint": "c31d98c33c7be22f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/audit-skill-tagging.mjs"}, "region": {"startLine": 251}}}]}, {"ruleId": "scanner-6f6187744ba4f3e0", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scripts/ti84-trainer-runtime.js:1259"}, "properties": {"repobilityId": "3d3f117a1cde9d41", "scanner": "scanner-primary", "fingerprint": "6f6187744ba4f3e0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/ti84-trainer-runtime.js"}, "region": {"startLine": 1259}}}]}, {"ruleId": "scanner-2435be7a550569d5", "level": "error", "message": {"text": "Possible secret in scripts/teacher-roster.mjs"}, "properties": {"repobilityId": "e534c71e17395429", "scanner": "scanner-primary", "fingerprint": "2435be7a550569d5", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/teacher-roster.mjs"}, "region": {"startLine": 531}}}]}, {"ruleId": "scanner-164c269632a82c49", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scripts/wire-ai-worksheet-grade.mjs:403"}, "properties": {"repobilityId": "b42557ed2b0337b4", "scanner": "scanner-primary", "fingerprint": "164c269632a82c49", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/wire-ai-worksheet-grade.mjs"}, "region": {"startLine": 403}}}]}, {"ruleId": "scanner-d318e5b380a2ad30", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in lib/validate-dag-topology.mjs:7"}, "properties": {"repobilityId": "533b8a5951dcb6e3", "scanner": "scanner-primary", "fingerprint": "d318e5b380a2ad30", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/validate-dag-topology.mjs"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-2b3f683c71fab2d1", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in lib/html5-qrcode.min.js:1"}, "properties": {"repobilityId": "bace6558aee174f4", "scanner": "scanner-primary", "fingerprint": "2b3f683c71fab2d1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/html5-qrcode.min.js"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-66194dee5a0c0c2e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in lib/html5-qrcode.min.js:1"}, "properties": {"repobilityId": "3f1a5e66aab2a536", "scanner": "scanner-primary", "fingerprint": "66194dee5a0c0c2e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/html5-qrcode.min.js"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-17536ee30056f845", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in lib/question-lo-tagger.mjs:108"}, "properties": {"repobilityId": "f73a539520f36a4c", "scanner": "scanner-primary", "fingerprint": "17536ee30056f845", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/question-lo-tagger.mjs"}, "region": {"startLine": 108}}}]}, {"ruleId": "scanner-472c28ae31ea3034", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in lib/qrcode.min.js:1"}, "properties": {"repobilityId": "732d38436fcd865e", "scanner": "scanner-primary", "fingerprint": "472c28ae31ea3034", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/qrcode.min.js"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2f62c74320084759", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in lib/dag-topology-builder.mjs:39"}, "properties": {"repobilityId": "79533d2cfba92b19", "scanner": "scanner-primary", "fingerprint": "2f62c74320084759", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/dag-topology-builder.mjs"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-2899a3a753cb4bc8", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in ti84-trainer-v2/app.js:3894"}, "properties": {"repobilityId": "7704f47a975f3f8f", "scanner": "scanner-primary", "fingerprint": "2899a3a753cb4bc8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ti84-trainer-v2/app.js"}, "region": {"startLine": 3894}}}]}, {"ruleId": "scanner-175f0485e7215f2c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in ti84-trainer-v2/standalone.html:12193"}, "properties": {"repobilityId": "dc7664460fa75a7a", "scanner": "scanner-primary", "fingerprint": "175f0485e7215f2c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ti84-trainer-v2/standalone.html"}, "region": {"startLine": 12193}}}]}, {"ruleId": "scanner-5cb1bdf59886423f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tools/level-editor-ui.js:679"}, "properties": {"repobilityId": "bcae2ec5e5be08d8", "scanner": "scanner-primary", "fingerprint": "5cb1bdf59886423f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/level-editor-ui.js"}, "region": {"startLine": 679}}}]}, {"ruleId": "scanner-bd3998fd78ba60be", "level": "error", "message": {"text": "Insecure pattern 'eval_used' in tools/cdp/edge.py:369"}, "properties": {"repobilityId": "62fe039e06b1f628", "scanner": "scanner-primary", "fingerprint": "bd3998fd78ba60be", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "eval_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/cdp/edge.py"}, "region": {"startLine": 369}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-cd59a05c27fd9b52", "level": "note", "message": {"text": "Very large file: classroom-board.js (6530 lines)"}, "properties": {"repobilityId": "20c803e047309359", "scanner": "scanner-primary", "fingerprint": "cd59a05c27fd9b52", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-09a5dd5cb81c4492", "level": "note", "message": {"text": "Very large file: tests/study-guide.test.js (1670 lines)"}, "properties": {"repobilityId": "00fa9f5bebbe537c", "scanner": "scanner-primary", "fingerprint": "09a5dd5cb81c4492", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f087a726376c4cd2", "level": "note", "message": {"text": "Very large file: tests/classroom-board-zone5.test.js (1398 lines)"}, "properties": {"repobilityId": "073e5c172a4d8894", "scanner": "scanner-primary", "fingerprint": "f087a726376c4cd2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4a64002107f30014", "level": "note", "message": {"text": "Very large file: tests/classroom-board.test.js (6984 lines)"}, "properties": {"repobilityId": "308b2b6fedb0a79e", "scanner": "scanner-primary", "fingerprint": "4a64002107f30014", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-75b4a0f0d07238dc", "level": "note", "message": {"text": "Very large file: roster-server/lesson-grade.js (1129 lines)"}, "properties": {"repobilityId": "86546c96e5907f4f", "scanner": "scanner-primary", "fingerprint": "75b4a0f0d07238dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a6d25cf812982cda", "level": "note", "message": {"text": "Very large file: roster-server/server.js (1174 lines)"}, "properties": {"repobilityId": "e39362667d3cbea1", "scanner": "scanner-primary", "fingerprint": "a6d25cf812982cda", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cc8784db8de813d3", "level": "note", "message": {"text": "Very large file: scripts/wire-ai-worksheet-grade.mjs (859 lines)"}, "properties": {"repobilityId": "8c7b3ba8fc5c4d31", "scanner": "scanner-primary", "fingerprint": "cc8784db8de813d3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fad723e5c7980904", "level": "note", "message": {"text": "Very large file: lib/curriculum-charts.js (1938 lines)"}, "properties": {"repobilityId": "3b598b0ad6a1ed9a", "scanner": "scanner-primary", "fingerprint": "fad723e5c7980904", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-799e885c4adcfbec", "level": "note", "message": {"text": "Very large file: ti84-trainer-v2/app.js (4337 lines)"}, "properties": {"repobilityId": "93f48adeff0d5f1a", "scanner": "scanner-primary", "fingerprint": "799e885c4adcfbec", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c52321e0789e412f", "level": "note", "message": {"text": "Very large file: tools/level-editor-ui.js (2046 lines)"}, "properties": {"repobilityId": "979e1575d52e8cb7", "scanner": "scanner-primary", "fingerprint": "c52321e0789e412f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "68531d28cd038133", "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": "36e0d19f91ead6d9", "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": "8e71b1272fa6a1a7", "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": "b95f9db464cca905", "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": "ee17a1e1759be09b", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "18644204dc2e5923", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "e747b2bc777b52e1", "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": "c8a59b1be934f38a", "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": "29ed940d6a601f90", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-17d866d91a7c451e", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "properties": {"repobilityId": "ccce5984e58a48f0", "scanner": "scanner-primary", "fingerprint": "17d866d91a7c451e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 248}}}]}, {"ruleId": "scanner-122f91b7f2906dc4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "properties": {"repobilityId": "a2967269048b6a9d", "scanner": "scanner-primary", "fingerprint": "122f91b7f2906dc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ecb0d2c55ed6875d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.local.json"}, "properties": {"repobilityId": "d8bae33a6d517bf0", "scanner": "scanner-primary", "fingerprint": "ecb0d2c55ed6875d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.local.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8ad917c589941989", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gitnexus/gitnexus-guide/SKILL.md"}, "properties": {"repobilityId": "2ace49e9cef867d2", "scanner": "scanner-primary", "fingerprint": "8ad917c589941989", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gitnexus/gitnexus-guide/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b7af0ebca00c8e7b", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gitnexus/gitnexus-exploring/SKILL.md"}, "properties": {"repobilityId": "b40fc1ec9784a7c5", "scanner": "scanner-primary", "fingerprint": "b7af0ebca00c8e7b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gitnexus/gitnexus-exploring/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2a26879567d53bb0", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gitnexus/gitnexus-debugging/SKILL.md"}, "properties": {"repobilityId": "483117a0da0cbd14", "scanner": "scanner-primary", "fingerprint": "2a26879567d53bb0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gitnexus/gitnexus-debugging/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e725d2ab884fbd49", "level": "note", "message": {"text": "Multiple root agent instruction files without precedence"}, "properties": {"repobilityId": "1953db6c89508d22", "scanner": "scanner-primary", "fingerprint": "e725d2ab884fbd49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["agent-instructions", "governance"]}}, {"ruleId": "scanner-4ff1f8c833bbbfac", "level": "none", "message": {"text": "Commented-code block (5 lines) in .v4-logic-block.js:580"}, "properties": {"repobilityId": "166176c8d38712cb", "scanner": "scanner-primary", "fingerprint": "4ff1f8c833bbbfac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2a3a306d8a515a7e", "level": "none", "message": {"text": "Commented-code block (11 lines) in roster-prefill.js:6"}, "properties": {"repobilityId": "94bb2fa8d3dae065", "scanner": "scanner-primary", "fingerprint": "2a3a306d8a515a7e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-59e1aa58cc4b3d90", "level": "note", "message": {"text": "Legacy-named symbol `p_old` in ai-grading-prompts-u6-l9.js:91"}, "properties": {"repobilityId": "38f72c67485e7979", "scanner": "scanner-primary", "fingerprint": "59e1aa58cc4b3d90", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-308a3733717e0351", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 video-ingest-whisper.mjs:540"}, "properties": {"repobilityId": "a67e345e87895923", "scanner": "scanner-primary", "fingerprint": "308a3733717e0351", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-af83d0ad00b9c9d4", "level": "none", "message": {"text": "Commented-code block (7 lines) in canvas_engine.js:65"}, "properties": {"repobilityId": "6afc850615eed6b2", "scanner": "scanner-primary", "fingerprint": "af83d0ad00b9c9d4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e5fbaea8d3024bb", "level": "note", "message": {"text": "Legacy-named symbol `p_old` in ai-grading-prompts-u6-l8.js:94"}, "properties": {"repobilityId": "a252c7d6cd9379cd", "scanner": "scanner-primary", "fingerprint": "9e5fbaea8d3024bb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8c80d199e2f730f7", "level": "none", "message": {"text": "Commented-code block (13 lines) in roster_config.js:3"}, "properties": {"repobilityId": "3d9c3cc22a70eed9", "scanner": "scanner-primary", "fingerprint": "8c80d199e2f730f7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ea1a511353a94868", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 video-ingest.mjs:85"}, "properties": {"repobilityId": "c3edfb71a498ffa4", "scanner": "scanner-primary", "fingerprint": "ea1a511353a94868", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6e01b9bcf36276fd", "level": "none", "message": {"text": "Commented-code block (10 lines) in classroom-board.js:48"}, "properties": {"repobilityId": "70abf5f4fb2cfff4", "scanner": "scanner-primary", "fingerprint": "6e01b9bcf36276fd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5ac9dea04bcda8cd", "level": "none", "message": {"text": "Commented-code block (7 lines) in railway_client.js:70"}, "properties": {"repobilityId": "1c26c872d9e1c22a", "scanner": "scanner-primary", "fingerprint": "5ac9dea04bcda8cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9bcdc26f907c9ed2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 railway_client.js:358"}, "properties": {"repobilityId": "ca90fb6f2eb8237c", "scanner": "scanner-primary", "fingerprint": "9bcdc26f907c9ed2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bec67f04edb15677", "level": "none", "message": {"text": "Commented-code block (5 lines) in activity-level.js:275"}, "properties": {"repobilityId": "6ec936779bc40f8d", "scanner": "scanner-primary", "fingerprint": "bec67f04edb15677", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1cfbcaafe6fc44df", "level": "note", "message": {"text": "Legacy-named symbol `desk_receipts_v1` in gradebook-client.js:65"}, "properties": {"repobilityId": "0aa06ae2536c555a", "scanner": "scanner-primary", "fingerprint": "1cfbcaafe6fc44df", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-102317e64ab1d447", "level": "none", "message": {"text": "Commented-code block (5 lines) in gradebook-client.js:1"}, "properties": {"repobilityId": "ebc4655d79f4aab5", "scanner": "scanner-primary", "fingerprint": "102317e64ab1d447", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5eafea4b5251701c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 gradebook-client.js:220"}, "properties": {"repobilityId": "eac46514a6c4c651", "scanner": "scanner-primary", "fingerprint": "5eafea4b5251701c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fb006ac2760af71f", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/level-editor-sim.test.js:760"}, "properties": {"repobilityId": "23e76f8ecf0f1f5d", "scanner": "scanner-primary", "fingerprint": "fb006ac2760af71f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-078ae579b778161b", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/phase5-structure.test.js:1"}, "properties": {"repobilityId": "6a0caa7d5efd948c", "scanner": "scanner-primary", "fingerprint": "078ae579b778161b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5f540e8440dff02f", "level": "none", "message": {"text": "Commented-code block (9 lines) in tests/calendar-polish.test.js:229"}, "properties": {"repobilityId": "c5a2ccd9d19f5d85", "scanner": "scanner-primary", "fingerprint": "5f540e8440dff02f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-45e103f2c7334076", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/roster-console-structure.test.js:56"}, "properties": {"repobilityId": "ec4d361f52616220", "scanner": "scanner-primary", "fingerprint": "45e103f2c7334076", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1943e3a2016a299b", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/desk-calendar-sync.test.js:1"}, "properties": {"repobilityId": "e53f51f4f9f018d9", "scanner": "scanner-primary", "fingerprint": "1943e3a2016a299b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4fe49f9a14826fd0", "level": "none", "message": {"text": "Commented-code block (10 lines) in tests/desk-modal-polish.test.js:1"}, "properties": {"repobilityId": "9ecb6cc1b50eee50", "scanner": "scanner-primary", "fingerprint": "4fe49f9a14826fd0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a88dcd35f20cbf05", "level": "none", "message": {"text": "Commented-code block (10 lines) in tests/cockpit-level.test.js:6"}, "properties": {"repobilityId": "70e6a2b5b565076a", "scanner": "scanner-primary", "fingerprint": "a88dcd35f20cbf05", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d94568e116b50101", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/desk-receipt-row.test.js:1"}, "properties": {"repobilityId": "a01b85dac4472ddb", "scanner": "scanner-primary", "fingerprint": "d94568e116b50101", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c9e426362e551690", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/desk-menu-sprite-hue.test.js:1"}, "properties": {"repobilityId": "8704a0a4d1172551", "scanner": "scanner-primary", "fingerprint": "c9e426362e551690", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-541dc0c5ad4943b2", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/phase4b-structure.test.js:1"}, "properties": {"repobilityId": "8971e41ef3f551ab", "scanner": "scanner-primary", "fingerprint": "541dc0c5ad4943b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b3b0398bea1a10a1", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/ti84-expected-accuracy.test.js:3"}, "properties": {"repobilityId": "b7dbc8756c674515", "scanner": "scanner-primary", "fingerprint": "b3b0398bea1a10a1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2fb9f399b4f7aa6a", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/desk-auto-open-override.test.js:124"}, "properties": {"repobilityId": "dd01638bc64dbea4", "scanner": "scanner-primary", "fingerprint": "2fb9f399b4f7aa6a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-857597617253d5ee", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/v3-p4-doorways.test.js:3"}, "properties": {"repobilityId": "74d116964543e658", "scanner": "scanner-primary", "fingerprint": "857597617253d5ee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7385e43506fd7b18", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/classroom-board-shared-camera.test.js:334"}, "properties": {"repobilityId": "308428a8f9f0a92f", "scanner": "scanner-primary", "fingerprint": "7385e43506fd7b18", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-949098ad00c7c539", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/desk-timed-deck.test.js:1"}, "properties": {"repobilityId": "1176c1b8d8022474", "scanner": "scanner-primary", "fingerprint": "949098ad00c7c539", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8d3c2ea9f3967490", "level": "note", "message": {"text": "Legacy-named symbol `buildProbesLegacy` in tests/study-guide.test.js:181"}, "properties": {"repobilityId": "6dc639086f57f859", "scanner": "scanner-primary", "fingerprint": "8d3c2ea9f3967490", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-962df08d0c77763c", "level": "none", "message": {"text": "Commented-code block (8 lines) in tests/avatar-popup-inline-expansions.test.js:6"}, "properties": {"repobilityId": "7bb1714ed21fdc14", "scanner": "scanner-primary", "fingerprint": "962df08d0c77763c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-660f844eefc9630a", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/activity-level.test.js:4"}, "properties": {"repobilityId": "65247d667355e9c4", "scanner": "scanner-primary", "fingerprint": "660f844eefc9630a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fc89b6f017df206e", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/grade-pipeline-w3-prompts.test.js:70"}, "properties": {"repobilityId": "63d47be1617d8645", "scanner": "scanner-primary", "fingerprint": "fc89b6f017df206e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-58e403eb3eb854ba", "level": "none", "message": {"text": "Commented-code block (9 lines) in tests/desk-roster-signin.test.js:607"}, "properties": {"repobilityId": "a827cf76ceb6d99e", "scanner": "scanner-primary", "fingerprint": "58e403eb3eb854ba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-74b25faca9a47e07", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/desk-activity-kbd.test.js:1"}, "properties": {"repobilityId": "13dc87cc1c54dca2", "scanner": "scanner-primary", "fingerprint": "74b25faca9a47e07", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f31573a23812ee18", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/desk-donow-ledger.test.js:1"}, "properties": {"repobilityId": "282754ce23e8d6fe", "scanner": "scanner-primary", "fingerprint": "f31573a23812ee18", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7fba5b4c1ba665ce", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/work-manifest.test.js:464"}, "properties": {"repobilityId": "533d216e024602f5", "scanner": "scanner-primary", "fingerprint": "7fba5b4c1ba665ce", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b1053efa7e27bf75", "level": "none", "message": {"text": "Commented-code block (10 lines) in tests/roster-prefill.test.js:1"}, "properties": {"repobilityId": "ec71d2413747141c", "scanner": "scanner-primary", "fingerprint": "b1053efa7e27bf75", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d284fb1ed638ad47", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/ti84-data-trust.test.js:1"}, "properties": {"repobilityId": "e03b04b86ddaf913", "scanner": "scanner-primary", "fingerprint": "d284fb1ed638ad47", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-14cdb4d51708f80b", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/gradebook-feeder-wiring.test.js:322"}, "properties": {"repobilityId": "33d102d5de561306", "scanner": "scanner-primary", "fingerprint": "14cdb4d51708f80b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-72721144273474e5", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/teacher-auth-pages.test.js:1"}, "properties": {"repobilityId": "fb848b15eac38d24", "scanner": "scanner-primary", "fingerprint": "72721144273474e5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8eb63ff18b48278c", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/poll-archive-cockpit.test.js:89"}, "properties": {"repobilityId": "e0db5da2fac799d4", "scanner": "scanner-primary", "fingerprint": "8eb63ff18b48278c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-711d743183ed46ff", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/teacher-student-console-nudges-pagination.test.js:5"}, "properties": {"repobilityId": "ec461b6dca6fafbd", "scanner": "scanner-primary", "fingerprint": "711d743183ed46ff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-99965755339c3f30", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/desk-level-integration.test.js:1"}, "properties": {"repobilityId": "0c6664dfc1dc8291", "scanner": "scanner-primary", "fingerprint": "99965755339c3f30", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-37bef8a8942779df", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/teacher-student-console-drawer.test.js:4"}, "properties": {"repobilityId": "080fbc59a9ceb778", "scanner": "scanner-primary", "fingerprint": "37bef8a8942779df", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-84352e7d89929ed4", "level": "none", "message": {"text": "Commented-code block (9 lines) in tests/poll-archive-desk.test.js:4"}, "properties": {"repobilityId": "09a77d45c052cdab", "scanner": "scanner-primary", "fingerprint": "84352e7d89929ed4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4261294b59e542f5", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/teacher-student-console-nudges.test.js:4"}, "properties": {"repobilityId": "50c82f0186b8c42c", "scanner": "scanner-primary", "fingerprint": "4261294b59e542f5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d1e148405b863fa2", "level": "none", "message": {"text": "Commented-code block (8 lines) in tests/cockpit-activity.test.js:5"}, "properties": {"repobilityId": "2a9ca0d2d44ba676", "scanner": "scanner-primary", "fingerprint": "d1e148405b863fa2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8d24b0f96967c473", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/classroom-board-scroll.test.js:952"}, "properties": {"repobilityId": "31410d0ca968cdc5", "scanner": "scanner-primary", "fingerprint": "8d24b0f96967c473", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b2bac1ee2811c636", "level": "none", "message": {"text": "Commented-code block (9 lines) in tests/desk-completion-gate.test.js:1"}, "properties": {"repobilityId": "5db3ac0a6c2293ea", "scanner": "scanner-primary", "fingerprint": "b2bac1ee2811c636", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-512475779812c702", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/roster-client.test.js:443"}, "properties": {"repobilityId": "de1596f04e226597", "scanner": "scanner-primary", "fingerprint": "512475779812c702", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1c2ff4527c9727d5", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/desk-user-role.test.js:1"}, "properties": {"repobilityId": "54b5e3bf3c0fe679", "scanner": "scanner-primary", "fingerprint": "1c2ff4527c9727d5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-985e76ace3b23aab", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/teacher-student-console-remediation.test.js:4"}, "properties": {"repobilityId": "ed56bd4866bcdc23", "scanner": "scanner-primary", "fingerprint": "985e76ace3b23aab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-78cbd24e367fbe47", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/v3-p3-webrtc.test.js:359"}, "properties": {"repobilityId": "7307d5bee3d9b208", "scanner": "scanner-primary", "fingerprint": "78cbd24e367fbe47", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-519c99a71915fbcc", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/broadcast-nudge-cockpit.test.js:6"}, "properties": {"repobilityId": "a6af41b8626ff330", "scanner": "scanner-primary", "fingerprint": "519c99a71915fbcc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9176e36a68f48463", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/classroom-board.test.js:4407"}, "properties": {"repobilityId": "2aea526bf4d08e4b", "scanner": "scanner-primary", "fingerprint": "9176e36a68f48463", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-21233f6291d5533f", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/teacher-student-console-unlocks.test.js:4"}, "properties": {"repobilityId": "66fb42970ec83e20", "scanner": "scanner-primary", "fingerprint": "21233f6291d5533f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ee324a7b6b4131b2", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/teacher-student-console-dashboard-deeplink.test.js:5"}, "properties": {"repobilityId": "08ac5735239a0f29", "scanner": "scanner-primary", "fingerprint": "ee324a7b6b4131b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-82c52c88a7d33381", "level": "none", "message": {"text": "Commented-code block (8 lines) in tests/classroom-structure.test.js:317"}, "properties": {"repobilityId": "d65d697e2ea5b0f8", "scanner": "scanner-primary", "fingerprint": "82c52c88a7d33381", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c77765a43948d715", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/desk-lesson-gate.test.js:1"}, "properties": {"repobilityId": "1402d9436e9db8b1", "scanner": "scanner-primary", "fingerprint": "c77765a43948d715", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3f360b6a5bc3631f", "level": "none", "message": {"text": "Commented-code block (10 lines) in tests/phase4-structure.test.js:68"}, "properties": {"repobilityId": "af08450d04307c3a", "scanner": "scanner-primary", "fingerprint": "3f360b6a5bc3631f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e6a15788591706f", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/worksheet-identity-clean.test.js:1"}, "properties": {"repobilityId": "5141f80945bdf8e4", "scanner": "scanner-primary", "fingerprint": "9e6a15788591706f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fcf4e4bb42e26aa2", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/worksheet-signin-wall.test.js:1"}, "properties": {"repobilityId": "d64ab8903528e528", "scanner": "scanner-primary", "fingerprint": "fcf4e4bb42e26aa2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-29ce9a959b99e66a", "level": "none", "message": {"text": "Commented-code block (8 lines) in roster-server/donow.js:74"}, "properties": {"repobilityId": "04c2506f7cab4f47", "scanner": "scanner-primary", "fingerprint": "29ce9a959b99e66a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eb6d5223db66247b", "level": "none", "message": {"text": "Commented-code block (6 lines) in roster-server/grade.js:4"}, "properties": {"repobilityId": "32f970061e92c39c", "scanner": "scanner-primary", "fingerprint": "eb6d5223db66247b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9a108f3c400901db", "level": "none", "message": {"text": "Commented-code block (5 lines) in roster-server/teacher-auth.js:3"}, "properties": {"repobilityId": "e2065afa2c5d10d5", "scanner": "scanner-primary", "fingerprint": "9a108f3c400901db", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-71888ef3b0a4f96d", "level": "none", "message": {"text": "Commented-code block (5 lines) in roster-server/teacher.js:203"}, "properties": {"repobilityId": "aa84869209f04270", "scanner": "scanner-primary", "fingerprint": "71888ef3b0a4f96d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-784115492c556058", "level": "none", "message": {"text": "Commented-code block (5 lines) in roster-server/lesson-unlock-db.js:44"}, "properties": {"repobilityId": "64e97c4bec955d90", "scanner": "scanner-primary", "fingerprint": "784115492c556058", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-db537c0331c0288d", "level": "none", "message": {"text": "Commented-code block (5 lines) in roster-server/trainer-db.js:47"}, "properties": {"repobilityId": "cae034e7dadbbf26", "scanner": "scanner-primary", "fingerprint": "db537c0331c0288d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bd5d9994d543a4cb", "level": "none", "message": {"text": "Commented-code block (6 lines) in roster-server/rollup.js:4"}, "properties": {"repobilityId": "6ccc7bcd7725fe01", "scanner": "scanner-primary", "fingerprint": "bd5d9994d543a4cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0d0b31faf7fa8967", "level": "none", "message": {"text": "Commented-code block (5 lines) in roster-server/gradebook-grid.js:7"}, "properties": {"repobilityId": "37b3c348f1b8ace0", "scanner": "scanner-primary", "fingerprint": "0d0b31faf7fa8967", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-370c5fa7a1cf7719", "level": "none", "message": {"text": "Commented-code block (7 lines) in roster-server/db.js:26"}, "properties": {"repobilityId": "9fd9d69739ae4c8a", "scanner": "scanner-primary", "fingerprint": "370c5fa7a1cf7719", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7272a39925f8c46b", "level": "none", "message": {"text": "Commented-code block (6 lines) in roster-server/signup-config.js:12"}, "properties": {"repobilityId": "c058425667c6660a", "scanner": "scanner-primary", "fingerprint": "7272a39925f8c46b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7328fdf248b2336d", "level": "none", "message": {"text": "Commented-code block (8 lines) in roster-server/lesson-grade.js:6"}, "properties": {"repobilityId": "07fbd64fb276f7ea", "scanner": "scanner-primary", "fingerprint": "7328fdf248b2336d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0360b0e5ce4df3d4", "level": "none", "message": {"text": "Commented-code block (5 lines) in roster-server/rate-limit.js:6"}, "properties": {"repobilityId": "4ca5239fcacf2b1a", "scanner": "scanner-primary", "fingerprint": "0360b0e5ce4df3d4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c4ea6c05dad91fc0", "level": "none", "message": {"text": "Commented-code block (5 lines) in roster-server/nudge.js:17"}, "properties": {"repobilityId": "7c8c23cdfaa8d480", "scanner": "scanner-primary", "fingerprint": "c4ea6c05dad91fc0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b9fa43bd6d72d1d6", "level": "none", "message": {"text": "Commented-code block (10 lines) in roster-server/lesson-unlock.js:20"}, "properties": {"repobilityId": "5f364a3d4cdcc8f6", "scanner": "scanner-primary", "fingerprint": "b9fa43bd6d72d1d6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-958514b27614de02", "level": "none", "message": {"text": "Commented-code block (5 lines) in roster-server/remediation.js:4"}, "properties": {"repobilityId": "8d50b7e9f765f777", "scanner": "scanner-primary", "fingerprint": "958514b27614de02", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-25f944f6edd4a633", "level": "none", "message": {"text": "Commented-code block (6 lines) in roster-server/crypto.js:5"}, "properties": {"repobilityId": "00f682d4d1b7e58a", "scanner": "scanner-primary", "fingerprint": "25f944f6edd4a633", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c69635e4c9add2e9", "level": "none", "message": {"text": "Commented-code block (9 lines) in roster-server/class.js:137"}, "properties": {"repobilityId": "f08e61cbe0cd3f72", "scanner": "scanner-primary", "fingerprint": "c69635e4c9add2e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7f1e71be9bced405", "level": "none", "message": {"text": "Commented-code block (5 lines) in roster-server/server.js:45"}, "properties": {"repobilityId": "debf1dd4148db5b7", "scanner": "scanner-primary", "fingerprint": "7f1e71be9bced405", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9abca707c9f0ef47", "level": "none", "message": {"text": "Commented-code block (5 lines) in roster-server/trainer.js:6"}, "properties": {"repobilityId": "975d50014ea75e27", "scanner": "scanner-primary", "fingerprint": "9abca707c9f0ef47", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b832b3649574534", "level": "none", "message": {"text": "Commented-code block (5 lines) in roster-server/remediation-db.js:6"}, "properties": {"repobilityId": "9db04b7c2006caec", "scanner": "scanner-primary", "fingerprint": "1b832b3649574534", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8bfffee92d437765", "level": "none", "message": {"text": "Commented-code block (5 lines) in roster-server/mastery.js:5"}, "properties": {"repobilityId": "2d7522f88c2f21c2", "scanner": "scanner-primary", "fingerprint": "8bfffee92d437765", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1c137037dc7733a9", "level": "none", "message": {"text": "Commented-code block (6 lines) in roster-server/ledger.js:5"}, "properties": {"repobilityId": "79f3a79fed41ff8a", "scanner": "scanner-primary", "fingerprint": "1c137037dc7733a9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f520a05046b4379c", "level": "none", "message": {"text": "Commented-code block (5 lines) in roster-server/poll-archive.js:4"}, "properties": {"repobilityId": "3c1ec0c349e66b96", "scanner": "scanner-primary", "fingerprint": "f520a05046b4379c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-94b8be1d1d4ee120", "level": "none", "message": {"text": "Commented-code block (5 lines) in roster-server/scoring.js:1"}, "properties": {"repobilityId": "fbb735dc87c21456", "scanner": "scanner-primary", "fingerprint": "94b8be1d1d4ee120", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ac7bbe3bef7ee0a8", "level": "none", "message": {"text": "Commented-code block (8 lines) in roster-server/grade-config.js:29"}, "properties": {"repobilityId": "bc4e5a7a22d384ad", "scanner": "scanner-primary", "fingerprint": "ac7bbe3bef7ee0a8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9974f05c261d43bf", "level": "none", "message": {"text": "Commented-code block (7 lines) in roster-server/tests/blooket.test.js:1"}, "properties": {"repobilityId": "ede71f9155ef2178", "scanner": "scanner-primary", "fingerprint": "9974f05c261d43bf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b42980409e2db692", "level": "none", "message": {"text": "Commented-code block (6 lines) in roster-server/tests/lesson-grade-v3.test.js:295"}, "properties": {"repobilityId": "72124cd8cc23b2a4", "scanner": "scanner-primary", "fingerprint": "b42980409e2db692", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2629f5768e3d54e9", "level": "none", "message": {"text": "Commented-code block (8 lines) in roster-server/tests/sprite-hue.test.js:1"}, "properties": {"repobilityId": "91142936d9665c34", "scanner": "scanner-primary", "fingerprint": "2629f5768e3d54e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-35851a78519f9071", "level": "none", "message": {"text": "Commented-code block (5 lines) in roster-server/tests/remediation.test.js:146"}, "properties": {"repobilityId": "7f9a757bacc89e23", "scanner": "scanner-primary", "fingerprint": "35851a78519f9071", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-484bacbd2a9b15d4", "level": "none", "message": {"text": "Commented-code block (5 lines) in roster-server/tests/student-dm.test.js:524"}, "properties": {"repobilityId": "f3aa91b0c9bc3091", "scanner": "scanner-primary", "fingerprint": "484bacbd2a9b15d4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-733a1a2533ce2fdb", "level": "none", "message": {"text": "Commented-code block (5 lines) in roster-server/tests/grade.test.js:621"}, "properties": {"repobilityId": "25fc0b82afa406d4", "scanner": "scanner-primary", "fingerprint": "733a1a2533ce2fdb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7aafde3d06bb6539", "level": "none", "message": {"text": "Commented-code block (8 lines) in roster-server/tests/quarters-by-date.test.js:3"}, "properties": {"repobilityId": "0ced470dc4693597", "scanner": "scanner-primary", "fingerprint": "7aafde3d06bb6539", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e07017416dfdd553", "level": "none", "message": {"text": "Commented-code block (5 lines) in roster-server/tests/lesson-grade.test.js:806"}, "properties": {"repobilityId": "7414a9c06b453e02", "scanner": "scanner-primary", "fingerprint": "e07017416dfdd553", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e30b5013f9e0ddf5", "level": "none", "message": {"text": "Commented-code block (6 lines) in roster-server/tests/gradebook-grid.test.js:1"}, "properties": {"repobilityId": "4112dc8d4452c816", "scanner": "scanner-primary", "fingerprint": "e30b5013f9e0ddf5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6179ca447fcec3d5", "level": "none", "message": {"text": "Commented-code block (5 lines) in roster-server/tests/lesson-unlock-endpoints.test.js:1"}, "properties": {"repobilityId": "78c7b1499362b8b6", "scanner": "scanner-primary", "fingerprint": "6179ca447fcec3d5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b07a17f7cfb3f6c5", "level": "none", "message": {"text": "Commented-code block (7 lines) in roster-server/tests/blooket-endpoint.test.js:1"}, "properties": {"repobilityId": "14887cd3b280c648", "scanner": "scanner-primary", "fingerprint": "b07a17f7cfb3f6c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0274b53d9c8c691d", "level": "none", "message": {"text": "Commented-code block (10 lines) in roster-server/tests/schoology-uid.test.js:1"}, "properties": {"repobilityId": "416a9d2783f87aa3", "scanner": "scanner-primary", "fingerprint": "0274b53d9c8c691d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c6ceded061dd2270", "level": "none", "message": {"text": "Commented-code block (10 lines) in roster-server/tests/teacher-auth.test.js:1"}, "properties": {"repobilityId": "5cf7d30131c9ba2e", "scanner": "scanner-primary", "fingerprint": "c6ceded061dd2270", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9c8905247c147f7e", "level": "none", "message": {"text": "Commented-code block (8 lines) in roster-server/tests/nudge-history.test.js:485"}, "properties": {"repobilityId": "95b1435043f08b37", "scanner": "scanner-primary", "fingerprint": "9c8905247c147f7e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ed549a7ea4437b5a", "level": "none", "message": {"text": "Commented-code block (7 lines) in js/wallet_logic.js:449"}, "properties": {"repobilityId": "a2a33ba7cc9409b9", "scanner": "scanner-primary", "fingerprint": "ed549a7ea4437b5a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d47e8637af527936", "level": "none", "message": {"text": "Commented-code block (8 lines) in scripts/import-blooket.mjs:126"}, "properties": {"repobilityId": "f6d82e2917b30f8f", "scanner": "scanner-primary", "fingerprint": "d47e8637af527936", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d80a7535ba5b3873", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/wire-worksheet-script-paths.mjs:1"}, "properties": {"repobilityId": "a28cca552f0e6d64", "scanner": "scanner-primary", "fingerprint": "d80a7535ba5b3873", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6410e1671795bf9c", "level": "note", "message": {"text": "Legacy-named symbol `curriculum_render_v2` in scripts/disambiguate-skills.mjs:195"}, "properties": {"repobilityId": "e0171a4055133d4a", "scanner": "scanner-primary", "fingerprint": "6410e1671795bf9c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a3a89a167ef545c5", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/disambiguate-skills.mjs:703"}, "properties": {"repobilityId": "640af7e3cd2a8387", "scanner": "scanner-primary", "fingerprint": "a3a89a167ef545c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d3b4e759e3f5c16b", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/wire-reflection-persistence.mjs:54"}, "properties": {"repobilityId": "4fae894095f44554", "scanner": "scanner-primary", "fingerprint": "d3b4e759e3f5c16b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b71646cb0e6c4de9", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/dn2b-wire-feeders.mjs:47"}, "properties": {"repobilityId": "36095f58a7db026b", "scanner": "scanner-primary", "fingerprint": "b71646cb0e6c4de9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2ed3d6ae6ab37514", "level": "note", "message": {"text": "Legacy-named symbol `curriculum_render_v2` in scripts/build-answer-key.mjs:37"}, "properties": {"repobilityId": "bd1ed0d981a346ac", "scanner": "scanner-primary", "fingerprint": "2ed3d6ae6ab37514", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-103da4fa02c49370", "level": "note", "message": {"text": "Legacy-named symbol `curriculum_render_v2` in scripts/build-skill-map.mjs:208"}, "properties": {"repobilityId": "007dc5243c66749b", "scanner": "scanner-primary", "fingerprint": "103da4fa02c49370", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b351ec659d0e8599", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/build-skill-map.mjs:167"}, "properties": {"repobilityId": "6348a437e82c1f5a", "scanner": "scanner-primary", "fingerprint": "b351ec659d0e8599", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d3c84d688252c0e6", "level": "note", "message": {"text": "Legacy-named symbol `curriculum_render_v2` in scripts/audit-skill-tagging.mjs:243"}, "properties": {"repobilityId": "cac56105e5ddd419", "scanner": "scanner-primary", "fingerprint": "d3c84d688252c0e6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-db5248e5e801f802", "level": "none", "message": {"text": "Commented-code block (8 lines) in scripts/audit-skill-tagging.mjs:390"}, "properties": {"repobilityId": "8f3e2532d2d98425", "scanner": "scanner-primary", "fingerprint": "db5248e5e801f802", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-24e1e854dcdd5c56", "level": "note", "message": {"text": "Legacy-named symbol `ti84trainer_state_v1` in scripts/ti84-trainer-runtime.js:4"}, "properties": {"repobilityId": "2e95688350ff514d", "scanner": "scanner-primary", "fingerprint": "24e1e854dcdd5c56", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-526be56740c17d3a", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/wire-verdict-prompt.mjs:46"}, "properties": {"repobilityId": "60df97b1d28ed29b", "scanner": "scanner-primary", "fingerprint": "526be56740c17d3a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8361286ea4b6766d", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/wire-completion-tracker.mjs:58"}, "properties": {"repobilityId": "76c1ce3ee2cba442", "scanner": "scanner-primary", "fingerprint": "8361286ea4b6766d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b1de6177d0c8186f", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/wire-ledger-heal.mjs:60"}, "properties": {"repobilityId": "21b562bb417cd497", "scanner": "scanner-primary", "fingerprint": "b1de6177d0c8186f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-576819500d77d01a", "level": "none", "message": {"text": "Commented-code block (10 lines) in scripts/build-sy2627-schedule.mjs:6"}, "properties": {"repobilityId": "789b7a1b9f32d3bd", "scanner": "scanner-primary", "fingerprint": "576819500d77d01a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9a79ea775582aa44", "level": "none", "message": {"text": "Commented-code block (8 lines) in scripts/wire-verdict-parser.mjs:58"}, "properties": {"repobilityId": "d7fc50ecf15ef5dc", "scanner": "scanner-primary", "fingerprint": "9a79ea775582aa44", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3d8f7b62d1e5f984", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/wire-ai-worksheet-grade.mjs:47"}, "properties": {"repobilityId": "a2753f323568f884", "scanner": "scanner-primary", "fingerprint": "3d8f7b62d1e5f984", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4aa1d0f690d993e0", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/wire-blank-scores.mjs:52"}, "properties": {"repobilityId": "4de70b86631a5724", "scanner": "scanner-primary", "fingerprint": "4aa1d0f690d993e0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-55d0149e245c42ba", "level": "none", "message": {"text": "Commented-code block (10 lines) in lib/dag-topology-builder.mjs:4"}, "properties": {"repobilityId": "f90c3a82c1ba4a6b", "scanner": "scanner-primary", "fingerprint": "55d0149e245c42ba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ba04bf0e4c3ff2dd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 ti84-trainer-v2/bridge.js:417"}, "properties": {"repobilityId": "87e739a5d2f4fbad", "scanner": "scanner-primary", "fingerprint": "ba04bf0e4c3ff2dd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f577dcc6a174e884", "level": "none", "message": {"text": "Commented-code block (5 lines) in ti84-trainer-v2/app.js:784"}, "properties": {"repobilityId": "07af9e403e1dcd0c", "scanner": "scanner-primary", "fingerprint": "f577dcc6a174e884", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ea7bbc0e88c0aaf7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 ti84-trainer-v2/wasm/WebCEmu.js:9"}, "properties": {"repobilityId": "df3117e29fad375e", "scanner": "scanner-primary", "fingerprint": "ea7bbc0e88c0aaf7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0212f5ca68924ba9", "level": "none", "message": {"text": "Commented-code block (5 lines) in ti84-trainer-v2/native/stat-math.js:223"}, "properties": {"repobilityId": "f48b50bd814809eb", "scanner": "scanner-primary", "fingerprint": "0212f5ca68924ba9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9c40f0a3b4b59373", "level": "none", "message": {"text": "Commented-code block (7 lines) in tools/schoology_components.py:273"}, "properties": {"repobilityId": "38491da0b9cb3960", "scanner": "scanner-primary", "fingerprint": "9c40f0a3b4b59373", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f14853bd21924e11", "level": "none", "message": {"text": "Commented-code block (6 lines) in tools/level-editor-ui.js:5"}, "properties": {"repobilityId": "b14d7bd897da34ad", "scanner": "scanner-primary", "fingerprint": "f14853bd21924e11", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f2eaca66b8a5bcc2", "level": "none", "message": {"text": "Commented-code block (9 lines) in tools/level-editor-sim.js:12"}, "properties": {"repobilityId": "9e5fe8dc2e901a5b", "scanner": "scanner-primary", "fingerprint": "f2eaca66b8a5bcc2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6018a73719ed807b", "level": "none", "message": {"text": "Commented-code block (8 lines) in tools/level-editor-model.js:166"}, "properties": {"repobilityId": "eb1e45635c9314c1", "scanner": "scanner-primary", "fingerprint": "6018a73719ed807b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0e39f18e3ed7e624", "level": "none", "message": {"text": "Commented-code block (6 lines) in tools/schoology_ops.py:301"}, "properties": {"repobilityId": "d0a6e54c45f9e17e", "scanner": "scanner-primary", "fingerprint": "0e39f18e3ed7e624", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e121e15f2f5c1701", "level": "none", "message": {"text": "Commented-code block (5 lines) in tools/level-editor-render.js:229"}, "properties": {"repobilityId": "692eb6f593538d20", "scanner": "scanner-primary", "fingerprint": "e121e15f2f5c1701", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5f25dbbfd32f6aac", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 tools/level-editor-render.js:164"}, "properties": {"repobilityId": "90173efcd4b78b1f", "scanner": "scanner-primary", "fingerprint": "5f25dbbfd32f6aac", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2f0f0b7477fa071a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 tools/sprite-regions.js:2"}, "properties": {"repobilityId": "2d6234f812d189cb", "scanner": "scanner-primary", "fingerprint": "2f0f0b7477fa071a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1cb597a98b13ccd6", "level": "none", "message": {"text": "Commented-code block (5 lines) in tools/schoology_sync_section.py:71"}, "properties": {"repobilityId": "2dce876040c54cba", "scanner": "scanner-primary", "fingerprint": "1cb597a98b13ccd6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-67e14aa9fcf18060", "level": "none", "message": {"text": "Commented-code block (8 lines) in tools/schoology-dom-helpers.js:27"}, "properties": {"repobilityId": "bd901ae971388e9c", "scanner": "scanner-primary", "fingerprint": "67e14aa9fcf18060", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cfd87903c715306c", "level": "none", "message": {"text": "Commented-code block (5 lines) in tools/level-editor-lint.js:12"}, "properties": {"repobilityId": "9f90e20fa03feef9", "scanner": "scanner-primary", "fingerprint": "cfd87903c715306c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f3ba2dccde76bcd2", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 tools/cdp/edge.py:125"}, "properties": {"repobilityId": "88e6b3dbd67258f4", "scanner": "scanner-primary", "fingerprint": "f3ba2dccde76bcd2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a260e355ea7d9f89", "level": "note", "message": {"text": "32 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "e735cee6f43259c2", "scanner": "scanner-primary", "fingerprint": "a260e355ea7d9f89", "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": "94a9b2b2070ffa7a", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "7a5e5f4af6224c81", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "1cc22400d2048674", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "934f3c70140f2de9", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "98b029ca602ae82c", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "12b369a25090426b", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "fceca59bffd588a5", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-516e1292fc4ea4dc", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/audio/transcriptions (video-ingest-whisper.mjs:540)"}, "properties": {"repobilityId": "df6bb4c8405df4ab", "scanner": "scanner-primary", "fingerprint": "516e1292fc4ea4dc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fa5e010d848260c1", "level": "note", "message": {"text": "Unused endpoint: GET /donow"}, "properties": {"repobilityId": "7ea94d6c7a006b25", "scanner": "scanner-primary", "fingerprint": "fa5e010d848260c1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f6babf6651017e26", "level": "note", "message": {"text": "Unused endpoint: GET /grade"}, "properties": {"repobilityId": "9f9d814cd7bc33b9", "scanner": "scanner-primary", "fingerprint": "f6babf6651017e26", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-edba0bf657d88af8", "level": "note", "message": {"text": "Unused endpoint: GET /transcript"}, "properties": {"repobilityId": "e3d899d33acfc8ff", "scanner": "scanner-primary", "fingerprint": "edba0bf657d88af8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-809d84c07d673157", "level": "note", "message": {"text": "Unused endpoint: GET /teacher/student/:studentId/profile"}, "properties": {"repobilityId": "275c465be7bb8777", "scanner": "scanner-primary", "fingerprint": "809d84c07d673157", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-133b075e25a3d8f3", "level": "note", "message": {"text": "Unused endpoint: GET /teacher/student/:studentId/grade"}, "properties": {"repobilityId": "4f929fb24cf552a2", "scanner": "scanner-primary", "fingerprint": "133b075e25a3d8f3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-48c42e4146288f17", "level": "note", "message": {"text": "Unused endpoint: GET /teacher/student/:studentId/recent"}, "properties": {"repobilityId": "2d4c243e473c8ef3", "scanner": "scanner-primary", "fingerprint": "48c42e4146288f17", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a0242d69f3540126", "level": "note", "message": {"text": "Unused endpoint: GET /teacher/student/:studentId/donow"}, "properties": {"repobilityId": "17039e505da1a5b3", "scanner": "scanner-primary", "fingerprint": "a0242d69f3540126", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4d32979656f8176b", "level": "note", "message": {"text": "Unused endpoint: GET /teacher/student/:studentId/poll-archive"}, "properties": {"repobilityId": "a7d773abac3dd48a", "scanner": "scanner-primary", "fingerprint": "4d32979656f8176b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-440a2309a192a858", "level": "note", "message": {"text": "Unused endpoint: GET /rollup"}, "properties": {"repobilityId": "c25d1030ad9ae91c", "scanner": "scanner-primary", "fingerprint": "440a2309a192a858", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4d45bce38d1ee222", "level": "note", "message": {"text": "Unused endpoint: GET /receipts/issuer"}, "properties": {"repobilityId": "c85805b6954ecfab", "scanner": "scanner-primary", "fingerprint": "4d45bce38d1ee222", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f5abb3710532e440", "level": "note", "message": {"text": "Unused endpoint: POST /teacher/nudge"}, "properties": {"repobilityId": "6e7376e90b023864", "scanner": "scanner-primary", "fingerprint": "f5abb3710532e440", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ed25a9263b51d5bb", "level": "note", "message": {"text": "Unused endpoint: GET /teacher/nudge-history"}, "properties": {"repobilityId": "ae9a8eac649e809c", "scanner": "scanner-primary", "fingerprint": "ed25a9263b51d5bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-562c9eefc3778f12", "level": "note", "message": {"text": "Unused endpoint: POST /student/nudge"}, "properties": {"repobilityId": "08ae5c39c0bbd749", "scanner": "scanner-primary", "fingerprint": "562c9eefc3778f12", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-21f0cd18d046a43b", "level": "note", "message": {"text": "Unused endpoint: GET /student/nudge-history"}, "properties": {"repobilityId": "d898e2dd72daeed0", "scanner": "scanner-primary", "fingerprint": "21f0cd18d046a43b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e79cfc872171908d", "level": "note", "message": {"text": "Unused endpoint: POST /student/nudge-reply"}, "properties": {"repobilityId": "2142b50c2539b487", "scanner": "scanner-primary", "fingerprint": "e79cfc872171908d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-084e7efa3c0fc2ff", "level": "note", "message": {"text": "Unused endpoint: POST /teacher/lesson-unlock"}, "properties": {"repobilityId": "de6383b1fbcb3312", "scanner": "scanner-primary", "fingerprint": "084e7efa3c0fc2ff", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-431ee6c1667983f5", "level": "note", "message": {"text": "Unused endpoint: POST /teacher/lesson-unlock/revoke"}, "properties": {"repobilityId": "68528328402a677c", "scanner": "scanner-primary", "fingerprint": "431ee6c1667983f5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3bc74a3ba5ca0c90", "level": "note", "message": {"text": "Unused endpoint: GET /student/lesson-unlocks"}, "properties": {"repobilityId": "c43b54dc4c740129", "scanner": "scanner-primary", "fingerprint": "3bc74a3ba5ca0c90", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-34bfdb766993c08b", "level": "note", "message": {"text": "Unused endpoint: GET /teacher/student/:studentId/lesson-unlocks"}, "properties": {"repobilityId": "d21033366e727b83", "scanner": "scanner-primary", "fingerprint": "34bfdb766993c08b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-597932dc559ac3a2", "level": "note", "message": {"text": "Unused endpoint: POST /remediation/propose"}, "properties": {"repobilityId": "85307e06fa3acaf1", "scanner": "scanner-primary", "fingerprint": "597932dc559ac3a2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6031a590a2fa9394", "level": "note", "message": {"text": "Unused endpoint: POST /remediation/approve"}, "properties": {"repobilityId": "7f7d63040958a9b2", "scanner": "scanner-primary", "fingerprint": "6031a590a2fa9394", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bedd60655d068ded", "level": "note", "message": {"text": "Unused endpoint: POST /remediation/complete"}, "properties": {"repobilityId": "1788bbff96076d13", "scanner": "scanner-primary", "fingerprint": "bedd60655d068ded", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-774f702be9c331de", "level": "note", "message": {"text": "Unused endpoint: POST /remediation/waive"}, "properties": {"repobilityId": "11c118aac806abf1", "scanner": "scanner-primary", "fingerprint": "774f702be9c331de", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5b88b5136c1cc95f", "level": "note", "message": {"text": "Unused endpoint: GET /remediation/student"}, "properties": {"repobilityId": "221e63b2a8b9d5c1", "scanner": "scanner-primary", "fingerprint": "5b88b5136c1cc95f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fc21e2c6618fea32", "level": "note", "message": {"text": "Unused endpoint: GET /remediation/list"}, "properties": {"repobilityId": "69e9be9048472c00", "scanner": "scanner-primary", "fingerprint": "fc21e2c6618fea32", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cc5b7a6a319a99eb", "level": "note", "message": {"text": "Unused endpoint: GET /remediation/unlocks"}, "properties": {"repobilityId": "20fa995aab44c5f3", "scanner": "scanner-primary", "fingerprint": "cc5b7a6a319a99eb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-901a85bcae797edf", "level": "note", "message": {"text": "Unused endpoint: POST /remediation/propose-from-mastery"}, "properties": {"repobilityId": "c76d23297c5c5f96", "scanner": "scanner-primary", "fingerprint": "901a85bcae797edf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4eaf772f445473fc", "level": "note", "message": {"text": "Unused endpoint: GET /class/blank/:itemId"}, "properties": {"repobilityId": "39cab7269e1b064f", "scanner": "scanner-primary", "fingerprint": "4eaf772f445473fc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b699716137bf843f", "level": "note", "message": {"text": "Unused endpoint: GET /class/grades"}, "properties": {"repobilityId": "fb0a99ec265389ae", "scanner": "scanner-primary", "fingerprint": "b699716137bf843f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-01548d5469e9f139", "level": "note", "message": {"text": "Unused endpoint: POST /class/blooket"}, "properties": {"repobilityId": "256571d751e80ed8", "scanner": "scanner-primary", "fingerprint": "01548d5469e9f139", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4c71528c170928ee", "level": "note", "message": {"text": "Unused endpoint: POST /class/backfill-receipts"}, "properties": {"repobilityId": "71e36e2c2c6eedf4", "scanner": "scanner-primary", "fingerprint": "4c71528c170928ee", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fa4e2e44d20a1a95", "level": "note", "message": {"text": "Unused endpoint: GET /class/mastery"}, "properties": {"repobilityId": "5215563308dabee9", "scanner": "scanner-primary", "fingerprint": "fa4e2e44d20a1a95", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f4894ac3c2140883", "level": "note", "message": {"text": "Unused endpoint: POST /roster/enroll"}, "properties": {"repobilityId": "78b4513f8ab0f3b1", "scanner": "scanner-primary", "fingerprint": "f4894ac3c2140883", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-afbb2b454032423f", "level": "note", "message": {"text": "Unused endpoint: POST /roster/verify"}, "properties": {"repobilityId": "886eade2586d917c", "scanner": "scanner-primary", "fingerprint": "afbb2b454032423f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6a133aed29dfb5ff", "level": "note", "message": {"text": "Unused endpoint: POST /roster/resolve"}, "properties": {"repobilityId": "b7f465e37540cf36", "scanner": "scanner-primary", "fingerprint": "6a133aed29dfb5ff", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c388654c85f190e6", "level": "note", "message": {"text": "Unused endpoint: POST /roster/change-password"}, "properties": {"repobilityId": "a9533d5e55bebdec", "scanner": "scanner-primary", "fingerprint": "c388654c85f190e6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d74dc38ecc62b76d", "level": "note", "message": {"text": "Unused endpoint: GET /roster/open-sections"}, "properties": {"repobilityId": "ed372f75b689d5e1", "scanner": "scanner-primary", "fingerprint": "d74dc38ecc62b76d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-02aa36fe45539cdf", "level": "note", "message": {"text": "Unused endpoint: POST /roster/claim"}, "properties": {"repobilityId": "ece60f25e600c0c0", "scanner": "scanner-primary", "fingerprint": "02aa36fe45539cdf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-680ed05b5585bf88", "level": "note", "message": {"text": "Unused endpoint: GET /roster/list"}, "properties": {"repobilityId": "4c7a0dcaa63c25e5", "scanner": "scanner-primary", "fingerprint": "680ed05b5585bf88", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7c8d1ff4d2f30754", "level": "note", "message": {"text": "Unused endpoint: PATCH /roster/:studentId"}, "properties": {"repobilityId": "c438652d676e6fca", "scanner": "scanner-primary", "fingerprint": "7c8d1ff4d2f30754", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8aa5ac7de00b89e8", "level": "note", "message": {"text": "Unused endpoint: DELETE /roster/:studentId"}, "properties": {"repobilityId": "611b7897a6fa5b14", "scanner": "scanner-primary", "fingerprint": "8aa5ac7de00b89e8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8bade24464b8f0c7", "level": "note", "message": {"text": "Unused endpoint: PATCH /roster/:studentId/sprite-hue"}, "properties": {"repobilityId": "d04518c5bc9ca3b6", "scanner": "scanner-primary", "fingerprint": "8bade24464b8f0c7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-80a003b17717b223", "level": "note", "message": {"text": "Unused endpoint: PATCH /roster/:studentId/schoology-uid"}, "properties": {"repobilityId": "db628725ed25b358", "scanner": "scanner-primary", "fingerprint": "80a003b17717b223", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7cb99a045bfd151f", "level": "note", "message": {"text": "Unused endpoint: GET /roster/section/:section"}, "properties": {"repobilityId": "a9e02cec32c43752", "scanner": "scanner-primary", "fingerprint": "7cb99a045bfd151f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ec74d126a451ee33", "level": "note", "message": {"text": "Unused endpoint: GET /trainer/state/:deckId"}, "properties": {"repobilityId": "48d99e10ffa032b2", "scanner": "scanner-primary", "fingerprint": "ec74d126a451ee33", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-01d363ede1a21cea", "level": "note", "message": {"text": "Unused endpoint: PUT /trainer/state/:deckId"}, "properties": {"repobilityId": "2eb4d4a92c039854", "scanner": "scanner-primary", "fingerprint": "01d363ede1a21cea", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2ff94df079523b34", "level": "note", "message": {"text": "Unused endpoint: PATCH /trainer/state/:deckId"}, "properties": {"repobilityId": "e31fcbdd1fa9db7c", "scanner": "scanner-primary", "fingerprint": "2ff94df079523b34", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c0413d996b88f8da", "level": "note", "message": {"text": "Unused endpoint: GET /trainer/leaderboard/:section/:deckId"}, "properties": {"repobilityId": "c4d4a045c5b9fc90", "scanner": "scanner-primary", "fingerprint": "c0413d996b88f8da", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f25e919857faaafb", "level": "note", "message": {"text": "Unused endpoint: GET /trainer/section/:section/summary/:deckId"}, "properties": {"repobilityId": "eef9cc0d5f6639b4", "scanner": "scanner-primary", "fingerprint": "f25e919857faaafb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-76cb1190cd494e1f", "level": "note", "message": {"text": "Unused endpoint: GET /mastery"}, "properties": {"repobilityId": "84309bf21dd5e7f5", "scanner": "scanner-primary", "fingerprint": "76cb1190cd494e1f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}