{"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-da5600e643db612f", "name": "Possibly dead Python function: logout_via_topbar", "shortDescription": {"text": "Possibly dead Python function: logout_via_topbar"}, "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-ff6a8193c9c4b832", "name": "Possibly dead Python function: reject_first_leave", "shortDescription": {"text": "Possibly dead Python function: reject_first_leave"}, "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-f0f0c3e4d314dd61", "name": "Possibly dead Python function: inject_auth_token", "shortDescription": {"text": "Possibly dead Python function: inject_auth_token"}, "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-f4a24aa8cadb2858", "name": "Stray `console.log` in TS/JS \u2014 test-phase3.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-phase3.js:12"}, "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-a9129cf480ea16f9", "name": "Stray `console.log` in TS/JS \u2014 screenshot-mobile.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 screenshot-mobile.js:14"}, "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-06b32b92020ef591", "name": "Stray `console.log` in TS/JS \u2014 debug-events.js:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 debug-events.js:5"}, "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-6151e23b9f7ef373", "name": "Stray `console.log` in TS/JS \u2014 test-phase5.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-phase5.js:11"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-97646a75eb0df34a", "name": "Stray `console.log` in TS/JS \u2014 debug-live-admin.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 debug-live-admin.js:6"}, "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-cd8d8dca27bad946", "name": "Stray `console.log` in TS/JS \u2014 audit-device-test.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 audit-device-test.js:9"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a6f1b46de9d6608e", "name": "Stray `console.log` in TS/JS \u2014 audit-verify.js:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 audit-verify.js:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b2a69a907e22b94c", "name": "Stray `console.log` in TS/JS \u2014 audit-final-verify.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 audit-final-verify.js:8"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d1d8e03b3b14eeb4", "name": "Stray `console.log` in TS/JS \u2014 test-admin-tabs.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-admin-tabs.js:19"}, "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-3960b017c6f9565a", "name": "Stray `console.log` in TS/JS \u2014 audit-apibase.js:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 audit-apibase.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-56b11d6d64bb78b0", "name": "Stray `console.log` in TS/JS \u2014 verify-profile-mobile.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 verify-profile-mobile.js:19"}, "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-c1ec333f28a73659", "name": "Stray `console.log` in TS/JS \u2014 verify-mobile.js:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 verify-mobile.js:33"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0fafeb257bb1aa64", "name": "Stray `console.log` in TS/JS \u2014 test-phase3-debug.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-phase3-debug.js:14"}, "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-866a7077249dfa7c", "name": "Stray `console.log` in TS/JS \u2014 debug-login-flow.js:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 debug-login-flow.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-e1d9a6620d94eacf", "name": "Stray `console.log` in TS/JS \u2014 test-pages.js:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-pages.js:35"}, "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-06adb58f475fbffb", "name": "Stray `console.log` in TS/JS \u2014 audit-warnings.js:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 audit-warnings.js:44"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ef2d8d51e754d80b", "name": "Stray `console.log` in TS/JS \u2014 test-react-e2e.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-react-e2e.js:19"}, "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-dff67cec1633a151", "name": "Stray `console.log` in TS/JS \u2014 verify-dashboard.js:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 verify-dashboard.js:22"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-36fdc66ceafe10d0", "name": "Stray `console.log` in TS/JS \u2014 test-app.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-app.js:9"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8cece4be250bbc2e", "name": "Stray `console.log` in TS/JS \u2014 verify-css-local.js:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 verify-css-local.js:36"}, "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-2627a21934611bc6", "name": "Stray `console.log` in TS/JS \u2014 generate-icons.js:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 generate-icons.js:44"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7775260d7dbcb6e1", "name": "Stray `console.log` in TS/JS \u2014 audit-device-retest.js:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 audit-device-retest.js:5"}, "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-5d435c457e65e7be", "name": "Stray `console.log` in TS/JS \u2014 branding-render.js:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 branding-render.js:49"}, "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-b04efe3820b7312b", "name": "Stray `console.log` in TS/JS \u2014 verify-css.js:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 verify-css.js:41"}, "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-762c347996169a75", "name": "Stray `console.log` in TS/JS \u2014 debug-events2.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 debug-events2.js:6"}, "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-082072a8a60a0b66", "name": "Stray `console.log` in TS/JS \u2014 debug-requests.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 debug-requests.js:6"}, "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-4a7e2f35ff68d471", "name": "Stray `console.log` in TS/JS \u2014 screenshot-laptop.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 screenshot-laptop.js:14"}, "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-ed8a084b299d605b", "name": "Stray `console.log` in TS/JS \u2014 screenshot-live.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 screenshot-live.js:16"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-52b02f3b6c31efe5", "name": "Icon-only button without accessible name \u2014 frontend/src/components/Modal.jsx:6", "shortDescription": {"text": "Icon-only button without accessible name \u2014 frontend/src/components/Modal.jsx:6"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0dba08f4b1fb7b65", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/pages/Chat.jsx:112", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/pages/Chat.jsx:112"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d80ef1cd2b95c7dc", "name": "Icon-only button without accessible name \u2014 frontend/src/pages/admin/StudentsTab.jsx:123", "shortDescription": {"text": "Icon-only button without accessible name \u2014 frontend/src/pages/admin/StudentsTab.jsx:123"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6c2c6a7bfbe995ad", "name": "Stray `console.log` in TS/JS \u2014 automated_test/dast_runner.js:121", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 automated_test/dast_runner.js:121"}, "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-97ea2e3d50cac736", "name": "Stray `console.log` in TS/JS \u2014 automated_test/reaudit-live.js:4", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 automated_test/reaudit-live.js:4"}, "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-ef8311e0eea1a11c", "name": "Stray `console.log` in TS/JS \u2014 backend/export-students.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/export-students.js:16"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1651e164b55f6052", "name": "Stray `console.log` in TS/JS \u2014 backend/create-admin.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/create-admin.js:9"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d9f51433db1f0bc3", "name": "Stray `console.log` in TS/JS \u2014 backend/reset-admin.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/reset-admin.js:8"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ed2f4279d54767ad", "name": "Stray `console.log` in TS/JS \u2014 backend/seed-students.js:144", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/seed-students.js:144"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-692e155870a5d7e1", "name": "Stray `console.log` in TS/JS \u2014 backend/renumber-requests.js:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/renumber-requests.js:15"}, "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-8efdd2b8df8c1c4c", "name": "Stray `console.log` in TS/JS \u2014 backend/dev-local.js:85", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/dev-local.js:85"}, "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-695feb7d5c624c1e", "name": "Stray `console.log` in TS/JS \u2014 backend/server.js:87", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/server.js:87"}, "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-fc7186aae5daa756", "name": "Stray `console.log` in TS/JS \u2014 backend/seed.js:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/seed.js:32"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1dd5830f186c6113", "name": "Stray `console.log` in TS/JS \u2014 backend/test-seq.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/test-seq.js:11"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ff08e18fe2efffa", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/refresh-demo-data.js:88", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/refresh-demo-data.js:88"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-33394e0cb4770bed", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/cleanup-notices.js:53", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/cleanup-notices.js:53"}, "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-ac833b9656b41ad6", "name": "Stray `console.log` in TS/JS \u2014 backend/utils/email.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/utils/email.js:19"}, "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-cf3acc1bab5e46a5", "name": "Stray `console.log` in TS/JS \u2014 backend/migrations/0003-notice-lifecycle.js:61", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/migrations/0003-notice-lifecycle.js:61"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-04bbb12d7b477a39", "name": "Stray `console.log` in TS/JS \u2014 backend/migrations/0001-dedupe-attendance.js:66", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/migrations/0001-dedupe-attendance.js:66"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-19b8374376ff1459", "name": "Stray `console.log` in TS/JS \u2014 backend/migrations/0002-backfill-fee-verification.js:47", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/migrations/0002-backfill-fee-verification.js:47"}, "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-63e15a729abb0a66", "name": "Insecure pattern 'direct_innerhtml_assignment' in requests.html:73", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in requests.html:73"}, "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-61eb78252a491c1a", "name": "Insecure pattern 'direct_innerhtml_assignment' in attendance.html:93", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in attendance.html:93"}, "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-9261f7d987467122", "name": "Insecure pattern 'direct_innerhtml_assignment' in exam.html:57", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in exam.html:57"}, "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-04ede1d2b88c1a98", "name": "Possible secret in audit-verify.js", "shortDescription": {"text": "Possible secret in audit-verify.js"}, "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-276f0a30af45f95c", "name": "Insecure pattern 'local_storage_auth_token' in audit-verify.js:28", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in audit-verify.js:28"}, "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-9effec0144623988", "name": "Insecure pattern 'direct_innerhtml_assignment' in admin-requests.html:144", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in admin-requests.html:144"}, "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-82571f584263bc52", "name": "Insecure pattern 'direct_innerhtml_assignment' in admin-notices.html:143", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in admin-notices.html:143"}, "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-1ebf6599f91cca03", "name": "Insecure pattern 'direct_innerhtml_assignment' in contact.html:57", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in contact.html:57"}, "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-13921ff53cc46bac", "name": "Insecure pattern 'direct_innerhtml_assignment' in library.html:57", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in library.html:57"}, "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-6533e6291264ce7b", "name": "Insecure pattern 'direct_innerhtml_assignment' in dashboard.html:65", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in dashboard.html:65"}, "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-2f477987527f6722", "name": "Insecure pattern 'local_storage_auth_token' in verify-profile-mobile.js:7", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in verify-profile-mobile.js:7"}, "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-d636014080fc75c1", "name": "Insecure pattern 'local_storage_auth_token' in verify-mobile.js:9", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in verify-mobile.js:9"}, "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-59cb1a98023dd6a5", "name": "Insecure pattern 'direct_innerhtml_assignment' in login.html:161", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in login.html:161"}, "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-88e8a5ca59f3fd73", "name": "Insecure pattern 'local_storage_auth_token' in login.html:319", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in login.html:319"}, "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-d4a35baf3ff80cbd", "name": "Insecure pattern 'direct_innerhtml_assignment' in chat.html:96", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in chat.html:96"}, "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-5d5af7531c14c190", "name": "Insecure pattern 'direct_innerhtml_assignment' in index.html:401", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in index.html:401"}, "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-fdc7a79400a4e5c6", "name": "Insecure pattern 'direct_innerhtml_assignment' in cgpa.html:81", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in cgpa.html:81"}, "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-161230fd77c11f66", "name": "Insecure pattern 'direct_innerhtml_assignment' in admin-dashboard.html:165", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in admin-dashboard.html:165"}, "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-e75efd35b0f3d1b1", "name": "Insecure pattern 'direct_innerhtml_assignment' in student-search.html:57", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in student-search.html:57"}, "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-ec21ca9f3614fb10", "name": "Insecure pattern 'direct_innerhtml_assignment' in profile.html:64", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in profile.html:64"}, "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-c1aa8b97793d5463", "name": "Insecure pattern 'local_storage_auth_token' in test-pages.js:69", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in test-pages.js:69"}, "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-aee3d7481bbae871", "name": "Insecure pattern 'direct_innerhtml_assignment' in admin.html:446", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in admin.html:446"}, "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-45edea1442966f0b", "name": "Insecure pattern 'insert_adjacent_html' in admin.html:694", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in admin.html:694"}, "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-ef62ba1cde0bf3d5", "name": "Insecure pattern 'direct_innerhtml_assignment' in app.js:19", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app.js:19"}, "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-fb0bf10b3c97c20b", "name": "Insecure pattern 'local_storage_auth_token' in app.js:223", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in app.js:223"}, "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-d118a055bef59b40", "name": "Insecure pattern 'direct_innerhtml_assignment' in od.html:57", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in od.html:57"}, "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-6fa7de0679d73011", "name": "Possible secret in audit-warnings.js", "shortDescription": {"text": "Possible secret in audit-warnings.js"}, "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-df15194359b7bb99", "name": "Insecure pattern 'local_storage_auth_token' in audit-warnings.js:22", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in audit-warnings.js:22"}, "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-4ba9aaca6905dedd", "name": "Insecure pattern 'direct_innerhtml_assignment' in leave.html:53", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in leave.html:53"}, "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-f1e22417477a963b", "name": "Insecure pattern 'direct_innerhtml_assignment' in fees.html:57", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in fees.html:57"}, "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-ea27403f703a7369", "name": "Insecure pattern 'direct_innerhtml_assignment' in events.html:87", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in events.html:87"}, "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-559e76722fddf251", "name": "Insecure pattern 'direct_innerhtml_assignment' in admin-leaves.html:128", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in admin-leaves.html:128"}, "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-2da51fee009110e1", "name": "Insecure pattern 'local_storage_auth_token' in verify-css-local.js:13", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in verify-css-local.js:13"}, "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-3375e5d9b1eb0837", "name": "Insecure pattern 'direct_innerhtml_assignment' in notices.html:57", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in notices.html:57"}, "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-b6a6e90d0b9c502d", "name": "Insecure pattern 'direct_innerhtml_assignment' in register.html:152", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in register.html:152"}, "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-c4362a1a004b1700", "name": "Insecure pattern 'local_storage_auth_token' in register.html:408", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in register.html:408"}, "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-ace544f8f7a956da", "name": "Possible secret in audit-device-retest.js", "shortDescription": {"text": "Possible secret in audit-device-retest.js"}, "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-e3319af76f580071", "name": "Insecure pattern 'direct_innerhtml_assignment' in status.html:76", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in status.html:76"}, "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-d76168ab8d9a6c5b", "name": "Insecure pattern 'local_storage_auth_token' in verify-css.js:9", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in verify-css.js:9"}, "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-6d0c90002036be74", "name": "Insecure pattern 'subprocess_shell_true' in e2e_test_report.py:1259", "shortDescription": {"text": "Insecure pattern 'subprocess_shell_true' in e2e_test_report.py:1259"}, "fullDescription": {"text": "Found a known-risky pattern (subprocess_shell_true). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4072cb82f99eff82", "name": "Insecure pattern 'local_storage_auth_token' in e2e_test_report.py:506", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in e2e_test_report.py:506"}, "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-ed043512481b7c7f", "name": "Insecure pattern 'direct_innerhtml_assignment' in timetable.html:80", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in timetable.html:80"}, "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-fb78709d0ca629f8", "name": "Possible secret in frontend/src/pages/Register.jsx", "shortDescription": {"text": "Possible secret in frontend/src/pages/Register.jsx"}, "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-3edff2949153c1a7", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/pages/Chat.jsx:112", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/pages/Chat.jsx:112"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-404fd06775b93ba6", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/pages/Chat.jsx:24", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/pages/Chat.jsx:24"}, "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-115e53824515bd09", "name": "Insecure pattern 'local_storage_auth_token' in frontend/src/services/auth.js:8", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/services/auth.js:8"}, "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-ac26e0688c24d59e", "name": "Possible secret in automated_test/dast_runner.js", "shortDescription": {"text": "Possible secret in automated_test/dast_runner.js"}, "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-58a8b7c2c5d1e6f9", "name": "Possible secret in automated_test/reaudit-live.js", "shortDescription": {"text": "Possible secret in automated_test/reaudit-live.js"}, "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-5b2bfa5b05925395", "name": "Insecure pattern 'direct_innerhtml_assignment' in selenium_model/html_report.html:509", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in selenium_model/html_report.html:509"}, "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-f423e65d8aeffb61", "name": "Insecure pattern 'insert_adjacent_html' in selenium_model/html_report.html:575", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in selenium_model/html_report.html:575"}, "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-49c60eab9e681d5f", "name": "Insecure pattern 'local_storage_auth_token' in selenium_model/pages/base_page.py:70", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in selenium_model/pages/base_page.py:70"}, "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-a17654fcf7de1d0b", "name": "Possible secret in backend/create-admin.js", "shortDescription": {"text": "Possible secret in backend/create-admin.js"}, "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-90a992598bcdfdd5", "name": "Possible secret in backend/reset-admin.js", "shortDescription": {"text": "Possible secret in backend/reset-admin.js"}, "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-1608c6bdd3ed89df", "name": "Possible secret in backend/dev-local.js", "shortDescription": {"text": "Possible secret in backend/dev-local.js"}, "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-5685e9d22af56429", "name": "Possible secret in backend/seed.js", "shortDescription": {"text": "Possible secret in backend/seed.js"}, "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-2c74db2c9a291517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ae6d7eeb05603f40", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0f6cfeca51e9a237", "name": "Very large file: e2e_test_report.py (1316 lines)", "shortDescription": {"text": "Very large file: e2e_test_report.py (1316 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-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "24 tests / 140 src (ratio 0.17)."}, "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 411 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 113 placeholder/mock markers across 34 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-655f3bdbf717f859", "name": "`fetch()` without try/.catch or AbortSignal \u2014 test-phase5.js:124", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test-phase5.js:124"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bc977cc68e5f9b79", "name": "`fetch()` without try/.catch or AbortSignal \u2014 audit-device-test.js:168", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 audit-device-test.js:168"}, "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-6ef5c28f5450c66d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 audit-verify.js:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 audit-verify.js:18"}, "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-275de5f65a1aeb4e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 sw.js:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 sw.js:20"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cacb3dcc4cc238d0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 audit-warnings.js:8", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 audit-warnings.js:8"}, "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-7edaa69e59bcade5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 audit-device-retest.js:99", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 audit-device-retest.js:99"}, "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-9d73a5e4c11f17c7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 automated_test/reaudit-live.js:99", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 automated_test/reaudit-live.js:99"}, "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-8c36dd52e307fdfc", "name": "Legacy-named symbol `MASTER_TEST_AUDIT_REPORT_backup` in selenium_model/report_generator.py:339", "shortDescription": {"text": "Legacy-named symbol `MASTER_TEST_AUDIT_REPORT_backup` in selenium_model/report_generator.py:339"}, "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-055a79c6010a1ef0", "name": "Network/subprocess call without timeout or try/except \u2014 selenium_model/run.py:33", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 selenium_model/run.py:33"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ddff583f43efa908", "name": "Commented-code block (6 lines) in backend/seed.js:87", "shortDescription": {"text": "Commented-code block (6 lines) in backend/seed.js:87"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-abe6b5ca785a8e38", "name": "Commented-code block (6 lines) in backend/routes/timetable.js:9", "shortDescription": {"text": "Commented-code block (6 lines) in backend/routes/timetable.js:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2eafc3188c36bb02", "name": "3 env vars used in code but missing from .env.example", "shortDescription": {"text": "3 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AUTH_RATE_LIMIT`, `RENDER_EXTERNAL_URL`, `VITE_API_URL`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-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:\nselenium_model/pages/dashboard_page.py:switch_theme, selenium_model/pages/login_page.py:switch_theme\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:\nselenium_model/pages/extra_pages.py:navigate, selenium_model/pages/extra_pages.py:navigate, selenium_model/pages/extra_pages.py:navigate\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-f96186261037e1be", "name": "Frontend route `/admin` has no Link/navigate to it \u2014 frontend/src/routes/AppRoutes.jsx", "shortDescription": {"text": "Frontend route `/admin` has no Link/navigate to it \u2014 frontend/src/routes/AppRoutes.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-11a3e97ac96d390f", "name": "Dangling fetch: GET http://localhost:5000/api/exam (test-phase5.js:124)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:5000/api/exam (test-phase5.js:124)"}, "fullDescription": {"text": "`test-phase5.js:124` calls `GET http://localhost:5000/api/exam` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:5000/api/exam`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4088657c418cf4e3", "name": "Dangling fetch: GET http://localhost:5000/api/fees (test-phase5.js:137)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:5000/api/fees (test-phase5.js:137)"}, "fullDescription": {"text": "`test-phase5.js:137` calls `GET http://localhost:5000/api/fees` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:5000/api/fees`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-35a35f73ab783150", "name": "Dangling fetch: GET http://localhost:5000/api/library (test-phase5.js:150)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:5000/api/library (test-phase5.js:150)"}, "fullDescription": {"text": "`test-phase5.js:150` calls `GET http://localhost:5000/api/library` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:5000/api/library`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7a3591b3bc32a5de", "name": "Dangling fetch: GET http://localhost:5000/api/library/borrowed (test-phase5.js:164)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:5000/api/library/borrowed (test-phase5.js:164)"}, "fullDescription": {"text": "`test-phase5.js:164` calls `GET http://localhost:5000/api/library/borrowed` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:5000/api/library/borrowed`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-46fb38a19d807458", "name": "Dangling fetch: GET http://localhost:5000/api/timetable (test-phase5.js:176)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:5000/api/timetable (test-phase5.js:176)"}, "fullDescription": {"text": "`test-phase5.js:176` calls `GET http://localhost:5000/api/timetable` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:5000/api/timetable`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9c08439edc70d4c5", "name": "Dangling fetch: GET /notices (app.js:295)", "shortDescription": {"text": "Dangling fetch: GET /notices (app.js:295)"}, "fullDescription": {"text": "`app.js:295` calls `GET /notices` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/notices`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-00e94fe854f006ca", "name": "Dangling fetch: GET /auth/me (app.js:352)", "shortDescription": {"text": "Dangling fetch: GET /auth/me (app.js:352)"}, "fullDescription": {"text": "`app.js:352` calls `GET /auth/me` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0551bb848f108158", "name": "Dangling fetch: POST http://localhost:5000/api/auth/login (audit-warnings.js:8)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:5000/api/auth/login (audit-warnings.js:8)"}, "fullDescription": {"text": "`audit-warnings.js:8` calls `POST http://localhost:5000/api/auth/login` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:5000/api/auth/login`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a1d9d11c5111f378", "name": "Dangling fetch: POST http://localhost:5000/api/auth/login (audit-warnings.js:12)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:5000/api/auth/login (audit-warnings.js:12)"}, "fullDescription": {"text": "`audit-warnings.js:12` calls `POST http://localhost:5000/api/auth/login` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:5000/api/auth/login`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6a4820e087c34407", "name": "Dangling fetch: POST https://college-helpdesk-chatbot-l4bk.onrender.com/api/auth/login (audit-device-retest.js:99)", "shortDescription": {"text": "Dangling fetch: POST https://college-helpdesk-chatbot-l4bk.onrender.com/api/auth/login (audit-device-retest.js:99)"}, "fullDescription": {"text": "`audit-device-retest.js:99` calls `POST https://college-helpdesk-chatbot-l4bk.onrender.com/api/auth/login` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/college-helpdesk-chatbot-l4bk.onrender.com/api/auth/login`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-29e9325d7a78bed6", "name": "Dangling fetch: GET /fees (frontend/src/pages/Fees.jsx:18)", "shortDescription": {"text": "Dangling fetch: GET /fees (frontend/src/pages/Fees.jsx:18)"}, "fullDescription": {"text": "`frontend/src/pages/Fees.jsx:18` calls `GET /fees` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/fees`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ebe053d455e778c4", "name": "Dangling fetch: POST /fees/payment (frontend/src/pages/Fees.jsx:28)", "shortDescription": {"text": "Dangling fetch: POST /fees/payment (frontend/src/pages/Fees.jsx:28)"}, "fullDescription": {"text": "`frontend/src/pages/Fees.jsx:28` calls `POST /fees/payment` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/fees/payment`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6225b9900c92dedf", "name": "Dangling fetch: POST /contact (frontend/src/pages/Contact.jsx:45)", "shortDescription": {"text": "Dangling fetch: POST /contact (frontend/src/pages/Contact.jsx:45)"}, "fullDescription": {"text": "`frontend/src/pages/Contact.jsx:45` calls `POST /contact` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/contact`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dbc821f757097be2", "name": "Dangling fetch: GET /attendance/summary (frontend/src/pages/Attendance.jsx:14)", "shortDescription": {"text": "Dangling fetch: GET /attendance/summary (frontend/src/pages/Attendance.jsx:14)"}, "fullDescription": {"text": "`frontend/src/pages/Attendance.jsx:14` calls `GET /attendance/summary` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/attendance/summary`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d79ae7cc34fce153", "name": "Dangling fetch: GET /attendance (frontend/src/pages/Attendance.jsx:15)", "shortDescription": {"text": "Dangling fetch: GET /attendance (frontend/src/pages/Attendance.jsx:15)"}, "fullDescription": {"text": "`frontend/src/pages/Attendance.jsx:15` calls `GET /attendance` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/attendance`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-aefe80bcf7ca362e", "name": "Dangling fetch: GET /events (frontend/src/pages/Events.jsx:20)", "shortDescription": {"text": "Dangling fetch: GET /events (frontend/src/pages/Events.jsx:20)"}, "fullDescription": {"text": "`frontend/src/pages/Events.jsx:20` calls `GET /events` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/events`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-00316fab8c8c2259", "name": "Dangling fetch: DELETE /events/${ev._id}/register (frontend/src/pages/Events.jsx:27)", "shortDescription": {"text": "Dangling fetch: DELETE /events/${ev._id}/register (frontend/src/pages/Events.jsx:27)"}, "fullDescription": {"text": "`frontend/src/pages/Events.jsx:27` calls `DELETE /events/${ev._id}/register` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/events/<p>/register`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5b0c0a58ee3925d5", "name": "Dangling fetch: POST /events/${ev._id}/register (frontend/src/pages/Events.jsx:31)", "shortDescription": {"text": "Dangling fetch: POST /events/${ev._id}/register (frontend/src/pages/Events.jsx:31)"}, "fullDescription": {"text": "`frontend/src/pages/Events.jsx:31` calls `POST /events/${ev._id}/register` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/events/<p>/register`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dcd8354b2e3f6177", "name": "Dangling fetch: GET /calendar (frontend/src/pages/Calendar.jsx:14)", "shortDescription": {"text": "Dangling fetch: GET /calendar (frontend/src/pages/Calendar.jsx:14)"}, "fullDescription": {"text": "`frontend/src/pages/Calendar.jsx:14` calls `GET /calendar` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/calendar`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9cf5c7ade280acef", "name": "Dangling fetch: GET /requests (frontend/src/pages/Status.jsx:45)", "shortDescription": {"text": "Dangling fetch: GET /requests (frontend/src/pages/Status.jsx:45)"}, "fullDescription": {"text": "`frontend/src/pages/Status.jsx:45` calls `GET /requests` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/requests`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-21946d938ac1a605", "name": "Dangling fetch: GET /notices (frontend/src/pages/Notices.jsx:25)", "shortDescription": {"text": "Dangling fetch: GET /notices (frontend/src/pages/Notices.jsx:25)"}, "fullDescription": {"text": "`frontend/src/pages/Notices.jsx:25` calls `GET /notices` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/notices`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b36acf92059e8469", "name": "Dangling fetch: GET /requests (frontend/src/pages/Admin.jsx:61)", "shortDescription": {"text": "Dangling fetch: GET /requests (frontend/src/pages/Admin.jsx:61)"}, "fullDescription": {"text": "`frontend/src/pages/Admin.jsx:61` calls `GET /requests` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/requests`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3d32157516f530e0", "name": "Dangling fetch: GET /leave (frontend/src/pages/Admin.jsx:62)", "shortDescription": {"text": "Dangling fetch: GET /leave (frontend/src/pages/Admin.jsx:62)"}, "fullDescription": {"text": "`frontend/src/pages/Admin.jsx:62` calls `GET /leave` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/leave`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-49c9568cf2c3308c", "name": "Dangling fetch: GET /notices (frontend/src/pages/Admin.jsx:63)", "shortDescription": {"text": "Dangling fetch: GET /notices (frontend/src/pages/Admin.jsx:63)"}, "fullDescription": {"text": "`frontend/src/pages/Admin.jsx:63` calls `GET /notices` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/notices`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7d2955fb8b3bc5f6", "name": "Dangling fetch: GET /students (frontend/src/pages/Admin.jsx:64)", "shortDescription": {"text": "Dangling fetch: GET /students (frontend/src/pages/Admin.jsx:64)"}, "fullDescription": {"text": "`frontend/src/pages/Admin.jsx:64` calls `GET /students` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/students`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cf681635b84b8aa9", "name": "Dangling fetch: GET /contact (frontend/src/pages/Admin.jsx:65)", "shortDescription": {"text": "Dangling fetch: GET /contact (frontend/src/pages/Admin.jsx:65)"}, "fullDescription": {"text": "`frontend/src/pages/Admin.jsx:65` calls `GET /contact` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/contact`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4eb291acdd336165", "name": "Dangling fetch: GET /events (frontend/src/pages/Admin.jsx:66)", "shortDescription": {"text": "Dangling fetch: GET /events (frontend/src/pages/Admin.jsx:66)"}, "fullDescription": {"text": "`frontend/src/pages/Admin.jsx:66` calls `GET /events` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/events`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-31286cfe564ff9f0", "name": "Dangling fetch: GET /exam/all (frontend/src/pages/Admin.jsx:67)", "shortDescription": {"text": "Dangling fetch: GET /exam/all (frontend/src/pages/Admin.jsx:67)"}, "fullDescription": {"text": "`frontend/src/pages/Admin.jsx:67` calls `GET /exam/all` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/exam/all`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e1ebb24e82aed570", "name": "Dangling fetch: GET /timetable/all (frontend/src/pages/Admin.jsx:68)", "shortDescription": {"text": "Dangling fetch: GET /timetable/all (frontend/src/pages/Admin.jsx:68)"}, "fullDescription": {"text": "`frontend/src/pages/Admin.jsx:68` calls `GET /timetable/all` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/timetable/all`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-362a6ed69fe8dda2", "name": "Dangling fetch: GET /audit (frontend/src/pages/Admin.jsx:69)", "shortDescription": {"text": "Dangling fetch: GET /audit (frontend/src/pages/Admin.jsx:69)"}, "fullDescription": {"text": "`frontend/src/pages/Admin.jsx:69` calls `GET /audit` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/audit`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9604ba8d44c05615", "name": "Dangling fetch: GET /exam (frontend/src/pages/Exam.jsx:22)", "shortDescription": {"text": "Dangling fetch: GET /exam (frontend/src/pages/Exam.jsx:22)"}, "fullDescription": {"text": "`frontend/src/pages/Exam.jsx:22` calls `GET /exam` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/exam`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-495c6082ee14ee76", "name": "Dangling fetch: GET /leave (frontend/src/pages/Leave.jsx:53)", "shortDescription": {"text": "Dangling fetch: GET /leave (frontend/src/pages/Leave.jsx:53)"}, "fullDescription": {"text": "`frontend/src/pages/Leave.jsx:53` calls `GET /leave` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/leave`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fc939cb28ad06d8c", "name": "Dangling fetch: POST /leave (frontend/src/pages/Leave.jsx:73)", "shortDescription": {"text": "Dangling fetch: POST /leave (frontend/src/pages/Leave.jsx:73)"}, "fullDescription": {"text": "`frontend/src/pages/Leave.jsx:73` calls `POST /leave` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/leave`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5676d52da5337980", "name": "Dangling fetch: GET /leave/${id}/document (frontend/src/pages/Leave.jsx:95)", "shortDescription": {"text": "Dangling fetch: GET /leave/${id}/document (frontend/src/pages/Leave.jsx:95)"}, "fullDescription": {"text": "`frontend/src/pages/Leave.jsx:95` calls `GET /leave/${id}/document` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/leave/<p>/document`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-32569a4bd1079df1", "name": "Dangling fetch: GET /marks/cgpa (frontend/src/pages/Cgpa.jsx:33)", "shortDescription": {"text": "Dangling fetch: GET /marks/cgpa (frontend/src/pages/Cgpa.jsx:33)"}, "fullDescription": {"text": "`frontend/src/pages/Cgpa.jsx:33` calls `GET /marks/cgpa` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/marks/cgpa`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b59b420a4644f1cb", "name": "Dangling fetch: GET /auth/me (frontend/src/pages/Profile.jsx:44)", "shortDescription": {"text": "Dangling fetch: GET /auth/me (frontend/src/pages/Profile.jsx:44)"}, "fullDescription": {"text": "`frontend/src/pages/Profile.jsx:44` calls `GET /auth/me` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f0d4e73a05dcd8dc", "name": "Dangling fetch: GET /requests/stats (frontend/src/pages/Profile.jsx:44)", "shortDescription": {"text": "Dangling fetch: GET /requests/stats (frontend/src/pages/Profile.jsx:44)"}, "fullDescription": {"text": "`frontend/src/pages/Profile.jsx:44` calls `GET /requests/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/requests/stats`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e3496eac45b32dc7", "name": "Dangling fetch: PUT /auth/profile (frontend/src/pages/Profile.jsx:83)", "shortDescription": {"text": "Dangling fetch: PUT /auth/profile (frontend/src/pages/Profile.jsx:83)"}, "fullDescription": {"text": "`frontend/src/pages/Profile.jsx:83` calls `PUT /auth/profile` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/auth/profile`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f532bbda3d68e63e", "name": "Dangling fetch: PUT /auth/profile (frontend/src/pages/Profile.jsx:102)", "shortDescription": {"text": "Dangling fetch: PUT /auth/profile (frontend/src/pages/Profile.jsx:102)"}, "fullDescription": {"text": "`frontend/src/pages/Profile.jsx:102` calls `PUT /auth/profile` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/auth/profile`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fa985bd98ebcece7", "name": "Dangling fetch: PUT /auth/profile (frontend/src/pages/Profile.jsx:126)", "shortDescription": {"text": "Dangling fetch: PUT /auth/profile (frontend/src/pages/Profile.jsx:126)"}, "fullDescription": {"text": "`frontend/src/pages/Profile.jsx:126` calls `PUT /auth/profile` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/auth/profile`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-53dff94f4fb59676", "name": "Dangling fetch: PUT /auth/change-password (frontend/src/pages/Profile.jsx:144)", "shortDescription": {"text": "Dangling fetch: PUT /auth/change-password (frontend/src/pages/Profile.jsx:144)"}, "fullDescription": {"text": "`frontend/src/pages/Profile.jsx:144` calls `PUT /auth/change-password` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/auth/change-password`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c9511887b09e6095", "name": "Dangling fetch: GET /requests/stats (frontend/src/pages/Dashboard.jsx:92)", "shortDescription": {"text": "Dangling fetch: GET /requests/stats (frontend/src/pages/Dashboard.jsx:92)"}, "fullDescription": {"text": "`frontend/src/pages/Dashboard.jsx:92` calls `GET /requests/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/requests/stats`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9753c6ede5a28351", "name": "Dangling fetch: GET /notices (frontend/src/pages/Dashboard.jsx:93)", "shortDescription": {"text": "Dangling fetch: GET /notices (frontend/src/pages/Dashboard.jsx:93)"}, "fullDescription": {"text": "`frontend/src/pages/Dashboard.jsx:93` calls `GET /notices` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/notices`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-33abe6e59ae88915", "name": "Dangling fetch: GET /events (frontend/src/pages/Dashboard.jsx:94)", "shortDescription": {"text": "Dangling fetch: GET /events (frontend/src/pages/Dashboard.jsx:94)"}, "fullDescription": {"text": "`frontend/src/pages/Dashboard.jsx:94` calls `GET /events` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/events`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d351212f341a689d", "name": "Dangling fetch: GET /requests (frontend/src/pages/Dashboard.jsx:95)", "shortDescription": {"text": "Dangling fetch: GET /requests (frontend/src/pages/Dashboard.jsx:95)"}, "fullDescription": {"text": "`frontend/src/pages/Dashboard.jsx:95` calls `GET /requests` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/requests`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1f02d30900f3aebe", "name": "Dangling fetch: GET /library (frontend/src/pages/Library.jsx:25)", "shortDescription": {"text": "Dangling fetch: GET /library (frontend/src/pages/Library.jsx:25)"}, "fullDescription": {"text": "`frontend/src/pages/Library.jsx:25` calls `GET /library` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/library`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e07671b7d637c2d7", "name": "Dangling fetch: GET /library/borrowed (frontend/src/pages/Library.jsx:34)", "shortDescription": {"text": "Dangling fetch: GET /library/borrowed (frontend/src/pages/Library.jsx:34)"}, "fullDescription": {"text": "`frontend/src/pages/Library.jsx:34` calls `GET /library/borrowed` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/library/borrowed`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c94b2a39e523a4f6", "name": "Dangling fetch: GET /library?search=${encodeURIComponent(query.trim())} (frontend/src/pages/Library.jsx:39)", "shortDescription": {"text": "Dangling fetch: GET /library?search=${encodeURIComponent(query.trim())} (frontend/src/pages/Library.jsx:39)"}, "fullDescription": {"text": "`frontend/src/pages/Library.jsx:39` calls `GET /library?search=${encodeURIComponent(query.trim())}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/library`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4fcf98fa60d85cb8", "name": "Dangling fetch: POST /chat (frontend/src/pages/Chat.jsx:65)", "shortDescription": {"text": "Dangling fetch: POST /chat (frontend/src/pages/Chat.jsx:65)"}, "fullDescription": {"text": "`frontend/src/pages/Chat.jsx:65` calls `POST /chat` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/chat`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0cb07586ef555fc1", "name": "Dangling fetch: GET /leave/${id}/document (frontend/src/pages/Od.jsx:64)", "shortDescription": {"text": "Dangling fetch: GET /leave/${id}/document (frontend/src/pages/Od.jsx:64)"}, "fullDescription": {"text": "`frontend/src/pages/Od.jsx:64` calls `GET /leave/${id}/document` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/leave/<p>/document`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-350c045ea7ac38cc", "name": "Dangling fetch: GET /leave (frontend/src/pages/Od.jsx:70)", "shortDescription": {"text": "Dangling fetch: GET /leave (frontend/src/pages/Od.jsx:70)"}, "fullDescription": {"text": "`frontend/src/pages/Od.jsx:70` calls `GET /leave` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/leave`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7c38eaebc9be1bbf", "name": "Dangling fetch: POST /leave (frontend/src/pages/Od.jsx:84)", "shortDescription": {"text": "Dangling fetch: POST /leave (frontend/src/pages/Od.jsx:84)"}, "fullDescription": {"text": "`frontend/src/pages/Od.jsx:84` calls `POST /leave` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/leave`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e2620e2d6c7745fe", "name": "Dangling fetch: GET /timetable (frontend/src/pages/Timetable.jsx:22)", "shortDescription": {"text": "Dangling fetch: GET /timetable (frontend/src/pages/Timetable.jsx:22)"}, "fullDescription": {"text": "`frontend/src/pages/Timetable.jsx:22` calls `GET /timetable` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/timetable`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fe1c4cd67f86370b", "name": "Dangling fetch: GET /requests (frontend/src/pages/Requests.jsx:33)", "shortDescription": {"text": "Dangling fetch: GET /requests (frontend/src/pages/Requests.jsx:33)"}, "fullDescription": {"text": "`frontend/src/pages/Requests.jsx:33` calls `GET /requests` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/requests`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3746cbb649d095c2", "name": "Dangling fetch: POST /requests (frontend/src/pages/Requests.jsx:43)", "shortDescription": {"text": "Dangling fetch: POST /requests (frontend/src/pages/Requests.jsx:43)"}, "fullDescription": {"text": "`frontend/src/pages/Requests.jsx:43` calls `POST /requests` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/requests`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-32732de676af08b5", "name": "Dangling fetch: GET /fees/all (frontend/src/pages/admin/FeesTab.jsx:18)", "shortDescription": {"text": "Dangling fetch: GET /fees/all (frontend/src/pages/admin/FeesTab.jsx:18)"}, "fullDescription": {"text": "`frontend/src/pages/admin/FeesTab.jsx:18` calls `GET /fees/all` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/fees/all`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d151c5c8dd9501cb", "name": "Dangling fetch: PUT /fees/${feeId}/payments/${index}/verify (frontend/src/pages/admin/FeesTab.jsx:24)", "shortDescription": {"text": "Dangling fetch: PUT /fees/${feeId}/payments/${index}/verify (frontend/src/pages/admin/FeesTab.jsx:24)"}, "fullDescription": {"text": "`frontend/src/pages/admin/FeesTab.jsx:24` calls `PUT /fees/${feeId}/payments/${index}/verify` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/fees/<p>/payments/<p>/verify`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-774b60f963bfaad4", "name": "Dangling fetch: POST /events (frontend/src/pages/admin/EventsTab.jsx:27)", "shortDescription": {"text": "Dangling fetch: POST /events (frontend/src/pages/admin/EventsTab.jsx:27)"}, "fullDescription": {"text": "`frontend/src/pages/admin/EventsTab.jsx:27` calls `POST /events` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/events`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-036f87bafb1fa761", "name": "Dangling fetch: DELETE /events/${id} (frontend/src/pages/admin/EventsTab.jsx:42)", "shortDescription": {"text": "Dangling fetch: DELETE /events/${id} (frontend/src/pages/admin/EventsTab.jsx:42)"}, "fullDescription": {"text": "`frontend/src/pages/admin/EventsTab.jsx:42` calls `DELETE /events/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/events/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-40e4ebb60a3a49b5", "name": "Dangling fetch: PUT /timetable/${existingId} (frontend/src/pages/admin/TimetableTab.jsx:65)", "shortDescription": {"text": "Dangling fetch: PUT /timetable/${existingId} (frontend/src/pages/admin/TimetableTab.jsx:65)"}, "fullDescription": {"text": "`frontend/src/pages/admin/TimetableTab.jsx:65` calls `PUT /timetable/${existingId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/timetable/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4f64454d47436893", "name": "Dangling fetch: POST /timetable (frontend/src/pages/admin/TimetableTab.jsx:66)", "shortDescription": {"text": "Dangling fetch: POST /timetable (frontend/src/pages/admin/TimetableTab.jsx:66)"}, "fullDescription": {"text": "`frontend/src/pages/admin/TimetableTab.jsx:66` calls `POST /timetable` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/timetable`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-15e2e02a3f9daea1", "name": "Dangling fetch: PUT /timetable/${existingId}/publish (frontend/src/pages/admin/TimetableTab.jsx:91)", "shortDescription": {"text": "Dangling fetch: PUT /timetable/${existingId}/publish (frontend/src/pages/admin/TimetableTab.jsx:91)"}, "fullDescription": {"text": "`frontend/src/pages/admin/TimetableTab.jsx:91` calls `PUT /timetable/${existingId}/publish` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/timetable/<p>/publish`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8c6ba6d55b220eaf", "name": "Dangling fetch: PUT /timetable/${existingId}/archive (frontend/src/pages/admin/TimetableTab.jsx:105)", "shortDescription": {"text": "Dangling fetch: PUT /timetable/${existingId}/archive (frontend/src/pages/admin/TimetableTab.jsx:105)"}, "fullDescription": {"text": "`frontend/src/pages/admin/TimetableTab.jsx:105` calls `PUT /timetable/${existingId}/archive` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/timetable/<p>/archive`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9bb5866e8a775457", "name": "Dangling fetch: GET /marks?studentId=${encodeURIComponent(sid)} (frontend/src/pages/admin/MarksTab.jsx:22)", "shortDescription": {"text": "Dangling fetch: GET /marks?studentId=${encodeURIComponent(sid)} (frontend/src/pages/admin/MarksTab.jsx:22)"}, "fullDescription": {"text": "`frontend/src/pages/admin/MarksTab.jsx:22` calls `GET /marks?studentId=${encodeURIComponent(sid)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/marks`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8cf11d116b40feb7", "name": "Dangling fetch: GET /marks/cgpa?studentId=${encodeURIComponent(sid)} (frontend/src/pages/admin/MarksTab.jsx:23)", "shortDescription": {"text": "Dangling fetch: GET /marks/cgpa?studentId=${encodeURIComponent(sid)} (frontend/src/pages/admin/MarksTab.jsx:23)"}, "fullDescription": {"text": "`frontend/src/pages/admin/MarksTab.jsx:23` calls `GET /marks/cgpa?studentId=${encodeURIComponent(sid)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/marks/cgpa`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a5afd930aab8a77f", "name": "Dangling fetch: POST /marks (frontend/src/pages/admin/MarksTab.jsx:33)", "shortDescription": {"text": "Dangling fetch: POST /marks (frontend/src/pages/admin/MarksTab.jsx:33)"}, "fullDescription": {"text": "`frontend/src/pages/admin/MarksTab.jsx:33` calls `POST /marks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/marks`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b5b19884d38e7925", "name": "Dangling fetch: DELETE /marks/${id} (frontend/src/pages/admin/MarksTab.jsx:48)", "shortDescription": {"text": "Dangling fetch: DELETE /marks/${id} (frontend/src/pages/admin/MarksTab.jsx:48)"}, "fullDescription": {"text": "`frontend/src/pages/admin/MarksTab.jsx:48` calls `DELETE /marks/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/marks/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-94213c3a7855a887", "name": "Dangling fetch: POST /attendance/bulk (frontend/src/pages/admin/AttendanceTab.jsx:36)", "shortDescription": {"text": "Dangling fetch: POST /attendance/bulk (frontend/src/pages/admin/AttendanceTab.jsx:36)"}, "fullDescription": {"text": "`frontend/src/pages/admin/AttendanceTab.jsx:36` calls `POST /attendance/bulk` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/attendance/bulk`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-69d39017db17a2b1", "name": "Dangling fetch: GET /attendance/summary?studentId=${encodeURIComponent(id)} (frontend/src/pages/admin/AttendanceTab.jsx:", "shortDescription": {"text": "Dangling fetch: GET /attendance/summary?studentId=${encodeURIComponent(id)} (frontend/src/pages/admin/AttendanceTab.jsx:46)"}, "fullDescription": {"text": "`frontend/src/pages/admin/AttendanceTab.jsx:46` calls `GET /attendance/summary?studentId=${encodeURIComponent(id)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/attendance/summary`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d9467e2d46f6f84e", "name": "Dangling fetch: PUT /students/${id}/${action} (frontend/src/pages/admin/StudentsTab.jsx:33)", "shortDescription": {"text": "Dangling fetch: PUT /students/${id}/${action} (frontend/src/pages/admin/StudentsTab.jsx:33)"}, "fullDescription": {"text": "`frontend/src/pages/admin/StudentsTab.jsx:33` calls `PUT /students/${id}/${action}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/students/<p>/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-493eafcdc524c0f0", "name": "Dangling fetch: PUT /exam/${selectedId} (frontend/src/pages/admin/ExamsTab.jsx:88)", "shortDescription": {"text": "Dangling fetch: PUT /exam/${selectedId} (frontend/src/pages/admin/ExamsTab.jsx:88)"}, "fullDescription": {"text": "`frontend/src/pages/admin/ExamsTab.jsx:88` calls `PUT /exam/${selectedId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/exam/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-79f17c524c71245b", "name": "Dangling fetch: POST /exam (frontend/src/pages/admin/ExamsTab.jsx:89)", "shortDescription": {"text": "Dangling fetch: POST /exam (frontend/src/pages/admin/ExamsTab.jsx:89)"}, "fullDescription": {"text": "`frontend/src/pages/admin/ExamsTab.jsx:89` calls `POST /exam` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/exam`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a3dee405bd9a977a", "name": "Dangling fetch: PUT /exam/${selectedId}/publish (frontend/src/pages/admin/ExamsTab.jsx:100)", "shortDescription": {"text": "Dangling fetch: PUT /exam/${selectedId}/publish (frontend/src/pages/admin/ExamsTab.jsx:100)"}, "fullDescription": {"text": "`frontend/src/pages/admin/ExamsTab.jsx:100` calls `PUT /exam/${selectedId}/publish` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/exam/<p>/publish`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-88f7b04c2078847a", "name": "Dangling fetch: PUT /exam/${selectedId}/archive (frontend/src/pages/admin/ExamsTab.jsx:106)", "shortDescription": {"text": "Dangling fetch: PUT /exam/${selectedId}/archive (frontend/src/pages/admin/ExamsTab.jsx:106)"}, "fullDescription": {"text": "`frontend/src/pages/admin/ExamsTab.jsx:106` calls `PUT /exam/${selectedId}/archive` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/exam/<p>/archive`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-64fb726d16308f3f", "name": "Dangling fetch: GET /calendar (frontend/src/pages/admin/CalendarTab.jsx:19)", "shortDescription": {"text": "Dangling fetch: GET /calendar (frontend/src/pages/admin/CalendarTab.jsx:19)"}, "fullDescription": {"text": "`frontend/src/pages/admin/CalendarTab.jsx:19` calls `GET /calendar` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/calendar`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fb086862c0627fef", "name": "Dangling fetch: PUT /calendar/${editId} (frontend/src/pages/admin/CalendarTab.jsx:33)", "shortDescription": {"text": "Dangling fetch: PUT /calendar/${editId} (frontend/src/pages/admin/CalendarTab.jsx:33)"}, "fullDescription": {"text": "`frontend/src/pages/admin/CalendarTab.jsx:33` calls `PUT /calendar/${editId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/calendar/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4b73a4b432b83c05", "name": "Dangling fetch: POST /calendar (frontend/src/pages/admin/CalendarTab.jsx:34)", "shortDescription": {"text": "Dangling fetch: POST /calendar (frontend/src/pages/admin/CalendarTab.jsx:34)"}, "fullDescription": {"text": "`frontend/src/pages/admin/CalendarTab.jsx:34` calls `POST /calendar` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/calendar`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a137bc5d3f43ceab", "name": "Dangling fetch: DELETE /calendar/${id} (frontend/src/pages/admin/CalendarTab.jsx:52)", "shortDescription": {"text": "Dangling fetch: DELETE /calendar/${id} (frontend/src/pages/admin/CalendarTab.jsx:52)"}, "fullDescription": {"text": "`frontend/src/pages/admin/CalendarTab.jsx:52` calls `DELETE /calendar/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/calendar/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cc75a426ea64bc56", "name": "Dangling fetch: GET /leave/${id}/document (frontend/src/pages/admin/LeavesTab.jsx:13)", "shortDescription": {"text": "Dangling fetch: GET /leave/${id}/document (frontend/src/pages/admin/LeavesTab.jsx:13)"}, "fullDescription": {"text": "`frontend/src/pages/admin/LeavesTab.jsx:13` calls `GET /leave/${id}/document` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/leave/<p>/document`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-94adccf18cf7e181", "name": "Dangling fetch: PUT /leave/${id}/status (frontend/src/pages/admin/LeavesTab.jsx:30)", "shortDescription": {"text": "Dangling fetch: PUT /leave/${id}/status (frontend/src/pages/admin/LeavesTab.jsx:30)"}, "fullDescription": {"text": "`frontend/src/pages/admin/LeavesTab.jsx:30` calls `PUT /leave/${id}/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/leave/<p>/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e2c79b31498caa62", "name": "Dangling fetch: POST /notices (frontend/src/pages/admin/NoticesTab.jsx:61)", "shortDescription": {"text": "Dangling fetch: POST /notices (frontend/src/pages/admin/NoticesTab.jsx:61)"}, "fullDescription": {"text": "`frontend/src/pages/admin/NoticesTab.jsx:61` calls `POST /notices` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/notices`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-807c3aa0c4af5c35", "name": "Dangling fetch: PUT /notices/${notice._id} (frontend/src/pages/admin/NoticesTab.jsx:75)", "shortDescription": {"text": "Dangling fetch: PUT /notices/${notice._id} (frontend/src/pages/admin/NoticesTab.jsx:75)"}, "fullDescription": {"text": "`frontend/src/pages/admin/NoticesTab.jsx:75` calls `PUT /notices/${notice._id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/notices/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4412413e1988e5ce", "name": "Dangling fetch: DELETE /notices/${id} (frontend/src/pages/admin/NoticesTab.jsx:82)", "shortDescription": {"text": "Dangling fetch: DELETE /notices/${id} (frontend/src/pages/admin/NoticesTab.jsx:82)"}, "fullDescription": {"text": "`frontend/src/pages/admin/NoticesTab.jsx:82` calls `DELETE /notices/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/notices/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f644555cfe90f764", "name": "Dangling fetch: GET /auth/me (frontend/src/pages/admin/AccountTab.jsx:20)", "shortDescription": {"text": "Dangling fetch: GET /auth/me (frontend/src/pages/admin/AccountTab.jsx:20)"}, "fullDescription": {"text": "`frontend/src/pages/admin/AccountTab.jsx:20` calls `GET /auth/me` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f13eddbde2d3c85a", "name": "Dangling fetch: PUT /auth/profile (frontend/src/pages/admin/AccountTab.jsx:32)", "shortDescription": {"text": "Dangling fetch: PUT /auth/profile (frontend/src/pages/admin/AccountTab.jsx:32)"}, "fullDescription": {"text": "`frontend/src/pages/admin/AccountTab.jsx:32` calls `PUT /auth/profile` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/auth/profile`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b78b12fbe80382d1", "name": "Dangling fetch: PUT /auth/change-password (frontend/src/pages/admin/AccountTab.jsx:49)", "shortDescription": {"text": "Dangling fetch: PUT /auth/change-password (frontend/src/pages/admin/AccountTab.jsx:49)"}, "fullDescription": {"text": "`frontend/src/pages/admin/AccountTab.jsx:49` calls `PUT /auth/change-password` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/auth/change-password`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e3ef448d50fe0ff6", "name": "Dangling fetch: PUT /contact/${id}/resolve (frontend/src/pages/admin/MessagesTab.jsx:10)", "shortDescription": {"text": "Dangling fetch: PUT /contact/${id}/resolve (frontend/src/pages/admin/MessagesTab.jsx:10)"}, "fullDescription": {"text": "`frontend/src/pages/admin/MessagesTab.jsx:10` calls `PUT /contact/${id}/resolve` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/contact/<p>/resolve`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3cde63d7ff56865d", "name": "Dangling fetch: PUT /requests/${id}/status (frontend/src/pages/admin/RequestsTab.jsx:13)", "shortDescription": {"text": "Dangling fetch: PUT /requests/${id}/status (frontend/src/pages/admin/RequestsTab.jsx:13)"}, "fullDescription": {"text": "`frontend/src/pages/admin/RequestsTab.jsx:13` calls `PUT /requests/${id}/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/requests/<p>/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fd8bbc0505e16b80", "name": "Dangling fetch: GET /notices (frontend/src/hooks/useUnreadNotices.js:12)", "shortDescription": {"text": "Dangling fetch: GET /notices (frontend/src/hooks/useUnreadNotices.js:12)"}, "fullDescription": {"text": "`frontend/src/hooks/useUnreadNotices.js:12` calls `GET /notices` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/notices`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-76889df7c8e240c5", "name": "Unused endpoint: USE /api/", "shortDescription": {"text": "Unused endpoint: USE /api/"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/` 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-8bf2f7ca3faa1f1b", "name": "Unused endpoint: USE /api/auth/login", "shortDescription": {"text": "Unused endpoint: USE /api/auth/login"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/auth/login` 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-def16861a13564b0", "name": "Unused endpoint: USE /api/auth/register", "shortDescription": {"text": "Unused endpoint: USE /api/auth/register"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/auth/register` 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-6eb452fbfb454d20", "name": "Unused endpoint: USE /api/auth", "shortDescription": {"text": "Unused endpoint: USE /api/auth"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/auth` 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-3cc7c4be574d90d6", "name": "Unused endpoint: USE /api/students", "shortDescription": {"text": "Unused endpoint: USE /api/students"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/students` 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-829fe3db7e6f3ccd", "name": "Unused endpoint: USE /api/requests", "shortDescription": {"text": "Unused endpoint: USE /api/requests"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/requests` 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-3d722f112128fe85", "name": "Unused endpoint: USE /api/leave", "shortDescription": {"text": "Unused endpoint: USE /api/leave"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/leave` 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-9bb126c3522da507", "name": "Unused endpoint: USE /api/notices", "shortDescription": {"text": "Unused endpoint: USE /api/notices"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/notices` 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-2b92dc87a4256298", "name": "Unused endpoint: USE /api/chat", "shortDescription": {"text": "Unused endpoint: USE /api/chat"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/chat` 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-40dad860cccfaa2e", "name": "Unused endpoint: USE /api/exam", "shortDescription": {"text": "Unused endpoint: USE /api/exam"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/exam` 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-022aebabab805160", "name": "Unused endpoint: USE /api/fees", "shortDescription": {"text": "Unused endpoint: USE /api/fees"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/fees` 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-8c797e25fee9b2b2", "name": "Unused endpoint: USE /api/library", "shortDescription": {"text": "Unused endpoint: USE /api/library"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/library` 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-55cb77d6ceb3716a", "name": "Unused endpoint: USE /api/timetable", "shortDescription": {"text": "Unused endpoint: USE /api/timetable"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/timetable` 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-d3d2df7bfb761887", "name": "Unused endpoint: USE /api/contact", "shortDescription": {"text": "Unused endpoint: USE /api/contact"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/contact` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f9eb90c1cd6cae29", "name": "Unused endpoint: USE /api/attendance", "shortDescription": {"text": "Unused endpoint: USE /api/attendance"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/attendance` 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-ec00984b27c88c15", "name": "Unused endpoint: USE /api/events", "shortDescription": {"text": "Unused endpoint: USE /api/events"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/events` 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-fc384258421c9ed4", "name": "Unused endpoint: USE /api/marks", "shortDescription": {"text": "Unused endpoint: USE /api/marks"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/marks` 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-aebdad2655c302c7", "name": "Unused endpoint: USE /api/calendar", "shortDescription": {"text": "Unused endpoint: USE /api/calendar"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/calendar` 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-ac2e8a1655395ddd", "name": "Unused endpoint: USE /api/audit", "shortDescription": {"text": "Unused endpoint: USE /api/audit"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api/audit` 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-dde3adb27bf7eebe", "name": "Unused endpoint: USE /api", "shortDescription": {"text": "Unused endpoint: USE /api"}, "fullDescription": {"text": "`backend/server.js` declares `USE /api` 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-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`backend/routes/library.js` declares `GET /` 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-75d410a7156d767c", "name": "Unused endpoint: GET /borrowed", "shortDescription": {"text": "Unused endpoint: GET /borrowed"}, "fullDescription": {"text": "`backend/routes/library.js` declares `GET /borrowed` 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-34e23d19c015af16", "name": "Unused endpoint: GET /hours", "shortDescription": {"text": "Unused endpoint: GET /hours"}, "fullDescription": {"text": "`backend/routes/library.js` declares `GET /hours` 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-c6b4dc64abfb9538", "name": "Unused endpoint: POST /renew/:borrowId", "shortDescription": {"text": "Unused endpoint: POST /renew/:borrowId"}, "fullDescription": {"text": "`backend/routes/library.js` declares `POST /renew/:borrowId` 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-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`backend/routes/library.js` declares `POST /` 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-8d5b2b188d08ca82", "name": "Unused endpoint: PUT /:id", "shortDescription": {"text": "Unused endpoint: PUT /:id"}, "fullDescription": {"text": "`backend/routes/library.js` declares `PUT /:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a0d22c00550a28e7", "name": "Unused endpoint: PUT /:id/resolve", "shortDescription": {"text": "Unused endpoint: PUT /:id/resolve"}, "fullDescription": {"text": "`backend/routes/contact.js` declares `PUT /:id/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-b56d0f0a38621428", "name": "Unused endpoint: POST /payment", "shortDescription": {"text": "Unused endpoint: POST /payment"}, "fullDescription": {"text": "`backend/routes/fees.js` declares `POST /payment` 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-2c3d1d103b19a7f6", "name": "Unused endpoint: GET /all", "shortDescription": {"text": "Unused endpoint: GET /all"}, "fullDescription": {"text": "`backend/routes/fees.js` declares `GET /all` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ee87755ce68b3599", "name": "Unused endpoint: PUT /:feeId/payments/:index/verify", "shortDescription": {"text": "Unused endpoint: PUT /:feeId/payments/:index/verify"}, "fullDescription": {"text": "`backend/routes/fees.js` declares `PUT /:feeId/payments/:index/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-b9c041dc087ff77f", "name": "Unused endpoint: GET /today", "shortDescription": {"text": "Unused endpoint: GET /today"}, "fullDescription": {"text": "`backend/routes/timetable.js` declares `GET /today` 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-9eb782b5a8df0afe", "name": "Unused endpoint: GET /:id/conflicts", "shortDescription": {"text": "Unused endpoint: GET /:id/conflicts"}, "fullDescription": {"text": "`backend/routes/timetable.js` declares `GET /:id/conflicts` 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-aaca58e5f6e3509f", "name": "Unused endpoint: PUT /:id/publish", "shortDescription": {"text": "Unused endpoint: PUT /:id/publish"}, "fullDescription": {"text": "`backend/routes/timetable.js` declares `PUT /:id/publish` 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-f68bf5330d49406a", "name": "Unused endpoint: PUT /:id/archive", "shortDescription": {"text": "Unused endpoint: PUT /:id/archive"}, "fullDescription": {"text": "`backend/routes/timetable.js` declares `PUT /:id/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-e1b7bee247ffc801", "name": "Unused endpoint: GET /summary", "shortDescription": {"text": "Unused endpoint: GET /summary"}, "fullDescription": {"text": "`backend/routes/attendance.js` declares `GET /summary` 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-90631dcf4fb49f54", "name": "Unused endpoint: POST /bulk", "shortDescription": {"text": "Unused endpoint: POST /bulk"}, "fullDescription": {"text": "`backend/routes/attendance.js` declares `POST /bulk` 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-f1aa028ff32c0c7f", "name": "Unused endpoint: POST /:id/register", "shortDescription": {"text": "Unused endpoint: POST /:id/register"}, "fullDescription": {"text": "`backend/routes/events.js` declares `POST /:id/register` 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-a8fdf182e080e637", "name": "Unused endpoint: DELETE /:id/register", "shortDescription": {"text": "Unused endpoint: DELETE /:id/register"}, "fullDescription": {"text": "`backend/routes/events.js` declares `DELETE /:id/register` 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-7a61c112b611f4bb", "name": "Unused endpoint: DELETE /:id", "shortDescription": {"text": "Unused endpoint: DELETE /:id"}, "fullDescription": {"text": "`backend/routes/events.js` declares `DELETE /:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-304b6f2b403d93f7", "name": "Unused endpoint: POST /register", "shortDescription": {"text": "Unused endpoint: POST /register"}, "fullDescription": {"text": "`backend/routes/auth.js` declares `POST /register` 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-618721b912bad1c2", "name": "Unused endpoint: POST /login", "shortDescription": {"text": "Unused endpoint: POST /login"}, "fullDescription": {"text": "`backend/routes/auth.js` declares `POST /login` 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-fd1dc91abf32142d", "name": "Unused endpoint: GET /me", "shortDescription": {"text": "Unused endpoint: GET /me"}, "fullDescription": {"text": "`backend/routes/auth.js` declares `GET /me` 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-fab08877d417b369", "name": "Unused endpoint: PUT /change-password", "shortDescription": {"text": "Unused endpoint: PUT /change-password"}, "fullDescription": {"text": "`backend/routes/auth.js` declares `PUT /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-911492554a68d0c1", "name": "Unused endpoint: PUT /profile", "shortDescription": {"text": "Unused endpoint: PUT /profile"}, "fullDescription": {"text": "`backend/routes/auth.js` declares `PUT /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-9de4cecd0e235584", "name": "Unused endpoint: GET /pending", "shortDescription": {"text": "Unused endpoint: GET /pending"}, "fullDescription": {"text": "`backend/routes/students.js` declares `GET /pending` 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-84cf7e210005f016", "name": "Unused endpoint: PUT /:id/approve", "shortDescription": {"text": "Unused endpoint: PUT /:id/approve"}, "fullDescription": {"text": "`backend/routes/students.js` declares `PUT /:id/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-05e8685bf43a812c", "name": "Unused endpoint: PUT /:id/reject", "shortDescription": {"text": "Unused endpoint: PUT /:id/reject"}, "fullDescription": {"text": "`backend/routes/students.js` declares `PUT /:id/reject` 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-ec9f62c6578a625c", "name": "Unused endpoint: GET /search/:query", "shortDescription": {"text": "Unused endpoint: GET /search/:query"}, "fullDescription": {"text": "`backend/routes/students.js` declares `GET /search/:query` 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-ca5756175765b49d", "name": "Unused endpoint: GET /:id", "shortDescription": {"text": "Unused endpoint: GET /:id"}, "fullDescription": {"text": "`backend/routes/students.js` declares `GET /:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cd8dc4599ec52a08", "name": "Unused endpoint: GET /stats", "shortDescription": {"text": "Unused endpoint: GET /stats"}, "fullDescription": {"text": "`backend/routes/requests.js` declares `GET /stats` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/19919"}, "properties": {"repository": "SNEKA2107/college-helpdesk-chatbot", "repoUrl": "https://github.com/SNEKA2107/college-helpdesk-chatbot", "branch": "main"}, "results": [{"ruleId": "scanner-da5600e643db612f", "level": "note", "message": {"text": "Possibly dead Python function: logout_via_topbar"}, "properties": {"repobilityId": "e1d391365e096237", "scanner": "scanner-primary", "fingerprint": "da5600e643db612f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "selenium_model/pages/dashboard_page.py:59"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ff6a8193c9c4b832", "level": "note", "message": {"text": "Possibly dead Python function: reject_first_leave"}, "properties": {"repobilityId": "dd06f9441bc4c8fb", "scanner": "scanner-primary", "fingerprint": "ff6a8193c9c4b832", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "selenium_model/pages/admin_page.py:99"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f0f0c3e4d314dd61", "level": "note", "message": {"text": "Possibly dead Python function: inject_auth_token"}, "properties": {"repobilityId": "e402c39fb90e2d92", "scanner": "scanner-primary", "fingerprint": "f0f0c3e4d314dd61", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "selenium_model/pages/base_page.py:66"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f4a24aa8cadb2858", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-phase3.js:12"}, "properties": {"repobilityId": "4a48c03d228ae7c5", "scanner": "scanner-primary", "fingerprint": "f4a24aa8cadb2858", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a9129cf480ea16f9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 screenshot-mobile.js:14"}, "properties": {"repobilityId": "47f89aea20035c5c", "scanner": "scanner-primary", "fingerprint": "a9129cf480ea16f9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-06b32b92020ef591", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 debug-events.js:5"}, "properties": {"repobilityId": "5b4d5af749451dc1", "scanner": "scanner-primary", "fingerprint": "06b32b92020ef591", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6151e23b9f7ef373", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-phase5.js:11"}, "properties": {"repobilityId": "b29693f27bc96c70", "scanner": "scanner-primary", "fingerprint": "6151e23b9f7ef373", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-97646a75eb0df34a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 debug-live-admin.js:6"}, "properties": {"repobilityId": "2f518385dff47104", "scanner": "scanner-primary", "fingerprint": "97646a75eb0df34a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cd8d8dca27bad946", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 audit-device-test.js:9"}, "properties": {"repobilityId": "d4a61f3e496cb896", "scanner": "scanner-primary", "fingerprint": "cd8d8dca27bad946", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a6f1b46de9d6608e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 audit-verify.js:13"}, "properties": {"repobilityId": "341882e29a84108c", "scanner": "scanner-primary", "fingerprint": "a6f1b46de9d6608e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b2a69a907e22b94c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 audit-final-verify.js:8"}, "properties": {"repobilityId": "7f1bf414d9b1427e", "scanner": "scanner-primary", "fingerprint": "b2a69a907e22b94c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d1d8e03b3b14eeb4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-admin-tabs.js:19"}, "properties": {"repobilityId": "a2fb262603058f34", "scanner": "scanner-primary", "fingerprint": "d1d8e03b3b14eeb4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3960b017c6f9565a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 audit-apibase.js:18"}, "properties": {"repobilityId": "f09ec0441f783b28", "scanner": "scanner-primary", "fingerprint": "3960b017c6f9565a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-56b11d6d64bb78b0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 verify-profile-mobile.js:19"}, "properties": {"repobilityId": "7b12c9c6a48d93b2", "scanner": "scanner-primary", "fingerprint": "56b11d6d64bb78b0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c1ec333f28a73659", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 verify-mobile.js:33"}, "properties": {"repobilityId": "ca92df65dd7cc38a", "scanner": "scanner-primary", "fingerprint": "c1ec333f28a73659", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0fafeb257bb1aa64", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-phase3-debug.js:14"}, "properties": {"repobilityId": "71ded7b785645f85", "scanner": "scanner-primary", "fingerprint": "0fafeb257bb1aa64", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-866a7077249dfa7c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 debug-login-flow.js:7"}, "properties": {"repobilityId": "7468d89f887b9d54", "scanner": "scanner-primary", "fingerprint": "866a7077249dfa7c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e1d9a6620d94eacf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-pages.js:35"}, "properties": {"repobilityId": "be43382f233889da", "scanner": "scanner-primary", "fingerprint": "e1d9a6620d94eacf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-06adb58f475fbffb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 audit-warnings.js:44"}, "properties": {"repobilityId": "f4bb12c7edd4d29b", "scanner": "scanner-primary", "fingerprint": "06adb58f475fbffb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ef2d8d51e754d80b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-react-e2e.js:19"}, "properties": {"repobilityId": "4c31d7a115f44ac6", "scanner": "scanner-primary", "fingerprint": "ef2d8d51e754d80b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dff67cec1633a151", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 verify-dashboard.js:22"}, "properties": {"repobilityId": "b089a6c996686522", "scanner": "scanner-primary", "fingerprint": "dff67cec1633a151", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-36fdc66ceafe10d0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-app.js:9"}, "properties": {"repobilityId": "c09c5f441c85e110", "scanner": "scanner-primary", "fingerprint": "36fdc66ceafe10d0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8cece4be250bbc2e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 verify-css-local.js:36"}, "properties": {"repobilityId": "98dc9bc8a2c621c0", "scanner": "scanner-primary", "fingerprint": "8cece4be250bbc2e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2627a21934611bc6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 generate-icons.js:44"}, "properties": {"repobilityId": "ceb32b725f31bd83", "scanner": "scanner-primary", "fingerprint": "2627a21934611bc6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7775260d7dbcb6e1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 audit-device-retest.js:5"}, "properties": {"repobilityId": "87ae50204fd34b4e", "scanner": "scanner-primary", "fingerprint": "7775260d7dbcb6e1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5d435c457e65e7be", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 branding-render.js:49"}, "properties": {"repobilityId": "4a2fea90b8eca2f8", "scanner": "scanner-primary", "fingerprint": "5d435c457e65e7be", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b04efe3820b7312b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 verify-css.js:41"}, "properties": {"repobilityId": "f0c7ee226eca268b", "scanner": "scanner-primary", "fingerprint": "b04efe3820b7312b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-762c347996169a75", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 debug-events2.js:6"}, "properties": {"repobilityId": "c19cd2bb2120bf4f", "scanner": "scanner-primary", "fingerprint": "762c347996169a75", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-082072a8a60a0b66", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 debug-requests.js:6"}, "properties": {"repobilityId": "8e5b395fdf4d3251", "scanner": "scanner-primary", "fingerprint": "082072a8a60a0b66", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4a7e2f35ff68d471", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 screenshot-laptop.js:14"}, "properties": {"repobilityId": "dba90141bf78870f", "scanner": "scanner-primary", "fingerprint": "4a7e2f35ff68d471", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ed8a084b299d605b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 screenshot-live.js:16"}, "properties": {"repobilityId": "6ae7412593edc8fb", "scanner": "scanner-primary", "fingerprint": "ed8a084b299d605b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-52b02f3b6c31efe5", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 frontend/src/components/Modal.jsx:6"}, "properties": {"repobilityId": "46c8ceef9e2e47c4", "scanner": "scanner-primary", "fingerprint": "52b02f3b6c31efe5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-0dba08f4b1fb7b65", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/pages/Chat.jsx:112"}, "properties": {"repobilityId": "779f1f8b62e27fb2", "scanner": "scanner-primary", "fingerprint": "0dba08f4b1fb7b65", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-d80ef1cd2b95c7dc", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 frontend/src/pages/admin/StudentsTab.jsx:123"}, "properties": {"repobilityId": "bb48bed23ade82d8", "scanner": "scanner-primary", "fingerprint": "d80ef1cd2b95c7dc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-6c2c6a7bfbe995ad", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 automated_test/dast_runner.js:121"}, "properties": {"repobilityId": "65216c93b6d3af3f", "scanner": "scanner-primary", "fingerprint": "6c2c6a7bfbe995ad", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-97ea2e3d50cac736", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 automated_test/reaudit-live.js:4"}, "properties": {"repobilityId": "7e2fd67fa8c75a3e", "scanner": "scanner-primary", "fingerprint": "97ea2e3d50cac736", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ef8311e0eea1a11c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/export-students.js:16"}, "properties": {"repobilityId": "1b11c1ae72c7d1ca", "scanner": "scanner-primary", "fingerprint": "ef8311e0eea1a11c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1651e164b55f6052", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/create-admin.js:9"}, "properties": {"repobilityId": "a6ff239527e21e42", "scanner": "scanner-primary", "fingerprint": "1651e164b55f6052", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d9f51433db1f0bc3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/reset-admin.js:8"}, "properties": {"repobilityId": "79f69303182e88e2", "scanner": "scanner-primary", "fingerprint": "d9f51433db1f0bc3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ed2f4279d54767ad", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/seed-students.js:144"}, "properties": {"repobilityId": "e260e2312fc07274", "scanner": "scanner-primary", "fingerprint": "ed2f4279d54767ad", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-692e155870a5d7e1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/renumber-requests.js:15"}, "properties": {"repobilityId": "fdec77f0b87b4cf8", "scanner": "scanner-primary", "fingerprint": "692e155870a5d7e1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8efdd2b8df8c1c4c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/dev-local.js:85"}, "properties": {"repobilityId": "052f078d873a1922", "scanner": "scanner-primary", "fingerprint": "8efdd2b8df8c1c4c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-695feb7d5c624c1e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/server.js:87"}, "properties": {"repobilityId": "ec6c625862fd9ddc", "scanner": "scanner-primary", "fingerprint": "695feb7d5c624c1e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fc7186aae5daa756", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/seed.js:32"}, "properties": {"repobilityId": "39959ae5a7d06d0f", "scanner": "scanner-primary", "fingerprint": "fc7186aae5daa756", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1dd5830f186c6113", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/test-seq.js:11"}, "properties": {"repobilityId": "19692af0886fef6d", "scanner": "scanner-primary", "fingerprint": "1dd5830f186c6113", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3ff08e18fe2efffa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/refresh-demo-data.js:88"}, "properties": {"repobilityId": "3178ef4db3d83858", "scanner": "scanner-primary", "fingerprint": "3ff08e18fe2efffa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-33394e0cb4770bed", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/cleanup-notices.js:53"}, "properties": {"repobilityId": "71250be9279ccfd9", "scanner": "scanner-primary", "fingerprint": "33394e0cb4770bed", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ac833b9656b41ad6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/utils/email.js:19"}, "properties": {"repobilityId": "90c0bc00fa6b82f1", "scanner": "scanner-primary", "fingerprint": "ac833b9656b41ad6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cf3acc1bab5e46a5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/migrations/0003-notice-lifecycle.js:61"}, "properties": {"repobilityId": "ed3f75355e756d85", "scanner": "scanner-primary", "fingerprint": "cf3acc1bab5e46a5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-04bbb12d7b477a39", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/migrations/0001-dedupe-attendance.js:66"}, "properties": {"repobilityId": "6af6136b26e8cde4", "scanner": "scanner-primary", "fingerprint": "04bbb12d7b477a39", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-19b8374376ff1459", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/migrations/0002-backfill-fee-verification.js:47"}, "properties": {"repobilityId": "d7b10afe764f1f4b", "scanner": "scanner-primary", "fingerprint": "19b8374376ff1459", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-63e15a729abb0a66", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in requests.html:73"}, "properties": {"repobilityId": "ec14c86379b0269e", "scanner": "scanner-primary", "fingerprint": "63e15a729abb0a66", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "requests.html"}, "region": {"startLine": 73}}}]}, {"ruleId": "scanner-61eb78252a491c1a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in attendance.html:93"}, "properties": {"repobilityId": "b505e389078e8afd", "scanner": "scanner-primary", "fingerprint": "61eb78252a491c1a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "attendance.html"}, "region": {"startLine": 93}}}]}, {"ruleId": "scanner-9261f7d987467122", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in exam.html:57"}, "properties": {"repobilityId": "d09b3efffb8a6787", "scanner": "scanner-primary", "fingerprint": "9261f7d987467122", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "exam.html"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-04ede1d2b88c1a98", "level": "error", "message": {"text": "Possible secret in audit-verify.js"}, "properties": {"repobilityId": "329da818a941b5b7", "scanner": "scanner-primary", "fingerprint": "04ede1d2b88c1a98", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "audit-verify.js"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-04ede1d2b88c1a98", "level": "error", "message": {"text": "Possible secret in audit-verify.js"}, "properties": {"repobilityId": "329da818a941b5b7", "scanner": "scanner-primary", "fingerprint": "04ede1d2b88c1a98", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "audit-verify.js"}, "region": {"startLine": 108}}}]}, {"ruleId": "scanner-276f0a30af45f95c", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in audit-verify.js:28"}, "properties": {"repobilityId": "d97751015db53f11", "scanner": "scanner-primary", "fingerprint": "276f0a30af45f95c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "audit-verify.js"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-9effec0144623988", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in admin-requests.html:144"}, "properties": {"repobilityId": "37eda52ec32efc0f", "scanner": "scanner-primary", "fingerprint": "9effec0144623988", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "admin-requests.html"}, "region": {"startLine": 144}}}]}, {"ruleId": "scanner-82571f584263bc52", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in admin-notices.html:143"}, "properties": {"repobilityId": "200e1a5a48ed5532", "scanner": "scanner-primary", "fingerprint": "82571f584263bc52", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "admin-notices.html"}, "region": {"startLine": 143}}}]}, {"ruleId": "scanner-1ebf6599f91cca03", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in contact.html:57"}, "properties": {"repobilityId": "4dcf46521649b98a", "scanner": "scanner-primary", "fingerprint": "1ebf6599f91cca03", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "contact.html"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-13921ff53cc46bac", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in library.html:57"}, "properties": {"repobilityId": "b31eceec5b7bbc9b", "scanner": "scanner-primary", "fingerprint": "13921ff53cc46bac", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "library.html"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-6533e6291264ce7b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in dashboard.html:65"}, "properties": {"repobilityId": "3cddbad051d0bcc9", "scanner": "scanner-primary", "fingerprint": "6533e6291264ce7b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dashboard.html"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-2f477987527f6722", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in verify-profile-mobile.js:7"}, "properties": {"repobilityId": "85c895b0dd28ce9d", "scanner": "scanner-primary", "fingerprint": "2f477987527f6722", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "verify-profile-mobile.js"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-d636014080fc75c1", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in verify-mobile.js:9"}, "properties": {"repobilityId": "ed797af5e6585e8c", "scanner": "scanner-primary", "fingerprint": "d636014080fc75c1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "verify-mobile.js"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-59cb1a98023dd6a5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in login.html:161"}, "properties": {"repobilityId": "617b51c994b02988", "scanner": "scanner-primary", "fingerprint": "59cb1a98023dd6a5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "login.html"}, "region": {"startLine": 161}}}]}, {"ruleId": "scanner-88e8a5ca59f3fd73", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in login.html:319"}, "properties": {"repobilityId": "eafd762f754dc2fc", "scanner": "scanner-primary", "fingerprint": "88e8a5ca59f3fd73", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "login.html"}, "region": {"startLine": 319}}}]}, {"ruleId": "scanner-d4a35baf3ff80cbd", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in chat.html:96"}, "properties": {"repobilityId": "a41e9122bbd353ec", "scanner": "scanner-primary", "fingerprint": "d4a35baf3ff80cbd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "chat.html"}, "region": {"startLine": 96}}}]}, {"ruleId": "scanner-5d5af7531c14c190", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in index.html:401"}, "properties": {"repobilityId": "f91708437a3a5445", "scanner": "scanner-primary", "fingerprint": "5d5af7531c14c190", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index.html"}, "region": {"startLine": 401}}}]}, {"ruleId": "scanner-fdc7a79400a4e5c6", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in cgpa.html:81"}, "properties": {"repobilityId": "0e35d8e8a0fc9bf1", "scanner": "scanner-primary", "fingerprint": "fdc7a79400a4e5c6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "cgpa.html"}, "region": {"startLine": 81}}}]}, {"ruleId": "scanner-161230fd77c11f66", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in admin-dashboard.html:165"}, "properties": {"repobilityId": "76e86372c106744e", "scanner": "scanner-primary", "fingerprint": "161230fd77c11f66", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "admin-dashboard.html"}, "region": {"startLine": 165}}}]}, {"ruleId": "scanner-e75efd35b0f3d1b1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in student-search.html:57"}, "properties": {"repobilityId": "b2ce08e39f2360b0", "scanner": "scanner-primary", "fingerprint": "e75efd35b0f3d1b1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "student-search.html"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-ec21ca9f3614fb10", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in profile.html:64"}, "properties": {"repobilityId": "310e2e909a7be4fa", "scanner": "scanner-primary", "fingerprint": "ec21ca9f3614fb10", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "profile.html"}, "region": {"startLine": 64}}}]}, {"ruleId": "scanner-c1aa8b97793d5463", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in test-pages.js:69"}, "properties": {"repobilityId": "be745c6a1a3df043", "scanner": "scanner-primary", "fingerprint": "c1aa8b97793d5463", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "test-pages.js"}, "region": {"startLine": 69}}}]}, {"ruleId": "scanner-aee3d7481bbae871", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in admin.html:446"}, "properties": {"repobilityId": "6ce12d2fb0d90b99", "scanner": "scanner-primary", "fingerprint": "aee3d7481bbae871", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "admin.html"}, "region": {"startLine": 446}}}]}, {"ruleId": "scanner-45edea1442966f0b", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in admin.html:694"}, "properties": {"repobilityId": "8e10605e3a9f4dae", "scanner": "scanner-primary", "fingerprint": "45edea1442966f0b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "admin.html"}, "region": {"startLine": 694}}}]}, {"ruleId": "scanner-ef62ba1cde0bf3d5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app.js:19"}, "properties": {"repobilityId": "b6b0c8b85ab66ded", "scanner": "scanner-primary", "fingerprint": "ef62ba1cde0bf3d5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app.js"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-fb0bf10b3c97c20b", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in app.js:223"}, "properties": {"repobilityId": "b118f202acb2b6f3", "scanner": "scanner-primary", "fingerprint": "fb0bf10b3c97c20b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app.js"}, "region": {"startLine": 223}}}]}, {"ruleId": "scanner-d118a055bef59b40", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in od.html:57"}, "properties": {"repobilityId": "a90d0ff24e8f32a5", "scanner": "scanner-primary", "fingerprint": "d118a055bef59b40", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "od.html"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-6fa7de0679d73011", "level": "error", "message": {"text": "Possible secret in audit-warnings.js"}, "properties": {"repobilityId": "316decf79599703f", "scanner": "scanner-primary", "fingerprint": "6fa7de0679d73011", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "audit-warnings.js"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-6fa7de0679d73011", "level": "error", "message": {"text": "Possible secret in audit-warnings.js"}, "properties": {"repobilityId": "316decf79599703f", "scanner": "scanner-primary", "fingerprint": "6fa7de0679d73011", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "audit-warnings.js"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-df15194359b7bb99", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in audit-warnings.js:22"}, "properties": {"repobilityId": "5009c0b6068dcee0", "scanner": "scanner-primary", "fingerprint": "df15194359b7bb99", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "audit-warnings.js"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-4ba9aaca6905dedd", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in leave.html:53"}, "properties": {"repobilityId": "e2904992efe1f11a", "scanner": "scanner-primary", "fingerprint": "4ba9aaca6905dedd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "leave.html"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-f1e22417477a963b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in fees.html:57"}, "properties": {"repobilityId": "cb6a4c660f3c943a", "scanner": "scanner-primary", "fingerprint": "f1e22417477a963b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "fees.html"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-ea27403f703a7369", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in events.html:87"}, "properties": {"repobilityId": "789edb7aad97c058", "scanner": "scanner-primary", "fingerprint": "ea27403f703a7369", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "events.html"}, "region": {"startLine": 87}}}]}, {"ruleId": "scanner-559e76722fddf251", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in admin-leaves.html:128"}, "properties": {"repobilityId": "5fbd5be03955e391", "scanner": "scanner-primary", "fingerprint": "559e76722fddf251", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "admin-leaves.html"}, "region": {"startLine": 128}}}]}, {"ruleId": "scanner-2da51fee009110e1", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in verify-css-local.js:13"}, "properties": {"repobilityId": "32af4d2d81b6952c", "scanner": "scanner-primary", "fingerprint": "2da51fee009110e1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "verify-css-local.js"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-3375e5d9b1eb0837", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in notices.html:57"}, "properties": {"repobilityId": "cb7f90a8768f364d", "scanner": "scanner-primary", "fingerprint": "3375e5d9b1eb0837", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "notices.html"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-b6a6e90d0b9c502d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in register.html:152"}, "properties": {"repobilityId": "00569427cb685e09", "scanner": "scanner-primary", "fingerprint": "b6a6e90d0b9c502d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "register.html"}, "region": {"startLine": 152}}}]}, {"ruleId": "scanner-c4362a1a004b1700", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in register.html:408"}, "properties": {"repobilityId": "736a4c880a504b93", "scanner": "scanner-primary", "fingerprint": "c4362a1a004b1700", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "register.html"}, "region": {"startLine": 408}}}]}, {"ruleId": "scanner-ace544f8f7a956da", "level": "error", "message": {"text": "Possible secret in audit-device-retest.js"}, "properties": {"repobilityId": "a4800d398ad28573", "scanner": "scanner-primary", "fingerprint": "ace544f8f7a956da", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "audit-device-retest.js"}, "region": {"startLine": 101}}}]}, {"ruleId": "scanner-e3319af76f580071", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in status.html:76"}, "properties": {"repobilityId": "76011ddcc06b50c4", "scanner": "scanner-primary", "fingerprint": "e3319af76f580071", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "status.html"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-d76168ab8d9a6c5b", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in verify-css.js:9"}, "properties": {"repobilityId": "116496c9db154efe", "scanner": "scanner-primary", "fingerprint": "d76168ab8d9a6c5b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "verify-css.js"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-6d0c90002036be74", "level": "warning", "message": {"text": "Insecure pattern 'subprocess_shell_true' in e2e_test_report.py:1259"}, "properties": {"repobilityId": "98e9c41463999ac0", "scanner": "scanner-primary", "fingerprint": "6d0c90002036be74", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "subprocess_shell_true"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e_test_report.py"}, "region": {"startLine": 1259}}}]}, {"ruleId": "scanner-4072cb82f99eff82", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in e2e_test_report.py:506"}, "properties": {"repobilityId": "44e1de182358656a", "scanner": "scanner-primary", "fingerprint": "4072cb82f99eff82", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e_test_report.py"}, "region": {"startLine": 506}}}]}, {"ruleId": "scanner-ed043512481b7c7f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in timetable.html:80"}, "properties": {"repobilityId": "6466877bfcba587f", "scanner": "scanner-primary", "fingerprint": "ed043512481b7c7f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "timetable.html"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-fb78709d0ca629f8", "level": "error", "message": {"text": "Possible secret in frontend/src/pages/Register.jsx"}, "properties": {"repobilityId": "8c9216fdd4cdc3ad", "scanner": "scanner-primary", "fingerprint": "fb78709d0ca629f8", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/pages/Register.jsx"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-fb78709d0ca629f8", "level": "error", "message": {"text": "Possible secret in frontend/src/pages/Register.jsx"}, "properties": {"repobilityId": "8c9216fdd4cdc3ad", "scanner": "scanner-primary", "fingerprint": "fb78709d0ca629f8", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/pages/Register.jsx"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-3edff2949153c1a7", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/pages/Chat.jsx:112"}, "properties": {"repobilityId": "08b65dce6d03cfb7", "scanner": "scanner-primary", "fingerprint": "3edff2949153c1a7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/pages/Chat.jsx"}, "region": {"startLine": 112}}}]}, {"ruleId": "scanner-404fd06775b93ba6", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/pages/Chat.jsx:24"}, "properties": {"repobilityId": "f24be9203b8f04e3", "scanner": "scanner-primary", "fingerprint": "404fd06775b93ba6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/pages/Chat.jsx"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-115e53824515bd09", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/src/services/auth.js:8"}, "properties": {"repobilityId": "81082b5f2259f21f", "scanner": "scanner-primary", "fingerprint": "115e53824515bd09", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/services/auth.js"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-ac26e0688c24d59e", "level": "error", "message": {"text": "Possible secret in automated_test/dast_runner.js"}, "properties": {"repobilityId": "a7924e8a71a503ed", "scanner": "scanner-primary", "fingerprint": "ac26e0688c24d59e", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automated_test/dast_runner.js"}, "region": {"startLine": 284}}}]}, {"ruleId": "scanner-ac26e0688c24d59e", "level": "error", "message": {"text": "Possible secret in automated_test/dast_runner.js"}, "properties": {"repobilityId": "a7924e8a71a503ed", "scanner": "scanner-primary", "fingerprint": "ac26e0688c24d59e", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automated_test/dast_runner.js"}, "region": {"startLine": 285}}}]}, {"ruleId": "scanner-ac26e0688c24d59e", "level": "error", "message": {"text": "Possible secret in automated_test/dast_runner.js"}, "properties": {"repobilityId": "a7924e8a71a503ed", "scanner": "scanner-primary", "fingerprint": "ac26e0688c24d59e", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automated_test/dast_runner.js"}, "region": {"startLine": 286}}}]}, {"ruleId": "scanner-ac26e0688c24d59e", "level": "error", "message": {"text": "Possible secret in automated_test/dast_runner.js"}, "properties": {"repobilityId": "a7924e8a71a503ed", "scanner": "scanner-primary", "fingerprint": "ac26e0688c24d59e", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automated_test/dast_runner.js"}, "region": {"startLine": 735}}}]}, {"ruleId": "scanner-58a8b7c2c5d1e6f9", "level": "error", "message": {"text": "Possible secret in automated_test/reaudit-live.js"}, "properties": {"repobilityId": "5ee0a8405cd5cf67", "scanner": "scanner-primary", "fingerprint": "58a8b7c2c5d1e6f9", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automated_test/reaudit-live.js"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-58a8b7c2c5d1e6f9", "level": "error", "message": {"text": "Possible secret in automated_test/reaudit-live.js"}, "properties": {"repobilityId": "5ee0a8405cd5cf67", "scanner": "scanner-primary", "fingerprint": "58a8b7c2c5d1e6f9", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "automated_test/reaudit-live.js"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-5b2bfa5b05925395", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in selenium_model/html_report.html:509"}, "properties": {"repobilityId": "35d5577ee7ab3926", "scanner": "scanner-primary", "fingerprint": "5b2bfa5b05925395", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "selenium_model/html_report.html"}, "region": {"startLine": 509}}}]}, {"ruleId": "scanner-f423e65d8aeffb61", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in selenium_model/html_report.html:575"}, "properties": {"repobilityId": "0279640618269850", "scanner": "scanner-primary", "fingerprint": "f423e65d8aeffb61", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "selenium_model/html_report.html"}, "region": {"startLine": 575}}}]}, {"ruleId": "scanner-49c60eab9e681d5f", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in selenium_model/pages/base_page.py:70"}, "properties": {"repobilityId": "17a9e573b3fd7783", "scanner": "scanner-primary", "fingerprint": "49c60eab9e681d5f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "selenium_model/pages/base_page.py"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-a17654fcf7de1d0b", "level": "error", "message": {"text": "Possible secret in backend/create-admin.js"}, "properties": {"repobilityId": "b84edd0d257cfb6e", "scanner": "scanner-primary", "fingerprint": "a17654fcf7de1d0b", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/create-admin.js"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-90a992598bcdfdd5", "level": "error", "message": {"text": "Possible secret in backend/reset-admin.js"}, "properties": {"repobilityId": "04b698644d50f211", "scanner": "scanner-primary", "fingerprint": "90a992598bcdfdd5", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/reset-admin.js"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-1608c6bdd3ed89df", "level": "error", "message": {"text": "Possible secret in backend/dev-local.js"}, "properties": {"repobilityId": "d61c7ca61a55b0d5", "scanner": "scanner-primary", "fingerprint": "1608c6bdd3ed89df", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/dev-local.js"}, "region": {"startLine": 90}}}]}, {"ruleId": "scanner-1608c6bdd3ed89df", "level": "error", "message": {"text": "Possible secret in backend/dev-local.js"}, "properties": {"repobilityId": "d61c7ca61a55b0d5", "scanner": "scanner-primary", "fingerprint": "1608c6bdd3ed89df", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/dev-local.js"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-5685e9d22af56429", "level": "error", "message": {"text": "Possible secret in backend/seed.js"}, "properties": {"repobilityId": "2c7629ddf5c8ee2d", "scanner": "scanner-primary", "fingerprint": "5685e9d22af56429", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/seed.js"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-5685e9d22af56429", "level": "error", "message": {"text": "Possible secret in backend/seed.js"}, "properties": {"repobilityId": "2c7629ddf5c8ee2d", "scanner": "scanner-primary", "fingerprint": "5685e9d22af56429", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/seed.js"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-2c74db2c9a291517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "108ce3d6ab1990c7", "scanner": "scanner-primary", "fingerprint": "2c74db2c9a291517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/project-summary.yml"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-ae6d7eeb05603f40", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "6305798068f1dbdf", "scanner": "scanner-primary", "fingerprint": "ae6d7eeb05603f40", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0f6cfeca51e9a237", "level": "note", "message": {"text": "Very large file: e2e_test_report.py (1316 lines)"}, "properties": {"repobilityId": "1ae4937194a2ba30", "scanner": "scanner-primary", "fingerprint": "0f6cfeca51e9a237", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "d6a94db2895d0b3b", "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": "32c0c167704a198c", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "199e8b61fa04e51b", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "de7a2e75d16ba123", "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": "1d4c0f1bfcbc7082", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-655f3bdbf717f859", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test-phase5.js:124"}, "properties": {"repobilityId": "e62d7ace7d90df94", "scanner": "scanner-primary", "fingerprint": "655f3bdbf717f859", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bc977cc68e5f9b79", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 audit-device-test.js:168"}, "properties": {"repobilityId": "f220720f94191280", "scanner": "scanner-primary", "fingerprint": "bc977cc68e5f9b79", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6ef5c28f5450c66d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 audit-verify.js:18"}, "properties": {"repobilityId": "ceb4cb10ee168d67", "scanner": "scanner-primary", "fingerprint": "6ef5c28f5450c66d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-275de5f65a1aeb4e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 sw.js:20"}, "properties": {"repobilityId": "fdee04f199c42b77", "scanner": "scanner-primary", "fingerprint": "275de5f65a1aeb4e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cacb3dcc4cc238d0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 audit-warnings.js:8"}, "properties": {"repobilityId": "cfd5eb3f39b308e9", "scanner": "scanner-primary", "fingerprint": "cacb3dcc4cc238d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7edaa69e59bcade5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 audit-device-retest.js:99"}, "properties": {"repobilityId": "a080465522b1d0c2", "scanner": "scanner-primary", "fingerprint": "7edaa69e59bcade5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9d73a5e4c11f17c7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 automated_test/reaudit-live.js:99"}, "properties": {"repobilityId": "c0b719007848c797", "scanner": "scanner-primary", "fingerprint": "9d73a5e4c11f17c7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8c36dd52e307fdfc", "level": "note", "message": {"text": "Legacy-named symbol `MASTER_TEST_AUDIT_REPORT_backup` in selenium_model/report_generator.py:339"}, "properties": {"repobilityId": "7d8ea76cf8b8043a", "scanner": "scanner-primary", "fingerprint": "8c36dd52e307fdfc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-055a79c6010a1ef0", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 selenium_model/run.py:33"}, "properties": {"repobilityId": "38f877f9138bcb76", "scanner": "scanner-primary", "fingerprint": "055a79c6010a1ef0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ddff583f43efa908", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/seed.js:87"}, "properties": {"repobilityId": "67a14682faf6ae62", "scanner": "scanner-primary", "fingerprint": "ddff583f43efa908", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-abe6b5ca785a8e38", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/routes/timetable.js:9"}, "properties": {"repobilityId": "066ee52020e43ca5", "scanner": "scanner-primary", "fingerprint": "abe6b5ca785a8e38", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2eafc3188c36bb02", "level": "none", "message": {"text": "3 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "bd934ba112b02ffa", "scanner": "scanner-primary", "fingerprint": "2eafc3188c36bb02", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "1503896120f984bc", "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": "9e96bfad4c887a9f", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-f96186261037e1be", "level": "warning", "message": {"text": "Frontend route `/admin` has no Link/navigate to it \u2014 frontend/src/routes/AppRoutes.jsx"}, "properties": {"repobilityId": "1402d0beb7fd96b9", "scanner": "scanner-primary", "fingerprint": "f96186261037e1be", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-11a3e97ac96d390f", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:5000/api/exam (test-phase5.js:124)"}, "properties": {"repobilityId": "f5631ecb0906047c", "scanner": "scanner-primary", "fingerprint": "11a3e97ac96d390f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4088657c418cf4e3", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:5000/api/fees (test-phase5.js:137)"}, "properties": {"repobilityId": "6da5be586810ac40", "scanner": "scanner-primary", "fingerprint": "4088657c418cf4e3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-35a35f73ab783150", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:5000/api/library (test-phase5.js:150)"}, "properties": {"repobilityId": "3015afc552eb39ec", "scanner": "scanner-primary", "fingerprint": "35a35f73ab783150", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7a3591b3bc32a5de", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:5000/api/library/borrowed (test-phase5.js:164)"}, "properties": {"repobilityId": "2aeab6615ac8280c", "scanner": "scanner-primary", "fingerprint": "7a3591b3bc32a5de", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-46fb38a19d807458", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:5000/api/timetable (test-phase5.js:176)"}, "properties": {"repobilityId": "2ec9facf1bf0fb5f", "scanner": "scanner-primary", "fingerprint": "46fb38a19d807458", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9c08439edc70d4c5", "level": "error", "message": {"text": "Dangling fetch: GET /notices (app.js:295)"}, "properties": {"repobilityId": "9d49118dabc39581", "scanner": "scanner-primary", "fingerprint": "9c08439edc70d4c5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-00e94fe854f006ca", "level": "error", "message": {"text": "Dangling fetch: GET /auth/me (app.js:352)"}, "properties": {"repobilityId": "0fa3dbddace9e95b", "scanner": "scanner-primary", "fingerprint": "00e94fe854f006ca", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-0551bb848f108158", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:5000/api/auth/login (audit-warnings.js:8)"}, "properties": {"repobilityId": "2737a1a0d4f5082f", "scanner": "scanner-primary", "fingerprint": "0551bb848f108158", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a1d9d11c5111f378", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:5000/api/auth/login (audit-warnings.js:12)"}, "properties": {"repobilityId": "23e6580795b6bfba", "scanner": "scanner-primary", "fingerprint": "a1d9d11c5111f378", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6a4820e087c34407", "level": "error", "message": {"text": "Dangling fetch: POST https://college-helpdesk-chatbot-l4bk.onrender.com/api/auth/login (audit-device-retest.js:99)"}, "properties": {"repobilityId": "241adde7056f1f18", "scanner": "scanner-primary", "fingerprint": "6a4820e087c34407", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-29e9325d7a78bed6", "level": "error", "message": {"text": "Dangling fetch: GET /fees (frontend/src/pages/Fees.jsx:18)"}, "properties": {"repobilityId": "43e142800e472440", "scanner": "scanner-primary", "fingerprint": "29e9325d7a78bed6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-ebe053d455e778c4", "level": "error", "message": {"text": "Dangling fetch: POST /fees/payment (frontend/src/pages/Fees.jsx:28)"}, "properties": {"repobilityId": "87647ad51f3a6d24", "scanner": "scanner-primary", "fingerprint": "ebe053d455e778c4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-6225b9900c92dedf", "level": "error", "message": {"text": "Dangling fetch: POST /contact (frontend/src/pages/Contact.jsx:45)"}, "properties": {"repobilityId": "4ab30f2d3e0d2e9a", "scanner": "scanner-primary", "fingerprint": "6225b9900c92dedf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-dbc821f757097be2", "level": "error", "message": {"text": "Dangling fetch: GET /attendance/summary (frontend/src/pages/Attendance.jsx:14)"}, "properties": {"repobilityId": "630b9bc97eb75aca", "scanner": "scanner-primary", "fingerprint": "dbc821f757097be2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-d79ae7cc34fce153", "level": "error", "message": {"text": "Dangling fetch: GET /attendance (frontend/src/pages/Attendance.jsx:15)"}, "properties": {"repobilityId": "423b9469127f3685", "scanner": "scanner-primary", "fingerprint": "d79ae7cc34fce153", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-aefe80bcf7ca362e", "level": "error", "message": {"text": "Dangling fetch: GET /events (frontend/src/pages/Events.jsx:20)"}, "properties": {"repobilityId": "7502a895b25db358", "scanner": "scanner-primary", "fingerprint": "aefe80bcf7ca362e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-00316fab8c8c2259", "level": "error", "message": {"text": "Dangling fetch: DELETE /events/${ev._id}/register (frontend/src/pages/Events.jsx:27)"}, "properties": {"repobilityId": "2a6b62d526827e54", "scanner": "scanner-primary", "fingerprint": "00316fab8c8c2259", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-5b0c0a58ee3925d5", "level": "error", "message": {"text": "Dangling fetch: POST /events/${ev._id}/register (frontend/src/pages/Events.jsx:31)"}, "properties": {"repobilityId": "68a4aa01df7cf044", "scanner": "scanner-primary", "fingerprint": "5b0c0a58ee3925d5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-dcd8354b2e3f6177", "level": "error", "message": {"text": "Dangling fetch: GET /calendar (frontend/src/pages/Calendar.jsx:14)"}, "properties": {"repobilityId": "bcacbbb1ccf999ff", "scanner": "scanner-primary", "fingerprint": "dcd8354b2e3f6177", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-9cf5c7ade280acef", "level": "error", "message": {"text": "Dangling fetch: GET /requests (frontend/src/pages/Status.jsx:45)"}, "properties": {"repobilityId": "842205c254d90e71", "scanner": "scanner-primary", "fingerprint": "9cf5c7ade280acef", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-21946d938ac1a605", "level": "error", "message": {"text": "Dangling fetch: GET /notices (frontend/src/pages/Notices.jsx:25)"}, "properties": {"repobilityId": "6dcaee0a073ae5b5", "scanner": "scanner-primary", "fingerprint": "21946d938ac1a605", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-b36acf92059e8469", "level": "error", "message": {"text": "Dangling fetch: GET /requests (frontend/src/pages/Admin.jsx:61)"}, "properties": {"repobilityId": "e01c7b1314d6aa1c", "scanner": "scanner-primary", "fingerprint": "b36acf92059e8469", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-3d32157516f530e0", "level": "error", "message": {"text": "Dangling fetch: GET /leave (frontend/src/pages/Admin.jsx:62)"}, "properties": {"repobilityId": "fbb4f57f57ead60a", "scanner": "scanner-primary", "fingerprint": "3d32157516f530e0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-49c9568cf2c3308c", "level": "error", "message": {"text": "Dangling fetch: GET /notices (frontend/src/pages/Admin.jsx:63)"}, "properties": {"repobilityId": "d72e0262a8723742", "scanner": "scanner-primary", "fingerprint": "49c9568cf2c3308c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-7d2955fb8b3bc5f6", "level": "error", "message": {"text": "Dangling fetch: GET /students (frontend/src/pages/Admin.jsx:64)"}, "properties": {"repobilityId": "3ec13ecde941c5cd", "scanner": "scanner-primary", "fingerprint": "7d2955fb8b3bc5f6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-cf681635b84b8aa9", "level": "error", "message": {"text": "Dangling fetch: GET /contact (frontend/src/pages/Admin.jsx:65)"}, "properties": {"repobilityId": "44062eb33c2bf531", "scanner": "scanner-primary", "fingerprint": "cf681635b84b8aa9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-4eb291acdd336165", "level": "error", "message": {"text": "Dangling fetch: GET /events (frontend/src/pages/Admin.jsx:66)"}, "properties": {"repobilityId": "bb093d2136791840", "scanner": "scanner-primary", "fingerprint": "4eb291acdd336165", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-31286cfe564ff9f0", "level": "error", "message": {"text": "Dangling fetch: GET /exam/all (frontend/src/pages/Admin.jsx:67)"}, "properties": {"repobilityId": "8c26999c1d88bda5", "scanner": "scanner-primary", "fingerprint": "31286cfe564ff9f0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-e1ebb24e82aed570", "level": "error", "message": {"text": "Dangling fetch: GET /timetable/all (frontend/src/pages/Admin.jsx:68)"}, "properties": {"repobilityId": "24cdf6b0be115c03", "scanner": "scanner-primary", "fingerprint": "e1ebb24e82aed570", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-362a6ed69fe8dda2", "level": "error", "message": {"text": "Dangling fetch: GET /audit (frontend/src/pages/Admin.jsx:69)"}, "properties": {"repobilityId": "99077e1a30e2751d", "scanner": "scanner-primary", "fingerprint": "362a6ed69fe8dda2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-9604ba8d44c05615", "level": "error", "message": {"text": "Dangling fetch: GET /exam (frontend/src/pages/Exam.jsx:22)"}, "properties": {"repobilityId": "9603dad709edf00b", "scanner": "scanner-primary", "fingerprint": "9604ba8d44c05615", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-495c6082ee14ee76", "level": "error", "message": {"text": "Dangling fetch: GET /leave (frontend/src/pages/Leave.jsx:53)"}, "properties": {"repobilityId": "38a29750fc09d396", "scanner": "scanner-primary", "fingerprint": "495c6082ee14ee76", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-fc939cb28ad06d8c", "level": "error", "message": {"text": "Dangling fetch: POST /leave (frontend/src/pages/Leave.jsx:73)"}, "properties": {"repobilityId": "2d782dc49b011c0b", "scanner": "scanner-primary", "fingerprint": "fc939cb28ad06d8c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-5676d52da5337980", "level": "error", "message": {"text": "Dangling fetch: GET /leave/${id}/document (frontend/src/pages/Leave.jsx:95)"}, "properties": {"repobilityId": "1485f36ffefb6638", "scanner": "scanner-primary", "fingerprint": "5676d52da5337980", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-32569a4bd1079df1", "level": "error", "message": {"text": "Dangling fetch: GET /marks/cgpa (frontend/src/pages/Cgpa.jsx:33)"}, "properties": {"repobilityId": "38255928583a38c7", "scanner": "scanner-primary", "fingerprint": "32569a4bd1079df1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-b59b420a4644f1cb", "level": "error", "message": {"text": "Dangling fetch: GET /auth/me (frontend/src/pages/Profile.jsx:44)"}, "properties": {"repobilityId": "b0c5f962d9d21c4b", "scanner": "scanner-primary", "fingerprint": "b59b420a4644f1cb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-f0d4e73a05dcd8dc", "level": "error", "message": {"text": "Dangling fetch: GET /requests/stats (frontend/src/pages/Profile.jsx:44)"}, "properties": {"repobilityId": "4a69740eef665ac9", "scanner": "scanner-primary", "fingerprint": "f0d4e73a05dcd8dc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-e3496eac45b32dc7", "level": "error", "message": {"text": "Dangling fetch: PUT /auth/profile (frontend/src/pages/Profile.jsx:83)"}, "properties": {"repobilityId": "90978fa758df6b3f", "scanner": "scanner-primary", "fingerprint": "e3496eac45b32dc7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-f532bbda3d68e63e", "level": "error", "message": {"text": "Dangling fetch: PUT /auth/profile (frontend/src/pages/Profile.jsx:102)"}, "properties": {"repobilityId": "fdc5f5d4409bd657", "scanner": "scanner-primary", "fingerprint": "f532bbda3d68e63e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-fa985bd98ebcece7", "level": "error", "message": {"text": "Dangling fetch: PUT /auth/profile (frontend/src/pages/Profile.jsx:126)"}, "properties": {"repobilityId": "3b94d716a214a47e", "scanner": "scanner-primary", "fingerprint": "fa985bd98ebcece7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-53dff94f4fb59676", "level": "error", "message": {"text": "Dangling fetch: PUT /auth/change-password (frontend/src/pages/Profile.jsx:144)"}, "properties": {"repobilityId": "60b8099e37039c25", "scanner": "scanner-primary", "fingerprint": "53dff94f4fb59676", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-c9511887b09e6095", "level": "error", "message": {"text": "Dangling fetch: GET /requests/stats (frontend/src/pages/Dashboard.jsx:92)"}, "properties": {"repobilityId": "ebfb579587f38409", "scanner": "scanner-primary", "fingerprint": "c9511887b09e6095", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-9753c6ede5a28351", "level": "error", "message": {"text": "Dangling fetch: GET /notices (frontend/src/pages/Dashboard.jsx:93)"}, "properties": {"repobilityId": "66cb244ffe034fb7", "scanner": "scanner-primary", "fingerprint": "9753c6ede5a28351", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-33abe6e59ae88915", "level": "error", "message": {"text": "Dangling fetch: GET /events (frontend/src/pages/Dashboard.jsx:94)"}, "properties": {"repobilityId": "68f9bd42a93e07f6", "scanner": "scanner-primary", "fingerprint": "33abe6e59ae88915", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-d351212f341a689d", "level": "error", "message": {"text": "Dangling fetch: GET /requests (frontend/src/pages/Dashboard.jsx:95)"}, "properties": {"repobilityId": "9dbf74b492b79d07", "scanner": "scanner-primary", "fingerprint": "d351212f341a689d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-1f02d30900f3aebe", "level": "error", "message": {"text": "Dangling fetch: GET /library (frontend/src/pages/Library.jsx:25)"}, "properties": {"repobilityId": "904b848c2c15420f", "scanner": "scanner-primary", "fingerprint": "1f02d30900f3aebe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-e07671b7d637c2d7", "level": "error", "message": {"text": "Dangling fetch: GET /library/borrowed (frontend/src/pages/Library.jsx:34)"}, "properties": {"repobilityId": "a30a3ea795a58968", "scanner": "scanner-primary", "fingerprint": "e07671b7d637c2d7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-c94b2a39e523a4f6", "level": "error", "message": {"text": "Dangling fetch: GET /library?search=${encodeURIComponent(query.trim())} (frontend/src/pages/Library.jsx:39)"}, "properties": {"repobilityId": "d132d0f0e93695f1", "scanner": "scanner-primary", "fingerprint": "c94b2a39e523a4f6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-4fcf98fa60d85cb8", "level": "error", "message": {"text": "Dangling fetch: POST /chat (frontend/src/pages/Chat.jsx:65)"}, "properties": {"repobilityId": "b7931a47febfe221", "scanner": "scanner-primary", "fingerprint": "4fcf98fa60d85cb8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-0cb07586ef555fc1", "level": "error", "message": {"text": "Dangling fetch: GET /leave/${id}/document (frontend/src/pages/Od.jsx:64)"}, "properties": {"repobilityId": "453975776da497ad", "scanner": "scanner-primary", "fingerprint": "0cb07586ef555fc1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-350c045ea7ac38cc", "level": "error", "message": {"text": "Dangling fetch: GET /leave (frontend/src/pages/Od.jsx:70)"}, "properties": {"repobilityId": "ab5f13b4dd49e174", "scanner": "scanner-primary", "fingerprint": "350c045ea7ac38cc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-7c38eaebc9be1bbf", "level": "error", "message": {"text": "Dangling fetch: POST /leave (frontend/src/pages/Od.jsx:84)"}, "properties": {"repobilityId": "cf8c6672a8462784", "scanner": "scanner-primary", "fingerprint": "7c38eaebc9be1bbf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-e2620e2d6c7745fe", "level": "error", "message": {"text": "Dangling fetch: GET /timetable (frontend/src/pages/Timetable.jsx:22)"}, "properties": {"repobilityId": "09f699f068b06f79", "scanner": "scanner-primary", "fingerprint": "e2620e2d6c7745fe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-fe1c4cd67f86370b", "level": "error", "message": {"text": "Dangling fetch: GET /requests (frontend/src/pages/Requests.jsx:33)"}, "properties": {"repobilityId": "e98030f6a059f426", "scanner": "scanner-primary", "fingerprint": "fe1c4cd67f86370b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-3746cbb649d095c2", "level": "error", "message": {"text": "Dangling fetch: POST /requests (frontend/src/pages/Requests.jsx:43)"}, "properties": {"repobilityId": "566fed3c7fc27dbe", "scanner": "scanner-primary", "fingerprint": "3746cbb649d095c2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-32732de676af08b5", "level": "error", "message": {"text": "Dangling fetch: GET /fees/all (frontend/src/pages/admin/FeesTab.jsx:18)"}, "properties": {"repobilityId": "d7988b5d4e5b5f87", "scanner": "scanner-primary", "fingerprint": "32732de676af08b5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-d151c5c8dd9501cb", "level": "error", "message": {"text": "Dangling fetch: PUT /fees/${feeId}/payments/${index}/verify (frontend/src/pages/admin/FeesTab.jsx:24)"}, "properties": {"repobilityId": "17f5a7ee59bc2c97", "scanner": "scanner-primary", "fingerprint": "d151c5c8dd9501cb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-774b60f963bfaad4", "level": "error", "message": {"text": "Dangling fetch: POST /events (frontend/src/pages/admin/EventsTab.jsx:27)"}, "properties": {"repobilityId": "0a66ed507c5add9e", "scanner": "scanner-primary", "fingerprint": "774b60f963bfaad4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-036f87bafb1fa761", "level": "error", "message": {"text": "Dangling fetch: DELETE /events/${id} (frontend/src/pages/admin/EventsTab.jsx:42)"}, "properties": {"repobilityId": "1d516dce45aa82a1", "scanner": "scanner-primary", "fingerprint": "036f87bafb1fa761", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-40e4ebb60a3a49b5", "level": "error", "message": {"text": "Dangling fetch: PUT /timetable/${existingId} (frontend/src/pages/admin/TimetableTab.jsx:65)"}, "properties": {"repobilityId": "b7ae946dcbd0a669", "scanner": "scanner-primary", "fingerprint": "40e4ebb60a3a49b5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-4f64454d47436893", "level": "error", "message": {"text": "Dangling fetch: POST /timetable (frontend/src/pages/admin/TimetableTab.jsx:66)"}, "properties": {"repobilityId": "1a691757477f17ca", "scanner": "scanner-primary", "fingerprint": "4f64454d47436893", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-15e2e02a3f9daea1", "level": "error", "message": {"text": "Dangling fetch: PUT /timetable/${existingId}/publish (frontend/src/pages/admin/TimetableTab.jsx:91)"}, "properties": {"repobilityId": "0659fe7b9c8e1a0f", "scanner": "scanner-primary", "fingerprint": "15e2e02a3f9daea1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-8c6ba6d55b220eaf", "level": "error", "message": {"text": "Dangling fetch: PUT /timetable/${existingId}/archive (frontend/src/pages/admin/TimetableTab.jsx:105)"}, "properties": {"repobilityId": "cf24ab64d8f3405d", "scanner": "scanner-primary", "fingerprint": "8c6ba6d55b220eaf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-9bb5866e8a775457", "level": "error", "message": {"text": "Dangling fetch: GET /marks?studentId=${encodeURIComponent(sid)} (frontend/src/pages/admin/MarksTab.jsx:22)"}, "properties": {"repobilityId": "e8ecd76f827defb0", "scanner": "scanner-primary", "fingerprint": "9bb5866e8a775457", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-8cf11d116b40feb7", "level": "error", "message": {"text": "Dangling fetch: GET /marks/cgpa?studentId=${encodeURIComponent(sid)} (frontend/src/pages/admin/MarksTab.jsx:23)"}, "properties": {"repobilityId": "347cebbe8080ddf0", "scanner": "scanner-primary", "fingerprint": "8cf11d116b40feb7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-a5afd930aab8a77f", "level": "error", "message": {"text": "Dangling fetch: POST /marks (frontend/src/pages/admin/MarksTab.jsx:33)"}, "properties": {"repobilityId": "a68fdb07343cfe28", "scanner": "scanner-primary", "fingerprint": "a5afd930aab8a77f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-b5b19884d38e7925", "level": "error", "message": {"text": "Dangling fetch: DELETE /marks/${id} (frontend/src/pages/admin/MarksTab.jsx:48)"}, "properties": {"repobilityId": "d40a64d44c039ffe", "scanner": "scanner-primary", "fingerprint": "b5b19884d38e7925", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-94213c3a7855a887", "level": "error", "message": {"text": "Dangling fetch: POST /attendance/bulk (frontend/src/pages/admin/AttendanceTab.jsx:36)"}, "properties": {"repobilityId": "89c6f6f82fc915de", "scanner": "scanner-primary", "fingerprint": "94213c3a7855a887", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-69d39017db17a2b1", "level": "error", "message": {"text": "Dangling fetch: GET /attendance/summary?studentId=${encodeURIComponent(id)} (frontend/src/pages/admin/AttendanceTab.jsx:46)"}, "properties": {"repobilityId": "91f94af6d818cfcd", "scanner": "scanner-primary", "fingerprint": "69d39017db17a2b1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-d9467e2d46f6f84e", "level": "error", "message": {"text": "Dangling fetch: PUT /students/${id}/${action} (frontend/src/pages/admin/StudentsTab.jsx:33)"}, "properties": {"repobilityId": "e092f95a4a5acb42", "scanner": "scanner-primary", "fingerprint": "d9467e2d46f6f84e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-493eafcdc524c0f0", "level": "error", "message": {"text": "Dangling fetch: PUT /exam/${selectedId} (frontend/src/pages/admin/ExamsTab.jsx:88)"}, "properties": {"repobilityId": "2036a4eaf86a21a2", "scanner": "scanner-primary", "fingerprint": "493eafcdc524c0f0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-79f17c524c71245b", "level": "error", "message": {"text": "Dangling fetch: POST /exam (frontend/src/pages/admin/ExamsTab.jsx:89)"}, "properties": {"repobilityId": "906aed6c32c645e6", "scanner": "scanner-primary", "fingerprint": "79f17c524c71245b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-a3dee405bd9a977a", "level": "error", "message": {"text": "Dangling fetch: PUT /exam/${selectedId}/publish (frontend/src/pages/admin/ExamsTab.jsx:100)"}, "properties": {"repobilityId": "9889f1375aec8568", "scanner": "scanner-primary", "fingerprint": "a3dee405bd9a977a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-88f7b04c2078847a", "level": "error", "message": {"text": "Dangling fetch: PUT /exam/${selectedId}/archive (frontend/src/pages/admin/ExamsTab.jsx:106)"}, "properties": {"repobilityId": "fac8d2360701b38b", "scanner": "scanner-primary", "fingerprint": "88f7b04c2078847a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-64fb726d16308f3f", "level": "error", "message": {"text": "Dangling fetch: GET /calendar (frontend/src/pages/admin/CalendarTab.jsx:19)"}, "properties": {"repobilityId": "778bd6e85d84d47c", "scanner": "scanner-primary", "fingerprint": "64fb726d16308f3f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-fb086862c0627fef", "level": "error", "message": {"text": "Dangling fetch: PUT /calendar/${editId} (frontend/src/pages/admin/CalendarTab.jsx:33)"}, "properties": {"repobilityId": "fb0f7f6ad750551a", "scanner": "scanner-primary", "fingerprint": "fb086862c0627fef", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-4b73a4b432b83c05", "level": "error", "message": {"text": "Dangling fetch: POST /calendar (frontend/src/pages/admin/CalendarTab.jsx:34)"}, "properties": {"repobilityId": "a2d6acfa421dcfac", "scanner": "scanner-primary", "fingerprint": "4b73a4b432b83c05", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-a137bc5d3f43ceab", "level": "error", "message": {"text": "Dangling fetch: DELETE /calendar/${id} (frontend/src/pages/admin/CalendarTab.jsx:52)"}, "properties": {"repobilityId": "01303695a6ff6979", "scanner": "scanner-primary", "fingerprint": "a137bc5d3f43ceab", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-cc75a426ea64bc56", "level": "error", "message": {"text": "Dangling fetch: GET /leave/${id}/document (frontend/src/pages/admin/LeavesTab.jsx:13)"}, "properties": {"repobilityId": "8797a0fc152c7212", "scanner": "scanner-primary", "fingerprint": "cc75a426ea64bc56", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-94adccf18cf7e181", "level": "error", "message": {"text": "Dangling fetch: PUT /leave/${id}/status (frontend/src/pages/admin/LeavesTab.jsx:30)"}, "properties": {"repobilityId": "59b6ab7b074f35df", "scanner": "scanner-primary", "fingerprint": "94adccf18cf7e181", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-e2c79b31498caa62", "level": "error", "message": {"text": "Dangling fetch: POST /notices (frontend/src/pages/admin/NoticesTab.jsx:61)"}, "properties": {"repobilityId": "1d33e5bc0a72cb73", "scanner": "scanner-primary", "fingerprint": "e2c79b31498caa62", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-807c3aa0c4af5c35", "level": "error", "message": {"text": "Dangling fetch: PUT /notices/${notice._id} (frontend/src/pages/admin/NoticesTab.jsx:75)"}, "properties": {"repobilityId": "dbba5fd87cce9a1c", "scanner": "scanner-primary", "fingerprint": "807c3aa0c4af5c35", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-4412413e1988e5ce", "level": "error", "message": {"text": "Dangling fetch: DELETE /notices/${id} (frontend/src/pages/admin/NoticesTab.jsx:82)"}, "properties": {"repobilityId": "ec7ece10276bb60b", "scanner": "scanner-primary", "fingerprint": "4412413e1988e5ce", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-f644555cfe90f764", "level": "error", "message": {"text": "Dangling fetch: GET /auth/me (frontend/src/pages/admin/AccountTab.jsx:20)"}, "properties": {"repobilityId": "e55cd79e8265dcce", "scanner": "scanner-primary", "fingerprint": "f644555cfe90f764", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-f13eddbde2d3c85a", "level": "error", "message": {"text": "Dangling fetch: PUT /auth/profile (frontend/src/pages/admin/AccountTab.jsx:32)"}, "properties": {"repobilityId": "7063ee16bfbfb4ce", "scanner": "scanner-primary", "fingerprint": "f13eddbde2d3c85a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-b78b12fbe80382d1", "level": "error", "message": {"text": "Dangling fetch: PUT /auth/change-password (frontend/src/pages/admin/AccountTab.jsx:49)"}, "properties": {"repobilityId": "394614fcf6866b04", "scanner": "scanner-primary", "fingerprint": "b78b12fbe80382d1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-e3ef448d50fe0ff6", "level": "error", "message": {"text": "Dangling fetch: PUT /contact/${id}/resolve (frontend/src/pages/admin/MessagesTab.jsx:10)"}, "properties": {"repobilityId": "2caec8c9d38ca80e", "scanner": "scanner-primary", "fingerprint": "e3ef448d50fe0ff6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-3cde63d7ff56865d", "level": "error", "message": {"text": "Dangling fetch: PUT /requests/${id}/status (frontend/src/pages/admin/RequestsTab.jsx:13)"}, "properties": {"repobilityId": "236e42ea41f8537b", "scanner": "scanner-primary", "fingerprint": "3cde63d7ff56865d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-fd8bbc0505e16b80", "level": "error", "message": {"text": "Dangling fetch: GET /notices (frontend/src/hooks/useUnreadNotices.js:12)"}, "properties": {"repobilityId": "48b769d3bc8ea61c", "scanner": "scanner-primary", "fingerprint": "fd8bbc0505e16b80", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-76889df7c8e240c5", "level": "note", "message": {"text": "Unused endpoint: USE /api/"}, "properties": {"repobilityId": "4cd4e6dc6349487f", "scanner": "scanner-primary", "fingerprint": "76889df7c8e240c5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8bf2f7ca3faa1f1b", "level": "note", "message": {"text": "Unused endpoint: USE /api/auth/login"}, "properties": {"repobilityId": "c172beb7cb603d72", "scanner": "scanner-primary", "fingerprint": "8bf2f7ca3faa1f1b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-def16861a13564b0", "level": "note", "message": {"text": "Unused endpoint: USE /api/auth/register"}, "properties": {"repobilityId": "d1d9984dee170083", "scanner": "scanner-primary", "fingerprint": "def16861a13564b0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6eb452fbfb454d20", "level": "note", "message": {"text": "Unused endpoint: USE /api/auth"}, "properties": {"repobilityId": "0a5793afc5ea0a13", "scanner": "scanner-primary", "fingerprint": "6eb452fbfb454d20", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3cc7c4be574d90d6", "level": "note", "message": {"text": "Unused endpoint: USE /api/students"}, "properties": {"repobilityId": "d3978b3ee54b0dcd", "scanner": "scanner-primary", "fingerprint": "3cc7c4be574d90d6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-829fe3db7e6f3ccd", "level": "note", "message": {"text": "Unused endpoint: USE /api/requests"}, "properties": {"repobilityId": "408bd3ae229c347a", "scanner": "scanner-primary", "fingerprint": "829fe3db7e6f3ccd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3d722f112128fe85", "level": "note", "message": {"text": "Unused endpoint: USE /api/leave"}, "properties": {"repobilityId": "9b07e69a5f305d75", "scanner": "scanner-primary", "fingerprint": "3d722f112128fe85", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9bb126c3522da507", "level": "note", "message": {"text": "Unused endpoint: USE /api/notices"}, "properties": {"repobilityId": "a680ec8518e1905b", "scanner": "scanner-primary", "fingerprint": "9bb126c3522da507", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2b92dc87a4256298", "level": "note", "message": {"text": "Unused endpoint: USE /api/chat"}, "properties": {"repobilityId": "9d872e816eff6150", "scanner": "scanner-primary", "fingerprint": "2b92dc87a4256298", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-40dad860cccfaa2e", "level": "note", "message": {"text": "Unused endpoint: USE /api/exam"}, "properties": {"repobilityId": "8dcfcd7593d6be3a", "scanner": "scanner-primary", "fingerprint": "40dad860cccfaa2e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-022aebabab805160", "level": "note", "message": {"text": "Unused endpoint: USE /api/fees"}, "properties": {"repobilityId": "dbdd0a03b31e0432", "scanner": "scanner-primary", "fingerprint": "022aebabab805160", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8c797e25fee9b2b2", "level": "note", "message": {"text": "Unused endpoint: USE /api/library"}, "properties": {"repobilityId": "9b07652d0e3cb199", "scanner": "scanner-primary", "fingerprint": "8c797e25fee9b2b2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-55cb77d6ceb3716a", "level": "note", "message": {"text": "Unused endpoint: USE /api/timetable"}, "properties": {"repobilityId": "0f2c80384cdacb09", "scanner": "scanner-primary", "fingerprint": "55cb77d6ceb3716a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d3d2df7bfb761887", "level": "note", "message": {"text": "Unused endpoint: USE /api/contact"}, "properties": {"repobilityId": "3964537571e8fed3", "scanner": "scanner-primary", "fingerprint": "d3d2df7bfb761887", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f9eb90c1cd6cae29", "level": "note", "message": {"text": "Unused endpoint: USE /api/attendance"}, "properties": {"repobilityId": "ca39e4dc4151b75f", "scanner": "scanner-primary", "fingerprint": "f9eb90c1cd6cae29", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ec00984b27c88c15", "level": "note", "message": {"text": "Unused endpoint: USE /api/events"}, "properties": {"repobilityId": "732e0437353672d8", "scanner": "scanner-primary", "fingerprint": "ec00984b27c88c15", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fc384258421c9ed4", "level": "note", "message": {"text": "Unused endpoint: USE /api/marks"}, "properties": {"repobilityId": "05005d42a1c608ac", "scanner": "scanner-primary", "fingerprint": "fc384258421c9ed4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aebdad2655c302c7", "level": "note", "message": {"text": "Unused endpoint: USE /api/calendar"}, "properties": {"repobilityId": "20bab90ed990992a", "scanner": "scanner-primary", "fingerprint": "aebdad2655c302c7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ac2e8a1655395ddd", "level": "note", "message": {"text": "Unused endpoint: USE /api/audit"}, "properties": {"repobilityId": "054cdbef58bc8cb9", "scanner": "scanner-primary", "fingerprint": "ac2e8a1655395ddd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dde3adb27bf7eebe", "level": "note", "message": {"text": "Unused endpoint: USE /api"}, "properties": {"repobilityId": "e7ff5964127d9924", "scanner": "scanner-primary", "fingerprint": "dde3adb27bf7eebe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "fefcda7be1ac38e9", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-75d410a7156d767c", "level": "note", "message": {"text": "Unused endpoint: GET /borrowed"}, "properties": {"repobilityId": "a2a5944a07f37949", "scanner": "scanner-primary", "fingerprint": "75d410a7156d767c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-34e23d19c015af16", "level": "note", "message": {"text": "Unused endpoint: GET /hours"}, "properties": {"repobilityId": "b20325ede780b7e9", "scanner": "scanner-primary", "fingerprint": "34e23d19c015af16", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c6b4dc64abfb9538", "level": "note", "message": {"text": "Unused endpoint: POST /renew/:borrowId"}, "properties": {"repobilityId": "d7cc2ceab4538dcf", "scanner": "scanner-primary", "fingerprint": "c6b4dc64abfb9538", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "80a728cf325d9c2b", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8d5b2b188d08ca82", "level": "note", "message": {"text": "Unused endpoint: PUT /:id"}, "properties": {"repobilityId": "323aece401f9f03d", "scanner": "scanner-primary", "fingerprint": "8d5b2b188d08ca82", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a0d22c00550a28e7", "level": "note", "message": {"text": "Unused endpoint: PUT /:id/resolve"}, "properties": {"repobilityId": "fc38bd7737a0793f", "scanner": "scanner-primary", "fingerprint": "a0d22c00550a28e7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b56d0f0a38621428", "level": "note", "message": {"text": "Unused endpoint: POST /payment"}, "properties": {"repobilityId": "5aa50884872a66ef", "scanner": "scanner-primary", "fingerprint": "b56d0f0a38621428", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2c3d1d103b19a7f6", "level": "note", "message": {"text": "Unused endpoint: GET /all"}, "properties": {"repobilityId": "e33c05544b695c63", "scanner": "scanner-primary", "fingerprint": "2c3d1d103b19a7f6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ee87755ce68b3599", "level": "note", "message": {"text": "Unused endpoint: PUT /:feeId/payments/:index/verify"}, "properties": {"repobilityId": "0d07ad40bf7d585a", "scanner": "scanner-primary", "fingerprint": "ee87755ce68b3599", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b9c041dc087ff77f", "level": "note", "message": {"text": "Unused endpoint: GET /today"}, "properties": {"repobilityId": "c216e384cddcc535", "scanner": "scanner-primary", "fingerprint": "b9c041dc087ff77f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9eb782b5a8df0afe", "level": "note", "message": {"text": "Unused endpoint: GET /:id/conflicts"}, "properties": {"repobilityId": "77ac937b44bc2156", "scanner": "scanner-primary", "fingerprint": "9eb782b5a8df0afe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aaca58e5f6e3509f", "level": "note", "message": {"text": "Unused endpoint: PUT /:id/publish"}, "properties": {"repobilityId": "0eaa5fcb76f38468", "scanner": "scanner-primary", "fingerprint": "aaca58e5f6e3509f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f68bf5330d49406a", "level": "note", "message": {"text": "Unused endpoint: PUT /:id/archive"}, "properties": {"repobilityId": "40d5f9a26e14e052", "scanner": "scanner-primary", "fingerprint": "f68bf5330d49406a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e1b7bee247ffc801", "level": "note", "message": {"text": "Unused endpoint: GET /summary"}, "properties": {"repobilityId": "046b17bd4480cbbc", "scanner": "scanner-primary", "fingerprint": "e1b7bee247ffc801", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-90631dcf4fb49f54", "level": "note", "message": {"text": "Unused endpoint: POST /bulk"}, "properties": {"repobilityId": "4d74797a2e27882c", "scanner": "scanner-primary", "fingerprint": "90631dcf4fb49f54", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f1aa028ff32c0c7f", "level": "note", "message": {"text": "Unused endpoint: POST /:id/register"}, "properties": {"repobilityId": "cf0d013979b3771d", "scanner": "scanner-primary", "fingerprint": "f1aa028ff32c0c7f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a8fdf182e080e637", "level": "note", "message": {"text": "Unused endpoint: DELETE /:id/register"}, "properties": {"repobilityId": "d035efd582ba4dc8", "scanner": "scanner-primary", "fingerprint": "a8fdf182e080e637", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a61c112b611f4bb", "level": "note", "message": {"text": "Unused endpoint: DELETE /:id"}, "properties": {"repobilityId": "26143d40c5d72d3c", "scanner": "scanner-primary", "fingerprint": "7a61c112b611f4bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-304b6f2b403d93f7", "level": "note", "message": {"text": "Unused endpoint: POST /register"}, "properties": {"repobilityId": "75111c8cb20116c6", "scanner": "scanner-primary", "fingerprint": "304b6f2b403d93f7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-618721b912bad1c2", "level": "note", "message": {"text": "Unused endpoint: POST /login"}, "properties": {"repobilityId": "0739200902492336", "scanner": "scanner-primary", "fingerprint": "618721b912bad1c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd1dc91abf32142d", "level": "note", "message": {"text": "Unused endpoint: GET /me"}, "properties": {"repobilityId": "e4a6fbd9b6ee5f8b", "scanner": "scanner-primary", "fingerprint": "fd1dc91abf32142d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fab08877d417b369", "level": "note", "message": {"text": "Unused endpoint: PUT /change-password"}, "properties": {"repobilityId": "739be950c35505d4", "scanner": "scanner-primary", "fingerprint": "fab08877d417b369", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-911492554a68d0c1", "level": "note", "message": {"text": "Unused endpoint: PUT /profile"}, "properties": {"repobilityId": "ece36e785ef6d6cf", "scanner": "scanner-primary", "fingerprint": "911492554a68d0c1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9de4cecd0e235584", "level": "note", "message": {"text": "Unused endpoint: GET /pending"}, "properties": {"repobilityId": "f9cda769d4eb2a38", "scanner": "scanner-primary", "fingerprint": "9de4cecd0e235584", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-84cf7e210005f016", "level": "note", "message": {"text": "Unused endpoint: PUT /:id/approve"}, "properties": {"repobilityId": "341b186e9806880f", "scanner": "scanner-primary", "fingerprint": "84cf7e210005f016", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-05e8685bf43a812c", "level": "note", "message": {"text": "Unused endpoint: PUT /:id/reject"}, "properties": {"repobilityId": "341a66a2888f38a8", "scanner": "scanner-primary", "fingerprint": "05e8685bf43a812c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ec9f62c6578a625c", "level": "note", "message": {"text": "Unused endpoint: GET /search/:query"}, "properties": {"repobilityId": "c1bf42ce32dff97e", "scanner": "scanner-primary", "fingerprint": "ec9f62c6578a625c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca5756175765b49d", "level": "note", "message": {"text": "Unused endpoint: GET /:id"}, "properties": {"repobilityId": "09ceb2a3bb831dbe", "scanner": "scanner-primary", "fingerprint": "ca5756175765b49d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cd8dc4599ec52a08", "level": "note", "message": {"text": "Unused endpoint: GET /stats"}, "properties": {"repobilityId": "d26b3ddd38a17f5b", "scanner": "scanner-primary", "fingerprint": "cd8dc4599ec52a08", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}